X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.hpp;h=fc42e9b9e7f27ccdc0685d7833d14077bfd99272;hb=75e8c9b7c7f2f10d9b7f479d45f58d81ea729d30;hp=3afa7096553c97a2ee7281862e5eaa85db0590f8;hpb=14b78f815fa02ffda48f8a6599d6af45868266ff;p=apitrace diff --git a/trace_file.hpp b/trace_file.hpp index 3afa709..fc42e9b 100644 --- a/trace_file.hpp +++ b/trace_file.hpp @@ -12,8 +12,13 @@ public: Read, Write }; + enum FlushType { + FlushShallow, + FlushDeep + }; public: static bool isZLibCompressed(const std::string &filename); + static bool isSnappyCompressed(const std::string &filename); public: File(const std::string &filename = std::string(), File::Mode mode = File::Read); @@ -21,13 +26,14 @@ public: bool isOpened() const; File::Mode mode() const; + std::string filename() const; bool open(const std::string &filename, File::Mode mode); bool write(const void *buffer, int length); bool read(void *buffer, int length); void close(); - void flush(); + void flush(FlushType type = FlushShallow); int getc(); protected: @@ -36,7 +42,7 @@ protected: virtual bool rawRead(void *buffer, int length) = 0; virtual int rawGetc() = 0; virtual void rawClose() = 0; - virtual void rawFlush() = 0; + virtual void rawFlush(FlushType type) = 0; protected: std::string m_filename; @@ -44,6 +50,69 @@ protected: bool m_isOpened; }; +inline bool File::isOpened() const +{ + return m_isOpened; +} + +inline File::Mode File::mode() const +{ + return m_mode; +} + +inline std::string File::filename() const +{ + return m_filename; +} + +inline bool File::open(const std::string &filename, File::Mode mode) +{ + if (m_isOpened) { + close(); + } + m_isOpened = rawOpen(filename, mode); + m_mode = mode; + + return m_isOpened; +} + +inline bool File::write(const void *buffer, int length) +{ + if (!m_isOpened || m_mode != File::Write) { + return false; + } + return rawWrite(buffer, length); +} + +inline bool File::read(void *buffer, int length) +{ + if (!m_isOpened || m_mode != File::Read) { + return false; + } + return rawRead(buffer, length); +} + +inline void File::close() +{ + if (m_isOpened) { + rawClose(); + m_isOpened = false; + } +} + +inline void File::flush(File::FlushType type) +{ + rawFlush(type); +} + +inline int File::getc() +{ + if (!m_isOpened || m_mode != File::Read) { + return 0; + } + return rawGetc(); +} + class ZLibFile : public File { public: ZLibFile(const std::string &filename = std::string(), @@ -56,50 +125,11 @@ protected: virtual bool rawRead(void *buffer, int length); virtual int rawGetc(); virtual void rawClose(); - virtual void rawFlush(); + virtual void rawFlush(FlushType type); private: void *m_gzFile; }; -namespace snappy { - class File; -} - -#define SNAPPY_CHUNK_SIZE (1 * 1024 * 1024) -class SnappyFile : public File { -public: - SnappyFile(const std::string &filename = std::string(), - File::Mode mode = File::Read); - virtual ~SnappyFile(); - -protected: - virtual bool rawOpen(const std::string &filename, File::Mode mode); - virtual bool rawWrite(const void *buffer, int length); - virtual bool rawRead(void *buffer, int length); - virtual int rawGetc(); - virtual void rawClose(); - virtual void rawFlush(); - -private: - inline int freeCacheSize() const - { - if (m_cacheSize > 0) - return m_cacheSize - (m_cachePtr - m_cache); - else - return 0; - } - void flushCache(); - void createCache(size_t size); -private: - std::fstream m_stream; - char *m_cache; - char *m_cachePtr; - size_t m_cacheSize; - - char *m_compressedCache; -}; - - } #endif