34 #ifndef CPL_VSI_VIRTUAL_H_INCLUDED
35 #define CPL_VSI_VIRTUAL_H_INCLUDED
38 #include "cpl_vsi_error.h"
40 #include "cpl_multiproc.h"
47 #ifdef GetDiskFreeSpace
48 #undef GetDiskFreeSpace
58 virtual int Seek(
vsi_l_offset nOffset,
int nWhence ) = 0;
60 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount ) = 0;
61 virtual int ReadMultiRange(
int nRanges,
void ** ppData,
63 const size_t* panSizes );
64 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount)=0;
65 virtual int Eof() = 0;
66 virtual int Flush() {
return 0;}
67 virtual int Close() = 0;
70 virtual void *GetNativeFileDescriptor() {
return nullptr; }
74 virtual bool HasPRead()
const;
75 virtual size_t PRead(
void* pBuffer,
size_t nSize,
vsi_l_offset nOffset )
const;
88 class CPL_DLL VSIFilesystemHandler {
92 virtual ~VSIFilesystemHandler() {}
95 const char *pszAccess );
98 const char *pszAccess,
101 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
int nFlags) = 0;
102 virtual int Unlink(
const char *pszFilename )
103 { (void) pszFilename; errno=ENOENT;
return -1; }
105 virtual int Mkdir(
const char *pszDirname,
long nMode )
106 {(void)pszDirname; (void)nMode; errno=ENOENT;
return -1;}
107 virtual int Rmdir(
const char *pszDirname )
108 { (void) pszDirname; errno=ENOENT;
return -1; }
109 virtual int RmdirRecursive(
const char *pszDirname );
110 virtual char **ReadDir(
const char *pszDirname )
111 { (void) pszDirname;
return nullptr; }
112 virtual char **ReadDirEx(
const char *pszDirname,
int )
113 {
return ReadDir(pszDirname); }
114 virtual char **SiblingFiles(
const char * )
116 virtual int Rename(
const char *oldpath,
const char *newpath )
117 { (void) oldpath; (void)newpath; errno=ENOENT;
return -1; }
118 virtual int IsCaseSensitive(
const char* pszFilename )
119 { (void) pszFilename;
return TRUE; }
120 virtual GIntBig GetDiskFreeSpace(
const char* ) {
return -1; }
121 virtual int SupportsSparseFiles(
const char* ) {
return FALSE; }
122 virtual int HasOptimizedReadMultiRange(
const char* ) {
return FALSE; }
123 virtual const char* GetActualURL(
const char* ) {
return nullptr; }
124 virtual const char* GetOptions() {
return nullptr; }
125 virtual char* GetSignedURL(
const char* ,
CSLConstList ) {
return nullptr; }
126 virtual bool Sync(
const char* pszSource,
const char* pszTarget,
127 const char*
const * papszOptions,
128 GDALProgressFunc pProgressFunc,
130 char*** ppapszOutputs );
132 virtual VSIDIR* OpenDir(
const char *pszPath,
int nRecurseDepth,
133 const char*
const *papszOptions);
135 virtual char** GetFileMetadata(
const char * pszFilename,
const char* pszDomain,
138 virtual bool SetFileMetadata(
const char * pszFilename,
140 const char* pszDomain,
143 virtual bool AbortPendingUploads(
const char* ) {
return true;}
145 virtual std::string GetStreamingFilename(
const std::string& osFilename)
const {
return osFilename; }
147 virtual bool IsLocal(
const char* ) {
return true; }
148 virtual bool SupportsSequentialWrite(
const char* ,
bool ) {
return true; }
149 virtual bool SupportsRandomWrite(
const char* ,
bool ) {
return true; }
150 virtual bool SupportsRead(
const char* ) {
return true; }
159 class CPL_DLL VSIFileManager
162 VSIFilesystemHandler *poDefaultHandler =
nullptr;
163 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
167 static VSIFileManager *Get();
174 static VSIFilesystemHandler *GetHandler(
const char * );
175 static void InstallHandler(
const std::string& osPrefix,
176 VSIFilesystemHandler * );
180 static char** GetPrefixes();
192 class VSIArchiveEntryFileOffset
195 virtual ~VSIArchiveEntryFileOffset();
202 VSIArchiveEntryFileOffset* file_pos;
207 class VSIArchiveContent
213 VSIArchiveEntry* entries =
nullptr;
215 ~VSIArchiveContent();
218 class VSIArchiveReader
221 virtual ~VSIArchiveReader();
223 virtual int GotoFirstFile() = 0;
224 virtual int GotoNextFile() = 0;
225 virtual VSIArchiveEntryFileOffset* GetFileOffset() = 0;
228 virtual GIntBig GetModifiedTime() = 0;
229 virtual int GotoFileOffset(VSIArchiveEntryFileOffset* pOffset) = 0;
232 class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
237 CPLMutex* hMutex =
nullptr;
241 std::map<CPLString,VSIArchiveContent*> oFileList{};
243 virtual const char* GetPrefix() = 0;
244 virtual std::vector<CPLString> GetExtensions() = 0;
245 virtual VSIArchiveReader* CreateReader(
const char* pszArchiveFileName) = 0;
248 VSIArchiveFilesystemHandler();
249 virtual ~VSIArchiveFilesystemHandler();
251 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
252 int nFlags )
override;
253 int Unlink(
const char *pszFilename )
override;
254 int Rename(
const char *oldpath,
const char *newpath )
override;
255 int Mkdir(
const char *pszDirname,
long nMode )
override;
256 int Rmdir(
const char *pszDirname )
override;
257 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles )
override;
259 virtual const VSIArchiveContent* GetContentOfArchive(
const char* archiveFilename, VSIArchiveReader* poReader =
nullptr);
260 virtual char* SplitFilename(
const char *pszFilename,
CPLString &osFileInArchive,
int bCheckMainFileExists);
261 virtual VSIArchiveReader* OpenArchiveFile(
const char* archiveFilename,
const char* fileInArchiveName);
262 virtual int FindFileInArchive(
const char* archiveFilename,
const char* fileInArchiveName,
const VSIArchiveEntry** archiveEntry);
264 virtual bool IsLocal(
const char* pszPath )
override;
265 virtual bool SupportsSequentialWrite(
const char* ,
bool )
override {
return false; }
266 virtual bool SupportsRandomWrite(
const char* ,
bool )
override {
return false; }
289 const GByte* pabyBeginningContent,
293 const int CPL_DEFLATE_TYPE_GZIP = 0;
294 const int CPL_DEFLATE_TYPE_ZLIB = 1;
295 const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;