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 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount) = 0;
55 const size_t *panSizes);
92 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount) = 0;
99 virtual
int Eof() = 0;
123 virtual bool HasPRead()
const;
124 virtual size_t PRead(
void *pBuffer,
size_t nSize,
171typedef std::unique_ptr<VSIVirtualHandle, VSIVirtualHandleCloser>
172 VSIVirtualHandleUniquePtr;
182 VSIVirtualHandleUniquePtr m_nativeHandle{};
185 explicit VSIProxyFileHandle(VSIVirtualHandleUniquePtr &&nativeHandle)
186 : m_nativeHandle(std::move(nativeHandle))
192 return m_nativeHandle->Seek(nOffset, nWhence);
197 return m_nativeHandle->Tell();
200 size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount)
override
202 return m_nativeHandle->Read(pBuffer, nSize, nCount);
207 const size_t *panSizes)
override
209 return m_nativeHandle->ReadMultiRange(nRanges, ppData, panOffsets,
214 const size_t *panSizes)
override
216 return m_nativeHandle->AdviseRead(nRanges, panOffsets, panSizes);
221 return m_nativeHandle->GetAdviseReadTotalBytesLimit();
224 size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount)
override
226 return m_nativeHandle->Write(pBuffer, nSize, nCount);
231 return m_nativeHandle->ClearErr();
236 return m_nativeHandle->Eof();
241 return m_nativeHandle->Error();
246 return m_nativeHandle->Flush();
251 return m_nativeHandle->Close();
256 return m_nativeHandle->Truncate(nNewSize);
261 return m_nativeHandle->GetNativeFileDescriptor();
267 return m_nativeHandle->GetRangeStatus(nOffset, nLength);
272 return m_nativeHandle->HasPRead();
275 size_t PRead(
void *pBuffer,
size_t nSize,
278 return m_nativeHandle->PRead(pBuffer, nSize, nOffset);
283 m_nativeHandle->Interrupt();
295class CPL_DLL VSIFilesystemHandler
299 virtual ~VSIFilesystemHandler() =
default;
301 static VSIVirtualHandleUniquePtr
302 OpenStatic(
const char *pszFilename,
const char *pszAccess,
303 bool bSetError =
false,
CSLConstList papszOptions =
nullptr);
305 virtual VSIVirtualHandleUniquePtr
306 Open(
const char *pszFilename,
const char *pszAccess,
bool bSetError =
false,
309 virtual VSIVirtualHandleUniquePtr
310 CreateOnlyVisibleAtCloseTime(
const char *pszFilename,
311 bool bEmulationAllowed,
314 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
317 virtual int Unlink(
const char *pszFilename)
326 virtual int Mkdir(
const char *pszDirname,
long nMode)
334 virtual int Rmdir(
const char *pszDirname)
341 virtual int RmdirRecursive(
const char *pszDirname);
343 char **ReadDir(
const char *pszDirname)
345 return ReadDirEx(pszDirname, 0);
348 virtual char **ReadDirEx(
const char * ,
int )
353 virtual char **SiblingFiles(
const char * )
358 virtual int Rename(
const char *oldpath,
const char *newpath,
359 GDALProgressFunc pProgressFunc,
void *pProgressData)
369 virtual int IsCaseSensitive(
const char *pszFilename)
375 virtual GIntBig GetDiskFreeSpace(
const char * )
380 virtual int SupportsSparseFiles(
const char * )
385 virtual int HasOptimizedReadMultiRange(
const char * )
390 virtual const char *GetActualURL(
const char * )
395 virtual const char *GetOptions()
400 virtual char *GetSignedURL(
const char * ,
406 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
407 const char *
const *papszOptions,
408 GDALProgressFunc pProgressFunc,
void *pProgressData,
409 char ***ppapszOutputs);
411 virtual int CopyFile(
const char *pszSource,
const char *pszTarget,
413 const char *
const *papszOptions,
414 GDALProgressFunc pProgressFunc,
void *pProgressData);
417 CopyFileRestartable(
const char *pszSource,
const char *pszTarget,
418 const char *pszInputPayload,
char **ppszOutputPayload,
420 GDALProgressFunc pProgressFunc,
void *pProgressData);
422 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
423 const char *
const *papszOptions);
425 virtual char **GetFileMetadata(
const char *pszFilename,
426 const char *pszDomain,
429 virtual bool SetFileMetadata(
const char *pszFilename,
431 const char *pszDomain,
435 MultipartUploadGetCapabilities(
int *pbNonSequentialUploadSupported,
436 int *pbParallelUploadSupported,
437 int *pbAbortSupported,
size_t *pnMinPartSize,
438 size_t *pnMaxPartSize,
int *pnMaxPartCount);
440 virtual char *MultipartUploadStart(
const char *pszFilename,
443 virtual char *MultipartUploadAddPart(
const char *pszFilename,
444 const char *pszUploadId,
447 const void *pData,
size_t nDataLength,
451 MultipartUploadEnd(
const char *pszFilename,
const char *pszUploadId,
452 size_t nPartIdsCount,
const char *
const *apszPartIds,
455 virtual bool MultipartUploadAbort(
const char *pszFilename,
456 const char *pszUploadId,
459 virtual bool AbortPendingUploads(
const char * )
465 GetStreamingFilename(
const std::string &osFilename)
const
471 GetNonStreamingFilename(
const std::string &osFilename)
const
484 GetCanonicalFilename(
const std::string &osFilename)
const
489 virtual bool IsLocal(
const char * )
const
494 virtual bool IsArchive(
const char * )
const
499 virtual bool SupportsSequentialWrite(
const char * ,
505 virtual bool SupportsRandomWrite(
const char * ,
511 virtual bool SupportsRead(
const char * )
516 virtual VSIFilesystemHandler *Duplicate(
const char * )
519 "Duplicate() not supported on this file "
530 virtual const char *GetDirectorySeparator(
CPL_UNUSED const char *pszPath)
542class CPL_DLL VSIFileManager
545 VSIFilesystemHandler *poDefaultHandler =
nullptr;
546 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
550 static VSIFileManager *Get();
557 static VSIFilesystemHandler *GetHandler(
const char *);
558 static void InstallHandler(
const std::string &osPrefix,
559 VSIFilesystemHandler *);
560 static void RemoveHandler(
const std::string &osPrefix);
562 static char **GetPrefixes();
574class VSIArchiveEntryFileOffset
577 virtual ~VSIArchiveEntryFileOffset();
583 std::string fileName{};
585 std::unique_ptr<VSIArchiveEntryFileOffset> file_pos{};
590class VSIArchiveContent
595 std::vector<VSIArchiveEntry> entries{};
598 using DirectoryChildren = std::vector<int>;
600 std::map<std::string, DirectoryChildren> dirIndex{};
602 VSIArchiveContent() =
default;
604 ~VSIArchiveContent();
610class VSIArchiveReader
613 virtual ~VSIArchiveReader();
615 virtual int GotoFirstFile() = 0;
616 virtual int GotoNextFile() = 0;
617 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
619 virtual CPLString GetFileName() = 0;
620 virtual GIntBig GetModifiedTime() = 0;
621 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
624class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
628 bool FindFileInArchive(
const char *archiveFilename,
629 const char *fileInArchiveName,
630 const VSIArchiveEntry **archiveEntry);
633 mutable std::recursive_mutex oMutex{};
640 std::map<CPLString, std::unique_ptr<VSIArchiveContent>> oFileList{};
642 virtual const char *GetPrefix()
const = 0;
643 virtual std::vector<CPLString> GetExtensions()
const = 0;
644 virtual std::unique_ptr<VSIArchiveReader>
645 CreateReader(
const char *pszArchiveFileName) = 0;
648 VSIArchiveFilesystemHandler();
649 ~VSIArchiveFilesystemHandler()
override;
651 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
652 int nFlags)
override;
653 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
655 virtual const VSIArchiveContent *
656 GetContentOfArchive(
const char *archiveFilename,
657 VSIArchiveReader *poReader =
nullptr);
658 virtual char *SplitFilename(
const char *pszFilename,
659 CPLString &osFileInArchive,
660 bool bCheckMainFileExists,
661 bool bSetError)
const;
662 virtual std::unique_ptr<VSIArchiveReader>
663 OpenArchiveFile(
const char *archiveFilename,
const char *fileInArchiveName);
665 bool IsLocal(
const char *pszPath)
const override;
667 bool IsArchive(
const char *pszPath)
const override;
669 bool SupportsSequentialWrite(
const char * ,
675 bool SupportsRandomWrite(
const char * ,
691 virtual const VSIDIREntry *NextDirEntry() = 0;
704 const GByte *pabyBeginningContent,
706constexpr int VSI_CACHED_DEFAULT_CHUNK_SIZE = 32768;
709 size_t nChunkSize = VSI_CACHED_DEFAULT_CHUNK_SIZE,
710 size_t nCacheSize = 0);
712const int CPL_DEFLATE_TYPE_GZIP = 0;
713const int CPL_DEFLATE_TYPE_ZLIB = 1;
714const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
717 int bAutoCloseBaseHandle);
721 bool bAutoCloseBaseHandle,
int nThreads,
723 size_t nSOZIPIndexEltSize,
724 std::vector<uint8_t> *panSOZIPIndex);
727VSICreateUploadOnCloseFile(VSIVirtualHandleUniquePtr &&poWritableHandle,
728 VSIVirtualHandleUniquePtr &&poTmpFile,
729 const std::string &osTmpFilename);
#define CPLE_NotSupported
Not supported.
Definition cpl_error.h:95
unsigned long long GUIntBig
Large unsigned integer type (generally 64-bit unsigned integer type).
Definition cpl_port.h:208
#define CPL_UNUSED
Qualifier for an argument that is unused.
Definition cpl_port.h:879
#define CPL_FORMAT_STRING(arg)
Macro into which to wrap the format argument of a printf-like function.
Definition cpl_port.h:860
#define CPL_PRINT_FUNC_FORMAT(format_idx, arg_idx)
Tag a function to have printf() formatting.
Definition cpl_port.h:844
#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:936
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1087
unsigned char GByte
Unsigned byte type.
Definition cpl_port.h:175
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:205
Various convenience functions for working with strings and string lists.
#define VSIStatBufL
Type for VSIStatL().
Definition cpl_vsi.h:195
struct VSIVirtualHandle VSILFILE
Opaque type for a FILE that implements the VSIVirtualHandle API.
Definition cpl_vsi.h:141
VSIRangeStatus
Range status.
Definition cpl_vsi.h:174
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition cpl_vsi.h:175
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition cpl_vsi.h:396
GUIntBig vsi_l_offset
Type for a file offset.
Definition cpl_vsi.h:136
Helper close to use with a std:unique_ptr<VSIVirtualHandle>, such as VSIVirtualHandleUniquePtr.
Definition cpl_vsi_virtual.h:158
void operator()(VSIVirtualHandle *poHandle)
Operator () that closes and deletes the file handle.
Definition cpl_vsi_virtual.h:160
Virtual file handle.
Definition cpl_vsi_virtual.h:48
virtual int Eof()=0
Test for end of file.
virtual size_t PRead(void *pBuffer, size_t nSize, vsi_l_offset nOffset) const
Do a parallel-compatible read operation.
Definition cpl_vsil.cpp:4418
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:138
virtual size_t Read(void *pBuffer, size_t nSize, size_t nCount)=0
Read bytes from file.
virtual int ReadMultiRange(int nRanges, void **ppData, const vsi_l_offset *panOffsets, const size_t *panSizes)
Read several ranges of bytes from file.
virtual bool HasPRead() const
Returns whether this file handle supports the PRead() method.
Definition cpl_vsil.cpp:4392
virtual int Seek(vsi_l_offset nOffset, int nWhence)=0
Seek to requested offset.
virtual int Error()=0
Test the error indicator.
virtual void * GetNativeFileDescriptor()
Returns the "native" file descriptor for the virtual handle.
Definition cpl_vsi_virtual.h:112
virtual size_t Write(const void *pBuffer, size_t nSize, size_t nCount)=0
Write bytes to file.
int Printf(const char *pszFormat,...)
Formatted write to file.
Definition cpl_vsil.cpp:3479
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.
virtual size_t GetAdviseReadTotalBytesLimit() const
Return the total maximum number of bytes that AdviseRead() can handle at once.
Definition cpl_vsi_virtual.h:87
virtual vsi_l_offset Tell()=0
Tell current file offset.
virtual int Flush()
Flush pending writes to disk.
Definition cpl_vsi_virtual.h:103
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:69
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:117
virtual int Close()=0
Close file.
virtual void Interrupt()
Ask current operations to be interrupted.
Definition cpl_vsi_virtual.h:131