X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.cpp;h=f48c1aa9189c8b04c23a92448afc5b51ddd9d216;hb=c5b741c83e804f1e438caca83565a76e254d0b94;hp=2d002868920feda1d7c2d48438bd8af5e88b8351;hpb=5f78882308c311b42c88e14e261289dd4208f4d7;p=apitrace diff --git a/trace_file.cpp b/trace_file.cpp index 2d00286..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); } } @@ -57,13 +56,9 @@ File::~File() } -File::Offset File::currentOffset() -{ - return File::Offset(); -} - void File::setCurrentOffset(const File::Offset &offset) { + assert(0); } bool File::isZLibCompressed(const std::string &filename) @@ -97,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) @@ -113,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; } @@ -144,13 +158,23 @@ 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(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); +}