1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: "wxWindows stream" base classes
4 // Author: Guilhem Lavaux
8 // Copyright: (c) Guilhem Lavaux
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef _WX_WXSTREAM_H__
13 #define _WX_WXSTREAM_H__
15 #if defined(__GNUG__) && !defined(__APPLE__)
16 #pragma interface "stream.h"
24 #include "wx/object.h"
25 #include "wx/string.h"
26 #include "wx/filefn.h" // for off_t, wxInvalidOffset and wxSeekMode
28 class WXDLLEXPORT wxStreamBase
;
29 class WXDLLEXPORT wxInputStream
;
30 class WXDLLEXPORT wxOutputStream
;
32 typedef wxInputStream
& (*__wxInputManip
)(wxInputStream
&);
33 typedef wxOutputStream
& (*__wxOutputManip
)(wxOutputStream
&);
35 WXDLLEXPORT wxOutputStream
& wxEndL(wxOutputStream
& o_stream
);
37 // ---------------------------------------------------------------------------
38 // wxStream: base classes
39 // ---------------------------------------------------------------------------
43 wxSTREAM_NO_ERROR
= 0,
44 wxSTREAM_NO_ERR
= wxSTREAM_NO_ERROR
,
45 wxSTREAM_NOERROR
= wxSTREAM_NO_ERROR
,
50 wxSTREAM_WRITE_ERR
= wxSTREAM_WRITE_ERROR
,
53 wxSTREAM_READ_ERR
= wxSTREAM_READ_ERROR
57 #define wxStream_NOERROR wxSTREAM_NOERROR
58 #define wxStream_EOF wxSTREAM_EOF
59 #define wxStream_WRITE_ERR wxSTREAM_WRITE_ERROR
60 #define wxStream_READ_ERR wxSTREAM_READ_ERROR
62 class WXDLLEXPORT wxStreamBase
66 virtual ~wxStreamBase();
69 wxStreamError
GetLastError() const { return m_lasterror
; }
70 bool IsOk() const { return LastError() == wxSTREAM_NOERROR
; }
71 bool operator!() const { return LastError() != wxSTREAM_NOERROR
; }
73 virtual size_t GetSize() const { return 0; }
75 // deprecated, for compatibility only
76 wxStreamError
LastError() const { return m_lasterror
; }
77 size_t StreamSize() const { return GetSize(); }
80 // VZ: these functions are really pure virtual and shouldn't be declared
81 // in the base class because it creates ambiguties in stream classes
82 // deriving from both wxInputStream and wxOutputStream
84 virtual size_t OnSysRead(void *buffer
, size_t bufsize
);
85 virtual size_t OnSysWrite(const void *buffer
, size_t bufsize
);
88 virtual off_t
OnSysSeek(off_t seek
, wxSeekMode mode
);
89 virtual off_t
OnSysTell() const;
91 friend class wxStreamBuffer
;
94 wxStreamError m_lasterror
;
97 class WXDLLEXPORT wxInputStream
: /* virtual */ public wxStreamBase
101 virtual ~wxInputStream();
103 // is the stream at EOF?
104 virtual bool Eof() const;
109 virtual wxInputStream
& Read(void *buffer
, size_t size
);
110 wxInputStream
& Read(wxOutputStream
& stream_out
);
112 // Position functions
113 virtual off_t
SeekI(off_t pos
, wxSeekMode mode
= wxFromStart
);
114 virtual off_t
TellI() const;
117 virtual size_t LastRead() { return wxStreamBase::m_lastcount
; }
120 size_t Ungetch(const void *buffer
, size_t size
);
121 bool Ungetch(char c
);
124 wxInputStream
& operator>>(wxOutputStream
& out
) { return Read(out
); }
125 wxInputStream
& operator>>( __wxInputManip func
) { return func(*this); }
128 // to be implemented in the derived classes (it should have been pure
130 virtual size_t OnSysRead(void *buffer
, size_t bufsize
);
137 char *AllocSpaceWBack(size_t needed_size
);
138 size_t GetWBack(void *buf
, size_t bsize
);
140 friend class wxStreamBuffer
;
143 class WXDLLEXPORT wxOutputStream
: /* virtual */ public wxStreamBase
147 virtual ~wxOutputStream();
150 virtual wxOutputStream
& Write(const void *buffer
, size_t size
);
151 wxOutputStream
& Write(wxInputStream
& stream_in
);
153 virtual off_t
SeekO(off_t pos
, wxSeekMode mode
= wxFromStart
);
154 virtual off_t
TellO() const;
156 virtual size_t LastWrite() const { return wxStreamBase::m_lastcount
; }
160 wxOutputStream
& operator<<(wxInputStream
& out
) { return Write(out
); }
161 wxOutputStream
& operator<<( __wxOutputManip func
) { return func(*this); }
164 // to be implemented in the derived classes (it should have been pure
166 virtual size_t OnSysWrite(const void *buffer
, size_t bufsize
);
168 friend class wxStreamBuffer
;
171 // ---------------------------------------------------------------------------
172 // A stream for measuring streamed output
173 // ---------------------------------------------------------------------------
175 class WXDLLEXPORT wxCountingOutputStream
: public wxOutputStream
178 wxCountingOutputStream();
180 size_t GetSize() const;
181 bool Ok() const { return TRUE
; }
184 virtual size_t OnSysWrite(const void *buffer
, size_t size
);
185 virtual off_t
OnSysSeek(off_t pos
, wxSeekMode mode
);
186 virtual off_t
OnSysTell() const;
191 // ---------------------------------------------------------------------------
193 // ---------------------------------------------------------------------------
195 class WXDLLEXPORT wxFilterInputStream
: public wxInputStream
198 wxFilterInputStream();
199 wxFilterInputStream(wxInputStream
& stream
);
200 virtual ~wxFilterInputStream();
202 char Peek() { return m_parent_i_stream
->Peek(); }
204 size_t GetSize() const { return m_parent_i_stream
->GetSize(); }
206 wxInputStream
*GetFilterInputStream() const { return m_parent_i_stream
; }
209 wxInputStream
*m_parent_i_stream
;
212 class WXDLLEXPORT wxFilterOutputStream
: public wxOutputStream
215 wxFilterOutputStream();
216 wxFilterOutputStream(wxOutputStream
& stream
);
217 virtual ~wxFilterOutputStream();
219 size_t GetSize() const { return m_parent_o_stream
->GetSize(); }
221 wxOutputStream
*GetFilterOutputStream() const { return m_parent_o_stream
; }
224 wxOutputStream
*m_parent_o_stream
;
227 // ---------------------------------------------------------------------------
228 // Stream buffer: this class can be derived from and passed to
229 // wxBufferedStreams to implement custom buffering
230 // ---------------------------------------------------------------------------
232 class WXDLLEXPORT wxStreamBuffer
242 wxStreamBuffer(wxStreamBase
& stream
, BufMode mode
);
243 wxStreamBuffer(BufMode mode
);
244 wxStreamBuffer(const wxStreamBuffer
& buf
);
245 virtual ~wxStreamBuffer();
248 virtual size_t Read(void *buffer
, size_t size
);
249 size_t Read(wxStreamBuffer
*buf
);
250 virtual size_t Write(const void *buffer
, size_t size
);
251 size_t Write(wxStreamBuffer
*buf
);
254 virtual char GetChar();
255 virtual void PutChar(char c
);
256 virtual off_t
Tell() const;
257 virtual off_t
Seek(off_t pos
, wxSeekMode mode
);
262 // NB: the buffer must always be allocated with malloc() if takeOwn is
263 // TRUE as it will be deallocated by free()
264 void SetBufferIO(void *start
, void *end
, bool takeOwnership
= FALSE
);
265 void SetBufferIO(void *start
, size_t len
, bool takeOwnership
= FALSE
);
266 void SetBufferIO(size_t bufsize
);
267 void *GetBufferStart() const { return m_buffer_start
; }
268 void *GetBufferEnd() const { return m_buffer_end
; }
269 void *GetBufferPos() const { return m_buffer_pos
; }
270 size_t GetBufferSize() const { return m_buffer_size
; }
271 size_t GetIntPosition() const { return m_buffer_pos
- m_buffer_start
; }
272 void SetIntPosition(size_t pos
) { m_buffer_pos
= m_buffer_start
+ pos
; }
273 size_t GetLastAccess() const { return m_buffer_end
- m_buffer_start
; }
274 size_t GetBytesLeft() const { return m_buffer_end
- m_buffer_pos
; }
276 void Fixed(bool fixed
) { m_fixed
= fixed
; }
277 void Flushable(bool f
) { m_flushable
= f
; }
281 size_t GetDataLeft();
284 wxStreamBase
*GetStream() const { return m_stream
; }
285 bool HasBuffer() const { return m_buffer_size
!= 0; }
287 bool IsFixed() const { return m_fixed
; }
288 bool IsFlushable() const { return m_flushable
; }
290 // only for input/output buffers respectively, returns NULL otherwise
291 wxInputStream
*GetInputStream() const;
292 wxOutputStream
*GetOutputStream() const;
294 // deprecated, for compatibility only
295 wxStreamBase
*Stream() { return m_stream
; }
298 void GetFromBuffer(void *buffer
, size_t size
);
299 void PutToBuffer(const void *buffer
, size_t size
);
301 // set the last error to the specified value if we didn't have it before
302 void SetError(wxStreamError err
);
304 // common part of several ctors
307 // init buffer variables to be empty
310 // free the buffer (always safe to call)
313 // the buffer itself: the pointers to its start and end and the current
314 // position in the buffer
315 char *m_buffer_start
,
320 // FIXME: isn't it the same as m_buffer_end - m_buffer_start? (VZ)
321 size_t m_buffer_size
;
323 // the stream we're associated with
324 wxStreamBase
*m_stream
;
330 bool m_destroybuf
, // deallocate buffer?
331 m_destroystream
, // delete associated stream?
336 // ---------------------------------------------------------------------------
338 // ---------------------------------------------------------------------------
340 class WXDLLEXPORT wxBufferedInputStream
: public wxFilterInputStream
343 // if a non NULL buffer is given to the stream, it will be deleted by it
344 wxBufferedInputStream(wxInputStream
& stream
,
345 wxStreamBuffer
*buffer
= NULL
);
346 virtual ~wxBufferedInputStream();
349 wxInputStream
& Read(void *buffer
, size_t size
);
351 // Position functions
352 off_t
SeekI(off_t pos
, wxSeekMode mode
= wxFromStart
);
355 // the buffer given to the stream will be deleted by it
356 void SetInputStreamBuffer(wxStreamBuffer
*buffer
);
357 wxStreamBuffer
*GetInputStreamBuffer() const { return m_i_streambuf
; }
359 // deprecated, for compatibility only
360 wxStreamBuffer
*InputStreamBuffer() const { return m_i_streambuf
; }
363 virtual size_t OnSysRead(void *buffer
, size_t bufsize
);
364 virtual off_t
OnSysSeek(off_t seek
, wxSeekMode mode
);
365 virtual off_t
OnSysTell() const;
367 wxStreamBuffer
*m_i_streambuf
;
370 class WXDLLEXPORT wxBufferedOutputStream
: public wxFilterOutputStream
373 // if a non NULL buffer is given to the stream, it will be deleted by it
374 wxBufferedOutputStream(wxOutputStream
& stream
,
375 wxStreamBuffer
*buffer
= NULL
);
376 virtual ~wxBufferedOutputStream();
378 wxOutputStream
& Write(const void *buffer
, size_t size
);
380 // Position functions
381 off_t
SeekO(off_t pos
, wxSeekMode mode
= wxFromStart
);
386 size_t GetSize() const;
388 // the buffer given to the stream will be deleted by it
389 void SetOutputStreamBuffer(wxStreamBuffer
*buffer
);
390 wxStreamBuffer
*GetOutputStreamBuffer() const { return m_o_streambuf
; }
392 // deprecated, for compatibility only
393 wxStreamBuffer
*OutputStreamBuffer() const { return m_o_streambuf
; }
396 virtual size_t OnSysWrite(const void *buffer
, size_t bufsize
);
397 virtual off_t
OnSysSeek(off_t seek
, wxSeekMode mode
);
398 virtual off_t
OnSysTell() const;
400 wxStreamBuffer
*m_o_streambuf
;
403 #endif // wxUSE_STREAMS
405 #endif // _WX_WXSTREAM_H__