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