xref: /aoo4110/main/io/source/stm/odata.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_io.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski // streams
29*b1cdbd2cSJim Jagielski #include <hash_map>
30*b1cdbd2cSJim Jagielski #include <vector>
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XObjectInputStream.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XObjectOutputStream.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSource.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XActiveDataSink.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XMarkableStream.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XConnectable.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/io/UnexpectedEOFException.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/io/WrongFormatException.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <cppuhelper/weak.hxx>      // OWeakObject
43*b1cdbd2cSJim Jagielski #include <cppuhelper/factory.hxx>
44*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase4.hxx>
45*b1cdbd2cSJim Jagielski #include <cppuhelper/typeprovider.hxx>
46*b1cdbd2cSJim Jagielski #include <cppuhelper/queryinterface.hxx>
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski #include <string.h>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski 
53*b1cdbd2cSJim Jagielski using namespace ::cppu;
54*b1cdbd2cSJim Jagielski using namespace ::osl;
55*b1cdbd2cSJim Jagielski using namespace ::std;
56*b1cdbd2cSJim Jagielski using namespace ::rtl;
57*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io;
58*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski #include "factreg.hxx"
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski namespace io_stm {
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski class ODataInputStream :
66*b1cdbd2cSJim Jagielski 	public WeakImplHelper4 <
67*b1cdbd2cSJim Jagielski                               XDataInputStream,
68*b1cdbd2cSJim Jagielski 	                          XActiveDataSink,
69*b1cdbd2cSJim Jagielski                               XConnectable,
70*b1cdbd2cSJim Jagielski 			                  XServiceInfo
71*b1cdbd2cSJim Jagielski                            >
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski public:
ODataInputStream()74*b1cdbd2cSJim Jagielski 	ODataInputStream( )
75*b1cdbd2cSJim Jagielski 		: m_bValidStream( sal_False )
76*b1cdbd2cSJim Jagielski 		{
77*b1cdbd2cSJim Jagielski 			g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
78*b1cdbd2cSJim Jagielski 		}
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 	~ODataInputStream();
81*b1cdbd2cSJim Jagielski public: // XInputStream
82*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readBytes(Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead)
83*b1cdbd2cSJim Jagielski     														throw (	NotConnectedException,
84*b1cdbd2cSJim Jagielski     																	BufferSizeExceededException,
85*b1cdbd2cSJim Jagielski     																	RuntimeException);
86*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readSomeBytes(Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead)
87*b1cdbd2cSJim Jagielski     														throw (	NotConnectedException,
88*b1cdbd2cSJim Jagielski     																	BufferSizeExceededException,
89*b1cdbd2cSJim Jagielski     																	RuntimeException);
90*b1cdbd2cSJim Jagielski     virtual void SAL_CALL skipBytes(sal_Int32 nBytesToSkip) 				throw (	NotConnectedException,
91*b1cdbd2cSJim Jagielski     																	BufferSizeExceededException,
92*b1cdbd2cSJim Jagielski     																	RuntimeException);
93*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL available(void) 							throw (	NotConnectedException,
94*b1cdbd2cSJim Jagielski     																	RuntimeException);
95*b1cdbd2cSJim Jagielski     virtual void SAL_CALL closeInput(void) 							throw (	NotConnectedException,
96*b1cdbd2cSJim Jagielski     																	RuntimeException);
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski public: // XDataInputStream
99*b1cdbd2cSJim Jagielski     virtual sal_Int8 SAL_CALL readBoolean(void) throw (IOException, RuntimeException);
100*b1cdbd2cSJim Jagielski     virtual sal_Int8 SAL_CALL readByte(void) throw (IOException, RuntimeException);
101*b1cdbd2cSJim Jagielski     virtual sal_Unicode SAL_CALL readChar(void) throw (IOException, RuntimeException);
102*b1cdbd2cSJim Jagielski     virtual sal_Int16 SAL_CALL readShort(void) throw (IOException, RuntimeException);
103*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readLong(void) throw (IOException, RuntimeException);
104*b1cdbd2cSJim Jagielski     virtual sal_Int64 SAL_CALL readHyper(void) throw (IOException, RuntimeException);
105*b1cdbd2cSJim Jagielski     virtual float SAL_CALL readFloat(void) throw (IOException, RuntimeException);
106*b1cdbd2cSJim Jagielski     virtual double SAL_CALL readDouble(void) throw (IOException, RuntimeException);
107*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL readUTF(void) throw (IOException, RuntimeException);
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski public: // XActiveDataSink
112*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setInputStream(const Reference< XInputStream > & aStream)
113*b1cdbd2cSJim Jagielski 		throw (RuntimeException);
114*b1cdbd2cSJim Jagielski     virtual Reference< XInputStream > SAL_CALL getInputStream(void) throw (RuntimeException);
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski public: // XConnectable
117*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setPredecessor(const Reference < XConnectable >& aPredecessor) throw (RuntimeException);
118*b1cdbd2cSJim Jagielski     virtual Reference < XConnectable > SAL_CALL getPredecessor(void) throw (RuntimeException);
119*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setSuccessor(const Reference < XConnectable >& aSuccessor) throw (RuntimeException);
120*b1cdbd2cSJim Jagielski     virtual Reference < XConnectable > SAL_CALL getSuccessor(void) throw (RuntimeException) ;
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski 
123*b1cdbd2cSJim Jagielski public: // XServiceInfo
124*b1cdbd2cSJim Jagielski     OUString                     SAL_CALL getImplementationName() throw ();
125*b1cdbd2cSJim Jagielski     Sequence< OUString >         SAL_CALL getSupportedServiceNames(void) throw ();
126*b1cdbd2cSJim Jagielski 	sal_Bool                        SAL_CALL supportsService(const OUString& ServiceName) throw ();
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski protected:
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	Reference < XConnectable > 	m_pred;
131*b1cdbd2cSJim Jagielski 	Reference < XConnectable > 	m_succ;
132*b1cdbd2cSJim Jagielski 	Reference < XInputStream > 	m_input;
133*b1cdbd2cSJim Jagielski 	sal_Bool m_bValidStream;
134*b1cdbd2cSJim Jagielski };
135*b1cdbd2cSJim Jagielski 
~ODataInputStream()136*b1cdbd2cSJim Jagielski ODataInputStream::~ODataInputStream()
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski 	g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski // XInputStream
readBytes(Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)142*b1cdbd2cSJim Jagielski sal_Int32 ODataInputStream::readBytes(Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead)
143*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
144*b1cdbd2cSJim Jagielski 			BufferSizeExceededException,
145*b1cdbd2cSJim Jagielski 			RuntimeException)
146*b1cdbd2cSJim Jagielski {
147*b1cdbd2cSJim Jagielski  	sal_Int32 nRead;
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski  	if( m_bValidStream )
150*b1cdbd2cSJim Jagielski 	{
151*b1cdbd2cSJim Jagielski  		nRead = m_input->readBytes( aData , nBytesToRead );
152*b1cdbd2cSJim Jagielski  	}
153*b1cdbd2cSJim Jagielski  	else
154*b1cdbd2cSJim Jagielski 	{
155*b1cdbd2cSJim Jagielski  		throw NotConnectedException( );
156*b1cdbd2cSJim Jagielski  	}
157*b1cdbd2cSJim Jagielski 
158*b1cdbd2cSJim Jagielski  	return nRead;
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
readSomeBytes(Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)161*b1cdbd2cSJim Jagielski sal_Int32 ODataInputStream::readSomeBytes(Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead)
162*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
163*b1cdbd2cSJim Jagielski 			BufferSizeExceededException,
164*b1cdbd2cSJim Jagielski 			RuntimeException)
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski  	sal_Int32 nRead;
167*b1cdbd2cSJim Jagielski  	if( m_bValidStream ) {
168*b1cdbd2cSJim Jagielski  		nRead = m_input->readSomeBytes( aData , nMaxBytesToRead );
169*b1cdbd2cSJim Jagielski  	}
170*b1cdbd2cSJim Jagielski  	else {
171*b1cdbd2cSJim Jagielski  		throw NotConnectedException( );
172*b1cdbd2cSJim Jagielski  	}
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski  	return nRead;
175*b1cdbd2cSJim Jagielski }
skipBytes(sal_Int32 nBytesToSkip)176*b1cdbd2cSJim Jagielski void ODataInputStream::skipBytes(sal_Int32 nBytesToSkip)
177*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
178*b1cdbd2cSJim Jagielski 			BufferSizeExceededException,
179*b1cdbd2cSJim Jagielski 			RuntimeException)
180*b1cdbd2cSJim Jagielski {
181*b1cdbd2cSJim Jagielski  	if( m_bValidStream ) {
182*b1cdbd2cSJim Jagielski  		m_input->skipBytes( nBytesToSkip );
183*b1cdbd2cSJim Jagielski  	}
184*b1cdbd2cSJim Jagielski  	else
185*b1cdbd2cSJim Jagielski 	{
186*b1cdbd2cSJim Jagielski  		throw NotConnectedException( );
187*b1cdbd2cSJim Jagielski  	}
188*b1cdbd2cSJim Jagielski }
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski 
available(void)191*b1cdbd2cSJim Jagielski sal_Int32 ODataInputStream::available(void)
192*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
193*b1cdbd2cSJim Jagielski 			RuntimeException)
194*b1cdbd2cSJim Jagielski {
195*b1cdbd2cSJim Jagielski  	sal_Int32 nAvail;
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski  	if( m_bValidStream )
198*b1cdbd2cSJim Jagielski 	{
199*b1cdbd2cSJim Jagielski  		nAvail = m_input->available( );
200*b1cdbd2cSJim Jagielski  	}
201*b1cdbd2cSJim Jagielski  	else
202*b1cdbd2cSJim Jagielski 	{
203*b1cdbd2cSJim Jagielski  		throw NotConnectedException( );
204*b1cdbd2cSJim Jagielski  	}
205*b1cdbd2cSJim Jagielski  	return nAvail;
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
closeInput(void)208*b1cdbd2cSJim Jagielski void ODataInputStream::closeInput(void )
209*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
210*b1cdbd2cSJim Jagielski 			RuntimeException)
211*b1cdbd2cSJim Jagielski {
212*b1cdbd2cSJim Jagielski  	if( m_bValidStream ) {
213*b1cdbd2cSJim Jagielski  		m_input->closeInput( );
214*b1cdbd2cSJim Jagielski  		setInputStream( Reference< XInputStream > () );
215*b1cdbd2cSJim Jagielski  		setPredecessor( Reference < XConnectable >() );
216*b1cdbd2cSJim Jagielski  		setSuccessor( Reference < XConnectable >() );
217*b1cdbd2cSJim Jagielski  		m_bValidStream = sal_False;
218*b1cdbd2cSJim Jagielski  	}
219*b1cdbd2cSJim Jagielski  	else
220*b1cdbd2cSJim Jagielski 	{
221*b1cdbd2cSJim Jagielski  		throw NotConnectedException( );
222*b1cdbd2cSJim Jagielski  	}
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski //== XDataInputStream ===========================================
229*b1cdbd2cSJim Jagielski 
230*b1cdbd2cSJim Jagielski // XDataInputStream
readBoolean(void)231*b1cdbd2cSJim Jagielski sal_Int8 ODataInputStream::readBoolean(void) throw (IOException, RuntimeException)
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski 	return readByte();
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
readByte(void)236*b1cdbd2cSJim Jagielski sal_Int8 ODataInputStream::readByte(void)	 throw (IOException, RuntimeException)
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp(1);
239*b1cdbd2cSJim Jagielski 	if( 1 != readBytes( aTmp, 1 ) )
240*b1cdbd2cSJim Jagielski 	{
241*b1cdbd2cSJim Jagielski 		throw UnexpectedEOFException();
242*b1cdbd2cSJim Jagielski 	}
243*b1cdbd2cSJim Jagielski 	return aTmp.getArray()[0];
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski 
readChar(void)246*b1cdbd2cSJim Jagielski sal_Unicode ODataInputStream::readChar(void) throw (IOException, RuntimeException)
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp(2);
249*b1cdbd2cSJim Jagielski 	if( 2 != readBytes( aTmp, 2 ) )
250*b1cdbd2cSJim Jagielski 	{
251*b1cdbd2cSJim Jagielski 		throw UnexpectedEOFException();
252*b1cdbd2cSJim Jagielski 	}
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	const sal_uInt8 * pBytes = ( const sal_uInt8 * )aTmp.getConstArray();
255*b1cdbd2cSJim Jagielski 	return ((sal_Unicode)pBytes[0] << 8) + pBytes[1];
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski 
readShort(void)258*b1cdbd2cSJim Jagielski sal_Int16 ODataInputStream::readShort(void) throw (IOException, RuntimeException)
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp(2);
261*b1cdbd2cSJim Jagielski 	if( 2 != readBytes( aTmp, 2 ) )
262*b1cdbd2cSJim Jagielski 	{
263*b1cdbd2cSJim Jagielski 		throw UnexpectedEOFException();
264*b1cdbd2cSJim Jagielski 	}
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski 	const sal_uInt8 * pBytes = ( const sal_uInt8 * ) aTmp.getConstArray();
267*b1cdbd2cSJim Jagielski 	return ((sal_Int16)pBytes[0] << 8) + pBytes[1];
268*b1cdbd2cSJim Jagielski }
269*b1cdbd2cSJim Jagielski 
270*b1cdbd2cSJim Jagielski 
readLong(void)271*b1cdbd2cSJim Jagielski sal_Int32 ODataInputStream::readLong(void) throw (IOException, RuntimeException)
272*b1cdbd2cSJim Jagielski {
273*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp(4);
274*b1cdbd2cSJim Jagielski 	if( 4 != readBytes( aTmp, 4 ) )
275*b1cdbd2cSJim Jagielski 	{
276*b1cdbd2cSJim Jagielski 		throw UnexpectedEOFException( );
277*b1cdbd2cSJim Jagielski 	}
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski 	const sal_uInt8 * pBytes = ( const sal_uInt8 * ) aTmp.getConstArray();
280*b1cdbd2cSJim Jagielski 	return ((sal_Int32)pBytes[0] << 24) + ((sal_Int32)pBytes[1] << 16) + ((sal_Int32)pBytes[2] << 8) + pBytes[3];
281*b1cdbd2cSJim Jagielski }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 
readHyper(void)284*b1cdbd2cSJim Jagielski sal_Int64 ODataInputStream::readHyper(void) throw (IOException, RuntimeException)
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp(8);
287*b1cdbd2cSJim Jagielski 	if( 8 != readBytes( aTmp, 8 ) )
288*b1cdbd2cSJim Jagielski 	{
289*b1cdbd2cSJim Jagielski 		throw UnexpectedEOFException( );
290*b1cdbd2cSJim Jagielski 	}
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	const sal_uInt8 * pBytes = ( const sal_uInt8 * ) aTmp.getConstArray();
293*b1cdbd2cSJim Jagielski 	return
294*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[0]) << 56) +
295*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[1]) << 48) +
296*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[2]) << 40) +
297*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[3]) << 32) +
298*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[4]) << 24) +
299*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[5]) << 16) +
300*b1cdbd2cSJim Jagielski 		(((sal_Int64)pBytes[6]) << 8) +
301*b1cdbd2cSJim Jagielski 		pBytes[7];
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski 
readFloat(void)304*b1cdbd2cSJim Jagielski float ODataInputStream::readFloat(void) throw (IOException, RuntimeException)
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski 	union { float f; sal_uInt32 n; } a;
307*b1cdbd2cSJim Jagielski 	a.n = readLong();
308*b1cdbd2cSJim Jagielski 	return a.f;
309*b1cdbd2cSJim Jagielski }
310*b1cdbd2cSJim Jagielski 
readDouble(void)311*b1cdbd2cSJim Jagielski double ODataInputStream::readDouble(void) throw (IOException, RuntimeException)
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski 	sal_uInt32 n = 1;
314*b1cdbd2cSJim Jagielski 	union { double d; struct { sal_uInt32 n1; sal_uInt32 n2; } ad; } a;
315*b1cdbd2cSJim Jagielski 	if( *(sal_uInt8 *)&n == 1 )
316*b1cdbd2cSJim Jagielski 	{
317*b1cdbd2cSJim Jagielski 		// little endian
318*b1cdbd2cSJim Jagielski 		a.ad.n2 = readLong();
319*b1cdbd2cSJim Jagielski 		a.ad.n1 = readLong();
320*b1cdbd2cSJim Jagielski 	}
321*b1cdbd2cSJim Jagielski 	else
322*b1cdbd2cSJim Jagielski 	{
323*b1cdbd2cSJim Jagielski 		// big endian
324*b1cdbd2cSJim Jagielski 		a.ad.n1 = readLong();
325*b1cdbd2cSJim Jagielski 		a.ad.n2 = readLong();
326*b1cdbd2cSJim Jagielski 	}
327*b1cdbd2cSJim Jagielski 	return a.d;
328*b1cdbd2cSJim Jagielski }
329*b1cdbd2cSJim Jagielski 
readUTF(void)330*b1cdbd2cSJim Jagielski OUString ODataInputStream::readUTF(void) throw (IOException, RuntimeException)
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski 	sal_uInt16				nShortLen = (sal_uInt16)readShort();
333*b1cdbd2cSJim Jagielski 	sal_Int32				nUTFLen;
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	if( ((sal_uInt16)0xffff) == nShortLen )
336*b1cdbd2cSJim Jagielski 	{
337*b1cdbd2cSJim Jagielski 		// is interpreted as a sign, that string is longer than 64k
338*b1cdbd2cSJim Jagielski 		// incompatible to older XDataInputStream-routines, when strings are exactly 64k
339*b1cdbd2cSJim Jagielski 		nUTFLen = readLong();
340*b1cdbd2cSJim Jagielski 	}
341*b1cdbd2cSJim Jagielski 	else
342*b1cdbd2cSJim Jagielski 	{
343*b1cdbd2cSJim Jagielski 		nUTFLen = ( sal_Int32 ) nShortLen;
344*b1cdbd2cSJim Jagielski 	}
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski 	Sequence<sal_Unicode>	aBuffer( nUTFLen );
347*b1cdbd2cSJim Jagielski 	sal_Unicode *			pStr = aBuffer.getArray();
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = 0;
350*b1cdbd2cSJim Jagielski 	sal_Int32 nStrLen = 0;
351*b1cdbd2cSJim Jagielski 	while( nCount < nUTFLen )
352*b1cdbd2cSJim Jagielski 	{
353*b1cdbd2cSJim Jagielski 	    sal_uInt8 c = (sal_uInt8)readByte();
354*b1cdbd2cSJim Jagielski 	    sal_uInt8 char2, char3;
355*b1cdbd2cSJim Jagielski 	    switch( c >> 4 )
356*b1cdbd2cSJim Jagielski 		{
357*b1cdbd2cSJim Jagielski 	        case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
358*b1cdbd2cSJim Jagielski 				// 0xxxxxxx
359*b1cdbd2cSJim Jagielski 				nCount++;
360*b1cdbd2cSJim Jagielski 				pStr[nStrLen++] = c;
361*b1cdbd2cSJim Jagielski 				break;
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	        case 12: case 13:
364*b1cdbd2cSJim Jagielski 				// 110x xxxx   10xx xxxx
365*b1cdbd2cSJim Jagielski 				nCount += 2;
366*b1cdbd2cSJim Jagielski 				if( ! ( nCount <= nUTFLen ) )
367*b1cdbd2cSJim Jagielski 				{
368*b1cdbd2cSJim Jagielski 					throw WrongFormatException( );
369*b1cdbd2cSJim Jagielski 				}
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 				char2 = (sal_uInt8)readByte();
372*b1cdbd2cSJim Jagielski 				if( ! ( (char2 & 0xC0) == 0x80 ) )
373*b1cdbd2cSJim Jagielski 				{
374*b1cdbd2cSJim Jagielski 					throw WrongFormatException( );
375*b1cdbd2cSJim Jagielski 				}
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 				pStr[nStrLen++] = (sal_Unicode(c & 0x1F) << 6) | (char2 & 0x3F);
378*b1cdbd2cSJim Jagielski 				break;
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 	        case 14:
381*b1cdbd2cSJim Jagielski 		    // 1110 xxxx  10xx xxxx  10xx xxxx
382*b1cdbd2cSJim Jagielski 				nCount += 3;
383*b1cdbd2cSJim Jagielski 				if( !( nCount <= nUTFLen) )
384*b1cdbd2cSJim Jagielski 				{
385*b1cdbd2cSJim Jagielski 					throw WrongFormatException( );
386*b1cdbd2cSJim Jagielski 				}
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski 				char2 = (sal_uInt8)readByte();
389*b1cdbd2cSJim Jagielski 				char3 = (sal_uInt8)readByte();
390*b1cdbd2cSJim Jagielski 
391*b1cdbd2cSJim Jagielski 				if( (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80)) ) {
392*b1cdbd2cSJim Jagielski 					throw WrongFormatException( );
393*b1cdbd2cSJim Jagielski 				}
394*b1cdbd2cSJim Jagielski 				pStr[nStrLen++] = (sal_Unicode(c & 0x0F) << 12) |
395*b1cdbd2cSJim Jagielski 								(sal_Unicode(char2 & 0x3F) << 6) |
396*b1cdbd2cSJim Jagielski 								(char3 & 0x3F);
397*b1cdbd2cSJim Jagielski 				break;
398*b1cdbd2cSJim Jagielski 
399*b1cdbd2cSJim Jagielski 	        default:
400*b1cdbd2cSJim Jagielski 				// 10xx xxxx,  1111 xxxx
401*b1cdbd2cSJim Jagielski 				throw WrongFormatException();
402*b1cdbd2cSJim Jagielski 				//throw new UTFDataFormatException();
403*b1cdbd2cSJim Jagielski 		}
404*b1cdbd2cSJim Jagielski 	}
405*b1cdbd2cSJim Jagielski 	return OUString( pStr, nStrLen );
406*b1cdbd2cSJim Jagielski }
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski // XActiveDataSource
setInputStream(const Reference<XInputStream> & aStream)411*b1cdbd2cSJim Jagielski void ODataInputStream::setInputStream(const Reference< XInputStream > & aStream)
412*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski 
415*b1cdbd2cSJim Jagielski 	if( m_input != aStream ) {
416*b1cdbd2cSJim Jagielski 		m_input = aStream;
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 		Reference < XConnectable > pred( m_input , UNO_QUERY );
419*b1cdbd2cSJim Jagielski 		setPredecessor( pred );
420*b1cdbd2cSJim Jagielski 	}
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski 	m_bValidStream = m_input.is();
423*b1cdbd2cSJim Jagielski }
424*b1cdbd2cSJim Jagielski 
getInputStream(void)425*b1cdbd2cSJim Jagielski Reference< XInputStream > ODataInputStream::getInputStream(void) throw (RuntimeException)
426*b1cdbd2cSJim Jagielski {
427*b1cdbd2cSJim Jagielski 	return m_input;
428*b1cdbd2cSJim Jagielski }
429*b1cdbd2cSJim Jagielski 
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski // XDataSink
setSuccessor(const Reference<XConnectable> & r)433*b1cdbd2cSJim Jagielski void ODataInputStream::setSuccessor( const Reference < XConnectable > &r ) throw (RuntimeException)
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski      /// if the references match, nothing needs to be done
436*b1cdbd2cSJim Jagielski      if( m_succ != r ) {
437*b1cdbd2cSJim Jagielski          /// store the reference for later use
438*b1cdbd2cSJim Jagielski          m_succ = r;
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski          if( m_succ.is() ) {
441*b1cdbd2cSJim Jagielski               /// set this instance as the sink !
442*b1cdbd2cSJim Jagielski               m_succ->setPredecessor( Reference< XConnectable > (
443*b1cdbd2cSJim Jagielski 				  SAL_STATIC_CAST( XConnectable * , this ) ) );
444*b1cdbd2cSJim Jagielski          }
445*b1cdbd2cSJim Jagielski      }
446*b1cdbd2cSJim Jagielski }
447*b1cdbd2cSJim Jagielski 
getSuccessor()448*b1cdbd2cSJim Jagielski Reference < XConnectable > ODataInputStream::getSuccessor() throw (RuntimeException)
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski 	return m_succ;
451*b1cdbd2cSJim Jagielski }
452*b1cdbd2cSJim Jagielski 
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski // XDataSource
setPredecessor(const Reference<XConnectable> & r)455*b1cdbd2cSJim Jagielski void ODataInputStream::setPredecessor( const Reference < XConnectable > &r )
456*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	if( r != m_pred ) {
459*b1cdbd2cSJim Jagielski 		m_pred = r;
460*b1cdbd2cSJim Jagielski 		if( m_pred.is() ) {
461*b1cdbd2cSJim Jagielski 			m_pred->setSuccessor( Reference< XConnectable > (
462*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( XConnectable * , this ) ) );
463*b1cdbd2cSJim Jagielski 		}
464*b1cdbd2cSJim Jagielski 	}
465*b1cdbd2cSJim Jagielski }
getPredecessor()466*b1cdbd2cSJim Jagielski Reference < XConnectable > ODataInputStream::getPredecessor() throw (RuntimeException)
467*b1cdbd2cSJim Jagielski {
468*b1cdbd2cSJim Jagielski 	return m_pred;
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski // XServiceInfo
getImplementationName()472*b1cdbd2cSJim Jagielski OUString ODataInputStream::getImplementationName() throw ()
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski     return ODataInputStream_getImplementationName();
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski 
477*b1cdbd2cSJim Jagielski // XServiceInfo
supportsService(const OUString & ServiceName)478*b1cdbd2cSJim Jagielski sal_Bool ODataInputStream::supportsService(const OUString& ServiceName) throw ()
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski     Sequence< OUString > aSNL = getSupportedServiceNames();
481*b1cdbd2cSJim Jagielski     const OUString * pArray = aSNL.getConstArray();
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
484*b1cdbd2cSJim Jagielski         if( pArray[i] == ServiceName )
485*b1cdbd2cSJim Jagielski             return sal_True;
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski     return sal_False;
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski // XServiceInfo
getSupportedServiceNames(void)491*b1cdbd2cSJim Jagielski Sequence< OUString > ODataInputStream::getSupportedServiceNames(void) throw ()
492*b1cdbd2cSJim Jagielski {
493*b1cdbd2cSJim Jagielski     return ODataInputStream_getSupportedServiceNames();
494*b1cdbd2cSJim Jagielski }
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski /***
497*b1cdbd2cSJim Jagielski *
498*b1cdbd2cSJim Jagielski * registration information
499*b1cdbd2cSJim Jagielski *
500*b1cdbd2cSJim Jagielski *
501*b1cdbd2cSJim Jagielski ****/
502*b1cdbd2cSJim Jagielski 
ODataInputStream_CreateInstance(const Reference<XComponentContext> &)503*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL ODataInputStream_CreateInstance( const Reference < XComponentContext > & ) throw( Exception)
504*b1cdbd2cSJim Jagielski {
505*b1cdbd2cSJim Jagielski 	ODataInputStream *p = new ODataInputStream;
506*b1cdbd2cSJim Jagielski 	return Reference< XInterface > ( (OWeakObject * ) p );
507*b1cdbd2cSJim Jagielski }
508*b1cdbd2cSJim Jagielski 
ODataInputStream_getImplementationName()509*b1cdbd2cSJim Jagielski OUString ODataInputStream_getImplementationName()
510*b1cdbd2cSJim Jagielski {
511*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.io.stm.DataInputStream" ) );
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski 
ODataInputStream_getSupportedServiceNames(void)514*b1cdbd2cSJim Jagielski Sequence<OUString> ODataInputStream_getSupportedServiceNames(void)
515*b1cdbd2cSJim Jagielski {
516*b1cdbd2cSJim Jagielski 	Sequence<OUString> aRet(1);
517*b1cdbd2cSJim Jagielski 	aRet.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.DataInputStream" ) );
518*b1cdbd2cSJim Jagielski 	return aRet;
519*b1cdbd2cSJim Jagielski }
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski 
523*b1cdbd2cSJim Jagielski 
524*b1cdbd2cSJim Jagielski class ODataOutputStream :
525*b1cdbd2cSJim Jagielski 	public WeakImplHelper4 <
526*b1cdbd2cSJim Jagielski 			 XDataOutputStream,
527*b1cdbd2cSJim Jagielski 			 XActiveDataSource,
528*b1cdbd2cSJim Jagielski 			 XConnectable,
529*b1cdbd2cSJim Jagielski  	         XServiceInfo >
530*b1cdbd2cSJim Jagielski {
531*b1cdbd2cSJim Jagielski public:
ODataOutputStream()532*b1cdbd2cSJim Jagielski 	ODataOutputStream()
533*b1cdbd2cSJim Jagielski 		: m_bValidStream( sal_False )
534*b1cdbd2cSJim Jagielski 		{
535*b1cdbd2cSJim Jagielski 			g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
536*b1cdbd2cSJim Jagielski 		}
537*b1cdbd2cSJim Jagielski 	~ODataOutputStream();
538*b1cdbd2cSJim Jagielski 
539*b1cdbd2cSJim Jagielski public: // XOutputStream
540*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeBytes(const Sequence< sal_Int8 >& aData)
541*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
542*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
543*b1cdbd2cSJim Jagielski 				RuntimeException);
544*b1cdbd2cSJim Jagielski     virtual void SAL_CALL flush(void)
545*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
546*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
547*b1cdbd2cSJim Jagielski 				RuntimeException);
548*b1cdbd2cSJim Jagielski     virtual void SAL_CALL closeOutput(void)
549*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
550*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
551*b1cdbd2cSJim Jagielski 				RuntimeException);
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski public: // XDataOutputStream
554*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeBoolean(sal_Bool Value) throw (IOException, RuntimeException);
555*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeByte(sal_Int8 Value) throw (IOException, RuntimeException);
556*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeChar(sal_Unicode Value) throw (IOException, RuntimeException);
557*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeShort(sal_Int16 Value) throw (IOException, RuntimeException);
558*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeLong(sal_Int32 Value) throw (IOException, RuntimeException);
559*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeHyper(sal_Int64 Value) throw (IOException, RuntimeException);
560*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeFloat(float Value) throw (IOException, RuntimeException);
561*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeDouble(double Value) throw (IOException, RuntimeException);
562*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeUTF(const OUString& Value) throw (IOException, RuntimeException);
563*b1cdbd2cSJim Jagielski 
564*b1cdbd2cSJim Jagielski public: // XActiveDataSource
565*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setOutputStream(const Reference< XOutputStream > & aStream)
566*b1cdbd2cSJim Jagielski 		throw (RuntimeException);
567*b1cdbd2cSJim Jagielski 	virtual Reference < XOutputStream > SAL_CALL getOutputStream(void) throw (RuntimeException);
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski public: // XConnectable
570*b1cdbd2cSJim Jagielski     virtual void SAL_CALL setPredecessor(const Reference < XConnectable >& aPredecessor)
571*b1cdbd2cSJim Jagielski 		throw (RuntimeException);
572*b1cdbd2cSJim Jagielski 	virtual Reference < XConnectable > SAL_CALL getPredecessor(void)
573*b1cdbd2cSJim Jagielski 		throw (RuntimeException);
574*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL setSuccessor(const Reference < XConnectable >& aSuccessor)
575*b1cdbd2cSJim Jagielski 		throw (RuntimeException);
576*b1cdbd2cSJim Jagielski     virtual Reference < XConnectable > SAL_CALL getSuccessor(void)
577*b1cdbd2cSJim Jagielski 		throw (RuntimeException);
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski public: // XServiceInfo
580*b1cdbd2cSJim Jagielski     OUString                     SAL_CALL getImplementationName() throw ();
581*b1cdbd2cSJim Jagielski     Sequence< OUString >         SAL_CALL getSupportedServiceNames(void) throw ();
582*b1cdbd2cSJim Jagielski     sal_Bool                     SAL_CALL supportsService(const OUString& ServiceName) throw ();
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski protected:
585*b1cdbd2cSJim Jagielski 	Reference < XConnectable > 	m_succ;
586*b1cdbd2cSJim Jagielski 	Reference < XConnectable >	m_pred;
587*b1cdbd2cSJim Jagielski 	Reference<  XOutputStream > m_output;
588*b1cdbd2cSJim Jagielski 	sal_Bool m_bValidStream;
589*b1cdbd2cSJim Jagielski };
590*b1cdbd2cSJim Jagielski 
~ODataOutputStream()591*b1cdbd2cSJim Jagielski ODataOutputStream::~ODataOutputStream()
592*b1cdbd2cSJim Jagielski {
593*b1cdbd2cSJim Jagielski 	g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
594*b1cdbd2cSJim Jagielski }
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski 
597*b1cdbd2cSJim Jagielski // XOutputStream
writeBytes(const Sequence<sal_Int8> & aData)598*b1cdbd2cSJim Jagielski void ODataOutputStream::writeBytes(const Sequence< sal_Int8 >& aData)
599*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
600*b1cdbd2cSJim Jagielski 			BufferSizeExceededException,
601*b1cdbd2cSJim Jagielski 			RuntimeException)
602*b1cdbd2cSJim Jagielski {
603*b1cdbd2cSJim Jagielski 	if( m_bValidStream )
604*b1cdbd2cSJim Jagielski 	{
605*b1cdbd2cSJim Jagielski 		m_output->writeBytes( aData );
606*b1cdbd2cSJim Jagielski 	}
607*b1cdbd2cSJim Jagielski 	else {
608*b1cdbd2cSJim Jagielski 		throw NotConnectedException( );
609*b1cdbd2cSJim Jagielski 	}
610*b1cdbd2cSJim Jagielski }
611*b1cdbd2cSJim Jagielski 
flush(void)612*b1cdbd2cSJim Jagielski void ODataOutputStream::flush(void)
613*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
614*b1cdbd2cSJim Jagielski 			BufferSizeExceededException,
615*b1cdbd2cSJim Jagielski 			RuntimeException)
616*b1cdbd2cSJim Jagielski {
617*b1cdbd2cSJim Jagielski 	if( m_bValidStream )
618*b1cdbd2cSJim Jagielski 	{
619*b1cdbd2cSJim Jagielski 		m_output->flush();
620*b1cdbd2cSJim Jagielski 	}
621*b1cdbd2cSJim Jagielski 	else
622*b1cdbd2cSJim Jagielski 	{
623*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
624*b1cdbd2cSJim Jagielski 	}
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski 
628*b1cdbd2cSJim Jagielski 
closeOutput(void)629*b1cdbd2cSJim Jagielski void ODataOutputStream::closeOutput(void)
630*b1cdbd2cSJim Jagielski 	throw (	NotConnectedException,
631*b1cdbd2cSJim Jagielski 			BufferSizeExceededException,
632*b1cdbd2cSJim Jagielski 			RuntimeException)
633*b1cdbd2cSJim Jagielski {
634*b1cdbd2cSJim Jagielski 	if( m_bValidStream )
635*b1cdbd2cSJim Jagielski 	{
636*b1cdbd2cSJim Jagielski 		m_output->closeOutput();
637*b1cdbd2cSJim Jagielski 		setOutputStream( Reference< XOutputStream > () );
638*b1cdbd2cSJim Jagielski 		setPredecessor( Reference < XConnectable >() );
639*b1cdbd2cSJim Jagielski 		setSuccessor( Reference < XConnectable >() );
640*b1cdbd2cSJim Jagielski 	}
641*b1cdbd2cSJim Jagielski 	else
642*b1cdbd2cSJim Jagielski 	{
643*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
644*b1cdbd2cSJim Jagielski 	}
645*b1cdbd2cSJim Jagielski }
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski // XDataOutputStream
writeBoolean(sal_Bool Value)648*b1cdbd2cSJim Jagielski void ODataOutputStream::writeBoolean(sal_Bool Value)
649*b1cdbd2cSJim Jagielski 	throw (	IOException,
650*b1cdbd2cSJim Jagielski 			RuntimeException)
651*b1cdbd2cSJim Jagielski {
652*b1cdbd2cSJim Jagielski 	if( Value )
653*b1cdbd2cSJim Jagielski 	{
654*b1cdbd2cSJim Jagielski 		writeByte( 1 );
655*b1cdbd2cSJim Jagielski 	}
656*b1cdbd2cSJim Jagielski 	else
657*b1cdbd2cSJim Jagielski 	{
658*b1cdbd2cSJim Jagielski 		writeByte( 0 );
659*b1cdbd2cSJim Jagielski 	}
660*b1cdbd2cSJim Jagielski }
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski 
writeByte(sal_Int8 Value)663*b1cdbd2cSJim Jagielski void ODataOutputStream::writeByte(sal_Int8 Value)
664*b1cdbd2cSJim Jagielski 	throw (	IOException,
665*b1cdbd2cSJim Jagielski 			RuntimeException)
666*b1cdbd2cSJim Jagielski {
667*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp( 1 );
668*b1cdbd2cSJim Jagielski 	aTmp.getArray()[0] = Value;
669*b1cdbd2cSJim Jagielski 	writeBytes( aTmp );
670*b1cdbd2cSJim Jagielski }
671*b1cdbd2cSJim Jagielski 
writeChar(sal_Unicode Value)672*b1cdbd2cSJim Jagielski void ODataOutputStream::writeChar(sal_Unicode Value)
673*b1cdbd2cSJim Jagielski 	throw (	IOException,
674*b1cdbd2cSJim Jagielski 			RuntimeException)
675*b1cdbd2cSJim Jagielski {
676*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp( 2 );
677*b1cdbd2cSJim Jagielski 	sal_Int8 * pBytes = ( sal_Int8 * ) aTmp.getArray();
678*b1cdbd2cSJim Jagielski 	pBytes[0] = sal_Int8(Value >> 8);
679*b1cdbd2cSJim Jagielski 	pBytes[1] = sal_Int8(Value);
680*b1cdbd2cSJim Jagielski 	writeBytes( aTmp );
681*b1cdbd2cSJim Jagielski }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski 
writeShort(sal_Int16 Value)684*b1cdbd2cSJim Jagielski void ODataOutputStream::writeShort(sal_Int16 Value)
685*b1cdbd2cSJim Jagielski 	throw (	IOException,
686*b1cdbd2cSJim Jagielski 			RuntimeException)
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp( 2 );
689*b1cdbd2cSJim Jagielski 	sal_Int8 * pBytes = aTmp.getArray();
690*b1cdbd2cSJim Jagielski 	pBytes[0] = sal_Int8(Value >> 8);
691*b1cdbd2cSJim Jagielski 	pBytes[1] = sal_Int8(Value);
692*b1cdbd2cSJim Jagielski 	writeBytes( aTmp );
693*b1cdbd2cSJim Jagielski }
694*b1cdbd2cSJim Jagielski 
writeLong(sal_Int32 Value)695*b1cdbd2cSJim Jagielski void ODataOutputStream::writeLong(sal_Int32 Value)
696*b1cdbd2cSJim Jagielski 	throw (	IOException,
697*b1cdbd2cSJim Jagielski 			RuntimeException)
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp( 4 );
700*b1cdbd2cSJim Jagielski 	sal_Int8 * pBytes = aTmp.getArray();
701*b1cdbd2cSJim Jagielski 	pBytes[0] = sal_Int8(Value >> 24);
702*b1cdbd2cSJim Jagielski 	pBytes[1] = sal_Int8(Value >> 16);
703*b1cdbd2cSJim Jagielski 	pBytes[2] = sal_Int8(Value >> 8);
704*b1cdbd2cSJim Jagielski 	pBytes[3] = sal_Int8(Value);
705*b1cdbd2cSJim Jagielski 	writeBytes( aTmp );
706*b1cdbd2cSJim Jagielski }
707*b1cdbd2cSJim Jagielski 
writeHyper(sal_Int64 Value)708*b1cdbd2cSJim Jagielski void ODataOutputStream::writeHyper(sal_Int64 Value)
709*b1cdbd2cSJim Jagielski 	throw (	IOException,
710*b1cdbd2cSJim Jagielski 			RuntimeException)
711*b1cdbd2cSJim Jagielski {
712*b1cdbd2cSJim Jagielski 	Sequence<sal_Int8> aTmp( 8 );
713*b1cdbd2cSJim Jagielski 	sal_Int8 * pBytes = aTmp.getArray();
714*b1cdbd2cSJim Jagielski 	pBytes[0] = sal_Int8(Value >> 56);
715*b1cdbd2cSJim Jagielski 	pBytes[1] = sal_Int8(Value >> 48);
716*b1cdbd2cSJim Jagielski 	pBytes[2] = sal_Int8(Value >> 40);
717*b1cdbd2cSJim Jagielski 	pBytes[3] = sal_Int8(Value >> 32);
718*b1cdbd2cSJim Jagielski 	pBytes[4] = sal_Int8(Value >> 24);
719*b1cdbd2cSJim Jagielski 	pBytes[5] = sal_Int8(Value >> 16);
720*b1cdbd2cSJim Jagielski 	pBytes[6] = sal_Int8(Value >> 8);
721*b1cdbd2cSJim Jagielski 	pBytes[7] = sal_Int8(Value);
722*b1cdbd2cSJim Jagielski 	writeBytes( aTmp );
723*b1cdbd2cSJim Jagielski }
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski 
writeFloat(float Value)726*b1cdbd2cSJim Jagielski void ODataOutputStream::writeFloat(float Value)
727*b1cdbd2cSJim Jagielski 	throw (	IOException,
728*b1cdbd2cSJim Jagielski 			RuntimeException)
729*b1cdbd2cSJim Jagielski {
730*b1cdbd2cSJim Jagielski 	union { float f; sal_uInt32 n; } a;
731*b1cdbd2cSJim Jagielski 	a.f = Value;
732*b1cdbd2cSJim Jagielski 	writeLong( a.n );
733*b1cdbd2cSJim Jagielski }
734*b1cdbd2cSJim Jagielski 
writeDouble(double Value)735*b1cdbd2cSJim Jagielski void ODataOutputStream::writeDouble(double Value)
736*b1cdbd2cSJim Jagielski 	throw (	IOException,
737*b1cdbd2cSJim Jagielski 			RuntimeException)
738*b1cdbd2cSJim Jagielski {
739*b1cdbd2cSJim Jagielski 	sal_uInt32 n = 1;
740*b1cdbd2cSJim Jagielski 	union { double d; struct { sal_uInt32 n1; sal_uInt32 n2; } ad; } a;
741*b1cdbd2cSJim Jagielski 	a.d = Value;
742*b1cdbd2cSJim Jagielski 	if( *(sal_Int8 *)&n == 1 )
743*b1cdbd2cSJim Jagielski 	{
744*b1cdbd2cSJim Jagielski 		// little endian
745*b1cdbd2cSJim Jagielski 		writeLong( a.ad.n2 );
746*b1cdbd2cSJim Jagielski 		writeLong( a.ad.n1 );
747*b1cdbd2cSJim Jagielski 	}
748*b1cdbd2cSJim Jagielski 	else
749*b1cdbd2cSJim Jagielski 	{
750*b1cdbd2cSJim Jagielski 		// big endian
751*b1cdbd2cSJim Jagielski 		writeLong( a.ad.n1 );
752*b1cdbd2cSJim Jagielski 		writeLong( a.ad.n2 );
753*b1cdbd2cSJim Jagielski 	}
754*b1cdbd2cSJim Jagielski }
755*b1cdbd2cSJim Jagielski 
writeUTF(const OUString & Value)756*b1cdbd2cSJim Jagielski void ODataOutputStream::writeUTF(const OUString& Value)
757*b1cdbd2cSJim Jagielski 	throw (	IOException,
758*b1cdbd2cSJim Jagielski 			RuntimeException)
759*b1cdbd2cSJim Jagielski {
760*b1cdbd2cSJim Jagielski 	sal_Int32 nStrLen = Value.getLength();
761*b1cdbd2cSJim Jagielski 	const sal_Unicode * pStr = Value.getStr();
762*b1cdbd2cSJim Jagielski 	sal_Int32 nUTFLen = 0;
763*b1cdbd2cSJim Jagielski 	sal_Int32 i;
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski 	for( i = 0 ; i < nStrLen ; i++ )
766*b1cdbd2cSJim Jagielski 	{
767*b1cdbd2cSJim Jagielski 	    sal_uInt16 c = pStr[i];
768*b1cdbd2cSJim Jagielski 	    if( (c >= 0x0001) && (c <= 0x007F) )
769*b1cdbd2cSJim Jagielski 		{
770*b1cdbd2cSJim Jagielski 			nUTFLen++;
771*b1cdbd2cSJim Jagielski 	    }
772*b1cdbd2cSJim Jagielski 		else if( c > 0x07FF )
773*b1cdbd2cSJim Jagielski 		{
774*b1cdbd2cSJim Jagielski 			nUTFLen += 3;
775*b1cdbd2cSJim Jagielski 	    }
776*b1cdbd2cSJim Jagielski 		else
777*b1cdbd2cSJim Jagielski 		{
778*b1cdbd2cSJim Jagielski 			nUTFLen += 2;
779*b1cdbd2cSJim Jagielski 	    }
780*b1cdbd2cSJim Jagielski 	}
781*b1cdbd2cSJim Jagielski 
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	// compatibility mode for older implementations, where it was not possible
784*b1cdbd2cSJim Jagielski 	// to write blocks bigger than 64 k. Note that there is a tradeoff. Blocks,
785*b1cdbd2cSJim Jagielski 	// that are exactly 64k long can not be read by older routines when written
786*b1cdbd2cSJim Jagielski 	// with these routines and the other way round !!!!!
787*b1cdbd2cSJim Jagielski 	if( nUTFLen >= 0xFFFF ) {
788*b1cdbd2cSJim Jagielski 		writeShort( (sal_Int16)-1 );
789*b1cdbd2cSJim Jagielski 		writeLong( nUTFLen );
790*b1cdbd2cSJim Jagielski 	}
791*b1cdbd2cSJim Jagielski 	else {
792*b1cdbd2cSJim Jagielski 		writeShort( ((sal_uInt16)nUTFLen) );
793*b1cdbd2cSJim Jagielski 	}
794*b1cdbd2cSJim Jagielski 	for( i = 0 ; i < nStrLen ; i++ )
795*b1cdbd2cSJim Jagielski 	{
796*b1cdbd2cSJim Jagielski 	    sal_uInt16 c = pStr[i];
797*b1cdbd2cSJim Jagielski 	    if( (c >= 0x0001) && (c <= 0x007F) )
798*b1cdbd2cSJim Jagielski 		{
799*b1cdbd2cSJim Jagielski 			writeByte(sal_Int8(c));
800*b1cdbd2cSJim Jagielski 	    }
801*b1cdbd2cSJim Jagielski 		else if( c > 0x07FF )
802*b1cdbd2cSJim Jagielski 		{
803*b1cdbd2cSJim Jagielski 			writeByte(sal_Int8(0xE0 | ((c >> 12) & 0x0F)));
804*b1cdbd2cSJim Jagielski 			writeByte(sal_Int8(0x80 | ((c >>  6) & 0x3F)));
805*b1cdbd2cSJim Jagielski 			writeByte(sal_Int8(0x80 | ((c >>  0) & 0x3F)));
806*b1cdbd2cSJim Jagielski 			//written += 2;
807*b1cdbd2cSJim Jagielski 	    }
808*b1cdbd2cSJim Jagielski 		else
809*b1cdbd2cSJim Jagielski 		{
810*b1cdbd2cSJim Jagielski 			writeByte(sal_Int8(0xC0 | ((c >>  6) & 0x1F)));
811*b1cdbd2cSJim Jagielski 			writeByte(sal_Int8(0x80 | ((c >>  0) & 0x3F)));
812*b1cdbd2cSJim Jagielski 			//written += 1;
813*b1cdbd2cSJim Jagielski 	    }
814*b1cdbd2cSJim Jagielski 	}
815*b1cdbd2cSJim Jagielski 	//written += strlen + 2;
816*b1cdbd2cSJim Jagielski }
817*b1cdbd2cSJim Jagielski 
818*b1cdbd2cSJim Jagielski // XActiveDataSource
setOutputStream(const Reference<XOutputStream> & aStream)819*b1cdbd2cSJim Jagielski void ODataOutputStream::setOutputStream(const Reference< XOutputStream > & aStream)
820*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski 	if( m_output != aStream ) {
823*b1cdbd2cSJim Jagielski 		m_output = aStream;
824*b1cdbd2cSJim Jagielski 		m_bValidStream = m_output.is();
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 		Reference < XConnectable > succ( m_output , UNO_QUERY );
827*b1cdbd2cSJim Jagielski 		setSuccessor( succ );
828*b1cdbd2cSJim Jagielski 	}
829*b1cdbd2cSJim Jagielski }
830*b1cdbd2cSJim Jagielski 
getOutputStream(void)831*b1cdbd2cSJim Jagielski Reference< XOutputStream > ODataOutputStream::getOutputStream(void)
832*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
833*b1cdbd2cSJim Jagielski {
834*b1cdbd2cSJim Jagielski 	return m_output;
835*b1cdbd2cSJim Jagielski }
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 
838*b1cdbd2cSJim Jagielski 
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski // XDataSink
setSuccessor(const Reference<XConnectable> & r)841*b1cdbd2cSJim Jagielski void ODataOutputStream::setSuccessor( const Reference < XConnectable > &r )
842*b1cdbd2cSJim Jagielski 	throw (RuntimeException)
843*b1cdbd2cSJim Jagielski {
844*b1cdbd2cSJim Jagielski      /// if the references match, nothing needs to be done
845*b1cdbd2cSJim Jagielski      if( m_succ != r )
846*b1cdbd2cSJim Jagielski 	 {
847*b1cdbd2cSJim Jagielski          /// store the reference for later use
848*b1cdbd2cSJim Jagielski          m_succ = r;
849*b1cdbd2cSJim Jagielski 
850*b1cdbd2cSJim Jagielski          if( m_succ.is() )
851*b1cdbd2cSJim Jagielski 		 {
852*b1cdbd2cSJim Jagielski               /// set this instance as the sink !
853*b1cdbd2cSJim Jagielski               m_succ->setPredecessor( Reference < XConnectable > (
854*b1cdbd2cSJim Jagielski 				  SAL_STATIC_CAST( XConnectable * , this  ) ));
855*b1cdbd2cSJim Jagielski          }
856*b1cdbd2cSJim Jagielski      }
857*b1cdbd2cSJim Jagielski }
getSuccessor()858*b1cdbd2cSJim Jagielski Reference < XConnectable > ODataOutputStream::getSuccessor()	throw (RuntimeException)
859*b1cdbd2cSJim Jagielski {
860*b1cdbd2cSJim Jagielski 	return m_succ;
861*b1cdbd2cSJim Jagielski }
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski // XDataSource
setPredecessor(const Reference<XConnectable> & r)865*b1cdbd2cSJim Jagielski void ODataOutputStream::setPredecessor( const Reference < XConnectable > &r )	throw (RuntimeException)
866*b1cdbd2cSJim Jagielski {
867*b1cdbd2cSJim Jagielski 	if( r != m_pred ) {
868*b1cdbd2cSJim Jagielski 		m_pred = r;
869*b1cdbd2cSJim Jagielski 		if( m_pred.is() ) {
870*b1cdbd2cSJim Jagielski 			m_pred->setSuccessor( Reference< XConnectable > (
871*b1cdbd2cSJim Jagielski 				SAL_STATIC_CAST( XConnectable * , this  ) ));
872*b1cdbd2cSJim Jagielski 		}
873*b1cdbd2cSJim Jagielski 	}
874*b1cdbd2cSJim Jagielski }
getPredecessor()875*b1cdbd2cSJim Jagielski Reference < XConnectable > ODataOutputStream::getPredecessor()	throw (RuntimeException)
876*b1cdbd2cSJim Jagielski {
877*b1cdbd2cSJim Jagielski 	return m_pred;
878*b1cdbd2cSJim Jagielski }
879*b1cdbd2cSJim Jagielski 
880*b1cdbd2cSJim Jagielski 
881*b1cdbd2cSJim Jagielski 
882*b1cdbd2cSJim Jagielski // XServiceInfo
getImplementationName()883*b1cdbd2cSJim Jagielski OUString ODataOutputStream::getImplementationName() throw ()
884*b1cdbd2cSJim Jagielski {
885*b1cdbd2cSJim Jagielski     return ODataOutputStream_getImplementationName();
886*b1cdbd2cSJim Jagielski }
887*b1cdbd2cSJim Jagielski 
888*b1cdbd2cSJim Jagielski // XServiceInfo
supportsService(const OUString & ServiceName)889*b1cdbd2cSJim Jagielski sal_Bool ODataOutputStream::supportsService(const OUString& ServiceName) throw ()
890*b1cdbd2cSJim Jagielski {
891*b1cdbd2cSJim Jagielski     Sequence< OUString > aSNL = getSupportedServiceNames();
892*b1cdbd2cSJim Jagielski     const OUString * pArray = aSNL.getConstArray();
893*b1cdbd2cSJim Jagielski 
894*b1cdbd2cSJim Jagielski     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
895*b1cdbd2cSJim Jagielski         if( pArray[i] == ServiceName )
896*b1cdbd2cSJim Jagielski             return sal_True;
897*b1cdbd2cSJim Jagielski 
898*b1cdbd2cSJim Jagielski     return sal_False;
899*b1cdbd2cSJim Jagielski }
900*b1cdbd2cSJim Jagielski 
901*b1cdbd2cSJim Jagielski // XServiceInfo
getSupportedServiceNames(void)902*b1cdbd2cSJim Jagielski Sequence< OUString > ODataOutputStream::getSupportedServiceNames(void) throw ()
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski     return ODataOutputStream_getSupportedServiceNames();
905*b1cdbd2cSJim Jagielski }
906*b1cdbd2cSJim Jagielski 
907*b1cdbd2cSJim Jagielski 
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski 
ODataOutputStream_CreateInstance(const Reference<XComponentContext> &)910*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL ODataOutputStream_CreateInstance( const Reference < XComponentContext > & ) throw(Exception)
911*b1cdbd2cSJim Jagielski {
912*b1cdbd2cSJim Jagielski 	ODataOutputStream *p = new ODataOutputStream;
913*b1cdbd2cSJim Jagielski 	Reference< XInterface > xService = *p;
914*b1cdbd2cSJim Jagielski 	return xService;
915*b1cdbd2cSJim Jagielski }
916*b1cdbd2cSJim Jagielski 
917*b1cdbd2cSJim Jagielski 
ODataOutputStream_getImplementationName()918*b1cdbd2cSJim Jagielski OUString ODataOutputStream_getImplementationName()
919*b1cdbd2cSJim Jagielski {
920*b1cdbd2cSJim Jagielski 	return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.io.stm.DataOutputStream" ) );
921*b1cdbd2cSJim Jagielski }
922*b1cdbd2cSJim Jagielski 
ODataOutputStream_getSupportedServiceNames(void)923*b1cdbd2cSJim Jagielski Sequence<OUString> ODataOutputStream_getSupportedServiceNames(void)
924*b1cdbd2cSJim Jagielski {
925*b1cdbd2cSJim Jagielski 	Sequence<OUString> aRet(1);
926*b1cdbd2cSJim Jagielski 	aRet.getArray()[0] =  OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.DataOutputStream" ) );
927*b1cdbd2cSJim Jagielski 	return aRet;
928*b1cdbd2cSJim Jagielski }
929*b1cdbd2cSJim Jagielski 
930*b1cdbd2cSJim Jagielski //--------------------------------------
931*b1cdbd2cSJim Jagielski struct equalObjectContainer_Impl
932*b1cdbd2cSJim Jagielski {
operator ()io_stm::equalObjectContainer_Impl933*b1cdbd2cSJim Jagielski 	sal_Int32 operator()(const Reference< XInterface > & s1,
934*b1cdbd2cSJim Jagielski 						 const Reference< XInterface > & s2) const
935*b1cdbd2cSJim Jagielski   	{
936*b1cdbd2cSJim Jagielski     	return s1 == s2;
937*b1cdbd2cSJim Jagielski 	}
938*b1cdbd2cSJim Jagielski };
939*b1cdbd2cSJim Jagielski 
940*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
941*b1cdbd2cSJim Jagielski struct hashObjectContainer_Impl
942*b1cdbd2cSJim Jagielski {
operator ()io_stm::hashObjectContainer_Impl943*b1cdbd2cSJim Jagielski 	size_t operator()(const Reference< XInterface > & xRef) const
944*b1cdbd2cSJim Jagielski 	{
945*b1cdbd2cSJim Jagielski 		return (size_t)xRef.get();
946*b1cdbd2cSJim Jagielski 	}
947*b1cdbd2cSJim Jagielski };
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski typedef hash_map
950*b1cdbd2cSJim Jagielski <
951*b1cdbd2cSJim Jagielski 	Reference< XInterface >,
952*b1cdbd2cSJim Jagielski 	sal_Int32,
953*b1cdbd2cSJim Jagielski 	hashObjectContainer_Impl,
954*b1cdbd2cSJim Jagielski 	equalObjectContainer_Impl
955*b1cdbd2cSJim Jagielski > ObjectContainer_Impl;
956*b1cdbd2cSJim Jagielski 
957*b1cdbd2cSJim Jagielski /*---------------------------------------------
958*b1cdbd2cSJim Jagielski *
959*b1cdbd2cSJim Jagielski *
960*b1cdbd2cSJim Jagielski *
961*b1cdbd2cSJim Jagielski *
962*b1cdbd2cSJim Jagielski *--------------------------------------------*/
963*b1cdbd2cSJim Jagielski class OObjectOutputStream :
964*b1cdbd2cSJim Jagielski 			public ODataOutputStream,
965*b1cdbd2cSJim Jagielski 			public XObjectOutputStream,
966*b1cdbd2cSJim Jagielski 			public XMarkableStream
967*b1cdbd2cSJim Jagielski {
968*b1cdbd2cSJim Jagielski public:
OObjectOutputStream()969*b1cdbd2cSJim Jagielski 	OObjectOutputStream()
970*b1cdbd2cSJim Jagielski 		: m_nMaxId(0) ,
971*b1cdbd2cSJim Jagielski 		  m_bValidMarkable(sal_False)
972*b1cdbd2cSJim Jagielski 		{
973*b1cdbd2cSJim Jagielski 			g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
974*b1cdbd2cSJim Jagielski 		}
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski 	~OObjectOutputStream();
977*b1cdbd2cSJim Jagielski 
978*b1cdbd2cSJim Jagielski public:
979*b1cdbd2cSJim Jagielski         Any             SAL_CALL queryInterface( const Type &type ) throw (::com::sun::star::uno::RuntimeException);
acquire()980*b1cdbd2cSJim Jagielski         void    SAL_CALL acquire() throw()                                       { ODataOutputStream::acquire(); }
release()981*b1cdbd2cSJim Jagielski         void    SAL_CALL release() throw()                                       { ODataOutputStream::release(); }
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski public:
984*b1cdbd2cSJim Jagielski 	// XOutputStream
writeBytes(const Sequence<sal_Int8> & aData)985*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeBytes(const Sequence< sal_Int8 >& aData)
986*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
987*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
988*b1cdbd2cSJim Jagielski 				RuntimeException)
989*b1cdbd2cSJim Jagielski 		{ ODataOutputStream::writeBytes( aData ); }
990*b1cdbd2cSJim Jagielski 
flush(void)991*b1cdbd2cSJim Jagielski     virtual void SAL_CALL flush(void)
992*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
993*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
994*b1cdbd2cSJim Jagielski 				RuntimeException)
995*b1cdbd2cSJim Jagielski 		{ ODataOutputStream::flush(); }
996*b1cdbd2cSJim Jagielski 
closeOutput(void)997*b1cdbd2cSJim Jagielski     virtual void SAL_CALL closeOutput(void)
998*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
999*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
1000*b1cdbd2cSJim Jagielski 				RuntimeException)
1001*b1cdbd2cSJim Jagielski 		{ ODataOutputStream::closeOutput(); }
1002*b1cdbd2cSJim Jagielski 
1003*b1cdbd2cSJim Jagielski public:
1004*b1cdbd2cSJim Jagielski 	// XDataOutputStream
writeBoolean(sal_Bool Value)1005*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeBoolean(sal_Bool Value) throw (IOException, RuntimeException)
1006*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeBoolean( Value ); }
writeByte(sal_Int8 Value)1007*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeByte(sal_Int8 Value) throw (IOException, RuntimeException)
1008*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeByte( Value ); }
writeChar(sal_Unicode Value)1009*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeChar(sal_Unicode Value) throw (IOException, RuntimeException)
1010*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeChar( Value ); }
writeShort(sal_Int16 Value)1011*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeShort(sal_Int16 Value) throw (IOException, RuntimeException)
1012*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeShort( Value ); }
writeLong(sal_Int32 Value)1013*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeLong(sal_Int32 Value) throw (IOException, RuntimeException)
1014*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeLong( Value ); }
writeHyper(sal_Int64 Value)1015*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeHyper(sal_Int64 Value) throw (IOException, RuntimeException)
1016*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeHyper( Value ); }
writeFloat(float Value)1017*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeFloat(float Value) throw (IOException, RuntimeException)
1018*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeFloat( Value ); }
writeDouble(double Value)1019*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeDouble(double Value) throw (IOException, RuntimeException)
1020*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeDouble( Value ); }
writeUTF(const OUString & Value)1021*b1cdbd2cSJim Jagielski     virtual void SAL_CALL writeUTF(const OUString& Value) throw (IOException, RuntimeException)
1022*b1cdbd2cSJim Jagielski     			{ ODataOutputStream::writeUTF( Value );}
1023*b1cdbd2cSJim Jagielski 
1024*b1cdbd2cSJim Jagielski 	// XObjectOutputStream
1025*b1cdbd2cSJim Jagielski         virtual void SAL_CALL writeObject( const Reference< XPersistObject > & r ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
1026*b1cdbd2cSJim Jagielski 
1027*b1cdbd2cSJim Jagielski public: // XMarkableStream
1028*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL createMark(void) 				throw (IOException, RuntimeException);
1029*b1cdbd2cSJim Jagielski     virtual void SAL_CALL deleteMark(sal_Int32 Mark)			throw (IOException, IllegalArgumentException, RuntimeException);
1030*b1cdbd2cSJim Jagielski     virtual void SAL_CALL jumpToMark(sal_Int32 nMark) 		throw (IOException, IllegalArgumentException, RuntimeException);
1031*b1cdbd2cSJim Jagielski     virtual void SAL_CALL jumpToFurthest(void) 			throw (IOException, RuntimeException);
1032*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL offsetToMark(sal_Int32 nMark)
1033*b1cdbd2cSJim Jagielski 		throw (IOException, IllegalArgumentException, RuntimeException);
1034*b1cdbd2cSJim Jagielski 
1035*b1cdbd2cSJim Jagielski public: //XTypeProvider
1036*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL
1037*b1cdbd2cSJim Jagielski 	        getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
1038*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL
1039*b1cdbd2cSJim Jagielski             getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);
1040*b1cdbd2cSJim Jagielski 
1041*b1cdbd2cSJim Jagielski public: // XServiceInfo
1042*b1cdbd2cSJim Jagielski     OUString                   SAL_CALL   getImplementationName() throw ();
1043*b1cdbd2cSJim Jagielski     Sequence< OUString >       SAL_CALL   getSupportedServiceNames(void) throw ();
1044*b1cdbd2cSJim Jagielski     sal_Bool                   SAL_CALL   supportsService(const OUString& ServiceName) throw ();
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski private:
1047*b1cdbd2cSJim Jagielski 	void connectToMarkable();
1048*b1cdbd2cSJim Jagielski private:
1049*b1cdbd2cSJim Jagielski 	ObjectContainer_Impl	            m_mapObject;
1050*b1cdbd2cSJim Jagielski 	sal_Int32							m_nMaxId;
1051*b1cdbd2cSJim Jagielski 	Reference< XMarkableStream > 		m_rMarkable;
1052*b1cdbd2cSJim Jagielski 	sal_Bool 							m_bValidMarkable;
1053*b1cdbd2cSJim Jagielski };
1054*b1cdbd2cSJim Jagielski 
~OObjectOutputStream()1055*b1cdbd2cSJim Jagielski OObjectOutputStream::~OObjectOutputStream()
1056*b1cdbd2cSJim Jagielski {
1057*b1cdbd2cSJim Jagielski 	g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
1058*b1cdbd2cSJim Jagielski }
1059*b1cdbd2cSJim Jagielski 
queryInterface(const Type & aType)1060*b1cdbd2cSJim Jagielski Any OObjectOutputStream::queryInterface( const Type &aType ) throw (::com::sun::star::uno::RuntimeException)
1061*b1cdbd2cSJim Jagielski {
1062*b1cdbd2cSJim Jagielski 	Any a = ::cppu::queryInterface(
1063*b1cdbd2cSJim Jagielski 		aType ,
1064*b1cdbd2cSJim Jagielski 		SAL_STATIC_CAST( XMarkableStream * , this ),
1065*b1cdbd2cSJim Jagielski 		SAL_STATIC_CAST( XObjectOutputStream * , this ) );
1066*b1cdbd2cSJim Jagielski 	if( a.hasValue() )
1067*b1cdbd2cSJim Jagielski 	{
1068*b1cdbd2cSJim Jagielski 		return a;
1069*b1cdbd2cSJim Jagielski 	}
1070*b1cdbd2cSJim Jagielski 
1071*b1cdbd2cSJim Jagielski 	return ODataOutputStream::queryInterface( aType );
1072*b1cdbd2cSJim Jagielski 
1073*b1cdbd2cSJim Jagielski }
writeObject(const Reference<XPersistObject> & xPObj)1074*b1cdbd2cSJim Jagielski void OObjectOutputStream::writeObject( const Reference< XPersistObject > & xPObj ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
1075*b1cdbd2cSJim Jagielski {
1076*b1cdbd2cSJim Jagielski 
1077*b1cdbd2cSJim Jagielski 	connectToMarkable();
1078*b1cdbd2cSJim Jagielski 	sal_Bool bWriteObj = sal_False;
1079*b1cdbd2cSJim Jagielski 	// create Mark to write length of info
1080*b1cdbd2cSJim Jagielski 	sal_uInt32 nInfoLenMark = m_rMarkable->createMark();
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski 	// length of the info data (is later rewritten)
1083*b1cdbd2cSJim Jagielski 	OObjectOutputStream::writeShort( 0 );
1084*b1cdbd2cSJim Jagielski 
1085*b1cdbd2cSJim Jagielski 	// write the object identifier
1086*b1cdbd2cSJim Jagielski 	if( xPObj.is() )
1087*b1cdbd2cSJim Jagielski 	{
1088*b1cdbd2cSJim Jagielski 		Reference< XInterface > rX( xPObj , UNO_QUERY );
1089*b1cdbd2cSJim Jagielski 
1090*b1cdbd2cSJim Jagielski 		ObjectContainer_Impl::const_iterator aIt
1091*b1cdbd2cSJim Jagielski 			= m_mapObject.find( rX );
1092*b1cdbd2cSJim Jagielski 		if( aIt == m_mapObject.end() )
1093*b1cdbd2cSJim Jagielski 		{
1094*b1cdbd2cSJim Jagielski 			// insert new object in hash table
1095*b1cdbd2cSJim Jagielski 			m_mapObject[ rX ] = ++m_nMaxId;
1096*b1cdbd2cSJim Jagielski 			ODataOutputStream::writeLong( m_nMaxId );
1097*b1cdbd2cSJim Jagielski 			ODataOutputStream::writeUTF( xPObj->getServiceName() );
1098*b1cdbd2cSJim Jagielski 			bWriteObj = sal_True;
1099*b1cdbd2cSJim Jagielski 		}
1100*b1cdbd2cSJim Jagielski 		else
1101*b1cdbd2cSJim Jagielski 		{
1102*b1cdbd2cSJim Jagielski 			ODataOutputStream::writeLong( (*aIt).second );
1103*b1cdbd2cSJim Jagielski 			OUString aName;
1104*b1cdbd2cSJim Jagielski 			ODataOutputStream::writeUTF( aName );
1105*b1cdbd2cSJim Jagielski 		}
1106*b1cdbd2cSJim Jagielski 	}
1107*b1cdbd2cSJim Jagielski 	else
1108*b1cdbd2cSJim Jagielski 	{
1109*b1cdbd2cSJim Jagielski 		ODataOutputStream::writeLong( 0 );
1110*b1cdbd2cSJim Jagielski 		OUString aName;
1111*b1cdbd2cSJim Jagielski 		ODataOutputStream::writeUTF( aName );
1112*b1cdbd2cSJim Jagielski 	}
1113*b1cdbd2cSJim Jagielski 
1114*b1cdbd2cSJim Jagielski 	sal_uInt32 nObjLenMark = m_rMarkable->createMark();
1115*b1cdbd2cSJim Jagielski 	ODataOutputStream::writeLong( 0 );
1116*b1cdbd2cSJim Jagielski 
1117*b1cdbd2cSJim Jagielski 	sal_Int32 nInfoLen = m_rMarkable->offsetToMark( nInfoLenMark );
1118*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToMark( nInfoLenMark );
1119*b1cdbd2cSJim Jagielski 	// write length of the info data
1120*b1cdbd2cSJim Jagielski 	ODataOutputStream::writeShort( (sal_Int16)nInfoLen );
1121*b1cdbd2cSJim Jagielski 	// jump to the end of the stream
1122*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToFurthest();
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski 	if( bWriteObj )
1125*b1cdbd2cSJim Jagielski 		xPObj->write( Reference< XObjectOutputStream > (
1126*b1cdbd2cSJim Jagielski 			SAL_STATIC_CAST( XObjectOutputStream * , this ) ) );
1127*b1cdbd2cSJim Jagielski 
1128*b1cdbd2cSJim Jagielski 	sal_Int32 nObjLen = m_rMarkable->offsetToMark( nObjLenMark ) -4;
1129*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToMark( nObjLenMark );
1130*b1cdbd2cSJim Jagielski 	// write length of the info data
1131*b1cdbd2cSJim Jagielski 	ODataOutputStream::writeLong( nObjLen );
1132*b1cdbd2cSJim Jagielski 	// jump to the end of the stream
1133*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToFurthest();
1134*b1cdbd2cSJim Jagielski 
1135*b1cdbd2cSJim Jagielski 	m_rMarkable->deleteMark( nObjLenMark );
1136*b1cdbd2cSJim Jagielski 	m_rMarkable->deleteMark( nInfoLenMark );
1137*b1cdbd2cSJim Jagielski }
1138*b1cdbd2cSJim Jagielski 
1139*b1cdbd2cSJim Jagielski 
1140*b1cdbd2cSJim Jagielski 
connectToMarkable(void)1141*b1cdbd2cSJim Jagielski void OObjectOutputStream::connectToMarkable(void)
1142*b1cdbd2cSJim Jagielski {
1143*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable ) {
1144*b1cdbd2cSJim Jagielski 		if( ! m_bValidStream )
1145*b1cdbd2cSJim Jagielski 		{
1146*b1cdbd2cSJim Jagielski 			throw NotConnectedException();
1147*b1cdbd2cSJim Jagielski 		}
1148*b1cdbd2cSJim Jagielski 
1149*b1cdbd2cSJim Jagielski 		// find the markable stream !
1150*b1cdbd2cSJim Jagielski 		Reference< XInterface > rTry(m_output);
1151*b1cdbd2cSJim Jagielski 		while( sal_True ) {
1152*b1cdbd2cSJim Jagielski 			if( ! rTry.is() )
1153*b1cdbd2cSJim Jagielski 			{
1154*b1cdbd2cSJim Jagielski 				throw NotConnectedException();
1155*b1cdbd2cSJim Jagielski 			}
1156*b1cdbd2cSJim Jagielski 			Reference < XMarkableStream > markable( rTry , UNO_QUERY );
1157*b1cdbd2cSJim Jagielski 			if( markable.is() )
1158*b1cdbd2cSJim Jagielski 			{
1159*b1cdbd2cSJim Jagielski 				m_rMarkable = markable;
1160*b1cdbd2cSJim Jagielski 				break;
1161*b1cdbd2cSJim Jagielski 			}
1162*b1cdbd2cSJim Jagielski 			Reference < XActiveDataSource > source( rTry , UNO_QUERY );
1163*b1cdbd2cSJim Jagielski 			rTry = source;
1164*b1cdbd2cSJim Jagielski 		}
1165*b1cdbd2cSJim Jagielski 		m_bValidMarkable = sal_True;
1166*b1cdbd2cSJim Jagielski 	}
1167*b1cdbd2cSJim Jagielski }
1168*b1cdbd2cSJim Jagielski 
1169*b1cdbd2cSJim Jagielski 
createMark(void)1170*b1cdbd2cSJim Jagielski sal_Int32 OObjectOutputStream::createMark(void)
1171*b1cdbd2cSJim Jagielski 	throw (IOException, RuntimeException)
1172*b1cdbd2cSJim Jagielski {
1173*b1cdbd2cSJim Jagielski 	connectToMarkable();	// throws an exception, if a markable is not connected !
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski 	return m_rMarkable->createMark();
1176*b1cdbd2cSJim Jagielski }
1177*b1cdbd2cSJim Jagielski 
deleteMark(sal_Int32 Mark)1178*b1cdbd2cSJim Jagielski void OObjectOutputStream::deleteMark(sal_Int32 Mark)
1179*b1cdbd2cSJim Jagielski 	throw (IOException, IllegalArgumentException, RuntimeException)
1180*b1cdbd2cSJim Jagielski {
1181*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable )
1182*b1cdbd2cSJim Jagielski 	{
1183*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
1184*b1cdbd2cSJim Jagielski 	}
1185*b1cdbd2cSJim Jagielski 	m_rMarkable->deleteMark( Mark );
1186*b1cdbd2cSJim Jagielski }
1187*b1cdbd2cSJim Jagielski 
jumpToMark(sal_Int32 nMark)1188*b1cdbd2cSJim Jagielski void OObjectOutputStream::jumpToMark(sal_Int32 nMark)
1189*b1cdbd2cSJim Jagielski 	throw (IOException, IllegalArgumentException, RuntimeException)
1190*b1cdbd2cSJim Jagielski {
1191*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable )
1192*b1cdbd2cSJim Jagielski 	{
1193*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
1194*b1cdbd2cSJim Jagielski 	}
1195*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToMark( nMark );
1196*b1cdbd2cSJim Jagielski }
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski 
jumpToFurthest(void)1199*b1cdbd2cSJim Jagielski void OObjectOutputStream::jumpToFurthest(void)
1200*b1cdbd2cSJim Jagielski 	throw (IOException, RuntimeException)
1201*b1cdbd2cSJim Jagielski {
1202*b1cdbd2cSJim Jagielski 	connectToMarkable();
1203*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToFurthest();
1204*b1cdbd2cSJim Jagielski }
1205*b1cdbd2cSJim Jagielski 
offsetToMark(sal_Int32 nMark)1206*b1cdbd2cSJim Jagielski sal_Int32 OObjectOutputStream::offsetToMark(sal_Int32 nMark)
1207*b1cdbd2cSJim Jagielski 	throw (IOException, IllegalArgumentException, RuntimeException)
1208*b1cdbd2cSJim Jagielski {
1209*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable )
1210*b1cdbd2cSJim Jagielski 	{
1211*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
1212*b1cdbd2cSJim Jagielski 	}
1213*b1cdbd2cSJim Jagielski 	return m_rMarkable->offsetToMark( nMark );
1214*b1cdbd2cSJim Jagielski }
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski 
1217*b1cdbd2cSJim Jagielski 
1218*b1cdbd2cSJim Jagielski 
OObjectOutputStream_CreateInstance(const Reference<XComponentContext> &)1219*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL OObjectOutputStream_CreateInstance( const Reference < XComponentContext > & )
1220*b1cdbd2cSJim Jagielski 	throw(Exception)
1221*b1cdbd2cSJim Jagielski {
1222*b1cdbd2cSJim Jagielski 	OObjectOutputStream *p = new OObjectOutputStream;
1223*b1cdbd2cSJim Jagielski 	return  Reference< XInterface > ( SAL_STATIC_CAST( OWeakObject * , p ) );
1224*b1cdbd2cSJim Jagielski }
1225*b1cdbd2cSJim Jagielski 
OObjectOutputStream_getImplementationName()1226*b1cdbd2cSJim Jagielski OUString OObjectOutputStream_getImplementationName()
1227*b1cdbd2cSJim Jagielski {
1228*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.io.stm.ObjectOutputStream" ) );
1229*b1cdbd2cSJim Jagielski }
1230*b1cdbd2cSJim Jagielski 
OObjectOutputStream_getSupportedServiceNames(void)1231*b1cdbd2cSJim Jagielski Sequence<OUString> OObjectOutputStream_getSupportedServiceNames(void)
1232*b1cdbd2cSJim Jagielski {
1233*b1cdbd2cSJim Jagielski 	Sequence<OUString> aRet(1);
1234*b1cdbd2cSJim Jagielski 	aRet.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.ObjectOutputStream" ) );
1235*b1cdbd2cSJim Jagielski 	return aRet;
1236*b1cdbd2cSJim Jagielski }
1237*b1cdbd2cSJim Jagielski 
getTypes(void)1238*b1cdbd2cSJim Jagielski Sequence< Type > SAL_CALL OObjectOutputStream::getTypes(void) throw( RuntimeException )
1239*b1cdbd2cSJim Jagielski {
1240*b1cdbd2cSJim Jagielski 	static OTypeCollection *pCollection = 0;
1241*b1cdbd2cSJim Jagielski 	if( ! pCollection )
1242*b1cdbd2cSJim Jagielski 	{
1243*b1cdbd2cSJim Jagielski 		MutexGuard guard( Mutex::getGlobalMutex() );
1244*b1cdbd2cSJim Jagielski 		if( ! pCollection )
1245*b1cdbd2cSJim Jagielski 		{
1246*b1cdbd2cSJim Jagielski 			static OTypeCollection collection(
1247*b1cdbd2cSJim Jagielski 				getCppuType( (Reference< XMarkableStream > * ) 0 ),
1248*b1cdbd2cSJim Jagielski 				getCppuType( (Reference< XObjectOutputStream > * ) 0 ),
1249*b1cdbd2cSJim Jagielski 				ODataOutputStream::getTypes() );
1250*b1cdbd2cSJim Jagielski 			pCollection = &collection;
1251*b1cdbd2cSJim Jagielski 		}
1252*b1cdbd2cSJim Jagielski 	}
1253*b1cdbd2cSJim Jagielski 	return (*pCollection).getTypes();
1254*b1cdbd2cSJim Jagielski }
1255*b1cdbd2cSJim Jagielski 
getImplementationId()1256*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > SAL_CALL OObjectOutputStream::getImplementationId(  ) throw( RuntimeException)
1257*b1cdbd2cSJim Jagielski {
1258*b1cdbd2cSJim Jagielski 	static OImplementationId *pId = 0;
1259*b1cdbd2cSJim Jagielski 	if( ! pId )
1260*b1cdbd2cSJim Jagielski 	{
1261*b1cdbd2cSJim Jagielski 		MutexGuard guard( Mutex::getGlobalMutex() );
1262*b1cdbd2cSJim Jagielski 		if( ! pId )
1263*b1cdbd2cSJim Jagielski 		{
1264*b1cdbd2cSJim Jagielski 			static OImplementationId id( sal_False );
1265*b1cdbd2cSJim Jagielski 			pId = &id;
1266*b1cdbd2cSJim Jagielski 		}
1267*b1cdbd2cSJim Jagielski 	}
1268*b1cdbd2cSJim Jagielski 	return (*pId).getImplementationId();
1269*b1cdbd2cSJim Jagielski }
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski 
1272*b1cdbd2cSJim Jagielski // XServiceInfo
getImplementationName()1273*b1cdbd2cSJim Jagielski OUString OObjectOutputStream::getImplementationName() throw ()
1274*b1cdbd2cSJim Jagielski {
1275*b1cdbd2cSJim Jagielski     return ODataInputStream_getImplementationName();
1276*b1cdbd2cSJim Jagielski }
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski // XServiceInfo
supportsService(const OUString & ServiceName)1279*b1cdbd2cSJim Jagielski sal_Bool OObjectOutputStream::supportsService(const OUString& ServiceName) throw ()
1280*b1cdbd2cSJim Jagielski {
1281*b1cdbd2cSJim Jagielski     Sequence< OUString > aSNL = getSupportedServiceNames();
1282*b1cdbd2cSJim Jagielski     const OUString * pArray = aSNL.getConstArray();
1283*b1cdbd2cSJim Jagielski 
1284*b1cdbd2cSJim Jagielski     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
1285*b1cdbd2cSJim Jagielski         if( pArray[i] == ServiceName )
1286*b1cdbd2cSJim Jagielski             return sal_True;
1287*b1cdbd2cSJim Jagielski 
1288*b1cdbd2cSJim Jagielski     return sal_False;
1289*b1cdbd2cSJim Jagielski }
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski // XServiceInfo
getSupportedServiceNames(void)1292*b1cdbd2cSJim Jagielski Sequence< OUString > OObjectOutputStream::getSupportedServiceNames(void) throw ()
1293*b1cdbd2cSJim Jagielski {
1294*b1cdbd2cSJim Jagielski 	return OObjectOutputStream_getSupportedServiceNames();
1295*b1cdbd2cSJim Jagielski }
1296*b1cdbd2cSJim Jagielski 
1297*b1cdbd2cSJim Jagielski 
1298*b1cdbd2cSJim Jagielski 
1299*b1cdbd2cSJim Jagielski 
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski class OObjectInputStream :
1302*b1cdbd2cSJim Jagielski 	public ODataInputStream,
1303*b1cdbd2cSJim Jagielski 	public XObjectInputStream,
1304*b1cdbd2cSJim Jagielski 	public XMarkableStream
1305*b1cdbd2cSJim Jagielski {
1306*b1cdbd2cSJim Jagielski public:
OObjectInputStream(const Reference<XComponentContext> & r)1307*b1cdbd2cSJim Jagielski 	OObjectInputStream( const Reference < XComponentContext > &r)
1308*b1cdbd2cSJim Jagielski 		: m_rSMgr( r->getServiceManager() )
1309*b1cdbd2cSJim Jagielski 		, m_rCxt( r )
1310*b1cdbd2cSJim Jagielski 		, m_bValidMarkable(sal_False)
1311*b1cdbd2cSJim Jagielski 		{
1312*b1cdbd2cSJim Jagielski 			g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt );
1313*b1cdbd2cSJim Jagielski 		}
1314*b1cdbd2cSJim Jagielski 	~OObjectInputStream();
1315*b1cdbd2cSJim Jagielski 
1316*b1cdbd2cSJim Jagielski public:
1317*b1cdbd2cSJim Jagielski         Any             SAL_CALL queryInterface( const Type &type ) throw();
acquire()1318*b1cdbd2cSJim Jagielski         void    SAL_CALL acquire() throw()                                       { ODataInputStream::acquire(); }
release()1319*b1cdbd2cSJim Jagielski         void    SAL_CALL release() throw()                                       { ODataInputStream::release(); }
1320*b1cdbd2cSJim Jagielski 
1321*b1cdbd2cSJim Jagielski public: // XInputStream
readBytes(Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)1322*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readBytes(Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead)
1323*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
1324*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
1325*b1cdbd2cSJim Jagielski 				RuntimeException)
1326*b1cdbd2cSJim Jagielski 		{ return ODataInputStream::readBytes( aData , nBytesToRead ); }
1327*b1cdbd2cSJim Jagielski 
readSomeBytes(Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)1328*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readSomeBytes(Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead)
1329*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
1330*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
1331*b1cdbd2cSJim Jagielski 				RuntimeException)
1332*b1cdbd2cSJim Jagielski 		{ return ODataInputStream::readSomeBytes( aData, nMaxBytesToRead ); }
1333*b1cdbd2cSJim Jagielski 
skipBytes(sal_Int32 nBytesToSkip)1334*b1cdbd2cSJim Jagielski     virtual void SAL_CALL skipBytes(sal_Int32 nBytesToSkip)
1335*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
1336*b1cdbd2cSJim Jagielski 				BufferSizeExceededException,
1337*b1cdbd2cSJim Jagielski 				RuntimeException)
1338*b1cdbd2cSJim Jagielski 		{ ODataInputStream::skipBytes( nBytesToSkip ); }
1339*b1cdbd2cSJim Jagielski 
available(void)1340*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL available(void)
1341*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
1342*b1cdbd2cSJim Jagielski 				RuntimeException)
1343*b1cdbd2cSJim Jagielski 		{ return ODataInputStream::available(); }
1344*b1cdbd2cSJim Jagielski 
closeInput(void)1345*b1cdbd2cSJim Jagielski     virtual void SAL_CALL closeInput(void)
1346*b1cdbd2cSJim Jagielski 		throw (	NotConnectedException,
1347*b1cdbd2cSJim Jagielski 				RuntimeException)
1348*b1cdbd2cSJim Jagielski 		{ ODataInputStream::closeInput(); }
1349*b1cdbd2cSJim Jagielski 
1350*b1cdbd2cSJim Jagielski public: // XDataInputStream
readBoolean(void)1351*b1cdbd2cSJim Jagielski     virtual sal_Int8 SAL_CALL readBoolean(void) throw (IOException, RuntimeException)
1352*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readBoolean(); }
readByte(void)1353*b1cdbd2cSJim Jagielski     virtual sal_Int8 SAL_CALL readByte(void) throw (IOException, RuntimeException)
1354*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readByte(); }
readChar(void)1355*b1cdbd2cSJim Jagielski     virtual sal_Unicode SAL_CALL readChar(void) throw (IOException, RuntimeException)
1356*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readChar(); }
readShort(void)1357*b1cdbd2cSJim Jagielski     virtual sal_Int16 SAL_CALL readShort(void) throw (IOException, RuntimeException)
1358*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readShort(); }
readLong(void)1359*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL readLong(void) throw (IOException, RuntimeException)
1360*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readLong(); }
readHyper(void)1361*b1cdbd2cSJim Jagielski     virtual sal_Int64 SAL_CALL readHyper(void) throw (IOException, RuntimeException)
1362*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readHyper(); }
readFloat(void)1363*b1cdbd2cSJim Jagielski     virtual float SAL_CALL readFloat(void) throw (IOException, RuntimeException)
1364*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readFloat(); }
readDouble(void)1365*b1cdbd2cSJim Jagielski     virtual double SAL_CALL readDouble(void) throw (IOException, RuntimeException)
1366*b1cdbd2cSJim Jagielski 		{ return ODataInputStream::readDouble(); }
readUTF(void)1367*b1cdbd2cSJim Jagielski     virtual OUString SAL_CALL readUTF(void) throw (IOException, RuntimeException)
1368*b1cdbd2cSJim Jagielski     			{ return ODataInputStream::readUTF(); }
1369*b1cdbd2cSJim Jagielski 
1370*b1cdbd2cSJim Jagielski public: // XObjectInputStream
1371*b1cdbd2cSJim Jagielski         virtual Reference< XPersistObject > SAL_CALL readObject( ) throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException);
1372*b1cdbd2cSJim Jagielski 
1373*b1cdbd2cSJim Jagielski public: // XMarkableStream
1374*b1cdbd2cSJim Jagielski     virtual sal_Int32 SAL_CALL createMark(void)
1375*b1cdbd2cSJim Jagielski 		throw (IOException, RuntimeException);
1376*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL deleteMark(sal_Int32 Mark)			throw (IOException, IllegalArgumentException, RuntimeException);
1377*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL jumpToMark(sal_Int32 nMark) 		throw (IOException, IllegalArgumentException, RuntimeException);
1378*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL jumpToFurthest(void) 			throw (IOException, RuntimeException);
1379*b1cdbd2cSJim Jagielski 	virtual sal_Int32 SAL_CALL offsetToMark(sal_Int32 nMark)
1380*b1cdbd2cSJim Jagielski 		throw (IOException, IllegalArgumentException, RuntimeException);
1381*b1cdbd2cSJim Jagielski 
1382*b1cdbd2cSJim Jagielski public: //XTypeProvider
1383*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL
1384*b1cdbd2cSJim Jagielski 	        getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
1385*b1cdbd2cSJim Jagielski 	virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL
1386*b1cdbd2cSJim Jagielski             getImplementationId(  ) throw(::com::sun::star::uno::RuntimeException);
1387*b1cdbd2cSJim Jagielski 
1388*b1cdbd2cSJim Jagielski public: // XServiceInfo
1389*b1cdbd2cSJim Jagielski     OUString                     SAL_CALL getImplementationName() throw ();
1390*b1cdbd2cSJim Jagielski 	Sequence< OUString >         SAL_CALL getSupportedServiceNames(void) throw ();
1391*b1cdbd2cSJim Jagielski     sal_Bool                     SAL_CALL supportsService(const OUString& ServiceName) throw ();
1392*b1cdbd2cSJim Jagielski 
1393*b1cdbd2cSJim Jagielski private:
1394*b1cdbd2cSJim Jagielski 	void connectToMarkable();
1395*b1cdbd2cSJim Jagielski private:
1396*b1cdbd2cSJim Jagielski 	Reference < XMultiComponentFactory > m_rSMgr;
1397*b1cdbd2cSJim Jagielski 	Reference < XComponentContext >     m_rCxt;
1398*b1cdbd2cSJim Jagielski 	sal_Bool 				m_bValidMarkable;
1399*b1cdbd2cSJim Jagielski 	Reference < XMarkableStream > m_rMarkable;
1400*b1cdbd2cSJim Jagielski 	vector < Reference<  XPersistObject > > m_aPersistVector;
1401*b1cdbd2cSJim Jagielski 
1402*b1cdbd2cSJim Jagielski };
1403*b1cdbd2cSJim Jagielski 
~OObjectInputStream()1404*b1cdbd2cSJim Jagielski OObjectInputStream::~OObjectInputStream()
1405*b1cdbd2cSJim Jagielski {
1406*b1cdbd2cSJim Jagielski 	g_moduleCount.modCnt.release( &g_moduleCount.modCnt );
1407*b1cdbd2cSJim Jagielski }
1408*b1cdbd2cSJim Jagielski 
queryInterface(const Type & aType)1409*b1cdbd2cSJim Jagielski Any OObjectInputStream::queryInterface( const Type &aType ) throw ()
1410*b1cdbd2cSJim Jagielski {
1411*b1cdbd2cSJim Jagielski 	Any a = ::cppu::queryInterface(
1412*b1cdbd2cSJim Jagielski 		aType ,
1413*b1cdbd2cSJim Jagielski 		SAL_STATIC_CAST( XMarkableStream * , this ),
1414*b1cdbd2cSJim Jagielski 		SAL_STATIC_CAST( XObjectInputStream * , this ) );
1415*b1cdbd2cSJim Jagielski 	if( a.hasValue() )
1416*b1cdbd2cSJim Jagielski 	{
1417*b1cdbd2cSJim Jagielski 		return a;
1418*b1cdbd2cSJim Jagielski 	}
1419*b1cdbd2cSJim Jagielski 
1420*b1cdbd2cSJim Jagielski 	return ODataInputStream::queryInterface( aType );
1421*b1cdbd2cSJim Jagielski 
1422*b1cdbd2cSJim Jagielski }
1423*b1cdbd2cSJim Jagielski 
readObject()1424*b1cdbd2cSJim Jagielski Reference< XPersistObject >  OObjectInputStream::readObject() throw (::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
1425*b1cdbd2cSJim Jagielski {
1426*b1cdbd2cSJim Jagielski 	// check if chain contains a XMarkableStream
1427*b1cdbd2cSJim Jagielski 	connectToMarkable();
1428*b1cdbd2cSJim Jagielski 
1429*b1cdbd2cSJim Jagielski 	Reference< XPersistObject > xLoadedObj;
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski 	// create Mark to skip newer versions
1432*b1cdbd2cSJim Jagielski 	sal_uInt32 nMark = m_rMarkable->createMark();
1433*b1cdbd2cSJim Jagielski 	// length of the data
1434*b1cdbd2cSJim Jagielski 	sal_Int32 nLen = (sal_uInt16) ODataInputStream::readShort();
1435*b1cdbd2cSJim Jagielski 	if( nLen < 0xc )
1436*b1cdbd2cSJim Jagielski 	{
1437*b1cdbd2cSJim Jagielski 		throw WrongFormatException();
1438*b1cdbd2cSJim Jagielski 	}
1439*b1cdbd2cSJim Jagielski 
1440*b1cdbd2cSJim Jagielski 	// read the object identifier
1441*b1cdbd2cSJim Jagielski 	sal_uInt32 nId = readLong();
1442*b1cdbd2cSJim Jagielski 
1443*b1cdbd2cSJim Jagielski 	// the name of the persist model
1444*b1cdbd2cSJim Jagielski 	// MM ???
1445*b1cdbd2cSJim Jagielski 	OUString aName = readUTF();
1446*b1cdbd2cSJim Jagielski 
1447*b1cdbd2cSJim Jagielski 	// Read the length of the object
1448*b1cdbd2cSJim Jagielski 	sal_Int32 nObjLen = readLong();
1449*b1cdbd2cSJim Jagielski 	if( ( 0 == nId && 0 != nObjLen ) )
1450*b1cdbd2cSJim Jagielski 	{
1451*b1cdbd2cSJim Jagielski 		throw WrongFormatException();
1452*b1cdbd2cSJim Jagielski 	}
1453*b1cdbd2cSJim Jagielski 
1454*b1cdbd2cSJim Jagielski 	// skip data of new version
1455*b1cdbd2cSJim Jagielski 	skipBytes( nLen - m_rMarkable->offsetToMark( nMark ) );
1456*b1cdbd2cSJim Jagielski 
1457*b1cdbd2cSJim Jagielski 	sal_Bool bLoadSuccesfull = sal_True;
1458*b1cdbd2cSJim Jagielski 	if( nId )
1459*b1cdbd2cSJim Jagielski 	{
1460*b1cdbd2cSJim Jagielski 		if( aName.getLength() )
1461*b1cdbd2cSJim Jagielski 		{
1462*b1cdbd2cSJim Jagielski 			// load the object
1463*b1cdbd2cSJim Jagielski 			Reference< XInterface > x = m_rSMgr->createInstanceWithContext( aName, m_rCxt );
1464*b1cdbd2cSJim Jagielski 			xLoadedObj = Reference< XPersistObject >( x, UNO_QUERY );
1465*b1cdbd2cSJim Jagielski 			if( xLoadedObj.is() )
1466*b1cdbd2cSJim Jagielski 			{
1467*b1cdbd2cSJim Jagielski 				sal_uInt32 nSize = m_aPersistVector.size();
1468*b1cdbd2cSJim Jagielski 				if( nSize <= nId )
1469*b1cdbd2cSJim Jagielski 				{
1470*b1cdbd2cSJim Jagielski 					// grow to the right size
1471*b1cdbd2cSJim Jagielski 					Reference< XPersistObject > xEmpty;
1472*b1cdbd2cSJim Jagielski 					m_aPersistVector.insert( m_aPersistVector.end(), (long)(nId - nSize + 1), xEmpty );
1473*b1cdbd2cSJim Jagielski 				}
1474*b1cdbd2cSJim Jagielski 
1475*b1cdbd2cSJim Jagielski 				m_aPersistVector[nId] = xLoadedObj;
1476*b1cdbd2cSJim Jagielski 				xLoadedObj->read( Reference< XObjectInputStream >(
1477*b1cdbd2cSJim Jagielski 					SAL_STATIC_CAST( XObjectInputStream *, this ) ) );
1478*b1cdbd2cSJim Jagielski 			}
1479*b1cdbd2cSJim Jagielski 			else
1480*b1cdbd2cSJim Jagielski 			{
1481*b1cdbd2cSJim Jagielski 				// no service with this name could be instantiated
1482*b1cdbd2cSJim Jagielski 				bLoadSuccesfull = sal_False;
1483*b1cdbd2cSJim Jagielski 			}
1484*b1cdbd2cSJim Jagielski 		}
1485*b1cdbd2cSJim Jagielski 		else {
1486*b1cdbd2cSJim Jagielski 			if( m_aPersistVector.size() < nId )
1487*b1cdbd2cSJim Jagielski 			{
1488*b1cdbd2cSJim Jagielski 				// id unknown, load failure !
1489*b1cdbd2cSJim Jagielski 				bLoadSuccesfull = sal_False;
1490*b1cdbd2cSJim Jagielski 			}
1491*b1cdbd2cSJim Jagielski 			else
1492*b1cdbd2cSJim Jagielski 			{
1493*b1cdbd2cSJim Jagielski 				// Object has alread been read,
1494*b1cdbd2cSJim Jagielski 				xLoadedObj = m_aPersistVector[nId];
1495*b1cdbd2cSJim Jagielski 			}
1496*b1cdbd2cSJim Jagielski 		}
1497*b1cdbd2cSJim Jagielski 	}
1498*b1cdbd2cSJim Jagielski 
1499*b1cdbd2cSJim Jagielski 	// skip to the position behind the object
1500*b1cdbd2cSJim Jagielski 	skipBytes( nObjLen + nLen - m_rMarkable->offsetToMark( nMark ) );
1501*b1cdbd2cSJim Jagielski 	m_rMarkable->deleteMark( nMark );
1502*b1cdbd2cSJim Jagielski 
1503*b1cdbd2cSJim Jagielski 	if( ! bLoadSuccesfull )
1504*b1cdbd2cSJim Jagielski 	{
1505*b1cdbd2cSJim Jagielski 		throw WrongFormatException();
1506*b1cdbd2cSJim Jagielski 	}
1507*b1cdbd2cSJim Jagielski 	return xLoadedObj;
1508*b1cdbd2cSJim Jagielski }
1509*b1cdbd2cSJim Jagielski 
1510*b1cdbd2cSJim Jagielski 
connectToMarkable()1511*b1cdbd2cSJim Jagielski void OObjectInputStream::connectToMarkable()
1512*b1cdbd2cSJim Jagielski {
1513*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable ) {
1514*b1cdbd2cSJim Jagielski 		if( ! m_bValidStream )
1515*b1cdbd2cSJim Jagielski 		{
1516*b1cdbd2cSJim Jagielski 			throw NotConnectedException( );
1517*b1cdbd2cSJim Jagielski 		}
1518*b1cdbd2cSJim Jagielski 
1519*b1cdbd2cSJim Jagielski 		// find the markable stream !
1520*b1cdbd2cSJim Jagielski 		Reference< XInterface > rTry(m_input);
1521*b1cdbd2cSJim Jagielski 		while( sal_True ) {
1522*b1cdbd2cSJim Jagielski 			if( ! rTry.is() )
1523*b1cdbd2cSJim Jagielski 			{
1524*b1cdbd2cSJim Jagielski 				throw NotConnectedException( );
1525*b1cdbd2cSJim Jagielski 			}
1526*b1cdbd2cSJim Jagielski 			Reference<  XMarkableStream > markable( rTry , UNO_QUERY );
1527*b1cdbd2cSJim Jagielski 			if( markable.is() )
1528*b1cdbd2cSJim Jagielski 			{
1529*b1cdbd2cSJim Jagielski 				m_rMarkable = markable;
1530*b1cdbd2cSJim Jagielski 				break;
1531*b1cdbd2cSJim Jagielski 			}
1532*b1cdbd2cSJim Jagielski 			Reference < XActiveDataSink > sink( rTry , UNO_QUERY );
1533*b1cdbd2cSJim Jagielski 			rTry = sink;
1534*b1cdbd2cSJim Jagielski 		}
1535*b1cdbd2cSJim Jagielski 		m_bValidMarkable = sal_True;
1536*b1cdbd2cSJim Jagielski 	}
1537*b1cdbd2cSJim Jagielski }
1538*b1cdbd2cSJim Jagielski 
createMark(void)1539*b1cdbd2cSJim Jagielski sal_Int32 OObjectInputStream::createMark(void) 				throw (IOException, RuntimeException)
1540*b1cdbd2cSJim Jagielski {
1541*b1cdbd2cSJim Jagielski 	connectToMarkable();	// throws an exception, if a markable is not connected !
1542*b1cdbd2cSJim Jagielski 
1543*b1cdbd2cSJim Jagielski 	return m_rMarkable->createMark();
1544*b1cdbd2cSJim Jagielski }
1545*b1cdbd2cSJim Jagielski 
deleteMark(sal_Int32 Mark)1546*b1cdbd2cSJim Jagielski void OObjectInputStream::deleteMark(sal_Int32 Mark)			throw (IOException, IllegalArgumentException, RuntimeException)
1547*b1cdbd2cSJim Jagielski {
1548*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable )
1549*b1cdbd2cSJim Jagielski 	{
1550*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
1551*b1cdbd2cSJim Jagielski 	}
1552*b1cdbd2cSJim Jagielski 	m_rMarkable->deleteMark( Mark );
1553*b1cdbd2cSJim Jagielski }
1554*b1cdbd2cSJim Jagielski 
jumpToMark(sal_Int32 nMark)1555*b1cdbd2cSJim Jagielski void OObjectInputStream::jumpToMark(sal_Int32 nMark) 		throw (IOException, IllegalArgumentException, RuntimeException)
1556*b1cdbd2cSJim Jagielski {
1557*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable )
1558*b1cdbd2cSJim Jagielski 	{
1559*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
1560*b1cdbd2cSJim Jagielski 	}
1561*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToMark( nMark );
1562*b1cdbd2cSJim Jagielski }
jumpToFurthest(void)1563*b1cdbd2cSJim Jagielski void OObjectInputStream::jumpToFurthest(void) 			throw (IOException, RuntimeException)
1564*b1cdbd2cSJim Jagielski {
1565*b1cdbd2cSJim Jagielski 	connectToMarkable();
1566*b1cdbd2cSJim Jagielski 	m_rMarkable->jumpToFurthest();
1567*b1cdbd2cSJim Jagielski }
1568*b1cdbd2cSJim Jagielski 
offsetToMark(sal_Int32 nMark)1569*b1cdbd2cSJim Jagielski sal_Int32 OObjectInputStream::offsetToMark(sal_Int32 nMark)
1570*b1cdbd2cSJim Jagielski 	throw (IOException, IllegalArgumentException, RuntimeException)
1571*b1cdbd2cSJim Jagielski {
1572*b1cdbd2cSJim Jagielski 	if( ! m_bValidMarkable )
1573*b1cdbd2cSJim Jagielski 	{
1574*b1cdbd2cSJim Jagielski 		throw NotConnectedException();
1575*b1cdbd2cSJim Jagielski 	}
1576*b1cdbd2cSJim Jagielski 	return m_rMarkable->offsetToMark( nMark );
1577*b1cdbd2cSJim Jagielski }
1578*b1cdbd2cSJim Jagielski 
1579*b1cdbd2cSJim Jagielski 
getTypes(void)1580*b1cdbd2cSJim Jagielski Sequence< Type > SAL_CALL OObjectInputStream::getTypes(void) throw( RuntimeException )
1581*b1cdbd2cSJim Jagielski {
1582*b1cdbd2cSJim Jagielski 	static OTypeCollection *pCollection = 0;
1583*b1cdbd2cSJim Jagielski 	if( ! pCollection )
1584*b1cdbd2cSJim Jagielski 	{
1585*b1cdbd2cSJim Jagielski 		MutexGuard guard( Mutex::getGlobalMutex() );
1586*b1cdbd2cSJim Jagielski 		if( ! pCollection )
1587*b1cdbd2cSJim Jagielski 		{
1588*b1cdbd2cSJim Jagielski 			static OTypeCollection collection(
1589*b1cdbd2cSJim Jagielski 				getCppuType( (Reference< XMarkableStream > * ) 0 ),
1590*b1cdbd2cSJim Jagielski 				getCppuType( (Reference< XObjectInputStream > * ) 0 ),
1591*b1cdbd2cSJim Jagielski 				ODataInputStream::getTypes() );
1592*b1cdbd2cSJim Jagielski 			pCollection = &collection;
1593*b1cdbd2cSJim Jagielski 		}
1594*b1cdbd2cSJim Jagielski 	}
1595*b1cdbd2cSJim Jagielski 	return (*pCollection).getTypes();
1596*b1cdbd2cSJim Jagielski }
1597*b1cdbd2cSJim Jagielski 
getImplementationId()1598*b1cdbd2cSJim Jagielski Sequence< sal_Int8 > SAL_CALL OObjectInputStream::getImplementationId(  ) throw( RuntimeException)
1599*b1cdbd2cSJim Jagielski {
1600*b1cdbd2cSJim Jagielski 	static OImplementationId *pId = 0;
1601*b1cdbd2cSJim Jagielski 	if( ! pId )
1602*b1cdbd2cSJim Jagielski 	{
1603*b1cdbd2cSJim Jagielski 		MutexGuard guard( Mutex::getGlobalMutex() );
1604*b1cdbd2cSJim Jagielski 		if( ! pId )
1605*b1cdbd2cSJim Jagielski 		{
1606*b1cdbd2cSJim Jagielski 			static OImplementationId id( sal_False );
1607*b1cdbd2cSJim Jagielski 			pId = &id;
1608*b1cdbd2cSJim Jagielski 		}
1609*b1cdbd2cSJim Jagielski 	}
1610*b1cdbd2cSJim Jagielski 	return (*pId).getImplementationId();
1611*b1cdbd2cSJim Jagielski }
1612*b1cdbd2cSJim Jagielski 
1613*b1cdbd2cSJim Jagielski 
1614*b1cdbd2cSJim Jagielski // XServiceInfo
getImplementationName()1615*b1cdbd2cSJim Jagielski OUString OObjectInputStream::getImplementationName() throw ()
1616*b1cdbd2cSJim Jagielski {
1617*b1cdbd2cSJim Jagielski     return OObjectInputStream_getImplementationName();
1618*b1cdbd2cSJim Jagielski }
1619*b1cdbd2cSJim Jagielski 
1620*b1cdbd2cSJim Jagielski // XServiceInfo
supportsService(const OUString & ServiceName)1621*b1cdbd2cSJim Jagielski sal_Bool OObjectInputStream::supportsService(const OUString& ServiceName) throw ()
1622*b1cdbd2cSJim Jagielski {
1623*b1cdbd2cSJim Jagielski     Sequence< OUString > aSNL = getSupportedServiceNames();
1624*b1cdbd2cSJim Jagielski     const OUString * pArray = aSNL.getConstArray();
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ )
1627*b1cdbd2cSJim Jagielski         if( pArray[i] == ServiceName )
1628*b1cdbd2cSJim Jagielski             return sal_True;
1629*b1cdbd2cSJim Jagielski 
1630*b1cdbd2cSJim Jagielski     return sal_False;
1631*b1cdbd2cSJim Jagielski }
1632*b1cdbd2cSJim Jagielski 
1633*b1cdbd2cSJim Jagielski // XServiceInfo
getSupportedServiceNames(void)1634*b1cdbd2cSJim Jagielski Sequence< OUString > OObjectInputStream::getSupportedServiceNames(void) throw ()
1635*b1cdbd2cSJim Jagielski {
1636*b1cdbd2cSJim Jagielski     return OObjectInputStream_getSupportedServiceNames();
1637*b1cdbd2cSJim Jagielski }
1638*b1cdbd2cSJim Jagielski 
1639*b1cdbd2cSJim Jagielski 
1640*b1cdbd2cSJim Jagielski 
1641*b1cdbd2cSJim Jagielski 
OObjectInputStream_CreateInstance(const Reference<XComponentContext> & rCtx)1642*b1cdbd2cSJim Jagielski Reference< XInterface > SAL_CALL OObjectInputStream_CreateInstance( const Reference < XComponentContext > & rCtx ) throw(Exception)
1643*b1cdbd2cSJim Jagielski {
1644*b1cdbd2cSJim Jagielski 	OObjectInputStream *p = new OObjectInputStream( rCtx );
1645*b1cdbd2cSJim Jagielski 	return Reference< XInterface> ( SAL_STATIC_CAST( OWeakObject *, p ) );
1646*b1cdbd2cSJim Jagielski }
1647*b1cdbd2cSJim Jagielski 
OObjectInputStream_getImplementationName()1648*b1cdbd2cSJim Jagielski OUString OObjectInputStream_getImplementationName()
1649*b1cdbd2cSJim Jagielski {
1650*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.io.stm.ObjectInputStream" ) );
1651*b1cdbd2cSJim Jagielski }
1652*b1cdbd2cSJim Jagielski 
OObjectInputStream_getSupportedServiceNames(void)1653*b1cdbd2cSJim Jagielski Sequence<OUString> OObjectInputStream_getSupportedServiceNames(void)
1654*b1cdbd2cSJim Jagielski {
1655*b1cdbd2cSJim Jagielski 	Sequence<OUString> aRet(1);
1656*b1cdbd2cSJim Jagielski 	aRet.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.io.ObjectInputStream" ) );
1657*b1cdbd2cSJim Jagielski 	return aRet;
1658*b1cdbd2cSJim Jagielski }
1659*b1cdbd2cSJim Jagielski 
1660*b1cdbd2cSJim Jagielski }
1661