1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/datstrm.h
3 // Purpose:     Data stream classes
4 // Author:      Guilhem Lavaux
5 // Modified by: Mickael Gilabert
6 // Created:     28/06/1998
7 // Copyright:   (c) Guilhem Lavaux
8 // Licence:     wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _WX_DATSTREAM_H_
12 #define _WX_DATSTREAM_H_
13 
14 #include "wx/stream.h"
15 #include "wx/longlong.h"
16 #include "wx/convauto.h"
17 
18 #if wxUSE_STREAMS
19 
20 // Common wxDataInputStream and wxDataOutputStream parameters.
21 class WXDLLIMPEXP_BASE wxDataStreamBase
22 {
23 public:
BigEndianOrdered(bool be_order)24     void BigEndianOrdered(bool be_order) { m_be_order = be_order; }
25 
26     // By default we use extended precision (80 bit) format for both float and
27     // doubles. Call this function to switch to alternative representation in
28     // which IEEE 754 single precision (32 bits) is used for floats and double
29     // precision (64 bits) is used for doubles.
UseBasicPrecisions()30     void UseBasicPrecisions()
31     {
32 #if wxUSE_APPLE_IEEE
33         m_useExtendedPrecision = false;
34 #endif // wxUSE_APPLE_IEEE
35     }
36 
37     // UseExtendedPrecision() is not very useful as it corresponds to the
38     // default value, only call it in your code if you want the compilation
39     // fail with the error when using wxWidgets library compiled without
40     // extended precision support.
41 #if wxUSE_APPLE_IEEE
UseExtendedPrecision()42     void UseExtendedPrecision()
43     {
44         m_useExtendedPrecision = true;
45     }
46 #endif // wxUSE_APPLE_IEEE
47 
48 #if wxUSE_UNICODE
49     void SetConv( const wxMBConv &conv );
GetConv()50     wxMBConv *GetConv() const { return m_conv; }
51 #endif
52 
53 protected:
54     // Ctor and dtor are both protected, this class is never used directly but
55     // only by its derived classes.
56     wxDataStreamBase(const wxMBConv& conv);
57     ~wxDataStreamBase();
58 
59 
60     bool m_be_order;
61 
62 #if wxUSE_APPLE_IEEE
63     bool m_useExtendedPrecision;
64 #endif // wxUSE_APPLE_IEEE
65 
66 #if wxUSE_UNICODE
67     wxMBConv *m_conv;
68 #endif
69 
70     wxDECLARE_NO_COPY_CLASS(wxDataStreamBase);
71 };
72 
73 
74 class WXDLLIMPEXP_BASE wxDataInputStream : public wxDataStreamBase
75 {
76 public:
77     wxDataInputStream(wxInputStream& s, const wxMBConv& conv = wxConvUTF8);
78 
IsOk()79     bool IsOk() { return m_input->IsOk(); }
80 
81 #if wxHAS_INT64
82     wxUint64 Read64();
83 #endif
84 #if wxUSE_LONGLONG
85     wxLongLong ReadLL();
86 #endif
87     wxUint32 Read32();
88     wxUint16 Read16();
89     wxUint8 Read8();
90     double ReadDouble();
91     float ReadFloat();
92     wxString ReadString();
93 
94 #if wxHAS_INT64
95     void Read64(wxUint64 *buffer, size_t size);
96     void Read64(wxInt64 *buffer, size_t size);
97 #endif
98 #if defined(wxLongLong_t) && wxUSE_LONGLONG
99     void Read64(wxULongLong *buffer, size_t size);
100     void Read64(wxLongLong *buffer, size_t size);
101 #endif
102 #if wxUSE_LONGLONG
103     void ReadLL(wxULongLong *buffer, size_t size);
104     void ReadLL(wxLongLong *buffer, size_t size);
105 #endif
106     void Read32(wxUint32 *buffer, size_t size);
107     void Read16(wxUint16 *buffer, size_t size);
108     void Read8(wxUint8 *buffer, size_t size);
109     void ReadDouble(double *buffer, size_t size);
110     void ReadFloat(float *buffer, size_t size);
111 
112     wxDataInputStream& operator>>(wxString& s);
113     wxDataInputStream& operator>>(wxInt8& c);
114     wxDataInputStream& operator>>(wxInt16& i);
115     wxDataInputStream& operator>>(wxInt32& i);
116     wxDataInputStream& operator>>(wxUint8& c);
117     wxDataInputStream& operator>>(wxUint16& i);
118     wxDataInputStream& operator>>(wxUint32& i);
119 #if wxHAS_INT64
120     wxDataInputStream& operator>>(wxUint64& i);
121     wxDataInputStream& operator>>(wxInt64& i);
122 #endif
123 #if defined(wxLongLong_t) && wxUSE_LONGLONG
124     wxDataInputStream& operator>>(wxULongLong& i);
125     wxDataInputStream& operator>>(wxLongLong& i);
126 #endif
127     wxDataInputStream& operator>>(double& d);
128     wxDataInputStream& operator>>(float& f);
129 
130 protected:
131     wxInputStream *m_input;
132 
133     wxDECLARE_NO_COPY_CLASS(wxDataInputStream);
134 };
135 
136 class WXDLLIMPEXP_BASE wxDataOutputStream : public wxDataStreamBase
137 {
138 public:
139     wxDataOutputStream(wxOutputStream& s, const wxMBConv& conv = wxConvUTF8);
140 
IsOk()141     bool IsOk() { return m_output->IsOk(); }
142 
143 #if wxHAS_INT64
144     void Write64(wxUint64 i);
145     void Write64(wxInt64 i);
146 #endif
147 #if wxUSE_LONGLONG
148     void WriteLL(const wxLongLong &ll);
149     void WriteLL(const wxULongLong &ll);
150 #endif
151     void Write32(wxUint32 i);
152     void Write16(wxUint16 i);
153     void Write8(wxUint8 i);
154     void WriteDouble(double d);
155     void WriteFloat(float f);
156     void WriteString(const wxString& string);
157 
158 #if wxHAS_INT64
159     void Write64(const wxUint64 *buffer, size_t size);
160     void Write64(const wxInt64 *buffer, size_t size);
161 #endif
162 #if defined(wxLongLong_t) && wxUSE_LONGLONG
163     void Write64(const wxULongLong *buffer, size_t size);
164     void Write64(const wxLongLong *buffer, size_t size);
165 #endif
166 #if wxUSE_LONGLONG
167     void WriteLL(const wxULongLong *buffer, size_t size);
168     void WriteLL(const wxLongLong *buffer, size_t size);
169 #endif
170     void Write32(const wxUint32 *buffer, size_t size);
171     void Write16(const wxUint16 *buffer, size_t size);
172     void Write8(const wxUint8 *buffer, size_t size);
173     void WriteDouble(const double *buffer, size_t size);
174     void WriteFloat(const float *buffer, size_t size);
175 
176     wxDataOutputStream& operator<<(const wxString& string);
177     wxDataOutputStream& operator<<(wxInt8 c);
178     wxDataOutputStream& operator<<(wxInt16 i);
179     wxDataOutputStream& operator<<(wxInt32 i);
180     wxDataOutputStream& operator<<(wxUint8 c);
181     wxDataOutputStream& operator<<(wxUint16 i);
182     wxDataOutputStream& operator<<(wxUint32 i);
183 #if wxHAS_INT64
184     wxDataOutputStream& operator<<(wxUint64 i);
185     wxDataOutputStream& operator<<(wxInt64 i);
186 #endif
187 #if defined(wxLongLong_t) && wxUSE_LONGLONG
188     wxDataOutputStream& operator<<(const wxULongLong &i);
189     wxDataOutputStream& operator<<(const wxLongLong &i);
190 #endif
191     wxDataOutputStream& operator<<(double d);
192     wxDataOutputStream& operator<<(float f);
193 
194 protected:
195     wxOutputStream *m_output;
196 
197     wxDECLARE_NO_COPY_CLASS(wxDataOutputStream);
198 };
199 
200 #endif
201   // wxUSE_STREAMS
202 
203 #endif
204     // _WX_DATSTREAM_H_
205