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