]> git.cworth.org Git - apitrace/blob - trace_file.hpp
f0e183d70693912b9feb176e5ecc9c8fb35136ef
[apitrace] / trace_file.hpp
1 /**************************************************************************
2  *
3  * Copyright 2011 Zack Rusin
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  *
24  **************************************************************************/
25
26
27 #ifndef TRACE_FILE_HPP
28 #define TRACE_FILE_HPP
29
30 #include <string>
31 #include <fstream>
32
33 namespace Trace {
34
35 class File {
36 public:
37     enum Mode {
38         Read,
39         Write
40     };
41     enum FlushType {
42         FlushShallow,
43         FlushDeep
44     };
45 public:
46     static bool isZLibCompressed(const std::string &filename);
47     static bool isSnappyCompressed(const std::string &filename);
48 public:
49     File(const std::string &filename = std::string(),
50          File::Mode mode = File::Read);
51     virtual ~File();
52
53     bool isOpened() const;
54     File::Mode mode() const;
55
56     std::string filename() const;
57
58     bool open(const std::string &filename, File::Mode mode);
59     bool write(const void *buffer, int length);
60     bool read(void *buffer, int length);
61     void close();
62     void flush(FlushType type = FlushShallow);
63     int getc();
64
65 protected:
66     virtual bool rawOpen(const std::string &filename, File::Mode mode) = 0;
67     virtual bool rawWrite(const void *buffer, int length) = 0;
68     virtual bool rawRead(void *buffer, int length) = 0;
69     virtual int rawGetc() = 0;
70     virtual void rawClose() = 0;
71     virtual void rawFlush(FlushType type) = 0;
72
73 protected:
74     std::string m_filename;
75     File::Mode m_mode;
76     bool m_isOpened;
77 };
78
79 inline bool File::isOpened() const
80 {
81     return m_isOpened;
82 }
83
84 inline File::Mode File::mode() const
85 {
86     return m_mode;
87 }
88
89 inline std::string File::filename() const
90 {
91     return m_filename;
92 }
93
94 inline bool File::open(const std::string &filename, File::Mode mode)
95 {
96     if (m_isOpened) {
97         close();
98     }
99     m_isOpened = rawOpen(filename, mode);
100     m_mode = mode;
101
102     return m_isOpened;
103 }
104
105 inline bool File::write(const void *buffer, int length)
106 {
107     if (!m_isOpened || m_mode != File::Write) {
108         return false;
109     }
110     return rawWrite(buffer, length);
111 }
112
113 inline bool File::read(void *buffer, int length)
114 {
115     if (!m_isOpened || m_mode != File::Read) {
116         return false;
117     }
118     return rawRead(buffer, length);
119 }
120
121 inline void File::close()
122 {
123     if (m_isOpened) {
124         rawClose();
125         m_isOpened = false;
126     }
127 }
128
129 inline void File::flush(File::FlushType type)
130 {
131     rawFlush(type);
132 }
133
134 inline int File::getc()
135 {
136     if (!m_isOpened || m_mode != File::Read) {
137         return 0;
138     }
139     return rawGetc();
140 }
141
142 class ZLibFile : public File {
143 public:
144     ZLibFile(const std::string &filename = std::string(),
145              File::Mode mode = File::Read);
146     virtual ~ZLibFile();
147
148 protected:
149     virtual bool rawOpen(const std::string &filename, File::Mode mode);
150     virtual bool rawWrite(const void *buffer, int length);
151     virtual bool rawRead(void *buffer, int length);
152     virtual int rawGetc();
153     virtual void rawClose();
154     virtual void rawFlush(FlushType type);
155 private:
156     void *m_gzFile;
157 };
158
159 }
160
161 #endif