00001
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 #ifndef _SOCKETS_MemFile_H
00031 #define _SOCKETS_MemFile_H
00032
00033 #include "sockets-config.h"
00034 #include <map>
00035 #include "IFile.h"
00036
00037 #define BLOCKSIZE 32768
00038
00039 #ifdef SOCKETS_NAMESPACE
00040 namespace SOCKETS_NAMESPACE {
00041 #endif
00042
00043
00046 class MemFile : public IFile
00047 {
00048 public:
00051 struct block_t {
00052 block_t() : next(NULL) {}
00053 struct block_t *next;
00054 char data[BLOCKSIZE];
00055 };
00056 public:
00057 MemFile();
00058 MemFile(const std::string& path);
00059 ~MemFile();
00060
00061 bool fopen(const std::string& path, const std::string& mode);
00062 void fclose();
00063
00064 size_t fread(char *ptr, size_t size, size_t nmemb) const;
00065 size_t fwrite(const char *ptr, size_t size, size_t nmemb);
00066
00067 char *fgets(char *s, int size) const;
00068 void fprintf(const char *format, ...);
00069
00070 off_t size() const;
00071 bool eof() const;
00072
00073 private:
00074 MemFile(const MemFile& ) {}
00075 MemFile& operator=(const MemFile& ) { return *this; }
00076
00077 static std::map<std::string,block_t *> m_files;
00078 std::string m_path;
00079 bool m_temporary;
00080 block_t *m_base;
00081 mutable block_t *m_current_read;
00082 block_t *m_current_write;
00083 mutable size_t m_read_ptr;
00084 size_t m_write_ptr;
00085 mutable bool m_b_read_caused_eof;
00086 };
00087
00088
00089
00090
00091 #ifdef SOCKETS_NAMESPACE
00092 }
00093 #endif
00094
00095 #endif // _SOCKETS_MemFile_H