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