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 25 // MARKER(update_precomp.py): autogen include statement, do not remove 26 #include "precompiled_xmlhelp.hxx" 27 #include "inputstream.hxx" 28 29 30 using namespace chelp; 31 using namespace com::sun::star; 32 using namespace com::sun::star::ucb; 33 34 35 36 XInputStream_impl::XInputStream_impl( const rtl::OUString& aUncPath ) 37 : m_bIsOpen( false ), 38 m_aFile( aUncPath ) 39 { 40 m_bIsOpen = ( osl::FileBase::E_None == m_aFile.open( OpenFlag_Read ) ); 41 } 42 43 44 XInputStream_impl::~XInputStream_impl() 45 { 46 closeInput(); 47 } 48 49 50 bool SAL_CALL XInputStream_impl::CtorSuccess() 51 { 52 return m_bIsOpen; 53 }; 54 55 56 uno::Any SAL_CALL 57 XInputStream_impl::queryInterface( 58 const uno::Type& rType ) 59 throw( uno::RuntimeException) 60 { 61 uno::Any aRet = cppu::queryInterface( rType, 62 SAL_STATIC_CAST( io::XInputStream*,this ), 63 SAL_STATIC_CAST( io::XSeekable*,this ) ); 64 return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ); 65 } 66 67 68 void SAL_CALL 69 XInputStream_impl::acquire( 70 void ) 71 throw() 72 { 73 OWeakObject::acquire(); 74 } 75 76 77 void SAL_CALL 78 XInputStream_impl::release( 79 void ) 80 throw() 81 { 82 OWeakObject::release(); 83 } 84 85 86 87 sal_Int32 SAL_CALL 88 XInputStream_impl::readBytes( 89 uno::Sequence< sal_Int8 >& aData, 90 sal_Int32 nBytesToRead ) 91 throw( io::NotConnectedException, 92 io::BufferSizeExceededException, 93 io::IOException, 94 uno::RuntimeException) 95 { 96 if( ! m_bIsOpen ) 97 throw io::IOException(); 98 99 aData.realloc(nBytesToRead); 100 //TODO! translate memory exhaustion (if it were detectable...) into 101 // io::BufferSizeExceededException 102 103 sal_uInt64 nrc; 104 m_aFile.read( aData.getArray(),sal_uInt64(nBytesToRead),nrc ); 105 106 // Shrink aData in case we read less than nBytesToRead (XInputStream 107 // documentation does not tell whether this is required, and I do not know 108 // if any code relies on this, so be conservative---SB): 109 if (nrc != sal::static_int_cast<sal_uInt64>( nBytesToRead) ) 110 aData.realloc(sal_Int32(nrc)); 111 return ( sal_Int32 ) nrc; 112 } 113 114 sal_Int32 SAL_CALL 115 XInputStream_impl::readSomeBytes( 116 uno::Sequence< sal_Int8 >& aData, 117 sal_Int32 nMaxBytesToRead ) 118 throw( io::NotConnectedException, 119 io::BufferSizeExceededException, 120 io::IOException, 121 uno::RuntimeException) 122 { 123 return readBytes( aData,nMaxBytesToRead ); 124 } 125 126 127 void SAL_CALL 128 XInputStream_impl::skipBytes( 129 sal_Int32 nBytesToSkip ) 130 throw( io::NotConnectedException, 131 io::BufferSizeExceededException, 132 io::IOException, 133 uno::RuntimeException) 134 { 135 m_aFile.setPos( osl_Pos_Current, sal_uInt64( nBytesToSkip ) ); 136 } 137 138 139 sal_Int32 SAL_CALL 140 XInputStream_impl::available( 141 void ) 142 throw( io::NotConnectedException, 143 io::IOException, 144 uno::RuntimeException) 145 { 146 return 0; 147 } 148 149 150 void SAL_CALL 151 XInputStream_impl::closeInput( 152 void ) 153 throw( io::NotConnectedException, 154 io::IOException, 155 uno::RuntimeException ) 156 { 157 if( m_bIsOpen ) 158 { 159 osl::FileBase::RC err = m_aFile.close(); 160 if( err != osl::FileBase::E_None ) 161 throw io::IOException(); 162 m_bIsOpen = false; 163 } 164 } 165 166 167 void SAL_CALL 168 XInputStream_impl::seek( 169 sal_Int64 location ) 170 throw( lang::IllegalArgumentException, 171 io::IOException, 172 uno::RuntimeException ) 173 { 174 if( location < 0 ) 175 throw lang::IllegalArgumentException(); 176 if( osl::FileBase::E_None != m_aFile.setPos( Pos_Absolut, sal_uInt64( location ) ) ) 177 throw io::IOException(); 178 } 179 180 181 sal_Int64 SAL_CALL 182 XInputStream_impl::getPosition( 183 void ) 184 throw( io::IOException, 185 uno::RuntimeException ) 186 { 187 sal_uInt64 uPos; 188 if( osl::FileBase::E_None != m_aFile.getPos( uPos ) ) 189 throw io::IOException(); 190 return sal_Int64( uPos ); 191 } 192 193 sal_Int64 SAL_CALL 194 XInputStream_impl::getLength( 195 void ) 196 throw( io::IOException, 197 uno::RuntimeException ) 198 { 199 osl::FileBase::RC err; 200 sal_uInt64 uCurrentPos, uEndPos; 201 202 err = m_aFile.getPos( uCurrentPos ); 203 if( err != osl::FileBase::E_None ) 204 throw io::IOException(); 205 206 err = m_aFile.setPos( Pos_End, 0 ); 207 if( err != osl::FileBase::E_None ) 208 throw io::IOException(); 209 210 err = m_aFile.getPos( uEndPos ); 211 if( err != osl::FileBase::E_None ) 212 throw io::IOException(); 213 214 err = m_aFile.setPos( Pos_Absolut, uCurrentPos ); 215 if( err != osl::FileBase::E_None ) 216 throw io::IOException(); 217 else 218 return sal_Int64( uEndPos ); 219 } 220