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_package.hxx"
26*b1cdbd2cSJim Jagielski #include <ByteGrabber.hxx>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XSeekable.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/io/XInputStream.hpp>
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
31*b1cdbd2cSJim Jagielski 
32*b1cdbd2cSJim Jagielski /** ByteGrabber implements the >> operators on an XOutputStream. This is
33*b1cdbd2cSJim Jagielski  *  potentially quite slow and may need to be optimised
34*b1cdbd2cSJim Jagielski  */
35*b1cdbd2cSJim Jagielski 
ByteGrabber(uno::Reference<io::XInputStream> xIstream)36*b1cdbd2cSJim Jagielski ByteGrabber::ByteGrabber(uno::Reference  < io::XInputStream > xIstream)
37*b1cdbd2cSJim Jagielski : xStream(xIstream)
38*b1cdbd2cSJim Jagielski , xSeek (xIstream, uno::UNO_QUERY )
39*b1cdbd2cSJim Jagielski , aSequence ( 4 )
40*b1cdbd2cSJim Jagielski {
41*b1cdbd2cSJim Jagielski 	pSequence = aSequence.getArray();
42*b1cdbd2cSJim Jagielski }
43*b1cdbd2cSJim Jagielski 
~ByteGrabber()44*b1cdbd2cSJim Jagielski ByteGrabber::~ByteGrabber()
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski }
47*b1cdbd2cSJim Jagielski 
setInputStream(uno::Reference<io::XInputStream> xNewStream)48*b1cdbd2cSJim Jagielski void ByteGrabber::setInputStream (uno::Reference < io::XInputStream > xNewStream)
49*b1cdbd2cSJim Jagielski {
50*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
51*b1cdbd2cSJim Jagielski 	xStream = xNewStream;
52*b1cdbd2cSJim Jagielski 	xSeek = uno::Reference < io::XSeekable > (xNewStream, uno::UNO_QUERY);
53*b1cdbd2cSJim Jagielski }
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski // XInputStream chained
readBytes(uno::Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)56*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ByteGrabber::readBytes( uno::Sequence< sal_Int8 >& aData,
57*b1cdbd2cSJim Jagielski 										sal_Int32 nBytesToRead )
58*b1cdbd2cSJim Jagielski 	throw(io::NotConnectedException, io::BufferSizeExceededException, io::IOException, uno::RuntimeException)
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
61*b1cdbd2cSJim Jagielski 	return xStream->readBytes(aData, nBytesToRead );
62*b1cdbd2cSJim Jagielski }
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski // XSeekable chained...
seek(sal_Int64 location)65*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL ByteGrabber::seek( sal_Int64 location )
66*b1cdbd2cSJim Jagielski 	throw(lang::IllegalArgumentException, io::IOException, uno::RuntimeException)
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
69*b1cdbd2cSJim Jagielski 	if (xSeek.is() )
70*b1cdbd2cSJim Jagielski 	{
71*b1cdbd2cSJim Jagielski 		sal_Int64 nLen = xSeek->getLength();
72*b1cdbd2cSJim Jagielski 		if ( location < 0 || location > nLen )
73*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 1 );
74*b1cdbd2cSJim Jagielski 		if (location > nLen )
75*b1cdbd2cSJim Jagielski 			location = nLen;
76*b1cdbd2cSJim Jagielski 		xSeek->seek( location );
77*b1cdbd2cSJim Jagielski 		return location;
78*b1cdbd2cSJim Jagielski 	}
79*b1cdbd2cSJim Jagielski 	else
80*b1cdbd2cSJim Jagielski 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
81*b1cdbd2cSJim Jagielski }
82*b1cdbd2cSJim Jagielski 
getPosition()83*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL ByteGrabber::getPosition(  )
84*b1cdbd2cSJim Jagielski 		throw(io::IOException, uno::RuntimeException)
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
87*b1cdbd2cSJim Jagielski 	if (xSeek.is() )
88*b1cdbd2cSJim Jagielski 		return xSeek->getPosition();
89*b1cdbd2cSJim Jagielski 	else
90*b1cdbd2cSJim Jagielski 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski 
getLength()93*b1cdbd2cSJim Jagielski sal_Int64 SAL_CALL ByteGrabber::getLength(  )
94*b1cdbd2cSJim Jagielski 		throw(io::IOException, uno::RuntimeException)
95*b1cdbd2cSJim Jagielski {
96*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
97*b1cdbd2cSJim Jagielski 	if (xSeek.is() )
98*b1cdbd2cSJim Jagielski 		return xSeek->getLength();
99*b1cdbd2cSJim Jagielski 	else
100*b1cdbd2cSJim Jagielski 		throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() );
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski 
operator >>(sal_Int8 & rInt8)103*b1cdbd2cSJim Jagielski ByteGrabber& ByteGrabber::operator >> (sal_Int8& rInt8)
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
106*b1cdbd2cSJim Jagielski 	if (xStream->readBytes(aSequence,1) != 1)
107*b1cdbd2cSJim Jagielski 		rInt8 = 0;
108*b1cdbd2cSJim Jagielski 	else
109*b1cdbd2cSJim Jagielski 		rInt8 = aSequence[0] & 0xFF;
110*b1cdbd2cSJim Jagielski 	return *this;
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
operator >>(sal_Int16 & rInt16)113*b1cdbd2cSJim Jagielski ByteGrabber& ByteGrabber::operator >> (sal_Int16& rInt16)
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
116*b1cdbd2cSJim Jagielski 	if (xStream->readBytes ( aSequence, 2) != 2)
117*b1cdbd2cSJim Jagielski 		rInt16 = 0;
118*b1cdbd2cSJim Jagielski 	else
119*b1cdbd2cSJim Jagielski 	{
120*b1cdbd2cSJim Jagielski 		pSequence = aSequence.getConstArray();
121*b1cdbd2cSJim Jagielski 		rInt16 = static_cast <sal_Int16>
122*b1cdbd2cSJim Jagielski 			   ( (pSequence[0] & 0xFF)
123*b1cdbd2cSJim Jagielski 		      | (pSequence[1] & 0xFF) << 8);
124*b1cdbd2cSJim Jagielski 	}
125*b1cdbd2cSJim Jagielski 	return *this;
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
operator >>(sal_Int32 & rInt32)128*b1cdbd2cSJim Jagielski ByteGrabber& ByteGrabber::operator >> (sal_Int32& rInt32)
129*b1cdbd2cSJim Jagielski {
130*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski 	if (xStream->readBytes(aSequence, 4) != 4)
133*b1cdbd2cSJim Jagielski 		rInt32 = 0;
134*b1cdbd2cSJim Jagielski 	else
135*b1cdbd2cSJim Jagielski 	{
136*b1cdbd2cSJim Jagielski 		pSequence = aSequence.getConstArray();
137*b1cdbd2cSJim Jagielski 		rInt32 = static_cast < sal_Int32 >
138*b1cdbd2cSJim Jagielski 			    ( (pSequence[0] & 0xFF)
139*b1cdbd2cSJim Jagielski 		      | ( pSequence[1] & 0xFF ) << 8
140*b1cdbd2cSJim Jagielski 		      | ( pSequence[2] & 0xFF ) << 16
141*b1cdbd2cSJim Jagielski 		      | ( pSequence[3] & 0xFF ) << 24 );
142*b1cdbd2cSJim Jagielski 	}
143*b1cdbd2cSJim Jagielski 	return *this;
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
operator >>(sal_uInt8 & rInt8)146*b1cdbd2cSJim Jagielski ByteGrabber& ByteGrabber::operator >> (sal_uInt8& rInt8)
147*b1cdbd2cSJim Jagielski {
148*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	if (xStream->readBytes(aSequence,1) != 1)
151*b1cdbd2cSJim Jagielski 		rInt8 = 0;
152*b1cdbd2cSJim Jagielski 	else
153*b1cdbd2cSJim Jagielski 		rInt8 = static_cast < sal_uInt8 > (aSequence[0] & 0xFF );
154*b1cdbd2cSJim Jagielski 	return *this;
155*b1cdbd2cSJim Jagielski }
operator >>(sal_uInt16 & rInt16)156*b1cdbd2cSJim Jagielski ByteGrabber& ByteGrabber::operator >> (sal_uInt16& rInt16)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski 	if (xStream->readBytes(aSequence, 2) != 2)
161*b1cdbd2cSJim Jagielski 		rInt16 = 0;
162*b1cdbd2cSJim Jagielski 	else
163*b1cdbd2cSJim Jagielski 	{
164*b1cdbd2cSJim Jagielski 		pSequence = aSequence.getConstArray();
165*b1cdbd2cSJim Jagielski 		rInt16 = static_cast <sal_uInt16>
166*b1cdbd2cSJim Jagielski 			   ( (pSequence[0] & 0xFF)
167*b1cdbd2cSJim Jagielski 		      | (pSequence[1] & 0xFF) << 8);
168*b1cdbd2cSJim Jagielski 	}
169*b1cdbd2cSJim Jagielski 	return *this;
170*b1cdbd2cSJim Jagielski }
operator >>(sal_uInt32 & ruInt32)171*b1cdbd2cSJim Jagielski ByteGrabber& ByteGrabber::operator >> (sal_uInt32& ruInt32)
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski     ::osl::MutexGuard aGuard( m_aMutex );
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski 	if (xStream->readBytes(aSequence, 4) != 4)
176*b1cdbd2cSJim Jagielski 		ruInt32 = 0;
177*b1cdbd2cSJim Jagielski 	else
178*b1cdbd2cSJim Jagielski 	{
179*b1cdbd2cSJim Jagielski 		pSequence = aSequence.getConstArray();
180*b1cdbd2cSJim Jagielski 		ruInt32 = static_cast < sal_uInt32 >
181*b1cdbd2cSJim Jagielski 			    ( (pSequence[0] & 0xFF)
182*b1cdbd2cSJim Jagielski 		      | ( pSequence[1] & 0xFF ) << 8
183*b1cdbd2cSJim Jagielski 		      | ( pSequence[2] & 0xFF ) << 16
184*b1cdbd2cSJim Jagielski 		      | ( pSequence[3] & 0xFF ) << 24 );
185*b1cdbd2cSJim Jagielski 	}
186*b1cdbd2cSJim Jagielski 	return *this;
187*b1cdbd2cSJim Jagielski }
188