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