// Copyright 2014 PDFium Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | |
#ifndef _FX_STREAM_IMP | |
#define _FX_STREAM_IMP | |
class CFX_StreamImp; | |
class CFX_FileStreamImp; | |
class CFX_BufferStreamImp; | |
class CFX_FileReadStreamImp; | |
class CFX_BufferReadStreamImp; | |
class CFX_FileWriteStreamImp; | |
class CFX_Stream; | |
class CFX_TextStream; | |
class CFX_FileRead; | |
class CFX_FileWrite; | |
class CFX_BufferAccImp; | |
class CFX_StreamImp : public CFX_ThreadLock { | |
public: | |
virtual void Release() { delete this; } | |
virtual FX_DWORD GetAccessModes() const { return m_dwAccess; } | |
virtual int32_t GetLength() const = 0; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0; | |
virtual int32_t GetPosition() = 0; | |
virtual FX_BOOL IsEOF() const = 0; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0; | |
virtual int32_t ReadString(FX_WCHAR* pStr, | |
int32_t iMaxLength, | |
FX_BOOL& bEOS) = 0; | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0; | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) = 0; | |
virtual void Flush() = 0; | |
virtual FX_BOOL SetLength(int32_t iLength) = 0; | |
protected: | |
CFX_StreamImp(); | |
virtual ~CFX_StreamImp() {} | |
FX_DWORD m_dwAccess; | |
}; | |
class CFX_FileStreamImp : public CFX_StreamImp { | |
public: | |
CFX_FileStreamImp(); | |
virtual ~CFX_FileStreamImp(); | |
FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess); | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition(); | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS); | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength); | |
virtual void Flush(); | |
virtual FX_BOOL SetLength(int32_t iLength); | |
protected: | |
FXSYS_FILE* m_hFile; | |
int32_t m_iLength; | |
}; | |
class CFX_BufferStreamImp : public CFX_StreamImp { | |
public: | |
CFX_BufferStreamImp(); | |
virtual ~CFX_BufferStreamImp() {} | |
FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess); | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition(); | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS); | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength); | |
virtual void Flush() {} | |
virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; } | |
protected: | |
uint8_t* m_pData; | |
int32_t m_iTotalSize; | |
int32_t m_iPosition; | |
int32_t m_iLength; | |
}; | |
class CFX_FileReadStreamImp : public CFX_StreamImp { | |
public: | |
CFX_FileReadStreamImp(); | |
virtual ~CFX_FileReadStreamImp() {} | |
FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess); | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition() { return m_iPosition; } | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS); | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) { | |
return 0; | |
} | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) { | |
return 0; | |
} | |
virtual void Flush() {} | |
virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; } | |
protected: | |
IFX_FileRead* m_pFileRead; | |
int32_t m_iPosition; | |
int32_t m_iLength; | |
}; | |
class CFX_BufferReadStreamImp : public CFX_StreamImp { | |
public: | |
CFX_BufferReadStreamImp(); | |
~CFX_BufferReadStreamImp(); | |
FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead, | |
int32_t iFileSize, | |
FX_DWORD dwAccess, | |
FX_BOOL bReleaseBufferRead); | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition() { return m_iPosition; } | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS); | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) { | |
return 0; | |
} | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) { | |
return 0; | |
} | |
virtual void Flush() {} | |
virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; } | |
private: | |
IFX_BufferRead* m_pBufferRead; | |
FX_BOOL m_bReleaseBufferRead; | |
int32_t m_iPosition; | |
int32_t m_iBufferSize; | |
}; | |
class CFX_FileWriteStreamImp : public CFX_StreamImp { | |
public: | |
CFX_FileWriteStreamImp(); | |
virtual ~CFX_FileWriteStreamImp() {} | |
FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess); | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition() { return m_iPosition; } | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; } | |
virtual int32_t ReadString(FX_WCHAR* pStr, | |
int32_t iMaxLength, | |
FX_BOOL& bEOS) { | |
return 0; | |
} | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength); | |
virtual void Flush(); | |
virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; } | |
protected: | |
IFX_FileWrite* m_pFileWrite; | |
int32_t m_iPosition; | |
}; | |
enum FX_STREAMTYPE { | |
FX_SREAMTYPE_Unknown = 0, | |
FX_STREAMTYPE_File, | |
FX_STREAMTYPE_Buffer, | |
FX_STREAMTYPE_Stream, | |
FX_STREAMTYPE_BufferRead, | |
}; | |
class CFX_Stream : public IFX_Stream, public CFX_ThreadLock { | |
public: | |
CFX_Stream(); | |
~CFX_Stream(); | |
FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess); | |
FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess); | |
FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess); | |
FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess); | |
FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead, | |
int32_t iFileSize, | |
FX_DWORD dwAccess, | |
FX_BOOL bReleaseBufferRead); | |
virtual void Release(); | |
virtual IFX_Stream* Retain(); | |
virtual FX_DWORD GetAccessModes() const { return m_dwAccess; } | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition(); | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t ReadString(FX_WCHAR* pStr, | |
int32_t iMaxLength, | |
FX_BOOL& bEOS, | |
int32_t const* pByteSize = NULL); | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength); | |
virtual void Flush(); | |
virtual FX_BOOL SetLength(int32_t iLength); | |
virtual int32_t GetBOM(uint8_t bom[4]) const; | |
virtual FX_WORD GetCodePage() const; | |
virtual FX_WORD SetCodePage(FX_WORD wCodePage); | |
virtual void Lock() { CFX_ThreadLock::Lock(); } | |
virtual void Unlock() { CFX_ThreadLock::Unlock(); } | |
virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, | |
int32_t iOffset, | |
int32_t iLength); | |
protected: | |
FX_STREAMTYPE m_eStreamType; | |
CFX_StreamImp* m_pStreamImp; | |
FX_DWORD m_dwAccess; | |
int32_t m_iTotalSize; | |
int32_t m_iPosition; | |
int32_t m_iStart; | |
int32_t m_iLength; | |
int32_t m_iRefCount; | |
}; | |
class CFX_TextStream : public IFX_Stream, public CFX_ThreadLock { | |
public: | |
CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream); | |
~CFX_TextStream(); | |
virtual void Release(); | |
virtual IFX_Stream* Retain(); | |
virtual FX_DWORD GetAccessModes() const; | |
virtual int32_t GetLength() const; | |
virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset); | |
virtual int32_t GetPosition(); | |
virtual FX_BOOL IsEOF() const; | |
virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t ReadString(FX_WCHAR* pStr, | |
int32_t iMaxLength, | |
FX_BOOL& bEOS, | |
int32_t const* pByteSize = NULL); | |
virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize); | |
virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength); | |
virtual void Flush(); | |
virtual FX_BOOL SetLength(int32_t iLength); | |
virtual int32_t GetBOM(uint8_t bom[4]) const; | |
virtual FX_WORD GetCodePage() const; | |
virtual FX_WORD SetCodePage(FX_WORD wCodePage); | |
virtual void Lock() { CFX_ThreadLock::Lock(); } | |
virtual void Unlock() { CFX_ThreadLock::Unlock(); } | |
virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, | |
int32_t iOffset, | |
int32_t iLength); | |
protected: | |
FX_WORD m_wCodePage; | |
int32_t m_wBOMLength; | |
FX_DWORD m_dwBOM; | |
uint8_t* m_pBuf; | |
int32_t m_iBufSize; | |
FX_BOOL m_bDelStream; | |
IFX_Stream* m_pStreamImp; | |
int32_t m_iRefCount; | |
void InitStream(); | |
}; | |
class CFGAS_FileRead : public IFX_FileRead { | |
public: | |
CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream); | |
virtual ~CFGAS_FileRead(); | |
virtual void Release() { delete this; } | |
virtual FX_FILESIZE GetSize(); | |
virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); | |
protected: | |
FX_BOOL m_bReleaseStream; | |
IFX_Stream* m_pStream; | |
}; | |
class CFX_BufferAccImp : public IFX_FileRead { | |
public: | |
CFX_BufferAccImp(IFX_BufferRead* pBufferRead, | |
FX_FILESIZE iFileSize, | |
FX_BOOL bReleaseStream); | |
virtual ~CFX_BufferAccImp(); | |
virtual void Release() { delete this; } | |
virtual FX_FILESIZE GetSize(); | |
virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size); | |
protected: | |
IFX_BufferRead* m_pBufferRead; | |
FX_BOOL m_bReleaseStream; | |
FX_FILESIZE m_iBufSize; | |
}; | |
class CFGAS_FileWrite : public IFX_FileWrite { | |
public: | |
CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream); | |
virtual ~CFGAS_FileWrite(); | |
virtual void Release() { delete this; } | |
virtual FX_FILESIZE GetSize(); | |
virtual FX_BOOL Flush(); | |
virtual FX_BOOL WriteBlock(const void* pData, size_t size); | |
virtual FX_BOOL WriteBlock(const void* pData, | |
FX_FILESIZE offset, | |
size_t size); | |
protected: | |
IFX_Stream* m_pStream; | |
FX_BOOL m_bReleaseStream; | |
}; | |
#endif |