* Fixes
[wxWidgets.git] / include / wx / stream.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: stream.h
3 // Purpose: "wxWindows stream" base classes
4 // Author: Guilhem Lavaux
5 // Modified by:
6 // Created: 11/07/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Guilhem Lavaux
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_WXSTREAM_H__
13 #define _WX_WXSTREAM_H__
14
15 #ifdef __GNUG__
16 #pragma interface
17 #endif
18
19 #include <stdio.h>
20 #include "wx/object.h"
21 #include "wx/string.h"
22 #include "wx/filefn.h" // for off_t, wxInvalidOffset and wxSeekMode
23
24 class WXDLLEXPORT wxStreamBase;
25 class WXDLLEXPORT wxInputStream;
26 class WXDLLEXPORT wxOutputStream;
27
28 typedef wxInputStream& (*__wxInputManip)(wxInputStream&);
29 typedef wxOutputStream& (*__wxOutputManip)(wxOutputStream&);
30
31 WXDLLEXPORT wxOutputStream& wxEndL(wxOutputStream& o_stream);
32
33 // ---------------------------------------------------------------------------
34 // Stream buffer
35 // ---------------------------------------------------------------------------
36
37 class WXDLLEXPORT wxStreamBuffer {
38 public:
39 typedef enum {
40 read = 0, write, read_write
41 } BufMode;
42
43 // -----------
44 // ctor & dtor
45 // -----------
46 wxStreamBuffer(wxStreamBase& stream, BufMode mode);
47 wxStreamBuffer(BufMode mode);
48 wxStreamBuffer(const wxStreamBuffer& buf);
49 ~wxStreamBuffer();
50
51 // -----------
52 // Filtered IO
53 // -----------
54 size_t Read(void *buffer, size_t size);
55 size_t Read(wxStreamBuffer *buf);
56 size_t Write(const void *buffer, size_t size);
57 size_t Write(wxStreamBuffer *buf);
58
59 size_t WriteBack(const char *buffer, size_t size);
60 bool WriteBack(char c);
61 char GetChar();
62 void PutChar(char c);
63 off_t Tell() const;
64 off_t Seek(off_t pos, wxSeekMode mode);
65
66 // --------------
67 // Buffer control
68 // --------------
69 void ResetBuffer();
70 void SetBufferIO(char *buffer_start, char *buffer_end);
71 void SetBufferIO(size_t bufsize);
72 char *GetBufferStart() const { return m_buffer_start; }
73 char *GetBufferEnd() const { return m_buffer_end; }
74 char *GetBufferPos() const { return m_buffer_pos; }
75 off_t GetIntPosition() const { return m_buffer_pos-m_buffer_start; }
76 void SetIntPosition(off_t pos) { m_buffer_pos = m_buffer_start+pos; }
77 size_t GetLastAccess() const { return m_buffer_end-m_buffer_start; }
78
79 void Fixed(bool fixed) { m_fixed = fixed; }
80 void Flushable(bool f) { m_flushable = f; }
81
82 bool FlushBuffer();
83 bool FillBuffer();
84 size_t GetDataLeft();
85
86 // --------------
87 // Administration
88 // --------------
89 wxStreamBase *Stream() { return m_stream; }
90
91 protected:
92 char *AllocSpaceWBack(size_t needed_size);
93 size_t GetWBack(char *buf, size_t bsize);
94
95 void GetFromBuffer(void *buffer, size_t size);
96 void PutToBuffer(const void *buffer, size_t size);
97
98 protected:
99 char *m_buffer_start, *m_buffer_end, *m_buffer_pos;
100 size_t m_buffer_size;
101
102 char *m_wback;
103 size_t m_wbacksize, m_wbackcur;
104
105 bool m_fixed, m_flushable;
106
107 wxStreamBase *m_stream;
108 BufMode m_mode;
109 bool m_destroybuf, m_destroystream;
110 };
111
112 // ---------------------------------------------------------------------------
113 // wxStream: base classes
114 // ---------------------------------------------------------------------------
115
116 typedef enum {
117 wxStream_NOERROR = 0,
118 wxStream_EOF,
119 wxStream_WRITE_ERR,
120 wxStream_READ_ERR
121 } wxStreamError;
122
123 class WXDLLEXPORT wxStreamBase {
124 public:
125 wxStreamBase();
126 virtual ~wxStreamBase();
127
128 wxStreamError LastError() const { return m_lasterror; }
129 virtual size_t StreamSize() const { return ~((size_t)0); }
130
131 protected:
132 friend class wxStreamBuffer;
133
134 virtual size_t OnSysRead(void *buffer, size_t bufsize);
135 virtual size_t OnSysWrite(const void *buffer, size_t bufsize);
136 virtual off_t OnSysSeek(off_t seek, wxSeekMode mode);
137 virtual off_t OnSysTell() const;
138
139 protected:
140 size_t m_lastcount;
141 wxStreamError m_lasterror;
142 };
143
144 class WXDLLEXPORT wxInputStream: public wxStreamBase {
145 public:
146 wxInputStream();
147 wxInputStream(wxStreamBuffer *sbuf);
148 virtual ~wxInputStream();
149
150 // IO functions
151 virtual char Peek();
152 char GetC();
153 wxInputStream& Read(void *buffer, size_t size);
154 wxInputStream& Read(wxOutputStream& stream_out);
155
156 // Position functions
157 off_t SeekI(off_t pos, wxSeekMode mode = wxFromStart);
158 off_t TellI() const;
159
160 // State functions
161 wxStreamBuffer *InputStreamBuffer() { return m_i_streambuf; }
162 size_t LastRead() { return wxStreamBase::m_lastcount; }
163
164 // Operators
165 wxInputStream& operator>>(wxOutputStream& out) { return Read(out); }
166 wxInputStream& operator>>(wxString& line);
167 wxInputStream& operator>>(char& c);
168 wxInputStream& operator>>(short& i);
169 wxInputStream& operator>>(int& i);
170 wxInputStream& operator>>(long& i);
171 wxInputStream& operator>>(double& i);
172 #if wxUSE_SERIAL
173 wxInputStream& operator>>(wxObject *& obj);
174 #endif
175
176 wxInputStream& operator>>(float& f) { double d; operator>>((double&)d); f = (float)d; return *this; }
177 wxInputStream& operator>>(unsigned char& c) { return operator>>((char&)c); }
178 wxInputStream& operator>>(unsigned short& i) { return operator>>((short&)i); }
179 wxInputStream& operator>>(unsigned int& i) { return operator>>((int&)i); }
180 wxInputStream& operator>>(unsigned long& i) { return operator>>((long&)i); }
181 wxInputStream& operator>>( __wxInputManip func) { return func(*this); }
182
183 protected:
184 bool m_i_destroybuf;
185 wxStreamBuffer *m_i_streambuf;
186 };
187
188 class WXDLLEXPORT wxOutputStream: public wxStreamBase {
189 public:
190 wxOutputStream();
191 wxOutputStream(wxStreamBuffer *sbuf);
192 virtual ~wxOutputStream();
193
194 wxOutputStream& Write(const void *buffer, size_t size);
195 wxOutputStream& Write(wxInputStream& stream_in);
196
197 off_t SeekO(off_t pos, wxSeekMode mode = wxFromStart);
198 off_t TellO() const;
199
200 size_t LastWrite() const { return wxStreamBase::m_lastcount; }
201 wxStreamBuffer *OutputStreamBuffer() { return m_o_streambuf; }
202
203 void Sync();
204
205 wxOutputStream& operator<<(wxInputStream& out) { return Write(out); }
206 wxOutputStream& operator<<(const char *string);
207 wxOutputStream& operator<<(wxString& string);
208 wxOutputStream& operator<<(char c);
209 wxOutputStream& operator<<(short i);
210 wxOutputStream& operator<<(int i);
211 wxOutputStream& operator<<(long i);
212 wxOutputStream& operator<<(double f);
213 #if wxUSE_SERIAL
214 wxOutputStream& operator<<(wxObject& obj);
215 #endif
216
217 wxOutputStream& operator<<(float f) { return operator<<((double)f); }
218 wxOutputStream& operator<<(unsigned char c) { return operator<<((char)c); }
219 wxOutputStream& operator<<(unsigned short i) { return operator<<((short)i); }
220 wxOutputStream& operator<<(unsigned int i) { return operator<<((int)i); }
221 wxOutputStream& operator<<(unsigned long i) { return operator<<((long)i); }
222 wxOutputStream& operator<<( __wxOutputManip func) { return func(*this); }
223
224 protected:
225 bool m_o_destroybuf;
226 wxStreamBuffer *m_o_streambuf;
227 };
228
229 // ---------------------------------------------------------------------------
230 // "Filter" streams
231 // ---------------------------------------------------------------------------
232
233 class WXDLLEXPORT wxFilterInputStream: public wxInputStream {
234 public:
235 wxFilterInputStream();
236 wxFilterInputStream(wxInputStream& stream);
237 ~wxFilterInputStream();
238
239 char Peek() { return m_parent_i_stream->Peek(); }
240
241 wxStreamError LastError() const { return m_parent_i_stream->LastError(); }
242 size_t StreamSize() const { return m_parent_i_stream->StreamSize(); }
243
244 protected:
245 wxInputStream *m_parent_i_stream;
246 };
247
248 class WXDLLEXPORT wxFilterOutputStream: public wxOutputStream {
249 public:
250 wxFilterOutputStream();
251 wxFilterOutputStream(wxOutputStream& stream);
252 ~wxFilterOutputStream();
253
254 wxStreamError LastError() const { return m_parent_o_stream->LastError(); }
255 size_t StreamSize() const { return m_parent_o_stream->StreamSize(); }
256
257 protected:
258 wxOutputStream *m_parent_o_stream;
259 };
260
261 #endif