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