18#ifndef CPL_VSI_VIRTUAL_H_INCLUDED
19#define CPL_VSI_VIRTUAL_H_INCLUDED
22#include "cpl_vsi_error.h"
24#include "cpl_multiproc.h"
32#ifdef GetDiskFreeSpace
33#undef GetDiskFreeSpace
51 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount) = 0;
54 const size_t *panSizes);
91 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount) = 0;
96 virtual
void ClearErr() = 0;
98 virtual
int Eof() = 0;
100 virtual
int Error() = 0;
122 virtual bool HasPRead()
const;
123 virtual size_t PRead(
void *pBuffer,
size_t nSize,
162typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
163 VSIVirtualHandleUniquePtr;
170class CPL_DLL VSIFilesystemHandler
174 virtual ~VSIFilesystemHandler()
181 const char *pszAccess,
bool bSetError,
183 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
186 virtual int Unlink(
const char *pszFilename)
195 virtual int Mkdir(
const char *pszDirname,
long nMode)
203 virtual int Rmdir(
const char *pszDirname)
210 virtual int RmdirRecursive(
const char *pszDirname);
212 char **ReadDir(
const char *pszDirname)
214 return ReadDirEx(pszDirname, 0);
217 virtual char **ReadDirEx(
const char * ,
int )
222 virtual char **SiblingFiles(
const char * )
227 virtual int Rename(
const char *oldpath,
const char *newpath)
235 virtual int IsCaseSensitive(
const char *pszFilename)
241 virtual GIntBig GetDiskFreeSpace(
const char * )
246 virtual int SupportsSparseFiles(
const char * )
251 virtual int HasOptimizedReadMultiRange(
const char * )
256 virtual const char *GetActualURL(
const char * )
261 virtual const char *GetOptions()
266 virtual char *GetSignedURL(
const char * ,
272 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
273 const char *
const *papszOptions,
274 GDALProgressFunc pProgressFunc,
void *pProgressData,
275 char ***ppapszOutputs);
277 virtual int CopyFile(
const char *pszSource,
const char *pszTarget,
279 const char *
const *papszOptions,
280 GDALProgressFunc pProgressFunc,
void *pProgressData);
283 CopyFileRestartable(
const char *pszSource,
const char *pszTarget,
284 const char *pszInputPayload,
char **ppszOutputPayload,
286 GDALProgressFunc pProgressFunc,
void *pProgressData);
288 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
289 const char *
const *papszOptions);
291 virtual char **GetFileMetadata(
const char *pszFilename,
292 const char *pszDomain,
295 virtual bool SetFileMetadata(
const char *pszFilename,
297 const char *pszDomain,
301 MultipartUploadGetCapabilities(
int *pbNonSequentialUploadSupported,
302 int *pbParallelUploadSupported,
303 int *pbAbortSupported,
size_t *pnMinPartSize,
304 size_t *pnMaxPartSize,
int *pnMaxPartCount);
306 virtual char *MultipartUploadStart(
const char *pszFilename,
309 virtual char *MultipartUploadAddPart(
const char *pszFilename,
310 const char *pszUploadId,
313 const void *pData,
size_t nDataLength,
317 MultipartUploadEnd(
const char *pszFilename,
const char *pszUploadId,
318 size_t nPartIdsCount,
const char *
const *apszPartIds,
321 virtual bool MultipartUploadAbort(
const char *pszFilename,
322 const char *pszUploadId,
325 virtual bool AbortPendingUploads(
const char * )
331 GetStreamingFilename(
const std::string &osFilename)
const
337 GetNonStreamingFilename(
const std::string &osFilename)
const
350 GetCanonicalFilename(
const std::string &osFilename)
const
355 virtual bool IsLocal(
const char * )
360 virtual bool SupportsSequentialWrite(
const char * ,
366 virtual bool SupportsRandomWrite(
const char * ,
372 virtual bool SupportsRead(
const char * )
377 virtual VSIFilesystemHandler *Duplicate(
const char * )
380 "Duplicate() not supported on this file system");
390 virtual const char *GetDirectorySeparator(
CPL_UNUSED const char *pszPath)
402class CPL_DLL VSIFileManager
405 VSIFilesystemHandler *poDefaultHandler =
nullptr;
406 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
410 static VSIFileManager *Get();
417 static VSIFilesystemHandler *GetHandler(
const char *);
418 static void InstallHandler(
const std::string &osPrefix,
419 VSIFilesystemHandler *);
420 static void RemoveHandler(
const std::string &osPrefix);
422 static char **GetPrefixes();
434class VSIArchiveEntryFileOffset
437 virtual ~VSIArchiveEntryFileOffset();
444 VSIArchiveEntryFileOffset *file_pos;
449class VSIArchiveContent
455 VSIArchiveEntry *entries =
nullptr;
457 ~VSIArchiveContent();
460class VSIArchiveReader
463 virtual ~VSIArchiveReader();
465 virtual int GotoFirstFile() = 0;
466 virtual int GotoNextFile() = 0;
467 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
470 virtual GIntBig GetModifiedTime() = 0;
471 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
474class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
479 CPLMutex *hMutex =
nullptr;
485 std::map<CPLString, VSIArchiveContent *> oFileList{};
487 virtual const char *GetPrefix() = 0;
488 virtual std::vector<CPLString> GetExtensions() = 0;
489 virtual VSIArchiveReader *CreateReader(
const char *pszArchiveFileName) = 0;
492 VSIArchiveFilesystemHandler();
493 virtual ~VSIArchiveFilesystemHandler();
495 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
496 int nFlags)
override;
497 int Unlink(
const char *pszFilename)
override;
498 int Rename(
const char *oldpath,
const char *newpath)
override;
499 int Mkdir(
const char *pszDirname,
long nMode)
override;
500 int Rmdir(
const char *pszDirname)
override;
501 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
503 virtual const VSIArchiveContent *
504 GetContentOfArchive(
const char *archiveFilename,
505 VSIArchiveReader *poReader =
nullptr);
506 virtual char *SplitFilename(
const char *pszFilename,
508 int bCheckMainFileExists);
509 virtual VSIArchiveReader *OpenArchiveFile(
const char *archiveFilename,
510 const char *fileInArchiveName);
511 virtual int FindFileInArchive(
const char *archiveFilename,
512 const char *fileInArchiveName,
513 const VSIArchiveEntry **archiveEntry);
515 virtual bool IsLocal(
const char *pszPath)
override;
518 SupportsSequentialWrite(
const char * ,
524 virtual bool SupportsRandomWrite(
const char * ,
553 const GByte *pabyBeginningContent,
555constexpr int VSI_CACHED_DEFAULT_CHUNK_SIZE = 32768;
558 size_t nChunkSize = VSI_CACHED_DEFAULT_CHUNK_SIZE,
559 size_t nCacheSize = 0);
561const int CPL_DEFLATE_TYPE_GZIP = 0;
562const int CPL_DEFLATE_TYPE_ZLIB = 1;
563const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
566 int bAutoCloseBaseHandle);
570 bool bAutoCloseBaseHandle,
int nThreads,
572 size_t nSOZIPIndexEltSize,
573 std::vector<uint8_t> *panSOZIPIndex);
576VSICreateUploadOnCloseFile(VSIVirtualHandleUniquePtr &&poWritableHandle,
577 VSIVirtualHandleUniquePtr &&poTmpFile,
578 const std::string &osTmpFilename);
Convenient string class based on std::string.
Definition: cpl_string.h:307
#define CPLE_NotSupported
Not supported.
Definition: cpl_error.h:94
void CPLError(CPLErr eErrClass, CPLErrorNum err_no, const char *fmt,...)
Report an error.
Definition: cpl_error.cpp:314
unsigned long long GUIntBig
Large unsigned integer type (generally 64-bit unsigned integer type).
Definition: cpl_port.h:202
#define CPL_UNUSED
Qualifier for an argument that is unused.
Definition: cpl_port.h:973
#define CPL_FORMAT_STRING(arg)
Macro into which to wrap the format argument of a printf-like function.
Definition: cpl_port.h:954
#define CPL_PRINT_FUNC_FORMAT(format_idx, arg_idx)
Tag a function to have printf() formatting.
Definition: cpl_port.h:938
#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:1030
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1179
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:169
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:199
Various convenience functions for working with strings and string lists.
#define VSIStatBufL
Type for VSIStatL()
Definition: cpl_vsi.h:189
VSIRangeStatus
Range status.
Definition: cpl_vsi.h:168
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition: cpl_vsi.h:169
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition: cpl_vsi.h:388
GUIntBig vsi_l_offset
Type for a file offset.
Definition: cpl_vsi.h:130
Directory entry.
Definition: cpl_vsi.h:400
Helper close to use with a std:unique_ptr<VSIVirtualHandle>, such as VSIVirtualHandleUniquePtr.
Definition: cpl_vsi_virtual.h:149
void operator()(VSIVirtualHandle *poHandle)
Operator () that closes and deletes the file handle.
Definition: cpl_vsi_virtual.h:151
Virtual file handle.
Definition: cpl_vsi_virtual.h:47
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:116
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:111
virtual size_t GetAdviseReadTotalBytesLimit() const
Return the total maximum number of bytes that AdviseRead() can handle at once.
Definition: cpl_vsi_virtual.h:86
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:68
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 void Interrupt()
Ask current operations to be interrupted.
Definition: cpl_vsi_virtual.h:130
virtual int Truncate(vsi_l_offset nNewSize)
Truncate/expand the file to the specified size.