blob: a8b33459a024dc44d348f1c6cdd075d2e52a5439 [file] [log] [blame]
José Fonseca9898b332011-08-25 13:31:31 +01001/**************************************************************************
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
Zack Rusin5ce45e72011-08-05 13:43:46 -040027#ifndef TRACE_FILE_HPP
28#define TRACE_FILE_HPP
29
30#include <string>
Zack Rusina26cf3e2011-08-06 16:12:09 -040031#include <fstream>
Zack Rusin5ce45e72011-08-05 13:43:46 -040032
33namespace Trace {
34
35class File {
36public:
37 enum Mode {
38 Read,
39 Write
40 };
41public:
Zack Rusin14b78f82011-08-06 19:26:46 -040042 static bool isZLibCompressed(const std::string &filename);
Zack Rusin6dce37c2011-08-08 09:59:58 -040043 static bool isSnappyCompressed(const std::string &filename);
Zack Rusin14b78f82011-08-06 19:26:46 -040044public:
Zack Rusin5ce45e72011-08-05 13:43:46 -040045 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;
Zack Rusin124cd342011-08-24 21:54:56 -040051
Zack Rusin5ce45e72011-08-05 13:43:46 -040052 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();
José Fonsecaaf17c802011-08-25 15:36:23 +010058 void flush(void);
Zack Rusinbb130e52011-08-06 18:58:39 -040059 int getc();
Zack Rusin5ce45e72011-08-05 13:43:46 -040060
61protected:
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;
Zack Rusinbb130e52011-08-06 18:58:39 -040065 virtual int rawGetc() = 0;
Zack Rusin5ce45e72011-08-05 13:43:46 -040066 virtual void rawClose() = 0;
José Fonsecaaf17c802011-08-25 15:36:23 +010067 virtual void rawFlush() = 0;
Zack Rusin5ce45e72011-08-05 13:43:46 -040068
69protected:
70 std::string m_filename;
71 File::Mode m_mode;
72 bool m_isOpened;
73};
74
Zack Rusin124cd342011-08-24 21:54:56 -040075inline bool File::isOpened() const
76{
77 return m_isOpened;
78}
79
80inline File::Mode File::mode() const
81{
82 return m_mode;
83}
84
85inline std::string File::filename() const
86{
87 return m_filename;
88}
89
90inline 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
101inline 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
109inline 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
117inline void File::close()
118{
119 if (m_isOpened) {
120 rawClose();
121 m_isOpened = false;
122 }
123}
124
José Fonsecaaf17c802011-08-25 15:36:23 +0100125inline void File::flush(void)
Zack Rusin124cd342011-08-24 21:54:56 -0400126{
José Fonsecaaf17c802011-08-25 15:36:23 +0100127 rawFlush();
Zack Rusin124cd342011-08-24 21:54:56 -0400128}
129
130inline int File::getc()
131{
132 if (!m_isOpened || m_mode != File::Read) {
133 return 0;
134 }
135 return rawGetc();
136}
137
Zack Rusin5ce45e72011-08-05 13:43:46 -0400138class ZLibFile : public File {
139public:
140 ZLibFile(const std::string &filename = std::string(),
141 File::Mode mode = File::Read);
142 virtual ~ZLibFile();
143
144protected:
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);
Zack Rusinbb130e52011-08-06 18:58:39 -0400148 virtual int rawGetc();
Zack Rusin5ce45e72011-08-05 13:43:46 -0400149 virtual void rawClose();
José Fonsecaaf17c802011-08-25 15:36:23 +0100150 virtual void rawFlush();
Zack Rusin5ce45e72011-08-05 13:43:46 -0400151private:
152 void *m_gzFile;
153};
154
Zack Rusin5ce45e72011-08-05 13:43:46 -0400155}
156
157#endif