]> git.cworth.org Git - apitrace/blob - trace_file.cpp
Abstract file writing operation into a class of its own.
[apitrace] / trace_file.cpp
1 #include "trace_file.hpp"
2
3 #include <zlib.h>
4
5 using namespace Trace;
6
7 File::File(const std::string &filename,
8            File::Mode mode)
9     : m_filename(filename),
10       m_mode(mode),
11       m_isOpened(false)
12 {
13     if (!m_filename.empty()) {
14         open(m_filename, m_mode);
15     }
16 }
17
18 File::~File()
19 {
20     close();
21 }
22
23 bool File::isOpened() const
24 {
25     return m_isOpened;
26 }
27
28 File::Mode File::mode() const
29 {
30     return m_mode;
31 }
32
33 std::string File::filename() const
34 {
35     return m_filename;
36 }
37
38 bool File::open(const std::string &filename, File::Mode mode)
39 {
40     if (m_isOpened) {
41         close();
42     }
43     m_isOpened = rawOpen(filename, mode);
44     return m_isOpened;
45 }
46
47 bool File::write(const void *buffer, int length)
48 {
49     if (!m_isOpened || m_mode != File::Write) {
50         return false;
51     }
52     return rawWrite(buffer, length);
53 }
54
55 bool File::read(void *buffer, int length)
56 {
57     if (!m_isOpened || m_mode != File::Read) {
58         return false;
59     }
60     return rawRead(buffer, length);
61 }
62
63 void File::close()
64 {
65     if (m_isOpened) {
66         rawClose();
67         m_isOpened = false;
68     }
69 }
70
71 void File::flush()
72 {
73     rawFlush();
74 }
75
76 char File::getc()
77 {
78     if (!m_isOpened || m_mode != File::Read) {
79         return 0;
80     }
81     return rawGetc();
82 }
83
84 ZLibFile::ZLibFile(const std::string &filename,
85                    File::Mode mode)
86     : File(filename, mode),
87       m_gzFile(NULL)
88 {
89 }
90
91 ZLibFile::~ZLibFile()
92 {
93 }
94
95 bool ZLibFile::rawOpen(const std::string &filename, File::Mode mode)
96 {
97     m_gzFile = gzopen(filename.c_str(),
98                       (mode == File::Write) ? "wb" : "rb");
99     return m_gzFile != NULL;
100 }
101
102 bool ZLibFile::rawWrite(const void *buffer, int length)
103 {
104     return gzwrite(m_gzFile, buffer, length);
105 }
106
107 bool ZLibFile::rawRead(void *buffer, int length)
108 {
109     return gzread(m_gzFile, buffer, length);
110 }
111
112 char ZLibFile::rawGetc()
113 {
114     return gzgetc(m_gzFile);
115 }
116
117 void ZLibFile::rawClose()
118 {
119     if (m_gzFile) {
120         gzclose(m_gzFile);
121         m_gzFile = NULL;
122     }
123 }
124
125 void ZLibFile::rawFlush()
126 {
127     gzflush(m_gzFile, Z_SYNC_FLUSH);
128 }