X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.cpp;h=45473b345ffa3a3cae447ccab1fe101e93f91514;hb=3a8ffad2f31f4438e19dd5a0f1c068e1fdffdeea;hp=652cd0f3f70bb0b14216aa2a48919b11b74c4767;hpb=46c4a32730c5b52c119376042a84a6773d8d789f;p=apitrace diff --git a/trace_file.cpp b/trace_file.cpp index 652cd0f..45473b3 100644 --- a/trace_file.cpp +++ b/trace_file.cpp @@ -97,6 +97,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) @@ -113,15 +119,28 @@ 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; } -bool ZLibFile::rawWrite(const void *buffer, int length) +bool ZLibFile::rawWrite(const void *buffer, size_t length) { return gzwrite(m_gzFile, buffer, length) != -1; } -bool ZLibFile::rawRead(void *buffer, int length) +bool ZLibFile::rawRead(void *buffer, size_t length) { return gzread(m_gzFile, buffer, length) != -1; } @@ -150,7 +169,13 @@ bool ZLibFile::supportsOffsets() const return false; } -bool ZLibFile::rawSkip(unsigned) +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); +}