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;
83class CPL_DLL VSIFilesystemHandler {
87 virtual ~VSIFilesystemHandler() {}
90 const char *pszAccess );
93 const char *pszAccess,
95 virtual int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
int nFlags) = 0;
96 virtual int Unlink(
const char *pszFilename )
97 { (void) pszFilename; errno=ENOENT;
return -1; }
98 virtual int Mkdir(
const char *pszDirname,
long nMode )
99 {(void)pszDirname; (void)nMode; errno=ENOENT;
return -1;}
100 virtual int Rmdir(
const char *pszDirname )
101 { (void) pszDirname; errno=ENOENT;
return -1; }
102 virtual char **ReadDir(
const char *pszDirname )
103 { (void) pszDirname;
return nullptr; }
104 virtual char **ReadDirEx(
const char *pszDirname,
int )
105 {
return ReadDir(pszDirname); }
106 virtual int Rename(
const char *oldpath,
const char *newpath )
107 { (void) oldpath; (void)newpath; errno=ENOENT;
return -1; }
108 virtual int IsCaseSensitive(
const char* pszFilename )
109 { (void) pszFilename;
return TRUE; }
110 virtual GIntBig GetDiskFreeSpace(
const char* ) {
return -1; }
111 virtual int SupportsSparseFiles(
const char* ) {
return FALSE; }
112 virtual int HasOptimizedReadMultiRange(
const char* ) {
return FALSE; }
113 virtual const char* GetActualURL(
const char* ) {
return nullptr; }
114 virtual const char* GetOptions() {
return nullptr; }
115 virtual char* GetSignedURL(
const char* ,
CSLConstList ) {
return nullptr; }
124class CPL_DLL VSIFileManager
127 VSIFilesystemHandler *poDefaultHandler;
128 std::map<std::string, VSIFilesystemHandler *> oHandlers;
132 static VSIFileManager *Get();
137 static VSIFilesystemHandler *GetHandler(
const char * );
138 static void InstallHandler(
const std::string& osPrefix,
139 VSIFilesystemHandler * );
143 static char** GetPrefixes();
155class VSIArchiveEntryFileOffset
158 virtual ~VSIArchiveEntryFileOffset();
165 VSIArchiveEntryFileOffset* file_pos;
170class VSIArchiveContent
176 VSIArchiveEntry* entries;
178 VSIArchiveContent() : mTime(0), nFileSize(0), nEntries(0), entries(nullptr) {}
179 ~VSIArchiveContent();
182class VSIArchiveReader
185 virtual ~VSIArchiveReader();
187 virtual int GotoFirstFile() = 0;
188 virtual int GotoNextFile() = 0;
189 virtual VSIArchiveEntryFileOffset* GetFileOffset() = 0;
192 virtual GIntBig GetModifiedTime() = 0;
193 virtual int GotoFileOffset(VSIArchiveEntryFileOffset* pOffset) = 0;
196class VSIArchiveFilesystemHandler :
public VSIFilesystemHandler
203 std::map<CPLString,VSIArchiveContent*> oFileList;
205 virtual const char* GetPrefix() = 0;
206 virtual std::vector<CPLString> GetExtensions() = 0;
207 virtual VSIArchiveReader* CreateReader(
const char* pszArchiveFileName) = 0;
210 VSIArchiveFilesystemHandler();
211 virtual ~VSIArchiveFilesystemHandler();
213 int Stat(
const char *pszFilename,
VSIStatBufL *pStatBuf,
214 int nFlags )
override;
215 int Unlink(
const char *pszFilename )
override;
216 int Rename(
const char *oldpath,
const char *newpath )
override;
217 int Mkdir(
const char *pszDirname,
long nMode )
override;
218 int Rmdir(
const char *pszDirname )
override;
219 char **ReadDirEx(
const char *pszDirname,
int nMaxFiles )
override;
221 virtual const VSIArchiveContent* GetContentOfArchive(
const char* archiveFilename, VSIArchiveReader* poReader =
nullptr);
222 virtual char* SplitFilename(
const char *pszFilename,
CPLString &osFileInArchive,
int bCheckMainFileExists);
223 virtual VSIArchiveReader* OpenArchiveFile(
const char* archiveFilename,
const char* fileInArchiveName);
224 virtual int FindFileInArchive(
const char* archiveFilename,
const char* fileInArchiveName,
const VSIArchiveEntry** archiveEntry);
231 const GByte* pabyBeginningContent,
Convenient string class based on std::string.
Definition: cpl_string.h:339
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
Definition: cpl_port.h:249
#define CPL_UNUSED
Definition: cpl_port.h:938
char ** CSLConstList
Definition: cpl_port.h:1184
unsigned char GByte
Definition: cpl_port.h:213
long long GIntBig
Definition: cpl_port.h:246
VSIRangeStatus
Definition: cpl_vsi.h:175
@ VSI_RANGE_STATUS_UNKNOWN
Definition: cpl_vsi.h:176
GUIntBig vsi_l_offset
Definition: cpl_vsi.h:139
struct stat64 VSIStatBufL
Definition: cpl_vsi.h:191