1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: "wxWindows stream" base classes
4 // Author: Guilhem Lavaux
8 // Copyright: (c) Guilhem Lavaux
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef __WXSTREAM_H__
13 #define __WXSTREAM_H__
20 #include "wx/object.h"
21 #include "wx/string.h"
22 #include "wx/filefn.h" // for off_t, wxInvalidOffset and wxSeekMode
24 class WXDLLEXPORT wxInputStream
;
25 class WXDLLEXPORT wxOutputStream
;
27 typedef wxInputStream
& (*__wxInputManip
)(wxInputStream
&);
28 typedef wxOutputStream
& (*__wxOutputManip
)(wxOutputStream
&);
30 wxOutputStream
& WXDLLEXPORT
wxEndL(wxOutputStream
& o_stream
);
32 class WXDLLEXPORT wxStreamBuffer
{
34 wxStreamBuffer(wxInputStream
& stream
);
35 wxStreamBuffer(wxOutputStream
& stream
);
38 void Read(void *buffer
, size_t size
);
39 void Write(const void *buffer
, size_t size
);
40 void WriteBack(char c
);
42 void SetBufferIO(char *buffer_start
, char *buffer_end
);
43 void SetBufferIO(size_t bufsize
);
46 void SetBufferPosition(char *buffer_position
)
47 { m_buffer_pos
= buffer_position
; }
48 void SetIntPosition(size_t pos
)
49 { m_buffer_pos
= m_buffer_start
+ pos
; }
50 char *GetBufferPosition() const { return m_buffer_pos
; }
51 size_t GetIntPosition() const { return m_buffer_pos
- m_buffer_start
; }
53 char *GetBufferStart() const { return m_buffer_start
; }
54 char *GetBufferEnd() const { return m_buffer_end
; }
55 size_t GetBufferSize() const { return m_buffer_size
; }
56 size_t GetLastAccess() const { return m_buffer_end
- m_buffer_start
; }
59 char *m_buffer_start
, *m_buffer_end
, *m_buffer_pos
;
62 wxInputStream
*m_istream
;
63 wxOutputStream
*m_ostream
;
67 * wxStream: base classes
69 class WXDLLEXPORT wxInputStream
{
72 virtual ~wxInputStream();
75 virtual char Peek() = 0;
77 virtual wxInputStream
& Read(void *buffer
, size_t size
);
78 wxInputStream
& Read(wxOutputStream
& stream_out
);
81 virtual off_t
SeekI(off_t pos
, wxSeekMode mode
= wxFromStart
);
82 virtual off_t
TellI() const;
85 bool Eof() const { return m_eof
; }
86 size_t LastRead() { return m_lastread
; }
87 wxStreamBuffer
*InputStreamBuffer() { return m_i_streambuf
; }
90 wxInputStream
& operator>>(wxOutputStream
& out
) { return Read(out
); }
91 wxInputStream
& operator>>(wxString
& line
);
92 wxInputStream
& operator>>(char& c
);
93 wxInputStream
& operator>>(short& i
);
94 wxInputStream
& operator>>(int& i
);
95 wxInputStream
& operator>>(long& i
);
96 wxInputStream
& operator>>(float& i
);
97 wxInputStream
& operator>>(wxObject
*& obj
);
99 wxInputStream
& operator>>(unsigned char& c
) { return operator>>((char&)c
); }
100 wxInputStream
& operator>>(unsigned short& i
) { return operator>>((short&)i
); }
101 wxInputStream
& operator>>(unsigned int& i
) { return operator>>((int&)i
); }
102 wxInputStream
& operator>>(unsigned long& i
) { return operator>>((long&)i
); }
103 wxInputStream
& operator>>( __wxInputManip func
) { return func(*this); }
106 friend class wxStreamBuffer
;
107 friend class wxFilterInputStream
;
109 wxInputStream(wxStreamBuffer
*buffer
);
111 virtual size_t DoRead(void *buffer
, size_t size
) = 0;
112 virtual off_t
DoSeekInput(off_t pos
, wxSeekMode mode
) = 0;
113 virtual off_t
DoTellInput() const = 0;
116 bool m_eof
, m_i_destroybuf
;
118 wxStreamBuffer
*m_i_streambuf
;
121 class WXDLLEXPORT wxOutputStream
{
124 virtual ~wxOutputStream();
126 virtual wxOutputStream
& Write(const void *buffer
, size_t size
);
127 wxOutputStream
& Write(wxInputStream
& stream_in
);
129 virtual off_t
SeekO(off_t pos
, wxSeekMode mode
= wxFromStart
);
130 virtual off_t
TellO() const;
132 virtual bool Bad() const { return m_bad
; }
133 virtual size_t LastWrite() const { return m_lastwrite
; }
134 wxStreamBuffer
*OutputStreamBuffer() { return m_o_streambuf
; }
138 wxOutputStream
& operator<<(wxInputStream
& out
) { return Write(out
); }
139 wxOutputStream
& operator<<(const char *string
);
140 wxOutputStream
& operator<<(wxString
& string
);
141 wxOutputStream
& operator<<(char c
);
142 wxOutputStream
& operator<<(short i
);
143 wxOutputStream
& operator<<(int i
);
144 wxOutputStream
& operator<<(long i
);
145 wxOutputStream
& operator<<(double f
);
146 wxOutputStream
& operator<<(wxObject
& obj
);
148 wxOutputStream
& operator<<(float f
) { return operator<<((double)f
); }
149 wxOutputStream
& operator<<(unsigned char c
) { return operator<<((char)c
); }
150 wxOutputStream
& operator<<(unsigned short i
) { return operator<<((short)i
); }
151 wxOutputStream
& operator<<(unsigned int i
) { return operator<<((int)i
); }
152 wxOutputStream
& operator<<(unsigned long i
) { return operator<<((long)i
); }
153 wxOutputStream
& operator<<( __wxOutputManip func
) { return func(*this); }
156 friend class wxStreamBuffer
;
157 friend class wxFilterOutputStream
;
159 wxOutputStream(wxStreamBuffer
*buffer
);
161 virtual size_t DoWrite(const void *buffer
, size_t size
) = 0;
162 virtual off_t
DoSeekOutput(off_t pos
, wxSeekMode mode
) = 0;
163 virtual off_t
DoTellOutput() const = 0;
166 bool m_bad
, m_o_destroybuf
;
168 wxStreamBuffer
*m_o_streambuf
;
175 class WXDLLEXPORT wxFilterInputStream
: public wxInputStream
{
177 wxFilterInputStream(wxInputStream
& stream
);
178 virtual ~wxFilterInputStream();
180 virtual char Peek() { return m_parent_i_stream
->Peek(); }
182 virtual bool Eof() const { return m_parent_i_stream
->Eof(); }
183 virtual size_t LastRead() const { return m_parent_i_stream
->LastRead(); }
184 virtual off_t
TellI() const { return m_parent_i_stream
->TellI(); }
187 virtual size_t DoRead(void *buffer
, size_t size
);
188 virtual off_t
DoSeekInput(off_t pos
, wxSeekMode mode
);
189 virtual off_t
DoTellInput() const;
192 wxInputStream
*m_parent_i_stream
;
195 class WXDLLEXPORT wxFilterOutputStream
: public wxOutputStream
{
197 wxFilterOutputStream(wxOutputStream
& stream
);
198 virtual ~wxFilterOutputStream();
200 virtual bool Bad() const { return m_parent_o_stream
->Bad(); }
201 virtual size_t LastWrite() const { return m_parent_o_stream
->LastWrite(); }
202 virtual off_t
TellO() const { return m_parent_o_stream
->TellO(); }
205 // The forward is implicitely done by wxStreamBuffer.
207 virtual size_t DoWrite(const void *buffer
, size_t size
);
208 virtual off_t
DoSeekOutput(off_t pos
, wxSeekMode mode
);
209 virtual off_t
DoTellOutput() const;
212 wxOutputStream
*m_parent_o_stream
;