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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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 // ------------------------------------------------------------------- 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