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;
70 const size_t *panSizes);
107 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount) = 0;
112 virtual
int Eof() = 0;
134 virtual bool HasPRead()
const;
135 virtual size_t PRead(
void *pBuffer,
size_t nSize,
166typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
167 VSIVirtualHandleUniquePtr;
174class CPL_DLL VSIFilesystemHandler
178 virtual ~VSIFilesystemHandler()
185 const char *pszAccess,
bool bSetError,
187 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
190 virtual int Unlink(
const char *pszFilename)
199 virtual int Mkdir(
const char *pszDirname,
long nMode)
207 virtual int Rmdir(
const char *pszDirname)
214 virtual int RmdirRecursive(
const char *pszDirname);
216 char **ReadDir(
const char *pszDirname)
218 return ReadDirEx(pszDirname, 0);
221 virtual char **ReadDirEx(
const char * ,
int )
226 virtual char **SiblingFiles(
const char * )
231 virtual int Rename(
const char *oldpath,
const char *newpath)
239 virtual int IsCaseSensitive(
const char *pszFilename)
245 virtual GIntBig GetDiskFreeSpace(
const char * )
250 virtual int SupportsSparseFiles(
const char * )
255 virtual int HasOptimizedReadMultiRange(
const char * )
260 virtual const char *GetActualURL(
const char * )
265 virtual const char *GetOptions()
270 virtual char *GetSignedURL(
const char * ,
276 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
277 const char *
const *papszOptions,
278 GDALProgressFunc pProgressFunc,
void *pProgressData,
279 char ***ppapszOutputs);
281 virtual int CopyFile(
const char *pszSource,
const char *pszTarget,
283 const char *
const *papszOptions,
284 GDALProgressFunc pProgressFunc,
void *pProgressData);
286 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
287 const char *
const *papszOptions);
289 virtual char **GetFileMetadata(
const char *pszFilename,
290 const char *pszDomain,
293 virtual bool SetFileMetadata(
const char *pszFilename,
295 const char *pszDomain,
298 virtual bool AbortPendingUploads(
const char * )
304 GetStreamingFilename(
const std::string &osFilename)
const
317 GetCanonicalFilename(
const std::string &osFilename)
const
322 virtual bool IsLocal(
const char * )
327 virtual bool SupportsSequentialWrite(
const char * ,
333 virtual bool SupportsRandomWrite(
const char * ,
339 virtual bool SupportsRead(
const char * )
344 virtual VSIFilesystemHandler *Duplicate(
const char * )
347 "Duplicate() not supported on this file system");
357 virtual const char *GetDirectorySeparator(
CPL_UNUSED const char *pszPath)
369class CPL_DLL VSIFileManager
372 VSIFilesystemHandler *poDefaultHandler =
nullptr;
373 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
377 static VSIFileManager *Get();
384 static VSIFilesystemHandler *GetHandler(
const char *);
385 static void InstallHandler(
const std::string &osPrefix,
386 VSIFilesystemHandler *);
387 static void RemoveHandler(
const std::string &osPrefix);
389 static char **GetPrefixes();
401class VSIArchiveEntryFileOffset
404 virtual ~VSIArchiveEntryFileOffset();
411 VSIArchiveEntryFileOffset *file_pos;
416class VSIArchiveContent
422 VSIArchiveEntry *entries =
nullptr;
424 ~VSIArchiveContent();
427class VSIArchiveReader
430 virtual ~VSIArchiveReader();
432 virtual int GotoFirstFile() = 0;
433 virtual int GotoNextFile() = 0;
434 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
437 virtual GIntBig GetModifiedTime() = 0;
438 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
441class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
446 CPLMutex *hMutex =
nullptr;
452 std::map<CPLString, VSIArchiveContent *> oFileList{};
454 virtual const char *GetPrefix() = 0;
455 virtual std::vector<CPLString> GetExtensions() = 0;
456 virtual VSIArchiveReader *CreateReader(
const char *pszArchiveFileName) = 0;
459 VSIArchiveFilesystemHandler();
460 virtual ~VSIArchiveFilesystemHandler();
462 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
463 int nFlags)
override;
464 int Unlink(
const char *pszFilename)
override;
465 int Rename(
const char *oldpath,
const char *newpath)
override;
466 int Mkdir(
const char *pszDirname,
long nMode)
override;
467 int Rmdir(
const char *pszDirname)
override;
468 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
470 virtual const VSIArchiveContent *
471 GetContentOfArchive(
const char *archiveFilename,
472 VSIArchiveReader *poReader =
nullptr);
473 virtual char *SplitFilename(
const char *pszFilename,
475 int bCheckMainFileExists);
476 virtual VSIArchiveReader *OpenArchiveFile(
const char *archiveFilename,
477 const char *fileInArchiveName);
478 virtual int FindFileInArchive(
const char *archiveFilename,
479 const char *fileInArchiveName,
480 const VSIArchiveEntry **archiveEntry);
482 virtual bool IsLocal(
const char *pszPath)
override;
485 SupportsSequentialWrite(
const char * ,
491 virtual bool SupportsRandomWrite(
const char * ,
520 const GByte *pabyBeginningContent,
522constexpr int VSI_CACHED_DEFAULT_CHUNK_SIZE = 32768;
525 size_t nChunkSize = VSI_CACHED_DEFAULT_CHUNK_SIZE,
526 size_t nCacheSize = 0);
528const int CPL_DEFLATE_TYPE_GZIP = 0;
529const int CPL_DEFLATE_TYPE_ZLIB = 1;
530const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
533 int bAutoCloseBaseHandle);
537 bool bAutoCloseBaseHandle,
int nThreads,
539 size_t nSOZIPIndexEltSize,
540 std::vector<uint8_t> *panSOZIPIndex);
543VSICreateUploadOnCloseFile(VSIVirtualHandleUniquePtr &&poWritableHandle,
544 VSIVirtualHandleUniquePtr &&poTmpFile,
545 const std::string &osTmpFilename);
Convenient string class based on std::string.
Definition: cpl_string.h:320
#define CPLE_NotSupported
Not supported.
Definition: cpl_error.h:110
unsigned long long GUIntBig
Large unsigned integer type (generally 64-bit unsigned integer type).
Definition: cpl_port.h:218
#define CPL_UNUSED
Qualifier for an argument that is unused.
Definition: cpl_port.h:985
#define CPL_FORMAT_STRING(arg)
Macro into which to wrap the format argument of a printf-like function.
Definition: cpl_port.h:966
#define CPL_PRINT_FUNC_FORMAT(format_idx, arg_idx)
Tag a function to have printf() formatting.
Definition: cpl_port.h:950
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition: cpl_port.h:1042
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1183
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:185
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:215
Various convenience functions for working with strings and string lists.
#define VSIStatBufL
Type for VSIStatL()
Definition: cpl_vsi.h:203
VSIRangeStatus
Range status.
Definition: cpl_vsi.h:182
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition: cpl_vsi.h:183
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition: cpl_vsi.h:402
GUIntBig vsi_l_offset
Type for a file offset.
Definition: cpl_vsi.h:146
Directory entry.
Definition: cpl_vsi.h:414
Helper close to use with a std:unique_ptr<VSIVirtualHandle>, such as VSIVirtualHandleUniquePtr.
Definition: cpl_vsi_virtual.h:153
void operator()(VSIVirtualHandle *poHandle)
Operator () that closes and deletes the file handle.
Definition: cpl_vsi_virtual.h:155
Virtual file handle.
Definition: cpl_vsi_virtual.h:63
virtual int Close()=0
Close file.
virtual VSIRangeStatus GetRangeStatus(vsi_l_offset nOffset, vsi_l_offset nLength)
Return if a given file range contains data or holes filled with zeroes.
Definition: cpl_vsi_virtual.h:128
virtual vsi_l_offset Tell()=0
Tell current file offset.
virtual int Seek(vsi_l_offset nOffset, int nWhence)=0
Seek to requested offset.
virtual size_t Read(void *pBuffer, size_t nSize, size_t nCount)=0
Read bytes from file.
virtual void * GetNativeFileDescriptor()
Returns the "native" file descriptor for the virtual handle.
Definition: cpl_vsi_virtual.h:123
virtual size_t GetAdviseReadTotalBytesLimit() const
Return the total maximum number of bytes that AdviseRead() can handle at once.
Definition: cpl_vsi_virtual.h:102
virtual void AdviseRead(int nRanges, const vsi_l_offset *panOffsets, const size_t *panSizes)
This method is called when code plans to access soon one or several ranges in a file.
Definition: cpl_vsi_virtual.h:84
virtual int ReadMultiRange(int nRanges, void **ppData, const vsi_l_offset *panOffsets, const size_t *panSizes)
Read several ranges of bytes from file.
virtual size_t Write(const void *pBuffer, size_t nSize, size_t nCount)=0
Write bytes to file.
virtual int Truncate(vsi_l_offset nNewSize)
Truncate/expand the file to the specified size.