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
void ClearErr() = 0;
114 virtual
int Eof() = 0;
116 virtual
int Error() = 0;
138 virtual bool HasPRead()
const;
139 virtual size_t PRead(
void *pBuffer,
size_t nSize,
170 typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
171 VSIVirtualHandleUniquePtr;
178 class CPL_DLL VSIFilesystemHandler
182 virtual ~VSIFilesystemHandler()
189 const char *pszAccess,
bool bSetError,
191 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
194 virtual int Unlink(
const char *pszFilename)
203 virtual int Mkdir(
const char *pszDirname,
long nMode)
211 virtual int Rmdir(
const char *pszDirname)
218 virtual int RmdirRecursive(
const char *pszDirname);
220 char **ReadDir(
const char *pszDirname)
222 return ReadDirEx(pszDirname, 0);
225 virtual char **ReadDirEx(
const char * ,
int )
230 virtual char **SiblingFiles(
const char * )
235 virtual int Rename(
const char *oldpath,
const char *newpath)
243 virtual int IsCaseSensitive(
const char *pszFilename)
249 virtual GIntBig GetDiskFreeSpace(
const char * )
254 virtual int SupportsSparseFiles(
const char * )
259 virtual int HasOptimizedReadMultiRange(
const char * )
264 virtual const char *GetActualURL(
const char * )
269 virtual const char *GetOptions()
274 virtual char *GetSignedURL(
const char * ,
280 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
281 const char *
const *papszOptions,
282 GDALProgressFunc pProgressFunc,
void *pProgressData,
283 char ***ppapszOutputs);
285 virtual int CopyFile(
const char *pszSource,
const char *pszTarget,
287 const char *
const *papszOptions,
288 GDALProgressFunc pProgressFunc,
void *pProgressData);
291 CopyFileRestartable(
const char *pszSource,
const char *pszTarget,
292 const char *pszInputPayload,
char **ppszOutputPayload,
294 GDALProgressFunc pProgressFunc,
void *pProgressData);
296 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
297 const char *
const *papszOptions);
299 virtual char **GetFileMetadata(
const char *pszFilename,
300 const char *pszDomain,
303 virtual bool SetFileMetadata(
const char *pszFilename,
305 const char *pszDomain,
309 MultipartUploadGetCapabilities(
int *pbNonSequentialUploadSupported,
310 int *pbParallelUploadSupported,
311 int *pbAbortSupported,
size_t *pnMinPartSize,
312 size_t *pnMaxPartSize,
int *pnMaxPartCount);
314 virtual char *MultipartUploadStart(
const char *pszFilename,
317 virtual char *MultipartUploadAddPart(
const char *pszFilename,
318 const char *pszUploadId,
321 const void *pData,
size_t nDataLength,
325 MultipartUploadEnd(
const char *pszFilename,
const char *pszUploadId,
326 size_t nPartIdsCount,
const char *
const *apszPartIds,
329 virtual bool MultipartUploadAbort(
const char *pszFilename,
330 const char *pszUploadId,
333 virtual bool AbortPendingUploads(
const char * )
339 GetStreamingFilename(
const std::string &osFilename)
const
352 GetCanonicalFilename(
const std::string &osFilename)
const
357 virtual bool IsLocal(
const char * )
362 virtual bool SupportsSequentialWrite(
const char * ,
368 virtual bool SupportsRandomWrite(
const char * ,
374 virtual bool SupportsRead(
const char * )
379 virtual VSIFilesystemHandler *Duplicate(
const char * )
382 "Duplicate() not supported on this file system");
392 virtual const char *GetDirectorySeparator(
CPL_UNUSED const char *pszPath)
404 class CPL_DLL VSIFileManager
407 VSIFilesystemHandler *poDefaultHandler =
nullptr;
408 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
412 static VSIFileManager *Get();
419 static VSIFilesystemHandler *GetHandler(
const char *);
420 static void InstallHandler(
const std::string &osPrefix,
421 VSIFilesystemHandler *);
422 static void RemoveHandler(
const std::string &osPrefix);
424 static char **GetPrefixes();
436 class VSIArchiveEntryFileOffset
439 virtual ~VSIArchiveEntryFileOffset();
446 VSIArchiveEntryFileOffset *file_pos;
451 class VSIArchiveContent
457 VSIArchiveEntry *entries =
nullptr;
459 ~VSIArchiveContent();
462 class VSIArchiveReader
465 virtual ~VSIArchiveReader();
467 virtual int GotoFirstFile() = 0;
468 virtual int GotoNextFile() = 0;
469 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
472 virtual GIntBig GetModifiedTime() = 0;
473 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
476 class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
481 CPLMutex *hMutex =
nullptr;
487 std::map<CPLString, VSIArchiveContent *> oFileList{};
489 virtual const char *GetPrefix() = 0;
490 virtual std::vector<CPLString> GetExtensions() = 0;
491 virtual VSIArchiveReader *CreateReader(
const char *pszArchiveFileName) = 0;
494 VSIArchiveFilesystemHandler();
495 virtual ~VSIArchiveFilesystemHandler();
497 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
498 int nFlags)
override;
499 int Unlink(
const char *pszFilename)
override;
500 int Rename(
const char *oldpath,
const char *newpath)
override;
501 int Mkdir(
const char *pszDirname,
long nMode)
override;
502 int Rmdir(
const char *pszDirname)
override;
503 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
505 virtual const VSIArchiveContent *
506 GetContentOfArchive(
const char *archiveFilename,
507 VSIArchiveReader *poReader =
nullptr);
508 virtual char *SplitFilename(
const char *pszFilename,
510 int bCheckMainFileExists);
511 virtual VSIArchiveReader *OpenArchiveFile(
const char *archiveFilename,
512 const char *fileInArchiveName);
513 virtual int FindFileInArchive(
const char *archiveFilename,
514 const char *fileInArchiveName,
515 const VSIArchiveEntry **archiveEntry);
517 virtual bool IsLocal(
const char *pszPath)
override;
520 SupportsSequentialWrite(
const char * ,
526 virtual bool SupportsRandomWrite(
const char * ,
555 const GByte *pabyBeginningContent,
557 constexpr
int VSI_CACHED_DEFAULT_CHUNK_SIZE = 32768;
560 size_t nChunkSize = VSI_CACHED_DEFAULT_CHUNK_SIZE,
561 size_t nCacheSize = 0);
563 const int CPL_DEFLATE_TYPE_GZIP = 0;
564 const int CPL_DEFLATE_TYPE_ZLIB = 1;
565 const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
568 int bAutoCloseBaseHandle);
572 bool bAutoCloseBaseHandle,
int nThreads,
574 size_t nSOZIPIndexEltSize,
575 std::vector<uint8_t> *panSOZIPIndex);
578 VSICreateUploadOnCloseFile(VSIVirtualHandleUniquePtr &&poWritableHandle,
579 VSIVirtualHandleUniquePtr &&poTmpFile,
580 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
void CPLError(CPLErr eErrClass, CPLErrorNum err_no, const char *fmt,...)
Report an error.
Definition: cpl_error.cpp:330
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:205
VSIRangeStatus
Range status.
Definition: cpl_vsi.h:184
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition: cpl_vsi.h:185
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition: cpl_vsi.h:404
GUIntBig vsi_l_offset
Type for a file offset.
Definition: cpl_vsi.h:146
Directory entry.
Definition: cpl_vsi.h:416
Helper close to use with a std:unique_ptr<VSIVirtualHandle>, such as VSIVirtualHandleUniquePtr.
Definition: cpl_vsi_virtual.h:157
void operator()(VSIVirtualHandle *poHandle)
Operator () that closes and deletes the file handle.
Definition: cpl_vsi_virtual.h:159
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:132
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:127
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.