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
66 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount) = 0;
67 virtual int ReadMultiRange(
int nRanges,
void **ppData,
69 const size_t *panSizes);
83 virtual void AdviseRead(
CPL_UNUSED int nRanges,
89 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount) = 0;
90 virtual int Eof() = 0;
95 virtual int Close() = 0;
98 virtual void *GetNativeFileDescriptor()
107 virtual bool HasPRead()
const;
108 virtual size_t PRead(
void *pBuffer,
size_t nSize,
139 typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
140 VSIVirtualHandleUniquePtr;
147 class CPL_DLL VSIFilesystemHandler
151 virtual ~VSIFilesystemHandler()
158 const char *pszAccess,
bool bSetError,
160 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
162 virtual int Unlink(
const char *pszFilename)
169 virtual int Mkdir(
const char *pszDirname,
long nMode)
176 virtual int Rmdir(
const char *pszDirname)
182 virtual int RmdirRecursive(
const char *pszDirname);
183 virtual char **ReadDir(
const char *pszDirname)
188 virtual char **ReadDirEx(
const char *pszDirname,
int )
190 return ReadDir(pszDirname);
192 virtual char **SiblingFiles(
const char * )
196 virtual int Rename(
const char *oldpath,
const char *newpath)
203 virtual int IsCaseSensitive(
const char *pszFilename)
208 virtual GIntBig GetDiskFreeSpace(
const char * )
212 virtual int SupportsSparseFiles(
const char * )
216 virtual int HasOptimizedReadMultiRange(
const char * )
220 virtual const char *GetActualURL(
const char * )
224 virtual const char *GetOptions()
228 virtual char *GetSignedURL(
const char * ,
233 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
234 const char *
const *papszOptions,
235 GDALProgressFunc pProgressFunc,
void *pProgressData,
236 char ***ppapszOutputs);
238 virtual int CopyFile(
const char *pszSource,
const char *pszTarget,
240 const char *
const *papszOptions,
241 GDALProgressFunc pProgressFunc,
void *pProgressData);
243 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
244 const char *
const *papszOptions);
246 virtual char **GetFileMetadata(
const char *pszFilename,
247 const char *pszDomain,
250 virtual bool SetFileMetadata(
const char *pszFilename,
252 const char *pszDomain,
255 virtual bool AbortPendingUploads(
const char * )
261 GetStreamingFilename(
const std::string &osFilename)
const
266 virtual bool IsLocal(
const char * )
270 virtual bool SupportsSequentialWrite(
const char * ,
275 virtual bool SupportsRandomWrite(
const char * ,
280 virtual bool SupportsRead(
const char * )
285 virtual VSIFilesystemHandler *Duplicate(
const char * )
288 "Duplicate() not supported on this file system");
299 class CPL_DLL VSIFileManager
302 VSIFilesystemHandler *poDefaultHandler =
nullptr;
303 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
307 static VSIFileManager *Get();
314 static VSIFilesystemHandler *GetHandler(
const char *);
315 static void InstallHandler(
const std::string &osPrefix,
316 VSIFilesystemHandler *);
320 static char **GetPrefixes();
332 class VSIArchiveEntryFileOffset
335 virtual ~VSIArchiveEntryFileOffset();
342 VSIArchiveEntryFileOffset *file_pos;
347 class VSIArchiveContent
353 VSIArchiveEntry *entries =
nullptr;
355 ~VSIArchiveContent();
358 class VSIArchiveReader
361 virtual ~VSIArchiveReader();
363 virtual int GotoFirstFile() = 0;
364 virtual int GotoNextFile() = 0;
365 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
368 virtual GIntBig GetModifiedTime() = 0;
369 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
372 class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
377 CPLMutex *hMutex =
nullptr;
383 std::map<CPLString, VSIArchiveContent *> oFileList{};
385 virtual const char *GetPrefix() = 0;
386 virtual std::vector<CPLString> GetExtensions() = 0;
387 virtual VSIArchiveReader *CreateReader(
const char *pszArchiveFileName) = 0;
390 VSIArchiveFilesystemHandler();
391 virtual ~VSIArchiveFilesystemHandler();
393 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
394 int nFlags)
override;
395 int Unlink(
const char *pszFilename)
override;
396 int Rename(
const char *oldpath,
const char *newpath)
override;
397 int Mkdir(
const char *pszDirname,
long nMode)
override;
398 int Rmdir(
const char *pszDirname)
override;
399 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
401 virtual const VSIArchiveContent *
402 GetContentOfArchive(
const char *archiveFilename,
403 VSIArchiveReader *poReader =
nullptr);
404 virtual char *SplitFilename(
const char *pszFilename,
406 int bCheckMainFileExists);
407 virtual VSIArchiveReader *OpenArchiveFile(
const char *archiveFilename,
408 const char *fileInArchiveName);
409 virtual int FindFileInArchive(
const char *archiveFilename,
410 const char *fileInArchiveName,
411 const VSIArchiveEntry **archiveEntry);
413 virtual bool IsLocal(
const char *pszPath)
override;
415 SupportsSequentialWrite(
const char * ,
420 virtual bool SupportsRandomWrite(
const char * ,
449 const GByte *pabyBeginningContent,
452 size_t nChunkSize = 32768,
453 size_t nCacheSize = 0);
455 const int CPL_DEFLATE_TYPE_GZIP = 0;
456 const int CPL_DEFLATE_TYPE_ZLIB = 1;
457 const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
460 int bAutoCloseBaseHandle);
464 bool bAutoCloseBaseHandle,
int nThreads,
466 size_t nSOZIPIndexEltSize,
467 std::vector<uint8_t> *panSOZIPIndex);