cpl_vsi_virtual.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef CPL_VSI_VIRTUAL_H_INCLUDED
00034 #define CPL_VSI_VIRTUAL_H_INCLUDED
00035
00036 #include "cpl_vsi.h"
00037 #include "cpl_string.h"
00038
00039 #if defined(WIN32CE)
00040 # include "cpl_wince.h"
00041 # include <wce_errno.h>
00042 # pragma warning(disable:4786)
00043 #endif
00044
00045 #include <map>
00046 #include <vector>
00047 #include <string>
00048
00049
00050
00051
00052
00053 class CPL_DLL VSIVirtualHandle {
00054 public:
00055 virtual int Seek( vsi_l_offset nOffset, int nWhence ) = 0;
00056 virtual vsi_l_offset Tell() = 0;
00057 virtual size_t Read( void *pBuffer, size_t nSize, size_t nMemb ) = 0;
00058 virtual size_t Write( const void *pBuffer, size_t nSize,size_t nMemb)=0;
00059 virtual int Eof() = 0;
00060 virtual int Flush() {return 0;}
00061 virtual int Close() = 0;
00062 virtual ~VSIVirtualHandle() { }
00063 };
00064
00065
00066
00067
00068
00069 class CPL_DLL VSIFilesystemHandler {
00070
00071 public:
00072
00073 virtual ~VSIFilesystemHandler() {}
00074
00075 virtual VSIVirtualHandle *Open( const char *pszFilename,
00076 const char *pszAccess) = 0;
00077 virtual int Stat( const char *pszFilename, VSIStatBufL *pStatBuf, int nFlags) = 0;
00078 virtual int Unlink( const char *pszFilename )
00079 { (void) pszFilename; errno=ENOENT; return -1; }
00080 virtual int Mkdir( const char *pszDirname, long nMode )
00081 {(void)pszDirname; (void)nMode; errno=ENOENT; return -1;}
00082 virtual int Rmdir( const char *pszDirname )
00083 { (void) pszDirname; errno=ENOENT; return -1; }
00084 virtual char **ReadDir( const char *pszDirname )
00085 { (void) pszDirname; return NULL; }
00086 virtual int Rename( const char *oldpath, const char *newpath )
00087 { (void) oldpath; (void)newpath; errno=ENOENT; return -1; }
00088 virtual int IsCaseSensitive( const char* pszFilename )
00089 { (void) pszFilename; return TRUE; }
00090 };
00091
00092
00093
00094
00095
00096 class CPL_DLL VSIFileManager
00097 {
00098 private:
00099 VSIFilesystemHandler *poDefaultHandler;
00100 std::map<std::string, VSIFilesystemHandler *> oHandlers;
00101
00102 VSIFileManager();
00103
00104 static VSIFileManager *Get();
00105
00106 public:
00107 ~VSIFileManager();
00108
00109 static VSIFilesystemHandler *GetHandler( const char * );
00110 static void InstallHandler( const std::string& osPrefix,
00111 VSIFilesystemHandler * );
00112 static void RemoveHandler( const std::string& osPrefix );
00113 };
00114
00115
00116
00117
00118
00119
00120
00121
00122 class VSIArchiveEntryFileOffset
00123 {
00124 public:
00125 virtual ~VSIArchiveEntryFileOffset();
00126 };
00127
00128 typedef struct
00129 {
00130 char *fileName;
00131 vsi_l_offset uncompressed_size;
00132 VSIArchiveEntryFileOffset* file_pos;
00133 int bIsDir;
00134 GIntBig nModifiedTime;
00135 } VSIArchiveEntry;
00136
00137 typedef struct
00138 {
00139 int nEntries;
00140 VSIArchiveEntry* entries;
00141 } VSIArchiveContent;
00142
00143 class VSIArchiveReader
00144 {
00145 public:
00146 virtual ~VSIArchiveReader();
00147
00148 virtual int GotoFirstFile() = 0;
00149 virtual int GotoNextFile() = 0;
00150 virtual VSIArchiveEntryFileOffset* GetFileOffset() = 0;
00151 virtual GUIntBig GetFileSize() = 0;
00152 virtual CPLString GetFileName() = 0;
00153 virtual GIntBig GetModifiedTime() = 0;
00154 virtual int GotoFileOffset(VSIArchiveEntryFileOffset* pOffset) = 0;
00155 };
00156
00157 class VSIArchiveFilesystemHandler : public VSIFilesystemHandler
00158 {
00159 protected:
00160 void* hMutex;
00161
00162
00163
00164 std::map<CPLString,VSIArchiveContent*> oFileList;
00165
00166 virtual const char* GetPrefix() = 0;
00167 virtual std::vector<CPLString> GetExtensions() = 0;
00168 virtual VSIArchiveReader* CreateReader(const char* pszArchiveFileName) = 0;
00169
00170 public:
00171 VSIArchiveFilesystemHandler();
00172 virtual ~VSIArchiveFilesystemHandler();
00173
00174 virtual int Stat( const char *pszFilename, VSIStatBufL *pStatBuf, int nFlags );
00175 virtual int Unlink( const char *pszFilename );
00176 virtual int Rename( const char *oldpath, const char *newpath );
00177 virtual int Mkdir( const char *pszDirname, long nMode );
00178 virtual int Rmdir( const char *pszDirname );
00179 virtual char **ReadDir( const char *pszDirname );
00180
00181 virtual const VSIArchiveContent* GetContentOfArchive(const char* archiveFilename, VSIArchiveReader* poReader = NULL);
00182 virtual char* SplitFilename(const char *pszFilename, CPLString &osFileInArchive, int bCheckMainFileExists);
00183 virtual VSIArchiveReader* OpenArchiveFile(const char* archiveFilename, const char* fileInArchiveName);
00184 virtual int FindFileInArchive(const char* archiveFilename, const char* fileInArchiveName, const VSIArchiveEntry** archiveEntry);
00185 };
00186
00187 VSIVirtualHandle* VSICreateBufferedReaderHandle(VSIVirtualHandle* poBaseHandle);
00188
00189 #endif