X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.cpp;h=f48c1aa9189c8b04c23a92448afc5b51ddd9d216;hb=121e3164e0ed7ab91947bd8325e03095dcfcb823;hp=d4e74b9ab45a6ff54b748b6eddb44ccabd27fb4b;hpb=8216d8efc428dd336957433d743af5c4ac2d0d05;p=apitrace diff --git a/trace_file.cpp b/trace_file.cpp index d4e74b9..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,15 +114,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; } @@ -144,8 +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(size_t) +{ + return false; +} + +int ZLibFile::rawPercentRead() +{ + gz_dummy_stream *stream = (gz_dummy_stream *)m_gzFile; + return 100 * (ftell(stream->file) / m_endOffset); +}