]> git.cworth.org Git - apitrace/commitdiff
Automatically detect whether trace is zlib or snappy compressed
authorZack Rusin <zack@kde.org>
Sat, 6 Aug 2011 23:26:46 +0000 (19:26 -0400)
committerZack Rusin <zack@kde.org>
Sat, 6 Aug 2011 23:26:46 +0000 (19:26 -0400)
trace_file.cpp
trace_file.hpp
trace_parser.cpp

index 0272a5c29767bacb76fed998613113b56b2a6424..10e6565925449f3b820088587cdad1453139dea5 100644 (file)
@@ -89,6 +89,21 @@ int File::getc()
     return rawGetc();
 }
 
+bool File::isZLibCompressed(const std::string &filename)
+{
+    std::fstream stream(filename.c_str(),
+                        std::fstream::binary | std::fstream::in);
+    if (!stream.is_open())
+        return false;
+
+    unsigned char byte1, byte2;
+    stream >> byte1;
+    stream >> byte2;
+    stream.close();
+
+    return (byte1 == 0x1f && byte2 == 0x8b);
+}
+
 ZLibFile::ZLibFile(const std::string &filename,
                    File::Mode mode)
     : File(filename, mode),
index 7e7f9bd09bf5ff3ac473952796aaf9e20c884cc0..3afa7096553c97a2ee7281862e5eaa85db0590f8 100644 (file)
@@ -12,6 +12,8 @@ public:
         Read,
         Write
     };
+public:
+    static bool isZLibCompressed(const std::string &filename);
 public:
     File(const std::string &filename = std::string(),
          File::Mode mode = File::Read);
index d53d62ce9e73258c851d112f4fe764f130138769..b0b501ac25aabb35419cf2cba5ea0d935939c6f3 100644 (file)
@@ -39,7 +39,7 @@ namespace Trace {
 
 
 Parser::Parser() {
-    file = new Trace::SnappyFile;
+    file = NULL;
     next_call_no = 0;
     version = 0;
 }
@@ -47,11 +47,17 @@ Parser::Parser() {
 
 Parser::~Parser() {
     close();
-    delete file;
 }
 
 
 bool Parser::open(const char *filename) {
+    assert(!file);
+    if (File::isZLibCompressed(filename)) {
+        file = new ZLibFile;
+    } else {
+        file = new SnappyFile;
+    }
+
     if (!file->open(filename, File::Read)) {
         return false;
     }
@@ -84,6 +90,8 @@ deleteAll(const Container &c)
 
 void Parser::close(void) {
     file->close();
+    delete file;
+    file = NULL;
 
     deleteAll(calls);
     deleteAll(functions);