X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=trace_file.cpp;h=f48c1aa9189c8b04c23a92448afc5b51ddd9d216;hb=c592957de1083b4e32ee58c0ea2e5feaa9085b47;hp=758ecd78c264d6e218b001473489394607da4b8f;hpb=b5f2ee344ef2914ca141608107c571ec0c28c6a6;p=apitrace diff --git a/trace_file.cpp b/trace_file.cpp index 758ecd7..f48c1aa 100644 --- a/trace_file.cpp +++ b/trace_file.cpp @@ -1,3 +1,29 @@ +/************************************************************************** + * + * Copyright 2011 Zack Rusin + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + **************************************************************************/ + + #include "trace_file.hpp" #include "trace_snappyfile.hpp" @@ -16,82 +42,23 @@ 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); } } - File::~File() { close(); } -bool File::isOpened() const -{ - return m_isOpened; -} -File::Mode File::mode() const +void File::setCurrentOffset(const File::Offset &offset) { - return m_mode; -} - -std::string File::filename() const -{ - return m_filename; -} - -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; -} - -bool File::write(const void *buffer, int length) -{ - if (!m_isOpened || m_mode != File::Write) { - return false; - } - return rawWrite(buffer, length); -} - -bool File::read(void *buffer, int length) -{ - if (!m_isOpened || m_mode != File::Read) { - return false; - } - return rawRead(buffer, length); -} - -void File::close() -{ - if (m_isOpened) { - rawClose(); - m_isOpened = false; - } -} - -void File::flush(FlushType type) -{ - rawFlush(type); -} - -int File::getc() -{ - if (!m_isOpened || m_mode != File::Read) { - return 0; - } - return rawGetc(); + assert(0); } bool File::isZLibCompressed(const std::string &filename) @@ -125,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) @@ -141,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; } @@ -167,7 +153,28 @@ void ZLibFile::rawClose() } } -void ZLibFile::rawFlush(FlushType type) +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); +}