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"
47#ifdef GetDiskFreeSpace
48#undef GetDiskFreeSpace
61 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount) = 0;
64 const size_t *panSizes);
65 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount) = 0;
66 virtual int Eof() = 0;
83 virtual bool HasPRead()
const;
84 virtual size_t PRead(
void *pBuffer,
size_t nSize,
100class CPL_DLL VSIFilesystemHandler
104 virtual ~VSIFilesystemHandler()
111 const char *pszAccess,
bool bSetError,
113 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
115 virtual int Unlink(
const char *pszFilename)
122 virtual int Mkdir(
const char *pszDirname,
long nMode)
129 virtual int Rmdir(
const char *pszDirname)
135 virtual int RmdirRecursive(
const char *pszDirname);
136 virtual char **ReadDir(
const char *pszDirname)
141 virtual char **ReadDirEx(
const char *pszDirname,
int )
143 return ReadDir(pszDirname);
145 virtual char **SiblingFiles(
const char * )
149 virtual int Rename(
const char *oldpath,
const char *newpath)
156 virtual int IsCaseSensitive(
const char *pszFilename)
161 virtual GIntBig GetDiskFreeSpace(
const char * )
165 virtual int SupportsSparseFiles(
const char * )
169 virtual int HasOptimizedReadMultiRange(
const char * )
173 virtual const char *GetActualURL(
const char * )
177 virtual const char *GetOptions()
181 virtual char *GetSignedURL(
const char * ,
186 virtual bool Sync(
const char *pszSource,
const char *pszTarget,
187 const char *
const *papszOptions,
188 GDALProgressFunc pProgressFunc,
void *pProgressData,
189 char ***ppapszOutputs);
191 virtual VSIDIR *OpenDir(
const char *pszPath,
int nRecurseDepth,
192 const char *
const *papszOptions);
194 virtual char **GetFileMetadata(
const char *pszFilename,
195 const char *pszDomain,
198 virtual bool SetFileMetadata(
const char *pszFilename,
200 const char *pszDomain,
203 virtual bool AbortPendingUploads(
const char * )
209 GetStreamingFilename(
const std::string &osFilename)
const
214 virtual bool IsLocal(
const char * )
218 virtual bool SupportsSequentialWrite(
const char * ,
223 virtual bool SupportsRandomWrite(
const char * ,
228 virtual bool SupportsRead(
const char * )
240class CPL_DLL VSIFileManager
243 VSIFilesystemHandler *poDefaultHandler =
nullptr;
244 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
248 static VSIFileManager *Get();
255 static VSIFilesystemHandler *GetHandler(
const char *);
256 static void InstallHandler(
const std::string &osPrefix,
257 VSIFilesystemHandler *);
261 static char **GetPrefixes();
273class VSIArchiveEntryFileOffset
276 virtual ~VSIArchiveEntryFileOffset();
283 VSIArchiveEntryFileOffset *file_pos;
288class VSIArchiveContent
294 VSIArchiveEntry *entries =
nullptr;
296 ~VSIArchiveContent();
299class VSIArchiveReader
302 virtual ~VSIArchiveReader();
304 virtual int GotoFirstFile() = 0;
305 virtual int GotoNextFile() = 0;
306 virtual VSIArchiveEntryFileOffset *GetFileOffset() = 0;
309 virtual GIntBig GetModifiedTime() = 0;
310 virtual int GotoFileOffset(VSIArchiveEntryFileOffset *pOffset) = 0;
313class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
318 CPLMutex *hMutex =
nullptr;
324 std::map<CPLString, VSIArchiveContent *> oFileList{};
326 virtual const char *GetPrefix() = 0;
327 virtual std::vector<CPLString> GetExtensions() = 0;
328 virtual VSIArchiveReader *CreateReader(
const char *pszArchiveFileName) = 0;
331 VSIArchiveFilesystemHandler();
332 virtual ~VSIArchiveFilesystemHandler();
334 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
335 int nFlags)
override;
336 int Unlink(
const char *pszFilename)
override;
337 int Rename(
const char *oldpath,
const char *newpath)
override;
338 int Mkdir(
const char *pszDirname,
long nMode)
override;
339 int Rmdir(
const char *pszDirname)
override;
340 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles)
override;
342 virtual const VSIArchiveContent *
343 GetContentOfArchive(
const char *archiveFilename,
344 VSIArchiveReader *poReader =
nullptr);
345 virtual char *SplitFilename(
const char *pszFilename,
347 int bCheckMainFileExists);
348 virtual VSIArchiveReader *OpenArchiveFile(
const char *archiveFilename,
349 const char *fileInArchiveName);
350 virtual int FindFileInArchive(
const char *archiveFilename,
351 const char *fileInArchiveName,
352 const VSIArchiveEntry **archiveEntry);
354 virtual bool IsLocal(
const char *pszPath)
override;
356 SupportsSequentialWrite(
const char * ,
361 virtual bool SupportsRandomWrite(
const char * ,
390 const GByte *pabyBeginningContent,
393 size_t nChunkSize = 32768,
394 size_t nCacheSize = 0);
396const int CPL_DEFLATE_TYPE_GZIP = 0;
397const int CPL_DEFLATE_TYPE_ZLIB = 1;
398const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
401 int bAutoCloseBaseHandle);
Convenient string class based on std::string.
Definition cpl_string.h:312
Virtual file handle.
Definition cpl_vsi_virtual.h:57
virtual int Flush()
Flush pending writes to disk.
Definition cpl_vsi_virtual.h:67
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:78
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:74
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 Eof()=0
Test for end of file.
virtual int Truncate(vsi_l_offset nNewSize)
Truncate/expand the file to the specified size.
unsigned long long GUIntBig
Large unsigned integer type (generally 64-bit unsigned integer type).
Definition cpl_port.h:236
#define CPL_UNUSED
Qualifier for an argument that is unused.
Definition cpl_port.h:992
#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:1049
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition cpl_port.h:1190
unsigned char GByte
Unsigned byte type.
Definition cpl_port.h:205
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:233
Various convenience functions for working with strings and string lists.
#define VSIStatBufL
Type for VSIStatL()
Definition cpl_vsi.h:215
VSIRangeStatus
Range status.
Definition cpl_vsi.h:194
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition cpl_vsi.h:195
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition cpl_vsi.h:394
GUIntBig vsi_l_offset
Type for a file offset.
Definition cpl_vsi.h:146
Directory entry.
Definition cpl_vsi.h:405