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