xref: /AOO42X/main/ucb/source/ucp/webdav/CurlInputStream.cxx (revision b1c5455db1639c48e26c568e4fa7ee78ca5d60ee)
1*9646dec5SDamjan Jovanovic /**************************************************************
2*9646dec5SDamjan Jovanovic  *
3*9646dec5SDamjan Jovanovic  * Licensed to the Apache Software Foundation (ASF) under one
4*9646dec5SDamjan Jovanovic  * or more contributor license agreements.  See the NOTICE file
5*9646dec5SDamjan Jovanovic  * distributed with this work for additional information
6*9646dec5SDamjan Jovanovic  * regarding copyright ownership.  The ASF licenses this file
7*9646dec5SDamjan Jovanovic  * to you under the Apache License, Version 2.0 (the
8*9646dec5SDamjan Jovanovic  * "License"); you may not use this file except in compliance
9*9646dec5SDamjan Jovanovic  * with the License.  You may obtain a copy of the License at
10*9646dec5SDamjan Jovanovic  *
11*9646dec5SDamjan Jovanovic  *   http://www.apache.org/licenses/LICENSE-2.0
12*9646dec5SDamjan Jovanovic  *
13*9646dec5SDamjan Jovanovic  * Unless required by applicable law or agreed to in writing,
14*9646dec5SDamjan Jovanovic  * software distributed under the License is distributed on an
15*9646dec5SDamjan Jovanovic  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9646dec5SDamjan Jovanovic  * KIND, either express or implied.  See the License for the
17*9646dec5SDamjan Jovanovic  * specific language governing permissions and limitations
18*9646dec5SDamjan Jovanovic  * under the License.
19*9646dec5SDamjan Jovanovic  *
20*9646dec5SDamjan Jovanovic  *************************************************************/
21*9646dec5SDamjan Jovanovic 
22*9646dec5SDamjan Jovanovic 
23*9646dec5SDamjan Jovanovic 
24*9646dec5SDamjan Jovanovic // MARKER(update_precomp.py): autogen include statement, do not remove
25*9646dec5SDamjan Jovanovic #include "precompiled_webdav.hxx"
26*9646dec5SDamjan Jovanovic #include "CurlInputStream.hxx"
27*9646dec5SDamjan Jovanovic #include <rtl/memory.h>
28*9646dec5SDamjan Jovanovic 
29*9646dec5SDamjan Jovanovic using namespace cppu;
30*9646dec5SDamjan Jovanovic using namespace rtl;
31*9646dec5SDamjan Jovanovic using namespace com::sun::star::io;
32*9646dec5SDamjan Jovanovic using namespace com::sun::star::uno;
33*9646dec5SDamjan Jovanovic using namespace http_dav_ucp;
34*9646dec5SDamjan Jovanovic 
35*9646dec5SDamjan Jovanovic 
36*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
37*9646dec5SDamjan Jovanovic // Constructor
38*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
CurlInputStream(void)39*9646dec5SDamjan Jovanovic CurlInputStream::CurlInputStream( void )
40*9646dec5SDamjan Jovanovic : mLen( 0 ),
41*9646dec5SDamjan Jovanovic   mPos( 0 ),
42*9646dec5SDamjan Jovanovic   mCapacity( 0 )
43*9646dec5SDamjan Jovanovic {
44*9646dec5SDamjan Jovanovic }
45*9646dec5SDamjan Jovanovic 
46*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
47*9646dec5SDamjan Jovanovic // Destructor
48*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
~CurlInputStream(void)49*9646dec5SDamjan Jovanovic CurlInputStream::~CurlInputStream( void )
50*9646dec5SDamjan Jovanovic {
51*9646dec5SDamjan Jovanovic }
52*9646dec5SDamjan Jovanovic 
53*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
54*9646dec5SDamjan Jovanovic // AddToStream
55*9646dec5SDamjan Jovanovic // Allows the caller to add some data to the "end" of the stream
56*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
AddToStream(const char * inBuf,sal_Int32 inLen)57*9646dec5SDamjan Jovanovic void CurlInputStream::AddToStream( const char * inBuf, sal_Int32 inLen )
58*9646dec5SDamjan Jovanovic {
59*9646dec5SDamjan Jovanovic     if ( mLen + inLen > mCapacity )
60*9646dec5SDamjan Jovanovic     {
61*9646dec5SDamjan Jovanovic         if ( 2*mCapacity >= ( mLen + inLen ) )
62*9646dec5SDamjan Jovanovic             mCapacity *= 2;
63*9646dec5SDamjan Jovanovic         else
64*9646dec5SDamjan Jovanovic             mCapacity = mLen + inLen;
65*9646dec5SDamjan Jovanovic         mInputBuffer.realloc( mCapacity );
66*9646dec5SDamjan Jovanovic     }
67*9646dec5SDamjan Jovanovic     rtl_copyMemory( mInputBuffer.getArray() + mLen, inBuf, inLen );
68*9646dec5SDamjan Jovanovic     mLen += inLen;
69*9646dec5SDamjan Jovanovic }
70*9646dec5SDamjan Jovanovic 
71*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
72*9646dec5SDamjan Jovanovic // queryInterface
73*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
queryInterface(const Type & type)74*9646dec5SDamjan Jovanovic Any CurlInputStream::queryInterface( const Type &type )
75*9646dec5SDamjan Jovanovic                         throw( RuntimeException )
76*9646dec5SDamjan Jovanovic {
77*9646dec5SDamjan Jovanovic     Any aRet = ::cppu::queryInterface( type,
78*9646dec5SDamjan Jovanovic                                        static_cast< XInputStream * >( this ),
79*9646dec5SDamjan Jovanovic                                        static_cast< XSeekable * >( this ) );
80*9646dec5SDamjan Jovanovic     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( type );
81*9646dec5SDamjan Jovanovic }
82*9646dec5SDamjan Jovanovic 
83*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
84*9646dec5SDamjan Jovanovic // readBytes
85*9646dec5SDamjan Jovanovic // "Reads" the specified number of bytes from the stream
86*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
readBytes(::com::sun::star::uno::Sequence<sal_Int8> & aData,sal_Int32 nBytesToRead)87*9646dec5SDamjan Jovanovic sal_Int32 SAL_CALL CurlInputStream::readBytes(
88*9646dec5SDamjan Jovanovic   ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead )
89*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::NotConnectedException,
90*9646dec5SDamjan Jovanovic                ::com::sun::star::io::BufferSizeExceededException,
91*9646dec5SDamjan Jovanovic                ::com::sun::star::io::IOException,
92*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
93*9646dec5SDamjan Jovanovic {
94*9646dec5SDamjan Jovanovic     // Work out how much we're actually going to write
95*9646dec5SDamjan Jovanovic     sal_Int32 theBytes2Read = nBytesToRead;
96*9646dec5SDamjan Jovanovic     sal_Int32 theBytesLeft  = sal::static_int_cast<sal_Int32>(mLen - mPos);
97*9646dec5SDamjan Jovanovic     if ( theBytes2Read > theBytesLeft )
98*9646dec5SDamjan Jovanovic         theBytes2Read = theBytesLeft;
99*9646dec5SDamjan Jovanovic 
100*9646dec5SDamjan Jovanovic     // Realloc buffer.
101*9646dec5SDamjan Jovanovic     aData.realloc( theBytes2Read );
102*9646dec5SDamjan Jovanovic 
103*9646dec5SDamjan Jovanovic     // Write the data
104*9646dec5SDamjan Jovanovic     rtl_copyMemory(
105*9646dec5SDamjan Jovanovic         aData.getArray(), mInputBuffer.getConstArray() + mPos, theBytes2Read );
106*9646dec5SDamjan Jovanovic 
107*9646dec5SDamjan Jovanovic     // Update our stream position for next time
108*9646dec5SDamjan Jovanovic     mPos += theBytes2Read;
109*9646dec5SDamjan Jovanovic 
110*9646dec5SDamjan Jovanovic     return theBytes2Read;
111*9646dec5SDamjan Jovanovic }
112*9646dec5SDamjan Jovanovic 
113*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
114*9646dec5SDamjan Jovanovic // readSomeBytes
115*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
readSomeBytes(::com::sun::star::uno::Sequence<sal_Int8> & aData,sal_Int32 nMaxBytesToRead)116*9646dec5SDamjan Jovanovic sal_Int32 SAL_CALL CurlInputStream::readSomeBytes(
117*9646dec5SDamjan Jovanovic  ::com::sun::star::uno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead )
118*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::NotConnectedException,
119*9646dec5SDamjan Jovanovic                ::com::sun::star::io::BufferSizeExceededException,
120*9646dec5SDamjan Jovanovic                ::com::sun::star::io::IOException,
121*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
122*9646dec5SDamjan Jovanovic {
123*9646dec5SDamjan Jovanovic     // Warning: What should this be doing ?
124*9646dec5SDamjan Jovanovic     return readBytes( aData, nMaxBytesToRead );
125*9646dec5SDamjan Jovanovic }
126*9646dec5SDamjan Jovanovic 
127*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
128*9646dec5SDamjan Jovanovic // skipBytes
129*9646dec5SDamjan Jovanovic // Moves the current stream position forward
130*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
skipBytes(sal_Int32 nBytesToSkip)131*9646dec5SDamjan Jovanovic void SAL_CALL CurlInputStream::skipBytes( sal_Int32 nBytesToSkip )
132*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::NotConnectedException,
133*9646dec5SDamjan Jovanovic                ::com::sun::star::io::BufferSizeExceededException,
134*9646dec5SDamjan Jovanovic                ::com::sun::star::io::IOException,
135*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
136*9646dec5SDamjan Jovanovic {
137*9646dec5SDamjan Jovanovic     mPos += nBytesToSkip;
138*9646dec5SDamjan Jovanovic     if ( mPos >= mLen )
139*9646dec5SDamjan Jovanovic         mPos = mLen;
140*9646dec5SDamjan Jovanovic }
141*9646dec5SDamjan Jovanovic 
142*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
143*9646dec5SDamjan Jovanovic // available
144*9646dec5SDamjan Jovanovic // Returns the number of unread bytes currently remaining on the stream
145*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
available()146*9646dec5SDamjan Jovanovic sal_Int32 SAL_CALL CurlInputStream::available(  )
147*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::NotConnectedException,
148*9646dec5SDamjan Jovanovic                ::com::sun::star::io::IOException,
149*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
150*9646dec5SDamjan Jovanovic {
151*9646dec5SDamjan Jovanovic     return sal::static_int_cast<sal_Int32>(mLen - mPos);
152*9646dec5SDamjan Jovanovic }
153*9646dec5SDamjan Jovanovic 
154*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
155*9646dec5SDamjan Jovanovic // closeInput
156*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
closeInput(void)157*9646dec5SDamjan Jovanovic void SAL_CALL CurlInputStream::closeInput( void )
158*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::NotConnectedException,
159*9646dec5SDamjan Jovanovic                ::com::sun::star::io::IOException,
160*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
161*9646dec5SDamjan Jovanovic {
162*9646dec5SDamjan Jovanovic }
163*9646dec5SDamjan Jovanovic 
164*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
165*9646dec5SDamjan Jovanovic // seek
166*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
seek(sal_Int64 location)167*9646dec5SDamjan Jovanovic void SAL_CALL CurlInputStream::seek( sal_Int64 location )
168*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::lang::IllegalArgumentException,
169*9646dec5SDamjan Jovanovic                ::com::sun::star::io::IOException,
170*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
171*9646dec5SDamjan Jovanovic {
172*9646dec5SDamjan Jovanovic     if ( location < 0 )
173*9646dec5SDamjan Jovanovic         throw ::com::sun::star::lang::IllegalArgumentException();
174*9646dec5SDamjan Jovanovic 
175*9646dec5SDamjan Jovanovic     if ( location <= mLen )
176*9646dec5SDamjan Jovanovic         mPos = location;
177*9646dec5SDamjan Jovanovic     else
178*9646dec5SDamjan Jovanovic         throw ::com::sun::star::lang::IllegalArgumentException();
179*9646dec5SDamjan Jovanovic }
180*9646dec5SDamjan Jovanovic 
181*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
182*9646dec5SDamjan Jovanovic // getPosition
183*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
getPosition()184*9646dec5SDamjan Jovanovic sal_Int64 SAL_CALL CurlInputStream::getPosition()
185*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::IOException,
186*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
187*9646dec5SDamjan Jovanovic {
188*9646dec5SDamjan Jovanovic     return mPos;
189*9646dec5SDamjan Jovanovic }
190*9646dec5SDamjan Jovanovic 
191*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
192*9646dec5SDamjan Jovanovic // getLength
193*9646dec5SDamjan Jovanovic // -------------------------------------------------------------------
getLength()194*9646dec5SDamjan Jovanovic sal_Int64 SAL_CALL CurlInputStream::getLength()
195*9646dec5SDamjan Jovanovic         throw( ::com::sun::star::io::IOException,
196*9646dec5SDamjan Jovanovic                ::com::sun::star::uno::RuntimeException )
197*9646dec5SDamjan Jovanovic {
198*9646dec5SDamjan Jovanovic     return mLen;
199*9646dec5SDamjan Jovanovic }
200