1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_ucb.hxx" 26 #include "filinpstr.hxx" 27 #ifndef _FILERROR_HXX_ 28 #include "filerror.hxx" 29 #endif 30 #include "shell.hxx" 31 #include "prov.hxx" 32 33 34 using namespace fileaccess; 35 using namespace com::sun::star; 36 using namespace com::sun::star::ucb; 37 38 39 40 XInputStream_impl::XInputStream_impl( shell* pMyShell,const rtl::OUString& aUncPath, sal_Bool bLock ) 41 : m_pMyShell( pMyShell ), 42 m_xProvider( pMyShell->m_pProvider ), 43 m_bLock( bLock ), 44 m_aFile( aUncPath ), 45 m_nErrorCode( TASKHANDLER_NO_ERROR ), 46 m_nMinorErrorCode( TASKHANDLER_NO_ERROR ) 47 { 48 sal_uInt32 nFlags = OpenFlag_Read; 49 if ( !bLock ) 50 nFlags |= OpenFlag_NoLock; 51 52 osl::FileBase::RC err = m_aFile.open( nFlags ); 53 if( err != osl::FileBase::E_None ) 54 { 55 m_nIsOpen = false; 56 m_aFile.close(); 57 58 m_nErrorCode = TASKHANDLING_OPEN_FOR_INPUTSTREAM; 59 m_nMinorErrorCode = err; 60 } 61 else 62 m_nIsOpen = true; 63 } 64 65 66 XInputStream_impl::~XInputStream_impl() 67 { 68 try 69 { 70 closeInput(); 71 } 72 catch (io::IOException const &) 73 { 74 OSL_ENSURE(false, "unexpected situation"); 75 } 76 catch (uno::RuntimeException const &) 77 { 78 OSL_ENSURE(false, "unexpected situation"); 79 } 80 } 81 82 83 sal_Int32 SAL_CALL XInputStream_impl::CtorSuccess() 84 { 85 return m_nErrorCode; 86 }; 87 88 89 90 sal_Int32 SAL_CALL XInputStream_impl::getMinorError() 91 { 92 return m_nMinorErrorCode; 93 } 94 95 96 ////////////////////////////////////////////////////////////////////////////////////////// 97 // XTypeProvider 98 ////////////////////////////////////////////////////////////////////////////////////////// 99 100 101 XTYPEPROVIDER_IMPL_3( XInputStream_impl, 102 lang::XTypeProvider, 103 io::XSeekable, 104 io::XInputStream ) 105 106 107 108 uno::Any SAL_CALL 109 XInputStream_impl::queryInterface( 110 const uno::Type& rType ) 111 throw( uno::RuntimeException) 112 { 113 uno::Any aRet = cppu::queryInterface( rType, 114 SAL_STATIC_CAST( io::XInputStream*,this ), 115 SAL_STATIC_CAST( lang::XTypeProvider*,this ), 116 SAL_STATIC_CAST( io::XSeekable*,this ) ); 117 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); 118 } 119 120 121 void SAL_CALL 122 XInputStream_impl::acquire( 123 void ) 124 throw() 125 { 126 OWeakObject::acquire(); 127 } 128 129 130 void SAL_CALL 131 XInputStream_impl::release( 132 void ) 133 throw() 134 { 135 OWeakObject::release(); 136 } 137 138 139 140 sal_Int32 SAL_CALL 141 XInputStream_impl::readBytes( 142 uno::Sequence< sal_Int8 >& aData, 143 sal_Int32 nBytesToRead ) 144 throw( io::NotConnectedException, 145 io::BufferSizeExceededException, 146 io::IOException, 147 uno::RuntimeException) 148 { 149 if( ! m_nIsOpen ) throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 150 151 aData.realloc(nBytesToRead); 152 //TODO! translate memory exhaustion (if it were detectable...) into 153 // io::BufferSizeExceededException 154 155 sal_uInt64 nrc(0); 156 if(m_aFile.read( aData.getArray(),sal_uInt64(nBytesToRead),nrc ) 157 != osl::FileBase::E_None) 158 throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 159 160 // Shrink aData in case we read less than nBytesToRead (XInputStream 161 // documentation does not tell whether this is required, and I do not know 162 // if any code relies on this, so be conservative---SB): 163 if (sal::static_int_cast<sal_Int32>(nrc) != nBytesToRead) 164 aData.realloc(sal_Int32(nrc)); 165 return ( sal_Int32 ) nrc; 166 } 167 168 sal_Int32 SAL_CALL 169 XInputStream_impl::readSomeBytes( 170 uno::Sequence< sal_Int8 >& aData, 171 sal_Int32 nMaxBytesToRead ) 172 throw( io::NotConnectedException, 173 io::BufferSizeExceededException, 174 io::IOException, 175 uno::RuntimeException) 176 { 177 return readBytes( aData,nMaxBytesToRead ); 178 } 179 180 181 void SAL_CALL 182 XInputStream_impl::skipBytes( 183 sal_Int32 nBytesToSkip ) 184 throw( io::NotConnectedException, 185 io::BufferSizeExceededException, 186 io::IOException, 187 uno::RuntimeException) 188 { 189 m_aFile.setPos( osl_Pos_Current, sal_uInt64( nBytesToSkip ) ); 190 } 191 192 193 sal_Int32 SAL_CALL 194 XInputStream_impl::available( 195 void ) 196 throw( io::NotConnectedException, 197 io::IOException, 198 uno::RuntimeException) 199 { 200 return 0; 201 } 202 203 204 void SAL_CALL 205 XInputStream_impl::closeInput( 206 void ) 207 throw( io::NotConnectedException, 208 io::IOException, 209 uno::RuntimeException ) 210 { 211 if( m_nIsOpen ) 212 { 213 osl::FileBase::RC err = m_aFile.close(); 214 if( err != osl::FileBase::E_None ) 215 throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 216 m_nIsOpen = false; 217 } 218 } 219 220 221 void SAL_CALL 222 XInputStream_impl::seek( 223 sal_Int64 location ) 224 throw( lang::IllegalArgumentException, 225 io::IOException, 226 uno::RuntimeException ) 227 { 228 if( location < 0 ) 229 throw lang::IllegalArgumentException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >(), 0 ); 230 if( osl::FileBase::E_None != m_aFile.setPos( Pos_Absolut, sal_uInt64( location ) ) ) 231 throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 232 } 233 234 235 sal_Int64 SAL_CALL 236 XInputStream_impl::getPosition( 237 void ) 238 throw( io::IOException, 239 uno::RuntimeException ) 240 { 241 sal_uInt64 uPos; 242 if( osl::FileBase::E_None != m_aFile.getPos( uPos ) ) 243 throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 244 return sal_Int64( uPos ); 245 } 246 247 sal_Int64 SAL_CALL 248 XInputStream_impl::getLength( 249 void ) 250 throw( io::IOException, 251 uno::RuntimeException ) 252 { 253 sal_uInt64 uEndPos; 254 if ( m_aFile.getSize(uEndPos) != osl::FileBase::E_None ) 255 throw io::IOException( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ), uno::Reference< uno::XInterface >() ); 256 else 257 return sal_Int64( uEndPos ); 258 } 259