]> git.cworth.org Git - apitrace/blob - trace_file.hpp
Change filterText to searchText
[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 public:
42     static bool isZLibCompressed(const std::string &filename);
43     static bool isSnappyCompressed(const std::string &filename);
44 public:
45     File(const std::string &filename = std::string(),
46          File::Mode mode = File::Read);
47     virtual ~File();
48
49     bool isOpened() const;
50     File::Mode mode() const;
51
52     std::string filename() const;
53
54     bool open(const std::string &filename, File::Mode mode);
55     bool write(const void *buffer, int length);
56     bool read(void *buffer, int length);
57     void close();
58     void flush(void);
59     int getc();
60
61 protected:
62     virtual bool rawOpen(const std::string &filename, File::Mode mode) = 0;
63     virtual bool rawWrite(const void *buffer, int length) = 0;
64     virtual bool rawRead(void *buffer, int length) = 0;
65     virtual int rawGetc() = 0;
66     virtual void rawClose() = 0;
67     virtual void rawFlush() = 0;
68
69 protected:
70     std::string m_filename;
71     File::Mode m_mode;
72     bool m_isOpened;
73 };
74
75 inline bool File::isOpened() const
76 {
77     return m_isOpened;
78 }
79
80 inline File::Mode File::mode() const
81 {
82     return m_mode;
83 }
84
85 inline std::string File::filename() const
86 {
87     return m_filename;
88 }
89
90 inline bool File::open(const std::string &filename, File::Mode mode)
91 {
92     if (m_isOpened) {
93         close();
94     }
95     m_isOpened = rawOpen(filename, mode);
96     m_mode = mode;
97
98     return m_isOpened;
99 }
100
101 inline bool File::write(const void *buffer, int length)
102 {
103     if (!m_isOpened || m_mode != File::Write) {
104         return false;
105     }
106     return rawWrite(buffer, length);
107 }
108
109 inline bool File::read(void *buffer, int length)
110 {
111     if (!m_isOpened || m_mode != File::Read) {
112         return false;
113     }
114     return rawRead(buffer, length);
115 }
116
117 inline void File::close()
118 {
119     if (m_isOpened) {
120         rawClose();
121         m_isOpened = false;
122     }
123 }
124
125 inline void File::flush(void)
126 {
127     rawFlush();
128 }
129
130 inline int File::getc()
131 {
132     if (!m_isOpened || m_mode != File::Read) {
133         return -1;
134     }
135     return rawGetc();
136 }
137
138 class ZLibFile : public File {
139 public:
140     ZLibFile(const std::string &filename = std::string(),
141              File::Mode mode = File::Read);
142     virtual ~ZLibFile();
143
144 protected:
145     virtual bool rawOpen(const std::string &filename, File::Mode mode);
146     virtual bool rawWrite(const void *buffer, int length);
147     virtual bool rawRead(void *buffer, int length);
148     virtual int rawGetc();
149     virtual void rawClose();
150     virtual void rawFlush();
151 private:
152     void *m_gzFile;
153 };
154
155 }
156
157 #endif