blob: 60a8459d93c9436283deceae508b7708071ace0b [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);
José Fonseca94194a22011-09-01 11:54:48 +010055 bool write(const void *buffer, size_t length);
56 bool read(void *buffer, size_t length);
Zack Rusin5ce45e72011-08-05 13:43:46 -040057 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;
José Fonseca94194a22011-09-01 11:54:48 +010063 virtual bool rawWrite(const void *buffer, size_t length) = 0;
64 virtual bool rawRead(void *buffer, size_t 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
José Fonseca94194a22011-09-01 11:54:48 +0100101inline bool File::write(const void *buffer, size_t length)
Zack Rusin124cd342011-08-24 21:54:56 -0400102{
103 if (!m_isOpened || m_mode != File::Write) {
104 return false;
105 }
106 return rawWrite(buffer, length);
107}
108
José Fonseca94194a22011-09-01 11:54:48 +0100109inline bool File::read(void *buffer, size_t length)
Zack Rusin124cd342011-08-24 21:54:56 -0400110{
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é Fonsecaf3acd092011-09-03 13:30:16 +0100127 if (m_mode == File::Write) {
128 rawFlush();
129 }
Zack Rusin124cd342011-08-24 21:54:56 -0400130}
131
132inline int File::getc()
133{
134 if (!m_isOpened || m_mode != File::Read) {
José Fonseca2d0d8382011-08-26 11:38:36 +0100135 return -1;
Zack Rusin124cd342011-08-24 21:54:56 -0400136 }
137 return rawGetc();
138}
139
Zack Rusin5ce45e72011-08-05 13:43:46 -0400140class ZLibFile : public File {
141public:
142 ZLibFile(const std::string &filename = std::string(),
143 File::Mode mode = File::Read);
144 virtual ~ZLibFile();
145
146protected:
147 virtual bool rawOpen(const std::string &filename, File::Mode mode);
José Fonseca94194a22011-09-01 11:54:48 +0100148 virtual bool rawWrite(const void *buffer, size_t length);
149 virtual bool rawRead(void *buffer, size_t length);
Zack Rusinbb130e52011-08-06 18:58:39 -0400150 virtual int rawGetc();
Zack Rusin5ce45e72011-08-05 13:43:46 -0400151 virtual void rawClose();
José Fonsecaaf17c802011-08-25 15:36:23 +0100152 virtual void rawFlush();
Zack Rusin5ce45e72011-08-05 13:43:46 -0400153private:
154 void *m_gzFile;
155};
156
Zack Rusin5ce45e72011-08-05 13:43:46 -0400157}
158
159#endif