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; }
83 class CPL_DLL VSIFilesystemHandler {
87 virtual ~VSIFilesystemHandler() {}
90 const char *pszAccess );
93 const char *pszAccess,
95 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
int nFlags) = 0;
96 virtual int Unlink(
const char *pszFilename )
97 { (void) pszFilename; errno=ENOENT;
return -1; }
99 virtual int Mkdir(
const char *pszDirname,
long nMode )
100 {(void)pszDirname; (void)nMode; errno=ENOENT;
return -1;}
101 virtual int Rmdir(
const char *pszDirname )
102 { (void) pszDirname; errno=ENOENT;
return -1; }
103 virtual int RmdirRecursive(
const char *pszDirname );
104 virtual char **ReadDir(
const char *pszDirname )
105 { (void) pszDirname;
return nullptr; }
106 virtual char **ReadDirEx(
const char *pszDirname,
int )
107 {
return ReadDir(pszDirname); }
108 virtual int Rename(
const char *oldpath,
const char *newpath )
109 { (void) oldpath; (void)newpath; errno=ENOENT;
return -1; }
110 virtual int IsCaseSensitive(
const char* pszFilename )
111 { (void) pszFilename;
return TRUE; }
112 virtual GIntBig GetDiskFreeSpace(
const char* ) {
return -1; }
113 virtual int SupportsSparseFiles(
const char* ) {
return FALSE; }
114 virtual int HasOptimizedReadMultiRange(
const char* ) {
return FALSE; }
115 virtual const char* GetActualURL(
const char* ) {
return nullptr; }
116 virtual const char* GetOptions() {
return nullptr; }
117 virtual char* GetSignedURL(
const char* ,
CSLConstList ) {
return nullptr; }
118 virtual bool Sync(
const char* pszSource,
const char* pszTarget,
119 const char*
const * papszOptions,
120 GDALProgressFunc pProgressFunc,
122 char*** ppapszOutputs );
124 virtual VSIDIR* OpenDir(
const char *pszPath,
int nRecurseDepth,
125 const char*
const *papszOptions);
127 virtual char** GetFileMetadata(
const char * pszFilename,
const char* pszDomain,
130 virtual bool SetFileMetadata(
const char * pszFilename,
132 const char* pszDomain,
142 class CPL_DLL VSIFileManager
145 VSIFilesystemHandler *poDefaultHandler =
nullptr;
146 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
150 static VSIFileManager *Get();
157 static VSIFilesystemHandler *GetHandler(
const char * );
158 static void InstallHandler(
const std::string& osPrefix,
159 VSIFilesystemHandler * );
163 static char** GetPrefixes();
175 class VSIArchiveEntryFileOffset
178 virtual ~VSIArchiveEntryFileOffset();
185 VSIArchiveEntryFileOffset* file_pos;
190 class VSIArchiveContent
196 VSIArchiveEntry* entries =
nullptr;
198 ~VSIArchiveContent();
201 class VSIArchiveReader
204 virtual ~VSIArchiveReader();
206 virtual int GotoFirstFile() = 0;
207 virtual int GotoNextFile() = 0;
208 virtual VSIArchiveEntryFileOffset* GetFileOffset() = 0;
211 virtual GIntBig GetModifiedTime() = 0;
212 virtual int GotoFileOffset(VSIArchiveEntryFileOffset* pOffset) = 0;
215 class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
220 CPLMutex* hMutex =
nullptr;
224 std::map<CPLString,VSIArchiveContent*> oFileList{};
226 virtual const char* GetPrefix() = 0;
227 virtual std::vector<CPLString> GetExtensions() = 0;
228 virtual VSIArchiveReader* CreateReader(
const char* pszArchiveFileName) = 0;
231 VSIArchiveFilesystemHandler();
232 virtual ~VSIArchiveFilesystemHandler();
234 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
235 int nFlags )
override;
236 int Unlink(
const char *pszFilename )
override;
237 int Rename(
const char *oldpath,
const char *newpath )
override;
238 int Mkdir(
const char *pszDirname,
long nMode )
override;
239 int Rmdir(
const char *pszDirname )
override;
240 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles )
override;
242 virtual const VSIArchiveContent* GetContentOfArchive(
const char* archiveFilename, VSIArchiveReader* poReader =
nullptr);
243 virtual char* SplitFilename(
const char *pszFilename,
CPLString &osFileInArchive,
int bCheckMainFileExists);
244 virtual VSIArchiveReader* OpenArchiveFile(
const char* archiveFilename,
const char* fileInArchiveName);
245 virtual int FindFileInArchive(
const char* archiveFilename,
const char* fileInArchiveName,
const VSIArchiveEntry** archiveEntry);
268 const GByte* pabyBeginningContent,
272 const int CPL_DEFLATE_TYPE_GZIP = 0;
273 const int CPL_DEFLATE_TYPE_ZLIB = 1;
274 const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;