17#ifndef CPL_VSI_VIRTUAL_H_INCLUDED
18#define CPL_VSI_VIRTUAL_H_INCLUDED
20#include "cpl_progress.h"
22#include "cpl_vsi_error.h"
33#ifdef GetDiskFreeSpace
34#undef GetDiskFreeSpace
52#ifdef GDAL_COMPILATION
54 inline int Seek(
int &&nOffset,
int nWhence)
56 return Seek(
static_cast<vsi_l_offset>(nOffset), nWhence);
59 inline int Seek(
unsigned &&nOffset,
int nWhence)
61 return Seek(
static_cast<vsi_l_offset>(nOffset), nWhence);
65 inline std::enable_if_t<std::is_same_v<T, uint64_t> &&
66 !std::is_same_v<uint64_t, vsi_l_offset>,
68 Seek(T nOffset,
int nWhence)
70 return Seek(
static_cast<vsi_l_offset>(nOffset), nWhence);
74 inline std::enable_if_t<std::is_same_v<T, size_t> &&
75 !std::is_same_v<T, uint64_t> &&
76 !std::is_same_v<size_t, unsigned> &&
77 !std::is_same_v<size_t, vsi_l_offset>,
79 Seek(T nOffset,
int nWhence) =
delete;
81 int Seek(
int &nOffset,
int nWhence) =
delete;
82 int Seek(
const int &nOffset,
int nWhence) =
delete;
83 int Seek(
unsigned &nOffset,
int nWhence) =
delete;
84 int Seek(
const unsigned &nOffset,
int nWhence) =
delete;
89 size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount);
91 virtual size_t Read(
void *pBuffer,
size_t nBytes) = 0;
103 template <
class T>
inline T
ReadLSB(
bool *pbError =
nullptr)
106 if (Read(&val,
sizeof(val)) !=
sizeof(val))
116 template <
class T>
inline bool ReadLSB(T &val)
118 if (Read(&val,
sizeof(val)) !=
sizeof(val))
126 bool ReadLSB(
bool &) =
delete;
130 const size_t *panSizes);
167 virtual size_t Write(
const void *pBuffer,
size_t nBytes) = 0;
168 size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount);
174 return Write(&val,
sizeof(val)) ==
sizeof(val);
180 virtual
void ClearErr() = 0;
182 virtual
int Eof() = 0;
184 virtual
int Error() = 0;
206 virtual bool HasPRead()
const;
207 virtual size_t PRead(
void *pBuffer,
size_t nSize,
254typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
255 VSIVirtualHandleUniquePtr;
265 VSIVirtualHandleUniquePtr m_nativeHandle{};
268 explicit VSIProxyFileHandle(VSIVirtualHandleUniquePtr &&nativeHandle)
269 : m_nativeHandle(std::move(nativeHandle))
275 return m_nativeHandle->Seek(nOffset, nWhence);
280 return m_nativeHandle->Tell();
283 size_t Read(
void *pBuffer,
size_t nBytes)
override
285 return m_nativeHandle->Read(pBuffer, nBytes);
290 const size_t *panSizes)
override
292 return m_nativeHandle->ReadMultiRange(nRanges, ppData, panOffsets,
297 const size_t *panSizes)
override
299 return m_nativeHandle->AdviseRead(nRanges, panOffsets, panSizes);
304 return m_nativeHandle->GetAdviseReadTotalBytesLimit();
307 size_t Write(
const void *pBuffer,
size_t nBytes)
override
309 return m_nativeHandle->Write(pBuffer, nBytes);
314 return m_nativeHandle->ClearErr();
319 return m_nativeHandle->Eof();
324 return m_nativeHandle->Error();
329 return m_nativeHandle->Flush();
334 return m_nativeHandle->Close();
339 return m_nativeHandle->Truncate(nNewSize);
344 return m_nativeHandle->GetNativeFileDescriptor();
350 return m_nativeHandle->GetRangeStatus(nOffset, nLength);
355 return m_nativeHandle->HasPRead();
358 size_t PRead(
void *pBuffer,
size_t nSize,
361 return m_nativeHandle->PRead(pBuffer, nSize, nOffset);
366 m_nativeHandle->Interrupt();
378class CPL_DLL VSIFilesystemHandler
382 virtual ~VSIFilesystemHandler() =
default;
384 static VSIVirtualHandleUniquePtr
385 OpenStatic(
const char *pszFilename,
const char *pszAccess,
386 bool bSetError =
false,
CSLConstList papszOptions =
nullptr);
388 virtual VSIVirtualHandleUniquePtr
389 Open(
const char *pszFilename,
const char *pszAccess,
bool bSetError =
false,
392 virtual VSIVirtualHandleUniquePtr
393 CreateOnlyVisibleAtCloseTime(
const char *pszFilename,
394 bool bEmulationAllowed,
397 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
400 virtual int Unlink(
const char *pszFilename)
409 virtual int Mkdir(
const char *pszDirname,
long nMode)
417 virtual int Rmdir(
const char *pszDirname)
424 virtual int RmdirRecursive(
const char *pszDirname);
426 char **ReadDir(
const char *pszDirname)
428 return ReadDirEx(pszDirname, 0);
431 virtual char **ReadDirEx(
const char * ,
int )
436 virtual char **SiblingFiles(
const char * )
441 virtual int Rename(
const char *oldpath,
const char *newpath,
442 GDALProgressFunc pProgressFunc,
void *pProgressData)
452 virtual int IsCaseSensitive(
const char *pszFilename)
458 virtual GIntBig GetDiskFreeSpace(
const char * )
463 virtual int SupportsSparseFiles(
const char * )
468 virtual int HasOptimizedReadMultiRange(
const char * )
473 virtual const char *GetActualURL(
const char * )
478 virtual const char *GetOptions()
483 virtual char *GetSignedURL(
const char * ,
489 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
490 const char *
const *papszOptions,
491 GDALProgressFunc pProgressFunc,
void *pProgressData,
492 char ***ppapszOutputs);
494 virtual int CopyFile(
const char *pszSource,
const char *pszTarget,
496 const char *
const *papszOptions,
497 GDALProgressFunc pProgressFunc,
void *pProgressData);
500 CopyFileRestartable(
const char *pszSource,
const char *pszTarget,
501 const char *pszInputPayload,
char **ppszOutputPayload,
503 GDALProgressFunc pProgressFunc,
void *pProgressData);
505 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
506 const char *
const *papszOptions);
508 virtual char **GetFileMetadata(
const char *pszFilename,
509 const char *pszDomain,
512 virtual bool SetFileMetadata(
const char *pszFilename,
514 const char *pszDomain,
518 MultipartUploadGetCapabilities(
int *pbNonSequentialUploadSupported,
519 int *pbParallelUploadSupported,
520 int *pbAbortSupported,
size_t *pnMinPartSize,
521 size_t *pnMaxPartSize,
int *pnMaxPartCount);
523 virtual char *MultipartUploadStart(
const char *pszFilename,
526 virtual char *MultipartUploadAddPart(
const char *pszFilename,
527 const char *pszUploadId,
530 const void *pData,
size_t nDataLength,
534 MultipartUploadEnd(
const char *pszFilename,
const char *pszUploadId,
535 size_t nPartIdsCount,
const char *
const *apszPartIds,
538 virtual bool MultipartUploadAbort(
const char *pszFilename,
539 const char *pszUploadId,
542 virtual bool AbortPendingUploads(
const char * )
548 GetStreamingFilename(
const std::string &osFilename)
const
554 GetNonStreamingFilename(
const std::string &osFilename)
const
567 GetCanonicalFilename(
const std::string &osFilename)
const
572 virtual bool IsLocal(
const char * )
const
577 virtual bool IsArchive(
const char * )
const
582 virtual bool SupportsSequentialWrite(
const char * ,
588 virtual bool SupportsRandomWrite(
const char * ,
594 virtual bool SupportsRead(
const char * )
599 virtual VSIFilesystemHandler *Duplicate(
const char * )
602 "Duplicate() not supported on this file "
613 virtual const char *GetDirectorySeparator(
CPL_UNUSED const char *pszPath)
630 GetHintForPotentiallyRecognizedPath(
const std::string &osPath)
633 return std::string();
643class CPL_DLL VSIFileManager
646 std::shared_ptr<VSIFilesystemHandler> m_poDefaultHandler{};
647 std::map<std::string, std::shared_ptr<VSIFilesystemHandler>>
652 static VSIFileManager *Get();
659 static VSIFilesystemHandler *GetHandler(
const char *);
660 static void InstallHandler(
const std::string &osPrefix,
661 const std::shared_ptr<VSIFilesystemHandler> &);
662 static void InstallHandler(
const std::string &osPrefix,
663 VSIFilesystemHandler *)
664 CPL_WARN_DEPRECATED(
"Use version with std::shared_ptr<> instead");
665 static void RemoveHandler(
const std::string &osPrefix);
667 static char **GetPrefixes();
679class VSIArchiveEntryFileOffset
682 virtual ~VSIArchiveEntryFileOffset();
688 std::string fileName{};
690 std::unique_ptr<VSIArchiveEntryFileOffset> file_pos{};
695class VSIArchiveContent
700 std::vector<VSIArchiveEntry> entries{};
703 using DirectoryChildren = std::vector<int>;
705 std::map<std::string, DirectoryChildren> dirIndex{};
707 VSIArchiveContent() =
default;
709 ~VSIArchiveContent();
715class VSIArchiveReader
718 virtual ~VSIArchiveReader();
720 virtual int GotoFirstFile() = 0;
721 virtual int GotoNextFile() = 0;
722 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
725 virtual GIntBig GetModifiedTime() = 0;
726 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
729class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
733 bool FindFileInArchive(
const char *archiveFilename,
734 const char *fileInArchiveName,
735 const VSIArchiveEntry **archiveEntry);
738 mutable std::recursive_mutex oMutex{};
745 std::map<CPLString, std::unique_ptr<VSIArchiveContent>> oFileList{};
747 virtual const char *GetPrefix()
const = 0;
748 virtual std::vector<CPLString> GetExtensions()
const = 0;
749 virtual std::unique_ptr<VSIArchiveReader>
750 CreateReader(
const char *pszArchiveFileName) = 0;
753 VSIArchiveFilesystemHandler();
754 ~VSIArchiveFilesystemHandler()
override;
756 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
757 int nFlags)
override;
758 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
760 virtual const VSIArchiveContent *
761 GetContentOfArchive(
const char *archiveFilename,
762 VSIArchiveReader *poReader =
nullptr);
763 virtual std::unique_ptr<char, VSIFreeReleaser>
764 SplitFilename(
const char *pszFilename,
CPLString &osFileInArchive,
765 bool bCheckMainFileExists,
bool bSetError)
const;
766 virtual std::unique_ptr<VSIArchiveReader>
767 OpenArchiveFile(
const char *archiveFilename,
const char *fileInArchiveName);
769 bool IsLocal(
const char *pszPath)
const override;
771 bool IsArchive(
const char *pszPath)
const override;
773 bool SupportsSequentialWrite(
const char * ,
779 bool SupportsRandomWrite(
const char * ,
786 GetHintForPotentiallyRecognizedPath(
const std::string &osPath)
override;
811 const GByte *pabyBeginningContent,
813constexpr int VSI_CACHED_DEFAULT_CHUNK_SIZE = 32768;
816 size_t nChunkSize = VSI_CACHED_DEFAULT_CHUNK_SIZE,
817 size_t nCacheSize = 0);
819const int CPL_DEFLATE_TYPE_GZIP = 0;
820const int CPL_DEFLATE_TYPE_ZLIB = 1;
821const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
824 int bAutoCloseBaseHandle);
828 bool bAutoCloseBaseHandle,
int nThreads,
830 size_t nSOZIPIndexEltSize,
831 std::vector<uint8_t> *panSOZIPIndex);
834VSICreateUploadOnCloseFile(VSIVirtualHandleUniquePtr &&poWritableHandle,
835 VSIVirtualHandleUniquePtr &&poTmpFile,
836 const std::string &osTmpFilename);
Convenient string class based on std::string.
Definition cpl_string.h:338
#define CPLE_NotSupported
Not supported.
Definition cpl_error.h:118
@ CE_Failure
Error that prevents the current operation to succeed.
Definition cpl_error.h:60
unsigned long long GUIntBig
Large unsigned integer type (generally 64-bit unsigned integer type).
Definition cpl_port.h:198
#define CPL_UNUSED
Qualifier for an argument that is unused.
Definition cpl_port.h:1044
#define CPL_FORMAT_STRING(arg)
Macro into which to wrap the format argument of a printf-like function.
Definition cpl_port.h:1025
#define CPL_PRINT_FUNC_FORMAT(format_idx, arg_idx)
Tag a function to have printf() formatting.
Definition cpl_port.h:1009
#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:1101
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1252
unsigned char GByte
Unsigned byte type.
Definition cpl_port.h:165
T CPL_AS_LSB(T)
Return the provided value as a LSB ordered one.
Definition cpl_port.h:825
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:195
Various convenience functions for working with strings and string lists.
#define VSIStatBufL
Type for VSIStatL()
Definition cpl_vsi.h:232
VSIRangeStatus
Range status.
Definition cpl_vsi.h:211
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition cpl_vsi.h:212
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition cpl_vsi.h:433
GUIntBig vsi_l_offset
Type for a file offset.
Definition cpl_vsi.h:136
Directory entry.
Definition cpl_vsi.h:445
Helper close to use with a std:unique_ptr<VSIVirtualHandle>, such as VSIVirtualHandleUniquePtr.
Definition cpl_vsi_virtual.h:241
void operator()(VSIVirtualHandle *poHandle)
Operator () that closes and deletes the file handle.
Definition cpl_vsi_virtual.h:243
Virtual file handle.
Definition cpl_vsi_virtual.h:48
virtual size_t PRead(void *pBuffer, size_t nSize, vsi_l_offset nOffset) const
Do a parallel-compatible read operation.
Definition cpl_vsil.cpp:4507
virtual void CancelCreation()
For a file created with CreateOnlyVisibleAtCloseTime(), ask for the file to not be created at all (if...
Definition cpl_vsi_virtual.h:221
virtual int Error()=0
Test the error indicator.
virtual size_t Read(void *pBuffer, size_t nBytes)=0
Read bytes from file.
virtual int Flush()
Flush pending writes to disk.
Definition cpl_vsi_virtual.h:186
virtual bool HasPRead() const
Returns whether this file handle supports the PRead() method.
Definition cpl_vsil.cpp:4481
bool WriteLSB(T val)
Write a primitive type as LSB-ordered byte sequence.
Definition cpl_vsi_virtual.h:171
bool ReadLSB(T &val)
Read a primitive type from LSB-ordered byte sequence.
Definition cpl_vsi_virtual.h:116
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:200
size_t Read(void *pBuffer, size_t nSize, size_t nCount)
Read bytes from file.
Definition cpl_vsil.cpp:3491
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 void * GetNativeFileDescriptor()
Returns the "native" file descriptor for the virtual handle.
Definition cpl_vsi_virtual.h:195
virtual size_t GetAdviseReadTotalBytesLimit() const
Return the total maximum number of bytes that AdviseRead() can handle at once.
Definition cpl_vsi_virtual.h:162
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:144
virtual int ReadMultiRange(int nRanges, void **ppData, const vsi_l_offset *panOffsets, const size_t *panSizes)
Read several ranges of bytes from file.
virtual int Eof()=0
Test for end of file.
virtual void Interrupt()
Ask current operations to be interrupted.
Definition cpl_vsi_virtual.h:214
T ReadLSB(bool *pbError=nullptr)
Read a primitive type from LSB-ordered byte sequence.
Definition cpl_vsi_virtual.h:103
virtual size_t Write(const void *pBuffer, size_t nBytes)=0
Write bytes to file.
virtual int Truncate(vsi_l_offset nNewSize)
Truncate/expand the file to the specified size.
virtual void ClearErr()=0
Reset the error and end-of-file indicators.