X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.cpp;h=f48c1aa9189c8b04c23a92448afc5b51ddd9d216;hb=8f98c3a529e7ef88e4111ef22cf8411916a9a065;hp=81b5d03c1f3f273f972f7b8b3d9db8be22f53336;hpb=94194a24eaa9f559b9140a89433f0d3ab3b77ef3;p=apitrace diff --git a/trace_file.cpp b/trace_file.cpp index 81b5d03..f48c1aa 100644 --- a/trace_file.cpp +++ b/trace_file.cpp @@ -42,12 +42,11 @@ using namespace Trace; File::File(const std::string &filename, File::Mode mode) - : m_filename(filename), - m_mode(mode), + : m_mode(mode), m_isOpened(false) { - if (!m_filename.empty()) { - open(m_filename, m_mode); + if (!filename.empty()) { + open(filename, m_mode); } } @@ -56,6 +55,12 @@ File::~File() close(); } + +void File::setCurrentOffset(const File::Offset &offset) +{ + assert(0); +} + bool File::isZLibCompressed(const std::string &filename) { std::fstream stream(filename.c_str(), @@ -87,6 +92,12 @@ bool File::isSnappyCompressed(const std::string &filename) return (byte1 == SNAPPY_BYTE1 && byte2 == SNAPPY_BYTE2); } +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ +} gz_dummy_stream; ZLibFile::ZLibFile(const std::string &filename, File::Mode mode) @@ -103,6 +114,19 @@ bool ZLibFile::rawOpen(const std::string &filename, File::Mode mode) { m_gzFile = gzopen(filename.c_str(), (mode == File::Write) ? "wb" : "rb"); + + if (mode == File::Read && m_gzFile) { + //XXX: unfortunately zlib doesn't support + // SEEK_END or we could've done: + //m_endOffset = gzseek(m_gzFile, 0, SEEK_END); + //gzrewind(m_gzFile); + gz_dummy_stream *stream = (gz_dummy_stream *)m_gzFile; + long loc = ftell(stream->file); + fseek(stream->file,0,SEEK_END); + m_endOffset = ftell(stream->file); + fseek(stream->file, loc, SEEK_SET); + } + return m_gzFile != NULL; } @@ -133,3 +157,24 @@ void ZLibFile::rawFlush() { gzflush(m_gzFile, Z_SYNC_FLUSH); } + +File::Offset ZLibFile::currentOffset() +{ + return File::Offset(gztell(m_gzFile)); +} + +bool ZLibFile::supportsOffsets() const +{ + return false; +} + +bool ZLibFile::rawSkip(size_t) +{ + return false; +} + +int ZLibFile::rawPercentRead() +{ + gz_dummy_stream *stream = (gz_dummy_stream *)m_gzFile; + return 100 * (ftell(stream->file) / m_endOffset); +}