1 // Copyright 2014 PDFium Authors. All rights reserved.
\r
2 // Use of this source code is governed by a BSD-style license that can be
\r
3 // found in the LICENSE file.
\r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
\r
7 #ifndef _FX_STREAM_IMP
\r
8 #define _FX_STREAM_IMP
\r
10 class CFX_FileStreamImp;
\r
11 class CFX_BufferStreamImp;
\r
12 class CFX_FileReadStreamImp;
\r
13 class CFX_BufferReadStreamImp;
\r
14 class CFX_FileWriteStreamImp;
\r
16 class CFX_TextStream;
\r
18 class CFX_FileWrite;
\r
19 class CFX_BufferAccImp;
\r
20 class CFX_StreamImp : public CFX_ThreadLock, public CFX_Object
\r
23 virtual void Release()
\r
27 virtual FX_DWORD GetAccessModes() const
\r
31 virtual FX_INT32 GetLength() const = 0;
\r
32 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset) = 0;
\r
33 virtual FX_INT32 GetPosition() = 0;
\r
34 virtual FX_BOOL IsEOF() const = 0;
\r
35 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize) = 0;
\r
36 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS) = 0;
\r
37 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize) = 0;
\r
38 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength) = 0;
\r
39 virtual void Flush() = 0;
\r
40 virtual FX_BOOL SetLength(FX_INT32 iLength) = 0;
\r
43 virtual ~CFX_StreamImp() {}
\r
44 FX_DWORD m_dwAccess;
\r
46 class CFX_FileStreamImp : public CFX_StreamImp
\r
49 CFX_FileStreamImp();
\r
50 virtual ~CFX_FileStreamImp();
\r
51 FX_BOOL LoadFile(FX_LPCWSTR pszSrcFileName, FX_DWORD dwAccess);
\r
52 virtual FX_INT32 GetLength() const;
\r
53 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
54 virtual FX_INT32 GetPosition();
\r
55 virtual FX_BOOL IsEOF() const;
\r
56 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize);
\r
57 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS);
\r
58 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize);
\r
59 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength);
\r
60 virtual void Flush();
\r
61 virtual FX_BOOL SetLength(FX_INT32 iLength);
\r
63 FXSYS_FILE *m_hFile;
\r
66 class CFX_BufferStreamImp : public CFX_StreamImp
\r
69 CFX_BufferStreamImp();
\r
70 virtual ~CFX_BufferStreamImp() {}
\r
71 FX_BOOL LoadBuffer(FX_LPBYTE pData, FX_INT32 iTotalSize, FX_DWORD dwAccess);
\r
72 virtual FX_INT32 GetLength() const;
\r
73 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
74 virtual FX_INT32 GetPosition();
\r
75 virtual FX_BOOL IsEOF() const;
\r
76 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize);
\r
77 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS);
\r
78 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize);
\r
79 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength);
\r
80 virtual void Flush() {}
\r
81 virtual FX_BOOL SetLength(FX_INT32 iLength)
\r
87 FX_INT32 m_iTotalSize;
\r
88 FX_INT32 m_iPosition;
\r
91 class CFX_FileReadStreamImp : public CFX_StreamImp
\r
94 CFX_FileReadStreamImp();
\r
95 virtual ~CFX_FileReadStreamImp() {}
\r
96 FX_BOOL LoadFileRead(IFX_FileRead *pFileRead, FX_DWORD dwAccess);
\r
97 virtual FX_INT32 GetLength() const;
\r
98 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
99 virtual FX_INT32 GetPosition()
\r
101 return m_iPosition;
\r
103 virtual FX_BOOL IsEOF() const;
\r
105 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize);
\r
106 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS);
\r
107 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize)
\r
111 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength)
\r
115 virtual void Flush() {}
\r
116 virtual FX_BOOL SetLength(FX_INT32 iLength)
\r
121 IFX_FileRead *m_pFileRead;
\r
122 FX_INT32 m_iPosition;
\r
123 FX_INT32 m_iLength;
\r
125 class CFX_BufferReadStreamImp : public CFX_StreamImp
\r
128 CFX_BufferReadStreamImp();
\r
129 ~CFX_BufferReadStreamImp();
\r
130 FX_BOOL LoadBufferRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_DWORD dwAccess, FX_BOOL bReleaseBufferRead);
\r
132 virtual FX_INT32 GetLength() const;
\r
133 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
134 virtual FX_INT32 GetPosition()
\r
136 return m_iPosition;
\r
138 virtual FX_BOOL IsEOF() const;
\r
140 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize);
\r
141 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS);
\r
142 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize)
\r
146 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength)
\r
150 virtual void Flush() {}
\r
151 virtual FX_BOOL SetLength(FX_INT32 iLength)
\r
156 IFX_BufferRead *m_pBufferRead;
\r
157 FX_BOOL m_bReleaseBufferRead;
\r
158 FX_INT32 m_iPosition;
\r
159 FX_INT32 m_iBufferSize;
\r
161 class CFX_FileWriteStreamImp : public CFX_StreamImp
\r
164 CFX_FileWriteStreamImp();
\r
165 virtual ~CFX_FileWriteStreamImp() {}
\r
166 FX_BOOL LoadFileWrite(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess);
\r
167 virtual FX_INT32 GetLength() const;
\r
168 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
169 virtual FX_INT32 GetPosition()
\r
171 return m_iPosition;
\r
173 virtual FX_BOOL IsEOF() const;
\r
174 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize)
\r
178 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS)
\r
182 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize);
\r
183 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength);
\r
184 virtual void Flush();
\r
185 virtual FX_BOOL SetLength(FX_INT32 iLength)
\r
190 IFX_FileWrite *m_pFileWrite;
\r
191 FX_INT32 m_iPosition;
\r
193 enum FX_STREAMTYPE {
\r
194 FX_SREAMTYPE_Unknown = 0,
\r
195 FX_STREAMTYPE_File ,
\r
196 FX_STREAMTYPE_Buffer ,
\r
197 FX_STREAMTYPE_Stream ,
\r
198 FX_STREAMTYPE_BufferRead ,
\r
200 class CFX_Stream : public IFX_Stream, public CFX_ThreadLock, public CFX_Object
\r
205 FX_BOOL LoadFile(FX_LPCWSTR pszSrcFileName, FX_DWORD dwAccess);
\r
206 FX_BOOL LoadBuffer(FX_LPBYTE pData, FX_INT32 iTotalSize, FX_DWORD dwAccess);
\r
207 FX_BOOL LoadFileRead(IFX_FileRead *pFileRead, FX_DWORD dwAccess);
\r
208 FX_BOOL LoadFileWrite(IFX_FileWrite *pFileWrite, FX_DWORD dwAccess);
\r
209 FX_BOOL LoadBufferRead(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_DWORD dwAccess, FX_BOOL bReleaseBufferRead);
\r
210 virtual void Release();
\r
211 virtual IFX_Stream* Retain();
\r
212 virtual FX_DWORD GetAccessModes() const
\r
216 virtual FX_INT32 GetLength() const;
\r
217 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
218 virtual FX_INT32 GetPosition();
\r
219 virtual FX_BOOL IsEOF() const;
\r
220 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize);
\r
221 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize = NULL);
\r
222 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize);
\r
223 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength);
\r
224 virtual void Flush();
\r
225 virtual FX_BOOL SetLength(FX_INT32 iLength);
\r
226 virtual FX_INT32 GetBOM(FX_BYTE bom[4]) const;
\r
227 virtual FX_WORD GetCodePage() const;
\r
228 virtual FX_WORD SetCodePage(FX_WORD wCodePage);
\r
229 virtual void Lock()
\r
231 CFX_ThreadLock::Lock();
\r
233 virtual void Unlock()
\r
235 CFX_ThreadLock::Unlock();
\r
237 virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength);
\r
239 FX_STREAMTYPE m_eStreamType;
\r
240 CFX_StreamImp *m_pStreamImp;
\r
241 FX_DWORD m_dwAccess;
\r
242 FX_INT32 m_iTotalSize;
\r
243 FX_INT32 m_iPosition;
\r
245 FX_INT32 m_iLength;
\r
246 FX_INT32 m_iRefCount;
\r
248 class CFX_TextStream : public IFX_Stream, public CFX_ThreadLock, public CFX_Object
\r
251 CFX_TextStream(IFX_Stream *pStream, FX_BOOL bDelStream);
\r
253 virtual void Release();
\r
254 virtual IFX_Stream* Retain();
\r
256 virtual FX_DWORD GetAccessModes() const;
\r
257 virtual FX_INT32 GetLength() const;
\r
258 virtual FX_INT32 Seek(FX_STREAMSEEK eSeek, FX_INT32 iOffset);
\r
259 virtual FX_INT32 GetPosition();
\r
260 virtual FX_BOOL IsEOF() const;
\r
262 virtual FX_INT32 ReadData(FX_LPBYTE pBuffer, FX_INT32 iBufferSize);
\r
263 virtual FX_INT32 ReadString(FX_LPWSTR pStr, FX_INT32 iMaxLength, FX_BOOL &bEOS, FX_INT32 const *pByteSize = NULL);
\r
264 virtual FX_INT32 WriteData(FX_LPCBYTE pBuffer, FX_INT32 iBufferSize);
\r
265 virtual FX_INT32 WriteString(FX_LPCWSTR pStr, FX_INT32 iLength);
\r
266 virtual void Flush();
\r
267 virtual FX_BOOL SetLength(FX_INT32 iLength);
\r
269 virtual FX_INT32 GetBOM(FX_BYTE bom[4]) const;
\r
270 virtual FX_WORD GetCodePage() const;
\r
271 virtual FX_WORD SetCodePage(FX_WORD wCodePage);
\r
273 virtual void Lock()
\r
275 CFX_ThreadLock::Lock();
\r
277 virtual void Unlock()
\r
279 CFX_ThreadLock::Unlock();
\r
282 virtual IFX_Stream* CreateSharedStream(FX_DWORD dwAccess, FX_INT32 iOffset, FX_INT32 iLength);
\r
284 FX_WORD m_wCodePage;
\r
285 FX_WORD m_wBOMLength;
\r
288 FX_INT32 m_iBufSize;
\r
289 FX_BOOL m_bDelStream;
\r
290 IFX_Stream *m_pStreamImp;
\r
291 FX_INT32 m_iRefCount;
\r
295 class CFGAS_FileRead : public IFX_FileRead, public CFX_Object
\r
298 CFGAS_FileRead(IFX_Stream *pStream, FX_BOOL bReleaseStream);
\r
299 virtual ~CFGAS_FileRead();
\r
300 virtual void Release()
\r
304 virtual FX_FILESIZE GetSize();
\r
305 virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
\r
307 FX_BOOL m_bReleaseStream;
\r
308 IFX_Stream *m_pStream;
\r
311 class CFGAS_FileRead : public IFX_FileRead, public CFX_Object
\r
314 CFGAS_FileRead(IFX_Stream *pStream, FX_BOOL bReleaseStream);
\r
315 virtual ~CFGAS_FileRead();
\r
317 virtual void Release()
\r
321 virtual FX_DWORD GetSize();
\r
322 virtual FX_BOOL ReadBlock(void* buffer, FX_DWORD offset, FX_DWORD size);
\r
325 FX_BOOL m_bReleaseStream;
\r
326 IFX_Stream *m_pStream;
\r
330 class CFX_BufferAccImp : public IFX_FileRead, public CFX_Object
\r
333 CFX_BufferAccImp(IFX_BufferRead *pBufferRead, FX_FILESIZE iFileSize, FX_BOOL bReleaseStream);
\r
334 virtual ~CFX_BufferAccImp();
\r
335 virtual void Release()
\r
339 virtual FX_FILESIZE GetSize();
\r
340 virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
\r
342 IFX_BufferRead *m_pBufferRead;
\r
343 FX_BOOL m_bReleaseStream;
\r
344 FX_FILESIZE m_iBufSize;
\r
347 class CFX_BufferAccImp : public IFX_FileRead, public CFX_Object
\r
350 CFX_BufferAccImp(IFX_BufferRead *pBufferRead, FX_INT32 iFileSize, FX_BOOL bReleaseStream);
\r
351 virtual ~CFX_BufferAccImp();
\r
353 virtual void Release()
\r
357 virtual FX_DWORD GetSize();
\r
358 virtual FX_BOOL ReadBlock(void* buffer, FX_DWORD offset, FX_DWORD size);
\r
361 IFX_BufferRead *m_pBufferRead;
\r
362 FX_BOOL m_bReleaseStream;
\r
363 FX_INT32 m_iBufSize;
\r
367 class CFGAS_FileWrite : public IFX_FileWrite, public CFX_Object
\r
370 CFGAS_FileWrite(IFX_Stream *pStream, FX_BOOL bReleaseStream);
\r
371 virtual ~CFGAS_FileWrite();
\r
372 virtual void Release()
\r
376 virtual FX_FILESIZE GetSize();
\r
377 virtual FX_BOOL Flush();
\r
378 virtual FX_BOOL WriteBlock(const void* pData, size_t size);
\r
379 virtual FX_BOOL WriteBlock(const void* pData, FX_FILESIZE offset, size_t size);
\r
381 IFX_Stream *m_pStream;
\r
382 FX_BOOL m_bReleaseStream;
\r
385 class CFGAS_FileWrite : public IFX_FileWrite, public CFX_Object
\r
388 CFGAS_FileWrite(IFX_Stream *pStream, FX_BOOL bReleaseStream);
\r
389 virtual ~CFGAS_FileWrite();
\r
391 virtual void Release()
\r
395 virtual FX_DWORD GetSize();
\r
396 virtual FX_DWORD Flush();
\r
397 virtual FX_BOOL WriteBlock(const void* pData, FX_DWORD size);
\r
398 virtual FX_BOOL WriteBlock(const void* pData, FX_DWORD offset, FX_DWORD size);
\r
401 IFX_Stream *m_pStream;
\r
402 FX_BOOL m_bReleaseStream;
\r