Initial commit.
[pdfium.git] / core / include / fxcrt / fx_stream.h
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
4  \r
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
6 \r
7 #ifndef _FX_STREAM_H_\r
8 #define _FX_STREAM_H_\r
9 #ifndef _FX_MEMORY_H_\r
10 #include "fx_memory.h"\r
11 #endif\r
12 void* FX_OpenFolder(FX_LPCSTR path);\r
13 void* FX_OpenFolder(FX_LPCWSTR path);\r
14 FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder);\r
15 FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder);\r
16 void FX_CloseFolder(void* handle);\r
17 FX_WCHAR FX_GetFolderSeparator();\r
18 FX_DEFINEHANDLE(FX_HFILE)\r
19 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_\r
20 #define FX_FILESIZE                     FX_INT32\r
21 #else\r
22 #include <fcntl.h>\r
23 #include <unistd.h>\r
24 #include <sys/stat.h>\r
25 #ifndef O_BINARY\r
26 #define O_BINARY                0\r
27 #endif\r
28 #ifndef O_LARGEFILE\r
29 #define O_LARGEFILE             0\r
30 #endif\r
31 #define FX_FILESIZE                     off_t\r
32 #endif\r
33 #define FX_GETBYTEOFFSET32(a)   0\r
34 #define FX_GETBYTEOFFSET40(a)   0\r
35 #define FX_GETBYTEOFFSET48(a)   0\r
36 #define FX_GETBYTEOFFSET56(a)   0\r
37 #define FX_GETBYTEOFFSET24(a)  ((FX_BYTE)(a>>24))\r
38 #define FX_GETBYTEOFFSET16(a)  ((FX_BYTE)(a>>16))\r
39 #define FX_GETBYTEOFFSET8(a)   ((FX_BYTE)(a>>8))\r
40 #define FX_GETBYTEOFFSET0(a)   ((FX_BYTE)(a))\r
41 #define FX_FILEMODE_Write               0\r
42 #define FX_FILEMODE_ReadOnly    1\r
43 #define FX_FILEMODE_Truncate    2\r
44 FX_HFILE        FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);\r
45 FX_HFILE        FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);\r
46 void            FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator = NULL);\r
47 FX_FILESIZE     FX_File_GetSize(FX_HFILE hFile);\r
48 FX_FILESIZE     FX_File_GetPosition(FX_HFILE hFile);\r
49 FX_FILESIZE     FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos);\r
50 size_t          FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer);\r
51 size_t          FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\r
52 size_t          FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer);\r
53 size_t          FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);\r
54 FX_BOOL         FX_File_Flush(FX_HFILE hFile);\r
55 FX_BOOL         FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile);\r
56 FX_BOOL         FX_File_Exist(FX_BSTR fileName);\r
57 FX_BOOL         FX_File_Exist(FX_WSTR fileName);\r
58 FX_BOOL         FX_File_Delete(FX_BSTR fileName);\r
59 FX_BOOL         FX_File_Delete(FX_WSTR fileName);\r
60 FX_BOOL         FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);\r
61 FX_BOOL         FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);\r
62 FX_BOOL         FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);\r
63 FX_BOOL         FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);\r
64 class IFX_StreamWrite\r
65 {\r
66 public:\r
67 \r
68     virtual void                Release() = 0;\r
69 \r
70     virtual     FX_BOOL         WriteBlock(const void* pData, size_t size) = 0;\r
71 };\r
72 class IFX_FileWrite : public IFX_StreamWrite\r
73 {\r
74 public:\r
75 \r
76     virtual void                        Release() = 0;\r
77 \r
78     virtual FX_FILESIZE         GetSize() = 0;\r
79 \r
80     virtual FX_BOOL                     Flush() = 0;\r
81 \r
82     virtual     FX_BOOL                 WriteBlock(const void* pData, FX_FILESIZE offset, size_t size) = 0;\r
83     virtual     FX_BOOL                 WriteBlock(const void* pData, size_t size)\r
84     {\r
85         return WriteBlock(pData, GetSize(), size);\r
86     }\r
87 };\r
88 IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);\r
89 IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);\r
90 class IFX_StreamRead\r
91 {\r
92 public:\r
93 \r
94     virtual void                        Release() = 0;\r
95 \r
96     virtual FX_BOOL                     IsEOF() = 0;\r
97 \r
98     virtual FX_FILESIZE         GetPosition() = 0;\r
99 \r
100     virtual size_t                      ReadBlock(void* buffer, size_t size) = 0;\r
101 };\r
102 class IFX_FileRead : IFX_StreamRead\r
103 {\r
104 public:\r
105 \r
106     virtual void                        Release() = 0;\r
107 \r
108     virtual FX_FILESIZE         GetSize() = 0;\r
109 \r
110     virtual FX_BOOL                     IsEOF()\r
111     {\r
112         return FALSE;\r
113     }\r
114 \r
115     virtual FX_FILESIZE         GetPosition()\r
116     {\r
117         return 0;\r
118     }\r
119 \r
120     virtual FX_BOOL                     SetRange(FX_FILESIZE offset, FX_FILESIZE size)\r
121     {\r
122         return FALSE;\r
123     }\r
124 \r
125     virtual void                        ClearRange() {}\r
126 \r
127     virtual FX_BOOL                     ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;\r
128 \r
129     virtual size_t                      ReadBlock(void* buffer, size_t size)\r
130     {\r
131         return 0;\r
132     }\r
133 };\r
134 IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);\r
135 IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);\r
136 class IFX_FileStream : public IFX_FileRead, public IFX_FileWrite\r
137 {\r
138 public:\r
139 \r
140     virtual IFX_FileStream*             Retain() = 0;\r
141 \r
142     virtual void                                Release() = 0;\r
143 \r
144     virtual FX_FILESIZE                 GetSize() = 0;\r
145 \r
146     virtual FX_BOOL                             IsEOF() = 0;\r
147 \r
148     virtual FX_FILESIZE                 GetPosition() = 0;\r
149 \r
150     virtual FX_BOOL                             ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;\r
151 \r
152     virtual size_t                              ReadBlock(void* buffer, size_t size) = 0;\r
153 \r
154     virtual     FX_BOOL                         WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) = 0;\r
155     virtual     FX_BOOL                         WriteBlock(const void* buffer, size_t size)\r
156     {\r
157         return WriteBlock(buffer, GetSize(), size);\r
158     }\r
159 \r
160     virtual FX_BOOL                             Flush() = 0;\r
161 };\r
162 IFX_FileStream*         FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);\r
163 IFX_FileStream*         FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);\r
164 class IFX_MemoryStream : public IFX_FileStream\r
165 {\r
166 public:\r
167 \r
168     virtual FX_BOOL                     IsConsecutive() const = 0;\r
169 \r
170     virtual void                        EstimateSize(size_t nInitSize, size_t nGrowSize) = 0;\r
171 \r
172     virtual FX_LPBYTE           GetBuffer() const = 0;\r
173 \r
174     virtual void                        AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE) = 0;\r
175 \r
176     virtual void                        DetachBuffer() = 0;\r
177 };\r
178 IFX_MemoryStream*       FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE, IFX_Allocator* pAllocator = NULL);\r
179 IFX_MemoryStream*       FX_CreateMemoryStream(FX_BOOL bConsecutive = FALSE, IFX_Allocator* pAllocator = NULL);\r
180 class IFX_BufferRead : public IFX_StreamRead\r
181 {\r
182 public:\r
183 \r
184     virtual void                        Release() = 0;\r
185 \r
186     virtual FX_BOOL                     IsEOF() = 0;\r
187 \r
188     virtual FX_FILESIZE         GetPosition() = 0;\r
189 \r
190     virtual size_t                      ReadBlock(void* buffer, size_t size) = 0;\r
191 \r
192     virtual FX_BOOL                     ReadNextBlock(FX_BOOL bRestart = FALSE) = 0;\r
193 \r
194     virtual FX_LPCBYTE          GetBlockBuffer() = 0;\r
195 \r
196     virtual size_t                      GetBlockSize() = 0;\r
197 \r
198     virtual FX_FILESIZE         GetBlockOffset() = 0;\r
199 };\r
200 #endif\r