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"
48 #ifdef GetDiskFreeSpace
49 #undef GetDiskFreeSpace
67 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount) = 0;
68 virtual int ReadMultiRange(
int nRanges,
void **ppData,
70 const size_t *panSizes);
84 virtual void AdviseRead(
CPL_UNUSED int nRanges,
90 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount) = 0;
91 virtual int Eof() = 0;
96 virtual int Close() = 0;
99 virtual void *GetNativeFileDescriptor()
108 virtual bool HasPRead()
const;
109 virtual size_t PRead(
void *pBuffer,
size_t nSize,
140 typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
141 VSIVirtualHandleUniquePtr;
148 class CPL_DLL VSIFilesystemHandler
152 virtual ~VSIFilesystemHandler()
159 const char *pszAccess,
bool bSetError,
161 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
163 virtual int Unlink(
const char *pszFilename)
170 virtual int Mkdir(
const char *pszDirname,
long nMode)
177 virtual int Rmdir(
const char *pszDirname)
183 virtual int RmdirRecursive(
const char *pszDirname);
184 char **ReadDir(
const char *pszDirname)
186 return ReadDirEx(pszDirname, 0);
188 virtual char **ReadDirEx(
const char * ,
int )
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
274 GetCanonicalFilename(
const std::string &osFilename)
const
279 virtual bool IsLocal(
const char * )
283 virtual bool SupportsSequentialWrite(
const char * ,
288 virtual bool SupportsRandomWrite(
const char * ,
293 virtual bool SupportsRead(
const char * )
298 virtual VSIFilesystemHandler *Duplicate(
const char * )
301 "Duplicate() not supported on this file system");
312 class CPL_DLL VSIFileManager
315 VSIFilesystemHandler *poDefaultHandler =
nullptr;
316 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
320 static VSIFileManager *Get();
327 static VSIFilesystemHandler *GetHandler(
const char *);
328 static void InstallHandler(
const std::string &osPrefix,
329 VSIFilesystemHandler *);
333 static char **GetPrefixes();
345 class VSIArchiveEntryFileOffset
348 virtual ~VSIArchiveEntryFileOffset();
355 VSIArchiveEntryFileOffset *file_pos;
360 class VSIArchiveContent
366 VSIArchiveEntry *entries =
nullptr;
368 ~VSIArchiveContent();
371 class VSIArchiveReader
374 virtual ~VSIArchiveReader();
376 virtual int GotoFirstFile() = 0;
377 virtual int GotoNextFile() = 0;
378 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
381 virtual GIntBig GetModifiedTime() = 0;
382 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
385 class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
390 CPLMutex *hMutex =
nullptr;
396 std::map<CPLString, VSIArchiveContent *> oFileList{};
398 virtual const char *GetPrefix() = 0;
399 virtual std::vector<CPLString> GetExtensions() = 0;
400 virtual VSIArchiveReader *CreateReader(
const char *pszArchiveFileName) = 0;
403 VSIArchiveFilesystemHandler();
404 virtual ~VSIArchiveFilesystemHandler();
406 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
407 int nFlags)
override;
408 int Unlink(
const char *pszFilename)
override;
409 int Rename(
const char *oldpath,
const char *newpath)
override;
410 int Mkdir(
const char *pszDirname,
long nMode)
override;
411 int Rmdir(
const char *pszDirname)
override;
412 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
414 virtual const VSIArchiveContent *
415 GetContentOfArchive(
const char *archiveFilename,
416 VSIArchiveReader *poReader =
nullptr);
417 virtual char *SplitFilename(
const char *pszFilename,
419 int bCheckMainFileExists);
420 virtual VSIArchiveReader *OpenArchiveFile(
const char *archiveFilename,
421 const char *fileInArchiveName);
422 virtual int FindFileInArchive(
const char *archiveFilename,
423 const char *fileInArchiveName,
424 const VSIArchiveEntry **archiveEntry);
426 virtual bool IsLocal(
const char *pszPath)
override;
428 SupportsSequentialWrite(
const char * ,
433 virtual bool SupportsRandomWrite(
const char * ,
462 const GByte *pabyBeginningContent,
464 constexpr
int VSI_CACHED_DEFAULT_CHUNK_SIZE = 32768;
467 size_t nChunkSize = VSI_CACHED_DEFAULT_CHUNK_SIZE,
468 size_t nCacheSize = 0);
470 const int CPL_DEFLATE_TYPE_GZIP = 0;
471 const int CPL_DEFLATE_TYPE_ZLIB = 1;
472 const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
475 int bAutoCloseBaseHandle);
479 bool bAutoCloseBaseHandle,
int nThreads,
481 size_t nSOZIPIndexEltSize,
482 std::vector<uint8_t> *panSOZIPIndex);
485 VSICreateUploadOnCloseFile(VSIVirtualHandleUniquePtr &&poWritableHandle,
486 VSIVirtualHandleUniquePtr &&poTmpFile,
487 const std::string &osTmpFilename);