]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/stream.h
char handling fixed again
[wxWidgets.git] / include / wx / stream.h
... / ...
CommitLineData
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
24class WXDLLEXPORT wxStreamBase;
25class WXDLLEXPORT wxInputStream;
26class WXDLLEXPORT wxOutputStream;
27
28typedef wxInputStream& (*__wxInputManip)(wxInputStream&);
29typedef wxOutputStream& (*__wxOutputManip)(wxOutputStream&);
30
31WXDLLEXPORT wxOutputStream& wxEndL(wxOutputStream& o_stream);
32
33// ---------------------------------------------------------------------------
34// Stream buffer
35// ---------------------------------------------------------------------------
36
37class 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
116typedef enum {
117 wxStream_NOERROR = 0,
118 wxStream_EOF,
119 wxStream_WRITE_ERR,
120 wxStream_READ_ERR
121} wxStreamError;
122
123class 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
144class 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 virtual 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
188class WXDLLEXPORT wxOutputStream: public wxStreamBase {
189 public:
190 wxOutputStream();
191 wxOutputStream(wxStreamBuffer *sbuf);
192 virtual ~wxOutputStream();
193
194 virtual 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
233class 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
248class 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