Changeset 302 for cpp/frams/virtfile/virtfile.h
- Timestamp:
- 01/20/15 10:24:05 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/virtfile/virtfile.h
r301 r302 26 26 class DLLEXP VirtFILE 27 27 { 28 29 string path;30 31 virtual size_t Vread(void *ptr, size_t size, size_t nmemb)=0;32 virtual size_t Vwrite(const void *ptr, size_t size, size_t nmemb)=0;33 virtual int Veof()=0;34 virtual int Vputc(int c) {unsigned char data=(unsigned char)c; return (Vwrite(&data,1,1)==1)?data:EOF;}35 virtual int Vputs(const char *s)=0;36 virtual int Vgetc() {unsigned char data; if (Vread(&data,1,1)==1) return data; else return EOF;}37 virtual int Vseek(long offset, int whence)=0;38 virtual long Vtell()=0;39 virtual void Vrewind() {Vseek(0,SEEK_SET);}40 virtual int Vflush()=0;41 virtual char *Vgets(char *s, int size)=0;42 virtual int Vprintf(const char *format, va_list args);43 int printf(const char *format, ...);44 virtual const char *VgetPath() {return path.c_str();}45 virtual int getSize();46 VirtFILE(const char* _path):path(_path) {}47 virtual ~VirtFILE();48 static VirtFILE *Vstdin,*Vstdout,*Vstderr;49 static void setVstdin(VirtFILE *);50 static void setVstdout(VirtFILE *);51 static void setVstderr(VirtFILE *);52 static VirtFILE* getVstdin();53 static VirtFILE* getVstdout();54 static VirtFILE* getVstderr();55 static VirtFileSystem *vfs;56 static void selectFileSystem(VirtFileSystem *s);28 protected: 29 string path; 30 public: 31 virtual size_t Vread(void *ptr, size_t size, size_t nmemb) = 0; 32 virtual size_t Vwrite(const void *ptr, size_t size, size_t nmemb) = 0; 33 virtual int Veof() = 0; 34 virtual int Vputc(int c) { unsigned char data = (unsigned char)c; return (Vwrite(&data, 1, 1) == 1) ? data : EOF; } 35 virtual int Vputs(const char *s) = 0; 36 virtual int Vgetc() { unsigned char data; if (Vread(&data, 1, 1) == 1) return data; else return EOF; } 37 virtual int Vseek(long offset, int whence) = 0; 38 virtual long Vtell() = 0; 39 virtual void Vrewind() { Vseek(0, SEEK_SET); } 40 virtual int Vflush() = 0; 41 virtual char *Vgets(char *s, int size) = 0; 42 virtual int Vprintf(const char *format, va_list args); 43 int printf(const char *format, ...); 44 virtual const char *VgetPath() { return path.c_str(); } 45 virtual int getSize(); 46 VirtFILE(const char* _path) :path(_path) {} 47 virtual ~VirtFILE(); 48 static VirtFILE *Vstdin, *Vstdout, *Vstderr; 49 static void setVstdin(VirtFILE *); 50 static void setVstdout(VirtFILE *); 51 static void setVstderr(VirtFILE *); 52 static VirtFILE* getVstdin(); 53 static VirtFILE* getVstdout(); 54 static VirtFILE* getVstderr(); 55 static VirtFileSystem *vfs; 56 static void selectFileSystem(VirtFileSystem *s); 57 57 }; 58 58 59 59 /** can be used directly or as a base class for implementations delegating VirtFILE calls to another VirtFILE object */ 60 class DLLEXP DelegatedFILE : public VirtFILE60 class DLLEXP DelegatedFILE : public VirtFILE 61 61 { 62 VirtFILE *delegate;63 64 size_t Vread(void *ptr, size_t size, size_t nmemb) {return delegate->Vread(ptr,size,nmemb);}65 size_t Vwrite(const void *ptr, size_t size, size_t nmemb) {return delegate->Vwrite(ptr,size,nmemb);}66 int Veof() {return delegate->Veof();}67 int Vputc(int c) {return delegate->Vputc(c);}68 int Vputs(const char *s) {return delegate->Vputs(s);}69 int Vgetc() {return delegate->Vgetc();}70 int Vseek(long offset, int whence) {return delegate->Vseek(offset,whence);}71 long Vtell() {return delegate->Vtell();}72 void Vrewind() {delegate->Vrewind();}73 int Vflush() {return delegate->Vflush();}74 char *Vgets(char *s, int size) {return delegate->Vgets(s,size);}75 int Vprintf(const char *format, va_list args) {return delegate->Vprintf(format,args);}76 int getSize() {return delegate->getSize();}77 // not overriden: VgetPath()62 VirtFILE *delegate; 63 public: 64 size_t Vread(void *ptr, size_t size, size_t nmemb) { return delegate->Vread(ptr, size, nmemb); } 65 size_t Vwrite(const void *ptr, size_t size, size_t nmemb) { return delegate->Vwrite(ptr, size, nmemb); } 66 int Veof() { return delegate->Veof(); } 67 int Vputc(int c) { return delegate->Vputc(c); } 68 int Vputs(const char *s) { return delegate->Vputs(s); } 69 int Vgetc() { return delegate->Vgetc(); } 70 int Vseek(long offset, int whence) { return delegate->Vseek(offset, whence); } 71 long Vtell() { return delegate->Vtell(); } 72 void Vrewind() { delegate->Vrewind(); } 73 int Vflush() { return delegate->Vflush(); } 74 char *Vgets(char *s, int size) { return delegate->Vgets(s, size); } 75 int Vprintf(const char *format, va_list args) { return delegate->Vprintf(format, args); } 76 int getSize() { return delegate->getSize(); } 77 // not overriden: VgetPath() 78 78 79 DelegatedFILE(const char* _path,VirtFILE *_delegate):VirtFILE(_path),delegate(_delegate) {}80 virtual ~DelegatedFILE() {if (delegate) delete delegate; delegate=NULL;}79 DelegatedFILE(const char* _path, VirtFILE *_delegate) :VirtFILE(_path), delegate(_delegate) {} 80 virtual ~DelegatedFILE() { if (delegate) delete delegate; delegate = NULL; } 81 81 }; 82 82 83 83 class DLLEXP VirtDIR 84 84 { 85 86 virtual ~VirtDIR() {}87 virtual dirent* Vreaddir() {return 0;}85 public: 86 virtual ~VirtDIR() {} 87 virtual dirent* Vreaddir() { return 0; } 88 88 }; 89 89 … … 91 91 { 92 92 public: 93 virtual VirtFILE *Vfopen(const char* path,const char*mode);94 virtual bool Vfexists(const char* path);95 virtual VirtDIR *Vopendir(const char* path);96 virtual bool Vmkdir(const char* path);97 virtual bool Vmkdirs(const char* path);98 virtual bool Vdirexists(const char* path,bool is_writable);93 virtual VirtFILE *Vfopen(const char* path, const char*mode); 94 virtual bool Vfexists(const char* path); 95 virtual VirtDIR *Vopendir(const char* path); 96 virtual bool Vmkdir(const char* path); 97 virtual bool Vmkdirs(const char* path); 98 virtual bool Vdirexists(const char* path, bool is_writable); 99 99 }; 100 100 … … 110 110 bool Vmkdir(const char* path); 111 111 bool Vmkdirs(const char* path); 112 bool Vdirexists(const char* path, bool is_writable);112 bool Vdirexists(const char* path, bool is_writable); 113 113 }; 114 114 115 115 116 DLLEXP VirtFILE *Vfopen(const char* path, const char*mode);116 DLLEXP VirtFILE *Vfopen(const char* path, const char*mode); 117 117 DLLEXP VirtDIR *Vopendir(const char* path); 118 118 DLLEXP bool Vfexists(const char* path); 119 119 DLLEXP bool Vmkdir(const char* path); 120 120 DLLEXP bool Vmkdirs(const char* path); 121 DLLEXP bool Vdirexists(const char* path, bool is_writable);121 DLLEXP bool Vdirexists(const char* path, bool is_writable); 122 122 123 123 DLLEXP int fread(void *ptr, size_t size, size_t nmemb, VirtFILE* f); … … 127 127 //since we want our own feof(VirtFILE*) function and some systems unfortunately define feof as a macro, we need to #undef it. Same as in virtfile.cpp 128 128 #if defined _MSC_VER || defined __CYGWIN__ || defined SHP || defined __ANDROID__ 129 130 129 #pragma push_macro("feof") 130 #undef feof 131 131 #endif 132 132 #if defined __BORLANDC__ //does not support #pragma push_macro/pop_macro 133 133 #undef feof 134 134 #endif 135 135 136 136 DLLEXP int feof(VirtFILE* f);// {return f->Veof();} 137 137 138 138 //...and then restore the original macro: 139 139 #if defined _MSC_VER || defined __CYGWIN__ || defined SHP || defined __ANDROID__ 140 140 #pragma pop_macro("feof") 141 141 #endif 142 142 #if defined __BORLANDC__ 143 143 #define feof(__f) ((__f)->flags & _F_EOF) 144 144 #endif 145 145 146 146 147 DLLEXP int fputc(int c, VirtFILE* f);148 DLLEXP int fputs(const char *s, VirtFILE* f);147 DLLEXP int fputc(int c, VirtFILE* f); 148 DLLEXP int fputs(const char *s, VirtFILE* f); 149 149 DLLEXP int fgetc(VirtFILE* f); 150 DLLEXP int fseek(VirtFILE* f, long offset, int whence);150 DLLEXP int fseek(VirtFILE* f, long offset, int whence); 151 151 DLLEXP int ftell(VirtFILE* f); 152 152 DLLEXP void rewind(VirtFILE* f); 153 153 DLLEXP int fflush(VirtFILE* f); 154 154 DLLEXP char *fgets(char *s, int size, VirtFILE* f); 155 DLLEXP int fprintf(VirtFILE* f, const char *format, ...);155 DLLEXP int fprintf(VirtFILE* f, const char *format, ...); 156 156 DLLEXP int fclose(VirtFILE* f); 157 157
Note: See TracChangeset
for help on using the changeset viewer.