1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef _FX_STREAM_IMP
8 #define _FX_STREAM_IMP
9 class CFX_StreamImp;
10 class CFX_FileStreamImp;
11 class CFX_BufferStreamImp;
12 class CFX_FileReadStreamImp;
13 class CFX_BufferReadStreamImp;
14 class CFX_FileWriteStreamImp;
15 class CFX_Stream;
16 class CFX_TextStream;
17 class CFX_FileRead;
18 class CFX_FileWrite;
19 class CFX_BufferAccImp;
20 class CFX_StreamImp : public CFX_ThreadLock {
21  public:
Release()22   virtual void Release() { delete this; }
GetAccessModes()23   virtual FX_DWORD GetAccessModes() const { return m_dwAccess; }
24   virtual int32_t GetLength() const = 0;
25   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) = 0;
26   virtual int32_t GetPosition() = 0;
27   virtual FX_BOOL IsEOF() const = 0;
28   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) = 0;
29   virtual int32_t ReadString(FX_WCHAR* pStr,
30                              int32_t iMaxLength,
31                              FX_BOOL& bEOS) = 0;
32   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) = 0;
33   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) = 0;
34   virtual void Flush() = 0;
35   virtual FX_BOOL SetLength(int32_t iLength) = 0;
36 
37  protected:
38   CFX_StreamImp();
~CFX_StreamImp()39   virtual ~CFX_StreamImp() {}
40   FX_DWORD m_dwAccess;
41 };
42 class CFX_FileStreamImp : public CFX_StreamImp {
43  public:
44   CFX_FileStreamImp();
45   virtual ~CFX_FileStreamImp();
46   FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess);
47   virtual int32_t GetLength() const;
48   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
49   virtual int32_t GetPosition();
50   virtual FX_BOOL IsEOF() const;
51   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
52   virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
53   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
54   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
55   virtual void Flush();
56   virtual FX_BOOL SetLength(int32_t iLength);
57 
58  protected:
59   FXSYS_FILE* m_hFile;
60   int32_t m_iLength;
61 };
62 class CFX_BufferStreamImp : public CFX_StreamImp {
63  public:
64   CFX_BufferStreamImp();
~CFX_BufferStreamImp()65   virtual ~CFX_BufferStreamImp() {}
66   FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess);
67   virtual int32_t GetLength() const;
68   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
69   virtual int32_t GetPosition();
70   virtual FX_BOOL IsEOF() const;
71   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
72   virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
73   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
74   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
Flush()75   virtual void Flush() {}
SetLength(int32_t iLength)76   virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
77 
78  protected:
79   uint8_t* m_pData;
80   int32_t m_iTotalSize;
81   int32_t m_iPosition;
82   int32_t m_iLength;
83 };
84 class CFX_FileReadStreamImp : public CFX_StreamImp {
85  public:
86   CFX_FileReadStreamImp();
~CFX_FileReadStreamImp()87   virtual ~CFX_FileReadStreamImp() {}
88   FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
89   virtual int32_t GetLength() const;
90   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
GetPosition()91   virtual int32_t GetPosition() { return m_iPosition; }
92   virtual FX_BOOL IsEOF() const;
93 
94   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
95   virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
WriteData(const uint8_t * pBuffer,int32_t iBufferSize)96   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
97     return 0;
98   }
WriteString(const FX_WCHAR * pStr,int32_t iLength)99   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
100     return 0;
101   }
Flush()102   virtual void Flush() {}
SetLength(int32_t iLength)103   virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
104 
105  protected:
106   IFX_FileRead* m_pFileRead;
107   int32_t m_iPosition;
108   int32_t m_iLength;
109 };
110 class CFX_BufferReadStreamImp : public CFX_StreamImp {
111  public:
112   CFX_BufferReadStreamImp();
113   ~CFX_BufferReadStreamImp();
114   FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead,
115                          int32_t iFileSize,
116                          FX_DWORD dwAccess,
117                          FX_BOOL bReleaseBufferRead);
118 
119   virtual int32_t GetLength() const;
120   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
GetPosition()121   virtual int32_t GetPosition() { return m_iPosition; }
122   virtual FX_BOOL IsEOF() const;
123 
124   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
125   virtual int32_t ReadString(FX_WCHAR* pStr, int32_t iMaxLength, FX_BOOL& bEOS);
WriteData(const uint8_t * pBuffer,int32_t iBufferSize)126   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
127     return 0;
128   }
WriteString(const FX_WCHAR * pStr,int32_t iLength)129   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
130     return 0;
131   }
Flush()132   virtual void Flush() {}
SetLength(int32_t iLength)133   virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
134 
135  private:
136   IFX_BufferRead* m_pBufferRead;
137   FX_BOOL m_bReleaseBufferRead;
138   int32_t m_iPosition;
139   int32_t m_iBufferSize;
140 };
141 class CFX_FileWriteStreamImp : public CFX_StreamImp {
142  public:
143   CFX_FileWriteStreamImp();
~CFX_FileWriteStreamImp()144   virtual ~CFX_FileWriteStreamImp() {}
145   FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
146   virtual int32_t GetLength() const;
147   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
GetPosition()148   virtual int32_t GetPosition() { return m_iPosition; }
149   virtual FX_BOOL IsEOF() const;
ReadData(uint8_t * pBuffer,int32_t iBufferSize)150   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; }
ReadString(FX_WCHAR * pStr,int32_t iMaxLength,FX_BOOL & bEOS)151   virtual int32_t ReadString(FX_WCHAR* pStr,
152                              int32_t iMaxLength,
153                              FX_BOOL& bEOS) {
154     return 0;
155   }
156   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
157   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
158   virtual void Flush();
SetLength(int32_t iLength)159   virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
160 
161  protected:
162   IFX_FileWrite* m_pFileWrite;
163   int32_t m_iPosition;
164 };
165 enum FX_STREAMTYPE {
166   FX_SREAMTYPE_Unknown = 0,
167   FX_STREAMTYPE_File,
168   FX_STREAMTYPE_Buffer,
169   FX_STREAMTYPE_Stream,
170   FX_STREAMTYPE_BufferRead,
171 };
172 class CFX_Stream : public IFX_Stream, public CFX_ThreadLock {
173  public:
174   CFX_Stream();
175   ~CFX_Stream();
176   FX_BOOL LoadFile(const FX_WCHAR* pszSrcFileName, FX_DWORD dwAccess);
177   FX_BOOL LoadBuffer(uint8_t* pData, int32_t iTotalSize, FX_DWORD dwAccess);
178   FX_BOOL LoadFileRead(IFX_FileRead* pFileRead, FX_DWORD dwAccess);
179   FX_BOOL LoadFileWrite(IFX_FileWrite* pFileWrite, FX_DWORD dwAccess);
180   FX_BOOL LoadBufferRead(IFX_BufferRead* pBufferRead,
181                          int32_t iFileSize,
182                          FX_DWORD dwAccess,
183                          FX_BOOL bReleaseBufferRead);
184   virtual void Release();
185   virtual IFX_Stream* Retain();
GetAccessModes()186   virtual FX_DWORD GetAccessModes() const { return m_dwAccess; }
187   virtual int32_t GetLength() const;
188   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
189   virtual int32_t GetPosition();
190   virtual FX_BOOL IsEOF() const;
191   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
192   virtual int32_t ReadString(FX_WCHAR* pStr,
193                              int32_t iMaxLength,
194                              FX_BOOL& bEOS,
195                              int32_t const* pByteSize = NULL);
196   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
197   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
198   virtual void Flush();
199   virtual FX_BOOL SetLength(int32_t iLength);
200   virtual int32_t GetBOM(uint8_t bom[4]) const;
201   virtual FX_WORD GetCodePage() const;
202   virtual FX_WORD SetCodePage(FX_WORD wCodePage);
Lock()203   virtual void Lock() { CFX_ThreadLock::Lock(); }
Unlock()204   virtual void Unlock() { CFX_ThreadLock::Unlock(); }
205   virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
206                                          int32_t iOffset,
207                                          int32_t iLength);
208 
209  protected:
210   FX_STREAMTYPE m_eStreamType;
211   CFX_StreamImp* m_pStreamImp;
212   FX_DWORD m_dwAccess;
213   int32_t m_iTotalSize;
214   int32_t m_iPosition;
215   int32_t m_iStart;
216   int32_t m_iLength;
217   int32_t m_iRefCount;
218 };
219 class CFX_TextStream : public IFX_Stream, public CFX_ThreadLock {
220  public:
221   CFX_TextStream(IFX_Stream* pStream, FX_BOOL bDelStream);
222   ~CFX_TextStream();
223   virtual void Release();
224   virtual IFX_Stream* Retain();
225 
226   virtual FX_DWORD GetAccessModes() const;
227   virtual int32_t GetLength() const;
228   virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
229   virtual int32_t GetPosition();
230   virtual FX_BOOL IsEOF() const;
231 
232   virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize);
233   virtual int32_t ReadString(FX_WCHAR* pStr,
234                              int32_t iMaxLength,
235                              FX_BOOL& bEOS,
236                              int32_t const* pByteSize = NULL);
237   virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize);
238   virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength);
239   virtual void Flush();
240   virtual FX_BOOL SetLength(int32_t iLength);
241 
242   virtual int32_t GetBOM(uint8_t bom[4]) const;
243   virtual FX_WORD GetCodePage() const;
244   virtual FX_WORD SetCodePage(FX_WORD wCodePage);
245 
Lock()246   virtual void Lock() { CFX_ThreadLock::Lock(); }
Unlock()247   virtual void Unlock() { CFX_ThreadLock::Unlock(); }
248 
249   virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess,
250                                          int32_t iOffset,
251                                          int32_t iLength);
252 
253  protected:
254   FX_WORD m_wCodePage;
255   int32_t m_wBOMLength;
256   FX_DWORD m_dwBOM;
257   uint8_t* m_pBuf;
258   int32_t m_iBufSize;
259   FX_BOOL m_bDelStream;
260   IFX_Stream* m_pStreamImp;
261   int32_t m_iRefCount;
262   void InitStream();
263 };
264 
265 class CFGAS_FileRead : public IFX_FileRead {
266  public:
267   CFGAS_FileRead(IFX_Stream* pStream, FX_BOOL bReleaseStream);
268   virtual ~CFGAS_FileRead();
Release()269   virtual void Release() { delete this; }
270   virtual FX_FILESIZE GetSize();
271   virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
272 
273  protected:
274   FX_BOOL m_bReleaseStream;
275   IFX_Stream* m_pStream;
276 };
277 
278 class CFX_BufferAccImp : public IFX_FileRead {
279  public:
280   CFX_BufferAccImp(IFX_BufferRead* pBufferRead,
281                    FX_FILESIZE iFileSize,
282                    FX_BOOL bReleaseStream);
283   virtual ~CFX_BufferAccImp();
Release()284   virtual void Release() { delete this; }
285   virtual FX_FILESIZE GetSize();
286   virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
287 
288  protected:
289   IFX_BufferRead* m_pBufferRead;
290   FX_BOOL m_bReleaseStream;
291   FX_FILESIZE m_iBufSize;
292 };
293 
294 class CFGAS_FileWrite : public IFX_FileWrite {
295  public:
296   CFGAS_FileWrite(IFX_Stream* pStream, FX_BOOL bReleaseStream);
297   virtual ~CFGAS_FileWrite();
Release()298   virtual void Release() { delete this; }
299   virtual FX_FILESIZE GetSize();
300   virtual FX_BOOL Flush();
301   virtual FX_BOOL WriteBlock(const void* pData, size_t size);
302   virtual FX_BOOL WriteBlock(const void* pData,
303                              FX_FILESIZE offset,
304                              size_t size);
305 
306  protected:
307   IFX_Stream* m_pStream;
308   FX_BOOL m_bReleaseStream;
309 };
310 
311 #endif
312