xref: /trunk/main/vos/inc/vos/stream.hxx (revision d98e0520)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _VOS_STREAM_HXX_
25 #define _VOS_STREAM_HXX_
26 
27 #	include <vos/types.hxx>
28 #	include <vos/object.hxx>
29 #	include <vos/istream.hxx>
30 #	include <vos/vosdllapi.h>
31 
32 namespace vos
33 {
34 
35 /** Adds seeking capabilities to IStream
36 */
37 class IPositionableStream : public vos::IStream
38 {
39 
40 public:
41 
42     typedef sal_Int32 Offset;
43 
44 public:
45 
46 	///
47     virtual sal_Bool SAL_CALL seekTo(Offset position) const = 0;
48 
49 	///
50     virtual sal_Bool SAL_CALL seekRelative(Offset change) const = 0;
51 
52 	///
53     virtual sal_Bool SAL_CALL seekToEnd() const = 0;
54 
55 	///
56     virtual sal_Bool SAL_CALL changeSize(sal_uInt32 new_size) = 0;
57 
58 	///
59     virtual sal_uInt32 SAL_CALL getSize() const = 0;
60 
61 
62 	///
63     virtual Offset SAL_CALL getOffset() const = 0;
64 
65 
66 protected:
IPositionableStream()67     IPositionableStream() { }
~IPositionableStream()68     virtual ~IPositionableStream() { }
69 
70 };
71 
72 
73 /** Implements IPositionableStream
74 */
75 class VOS_DLLPUBLIC OStream : public vos::OObject,
76 				public vos::IPositionableStream
77 {
78 	VOS_DECLARE_CLASSINFO(VOS_NAMESPACE(OStream, vos));
79 
80 public:
81 
82 	///
83     OStream(IPositionableStream& rStream);
84 
85 	///
86     virtual ~OStream ();
87 
88     // ----------------- Read operations -------------------------
89 
90 	///
91     virtual sal_Int32 SAL_CALL read(void* pbuffer, sal_uInt32 n) const;
92 
93 	///
94 	sal_Int32 SAL_CALL read(IPositionableStream::Offset offset,
95 			     void* pbuffer,
96 			     sal_uInt32 n) const;
97 
98 	///
99     inline sal_Bool SAL_CALL read(sal_Int32& value) const;
100 
101 	///
102     inline sal_Bool SAL_CALL read(sal_Int16& value) const;
103 
104 	///
105     inline sal_Bool SAL_CALL read(sal_Char& value) const;
106 
107 	///
108     inline sal_Bool SAL_CALL read(sal_uInt8& value) const;
109 
110     // ----------------- Write operations ------------------------
111 
112 	///
113     virtual sal_Int32 SAL_CALL write(const void* pbuffer, sal_uInt32 n);
114 
115 	///
116     sal_Int32 SAL_CALL write(IPositionableStream::Offset offset,
117 		          const void* pbuffer,
118 			      sal_uInt32 n);
119 	///
120     inline sal_Bool SAL_CALL write(sal_Int32 value);
121 
122 	///
123     inline sal_Bool SAL_CALL write(sal_Int16 value);
124 
125 	///
126     inline sal_Bool SAL_CALL write(sal_Char value);
127 
128 	///
129     inline sal_Bool SAL_CALL write(sal_uInt8 value);
130 
131 	///
132     sal_Bool SAL_CALL append(void* pbuffer, sal_uInt32 n); // Write at the end of the Stream.
133 
134     // ------------- Positioning and sizing operations ----------
135 
136 	///
137     inline sal_Bool SAL_CALL seekToBegin() const;
138 
139     // ----------------- Stream interface ------------------------
140 
141     ///
142 	virtual sal_Bool SAL_CALL seekTo(IPositionableStream::Offset pos) const;
143 
144 	///
145     virtual sal_Bool SAL_CALL seekToEnd() const;
146 
147 	///
148     virtual sal_Bool SAL_CALL seekRelative(IPositionableStream::Offset change) const;
149 
150 	///
151     virtual sal_Bool SAL_CALL changeSize(sal_uInt32 new_size);
152 
153 	///
154 	virtual sal_uInt32 SAL_CALL getSize() const;
155 
156 	///
157     virtual sal_Bool SAL_CALL isEof() const;
158 
159 	///
160     virtual IPositionableStream::Offset SAL_CALL getOffset() const;
161 
162 protected:
163     IPositionableStream& m_rStream;
164 
165 	// ----------------- Stream operators ------------------------
166 
167     friend const OStream& operator>> (OStream& rStream, sal_Int32& value);
168     friend const OStream& operator>> (OStream& rStream, sal_Int16& value);
169     friend const OStream& operator>> (OStream& rStream, sal_uInt8& value);
170     friend const OStream& operator>> (OStream& rStream, sal_Char& value);
171     friend OStream& operator<< (OStream& rStream, sal_Int32 value);
172     friend OStream& operator<< (OStream& rStream, sal_Int16 value);
173     friend OStream& operator<< (OStream& rStream, sal_uInt8 value);
174     friend OStream& operator<< (OStream& rStream, sal_Char value);
175 };
176 
read(sal_Int32 & value) const177 inline sal_Bool OStream::read(sal_Int32& value) const
178 {
179     return (read(&value, sizeof(value)) == sizeof(value));
180 }
181 
read(sal_Int16 & value) const182 inline sal_Bool OStream::read(sal_Int16& value) const
183 {
184     return (read(&value, sizeof(value)) == sizeof(value));
185 }
186 
read(sal_Char & value) const187 inline sal_Bool OStream::read(sal_Char& value) const
188 {
189     return (read(&value, sizeof(value)) == sizeof(value));
190 }
191 
read(sal_uInt8 & value) const192 inline sal_Bool OStream::read(sal_uInt8& value) const
193 {
194     return (read(&value, sizeof(value)) == sizeof(value));
195 }
196 
write(sal_Int32 value)197 inline sal_Bool OStream::write(sal_Int32 value)
198 {
199     return (write(&value, sizeof(value)) == sizeof(value));
200 }
201 
write(sal_Int16 value)202 inline sal_Bool OStream::write(sal_Int16 value)
203 {
204     return (write(&value, sizeof(value)) == sizeof(value));
205 }
206 
write(sal_Char value)207 inline sal_Bool OStream::write(sal_Char value)
208 {
209     return (write(&value, sizeof(value)) == sizeof(value));
210 }
211 
write(sal_uInt8 value)212 inline sal_Bool OStream::write(sal_uInt8 value)
213 {
214     return (write((sal_uInt8*)&value, sizeof(value)) == sizeof(value));
215 }
216 
seekToBegin() const217 inline sal_Bool OStream::seekToBegin() const
218 {
219     return (seekTo(0L));
220 }
221 
operator >>(OStream & rStream,sal_Int32 & value)222 inline const OStream& operator>> (OStream& rStream, sal_Int32& value)
223 {
224 	rStream.read(value);
225 
226 	return (rStream);
227 }
228 
operator >>(OStream & rStream,sal_Int16 & value)229 inline const OStream& operator>> (OStream& rStream, sal_Int16& value)
230 {
231 	rStream.read(value);
232 
233 	return (rStream);
234 }
235 
operator >>(OStream & rStream,sal_uInt8 & value)236 inline const OStream& operator>> (OStream& rStream, sal_uInt8& value)
237 {
238 	rStream.read(value);
239 
240 	return (rStream);
241 }
242 
operator >>(OStream & rStream,sal_Char & value)243 inline const OStream& operator>> (OStream& rStream, sal_Char& value)
244 {
245 	rStream.read(value);
246 
247 	return (rStream);
248 }
249 
operator <<(OStream & rStream,sal_Int32 value)250 inline OStream& operator<< (OStream& rStream, sal_Int32 value)
251 {
252 	rStream.write(value);
253 
254 	return (rStream);
255 }
256 
operator <<(OStream & rStream,sal_Int16 value)257 inline OStream& operator<< (OStream& rStream, sal_Int16 value)
258 {
259 	rStream.write(value);
260 
261 	return (rStream);
262 }
263 
operator <<(OStream & rStream,sal_uInt8 value)264 inline OStream& operator<< (OStream& rStream, sal_uInt8 value)
265 {
266 	rStream.write(value);
267 
268 	return (rStream);
269 }
270 
operator <<(OStream & rStream,sal_Char value)271 inline OStream& operator<< (OStream& rStream, sal_Char value)
272 {
273 	rStream.write(value);
274 
275 	return (rStream);
276 }
277 
278 }
279 
280 #endif // _VOS_STREAM_HXX_
281 
282 
283