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
60 virtual size_t Read(
void *pBuffer,
size_t nSize,
size_t nCount ) = 0;
63 const size_t* panSizes );
64 virtual size_t Write(
const void *pBuffer,
size_t nSize,
size_t nCount)=0;
65 virtual int Eof() = 0;
83 class CPL_DLL VSIFilesystemHandler {
87 virtual ~VSIFilesystemHandler() {}
90 const char *pszAccess );
93 const char *pszAccess,
96 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
int nFlags) = 0;
97 virtual int Unlink(
const char *pszFilename )
98 { (void) pszFilename; errno=ENOENT;
return -1; }
100 virtual int Mkdir(
const char *pszDirname,
long nMode )
101 {(void)pszDirname; (void)nMode; errno=ENOENT;
return -1;}
102 virtual int Rmdir(
const char *pszDirname )
103 { (void) pszDirname; errno=ENOENT;
return -1; }
104 virtual int RmdirRecursive(
const char *pszDirname );
105 virtual char **ReadDir(
const char *pszDirname )
106 { (void) pszDirname;
return nullptr; }
107 virtual char **ReadDirEx(
const char *pszDirname,
int )
108 {
return ReadDir(pszDirname); }
109 virtual char **SiblingFiles(
const char * )
111 virtual int Rename(
const char *oldpath,
const char *newpath )
112 { (void) oldpath; (void)newpath; errno=ENOENT;
return -1; }
113 virtual int IsCaseSensitive(
const char* pszFilename )
114 { (void) pszFilename;
return TRUE; }
115 virtual GIntBig GetDiskFreeSpace(
const char* ) {
return -1; }
116 virtual int SupportsSparseFiles(
const char* ) {
return FALSE; }
117 virtual int HasOptimizedReadMultiRange(
const char* ) {
return FALSE; }
118 virtual const char* GetActualURL(
const char* ) {
return nullptr; }
119 virtual const char* GetOptions() {
return nullptr; }
120 virtual char* GetSignedURL(
const char* ,
CSLConstList ) {
return nullptr; }
121 virtual bool Sync(
const char* pszSource,
const char* pszTarget,
122 const char*
const * papszOptions,
123 GDALProgressFunc pProgressFunc,
125 char*** ppapszOutputs );
127 virtual VSIDIR* OpenDir(
const char *pszPath,
int nRecurseDepth,
128 const char*
const *papszOptions);
130 virtual char** GetFileMetadata(
const char * pszFilename,
const char* pszDomain,
133 virtual bool SetFileMetadata(
const char * pszFilename,
135 const char* pszDomain,
138 virtual bool AbortPendingUploads(
const char* ) {
return true;}
140 virtual std::string GetStreamingFilename(
const std::string& osFilename)
const {
return osFilename; }
149 class CPL_DLL VSIFileManager
152 VSIFilesystemHandler *poDefaultHandler =
nullptr;
153 std::map<std::string, VSIFilesystemHandler *> oHandlers{};
157 static VSIFileManager *Get();
164 static VSIFilesystemHandler *GetHandler(
const char * );
165 static void InstallHandler(
const std::string& osPrefix,
166 VSIFilesystemHandler * );
170 static char** GetPrefixes();
182 class VSIArchiveEntryFileOffset
185 virtual ~VSIArchiveEntryFileOffset();
192 VSIArchiveEntryFileOffset* file_pos;
197 class VSIArchiveContent
203 VSIArchiveEntry* entries =
nullptr;
205 ~VSIArchiveContent();
208 class VSIArchiveReader
211 virtual ~VSIArchiveReader();
213 virtual int GotoFirstFile() = 0;
214 virtual int GotoNextFile() = 0;
215 virtual VSIArchiveEntryFileOffset* GetFileOffset() = 0;
218 virtual GIntBig GetModifiedTime() = 0;
219 virtual int GotoFileOffset(VSIArchiveEntryFileOffset* pOffset) = 0;
222 class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
227 CPLMutex* hMutex =
nullptr;
231 std::map<CPLString,VSIArchiveContent*> oFileList{};
233 virtual const char* GetPrefix() = 0;
234 virtual std::vector<CPLString> GetExtensions() = 0;
235 virtual VSIArchiveReader* CreateReader(
const char* pszArchiveFileName) = 0;
238 VSIArchiveFilesystemHandler();
239 virtual ~VSIArchiveFilesystemHandler();
241 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
242 int nFlags )
override;
243 int Unlink(
const char *pszFilename )
override;
244 int Rename(
const char *oldpath,
const char *newpath )
override;
245 int Mkdir(
const char *pszDirname,
long nMode )
override;
246 int Rmdir(
const char *pszDirname )
override;
247 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles )
override;
249 virtual const VSIArchiveContent* GetContentOfArchive(
const char* archiveFilename, VSIArchiveReader* poReader =
nullptr);
250 virtual char* SplitFilename(
const char *pszFilename,
CPLString &osFileInArchive,
int bCheckMainFileExists);
251 virtual VSIArchiveReader* OpenArchiveFile(
const char* archiveFilename,
const char* fileInArchiveName);
252 virtual int FindFileInArchive(
const char* archiveFilename,
const char* fileInArchiveName,
const VSIArchiveEntry** archiveEntry);
275 const GByte* pabyBeginningContent,
279 const int CPL_DEFLATE_TYPE_GZIP = 0;
280 const int CPL_DEFLATE_TYPE_ZLIB = 1;
281 const int CPL_DEFLATE_TYPE_RAW_DEFLATE = 2;
Convenient string class based on std::string.
Definition: cpl_string.h:320
Virtual file handle.
Definition: cpl_vsi_virtual.h:56
virtual int Flush()
Flush pending writes to disk.
Definition: cpl_vsi_virtual.h:66
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:71
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:70
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:233
#define CPL_UNUSED
Qualifier for an argument that is unused.
Definition: cpl_port.h:875
#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:927
char ** CSLConstList
Type of a constant null-terminated list of nul terminated strings.
Definition: cpl_port.h:1053
unsigned char GByte
Unsigned byte type.
Definition: cpl_port.h:203
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:230
Various convenience functions for working with strings and string lists.
#define VSIStatBufL
Type for VSIStatL()
Definition: cpl_vsi.h:198
VSIRangeStatus
Range status.
Definition: cpl_vsi.h:177
@ VSI_RANGE_STATUS_UNKNOWN
Unknown.
Definition: cpl_vsi.h:178
struct VSIDIR VSIDIR
Opaque type for a directory iterator.
Definition: cpl_vsi.h:329
GUIntBig vsi_l_offset
Type for a file offset.
Definition: cpl_vsi.h:140
Directory entry.
Definition: cpl_vsi.h:341