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_unotools.hxx" 26 #include <unotools/streamwrap.hxx> 27 #include <tools/stream.hxx> 28 #include <tools/debug.hxx> 29 30 namespace utl 31 { 32 33 using namespace ::com::sun::star::uno; 34 using namespace ::com::sun::star::io; 35 using namespace ::com::sun::star::lang; 36 37 //================================================================== 38 //= OInputStreamWrapper 39 //================================================================== 40 DBG_NAME(OInputStreamWrapper) 41 //------------------------------------------------------------------ 42 OInputStreamWrapper::OInputStreamWrapper( SvStream& _rStream ) 43 :m_pSvStream(&_rStream) 44 ,m_bSvStreamOwner(sal_False) 45 { 46 DBG_CTOR(OInputStreamWrapper,NULL); 47 48 } 49 50 //------------------------------------------------------------------ 51 OInputStreamWrapper::OInputStreamWrapper( SvStream* pStream, sal_Bool bOwner ) 52 :m_pSvStream( pStream ) 53 ,m_bSvStreamOwner( bOwner ) 54 { 55 DBG_CTOR(OInputStreamWrapper,NULL); 56 57 } 58 59 //------------------------------------------------------------------ 60 OInputStreamWrapper::~OInputStreamWrapper() 61 { 62 if( m_bSvStreamOwner ) 63 delete m_pSvStream; 64 65 DBG_DTOR(OInputStreamWrapper,NULL); 66 } 67 68 //------------------------------------------------------------------------------ 69 sal_Int32 SAL_CALL OInputStreamWrapper::readBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead) 70 throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException ) 71 { 72 checkConnected(); 73 74 if (nBytesToRead < 0) 75 throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this)); 76 77 ::osl::MutexGuard aGuard( m_aMutex ); 78 79 aData.realloc(nBytesToRead); 80 81 sal_uInt32 nRead = m_pSvStream->Read((void*)aData.getArray(), nBytesToRead); 82 checkError(); 83 84 // Wenn gelesene Zeichen < MaxLength, staruno::Sequence anpassen 85 if (nRead < (sal_uInt32)nBytesToRead) 86 aData.realloc( nRead ); 87 88 return nRead; 89 } 90 91 //------------------------------------------------------------------------------ 92 sal_Int32 SAL_CALL OInputStreamWrapper::readSomeBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead) throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException ) 93 { 94 checkError(); 95 96 if (nMaxBytesToRead < 0) 97 throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this)); 98 99 if (m_pSvStream->IsEof()) 100 { 101 aData.realloc(0); 102 return 0; 103 } 104 else 105 return readBytes(aData, nMaxBytesToRead); 106 } 107 108 //------------------------------------------------------------------------------ 109 void SAL_CALL OInputStreamWrapper::skipBytes(sal_Int32 nBytesToSkip) throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException ) 110 { 111 ::osl::MutexGuard aGuard( m_aMutex ); 112 checkError(); 113 114 #ifdef DBG_UTIL 115 sal_uInt32 nCurrentPos = m_pSvStream->Tell(); 116 #endif 117 118 m_pSvStream->SeekRel(nBytesToSkip); 119 checkError(); 120 121 #ifdef DBG_UTIL 122 nCurrentPos = m_pSvStream->Tell(); 123 #endif 124 } 125 126 //------------------------------------------------------------------------------ 127 sal_Int32 SAL_CALL OInputStreamWrapper::available() throw( stario::NotConnectedException, staruno::RuntimeException ) 128 { 129 ::osl::MutexGuard aGuard( m_aMutex ); 130 checkConnected(); 131 132 sal_uInt32 nPos = m_pSvStream->Tell(); 133 checkError(); 134 135 m_pSvStream->Seek(STREAM_SEEK_TO_END); 136 checkError(); 137 138 sal_Int32 nAvailable = (sal_Int32)m_pSvStream->Tell() - nPos; 139 m_pSvStream->Seek(nPos); 140 checkError(); 141 142 return nAvailable; 143 } 144 145 //------------------------------------------------------------------------------ 146 void SAL_CALL OInputStreamWrapper::closeInput() throw( stario::NotConnectedException, staruno::RuntimeException ) 147 { 148 ::osl::MutexGuard aGuard( m_aMutex ); 149 checkConnected(); 150 151 if (m_bSvStreamOwner) 152 delete m_pSvStream; 153 154 m_pSvStream = NULL; 155 } 156 157 //------------------------------------------------------------------------------ 158 void OInputStreamWrapper::checkConnected() const 159 { 160 if (!m_pSvStream) 161 throw stario::NotConnectedException(::rtl::OUString(), const_cast<staruno::XWeak*>(static_cast<const staruno::XWeak*>(this))); 162 } 163 164 //------------------------------------------------------------------------------ 165 void OInputStreamWrapper::checkError() const 166 { 167 checkConnected(); 168 169 if (m_pSvStream->SvStream::GetError() != ERRCODE_NONE) 170 // TODO: really evaluate the error 171 throw stario::NotConnectedException(::rtl::OUString(), const_cast<staruno::XWeak*>(static_cast<const staruno::XWeak*>(this))); 172 } 173 174 //================================================================== 175 //= OSeekableInputStreamWrapper 176 //================================================================== 177 //------------------------------------------------------------------------------ 178 OSeekableInputStreamWrapper::OSeekableInputStreamWrapper(SvStream& _rStream) 179 { 180 SetStream( &_rStream, sal_False ); 181 } 182 183 //------------------------------------------------------------------------------ 184 OSeekableInputStreamWrapper::OSeekableInputStreamWrapper(SvStream* _pStream, sal_Bool _bOwner) 185 { 186 SetStream( _pStream, _bOwner ); 187 } 188 189 //------------------------------------------------------------------------------ 190 void SAL_CALL OSeekableInputStreamWrapper::seek( sal_Int64 _nLocation ) throw (IllegalArgumentException, IOException, RuntimeException) 191 { 192 ::osl::MutexGuard aGuard( m_aMutex ); 193 checkConnected(); 194 195 m_pSvStream->Seek((sal_uInt32)_nLocation); 196 checkError(); 197 } 198 199 //------------------------------------------------------------------------------ 200 sal_Int64 SAL_CALL OSeekableInputStreamWrapper::getPosition( ) throw (IOException, RuntimeException) 201 { 202 ::osl::MutexGuard aGuard( m_aMutex ); 203 checkConnected(); 204 205 sal_uInt32 nPos = m_pSvStream->Tell(); 206 checkError(); 207 return (sal_Int64)nPos; 208 } 209 210 //------------------------------------------------------------------------------ 211 sal_Int64 SAL_CALL OSeekableInputStreamWrapper::getLength( ) throw (IOException, RuntimeException) 212 { 213 ::osl::MutexGuard aGuard( m_aMutex ); 214 checkConnected(); 215 216 sal_uInt32 nCurrentPos = m_pSvStream->Tell(); 217 checkError(); 218 219 m_pSvStream->Seek(STREAM_SEEK_TO_END); 220 sal_uInt32 nEndPos = m_pSvStream->Tell(); 221 m_pSvStream->Seek(nCurrentPos); 222 223 checkError(); 224 225 return (sal_Int64)nEndPos; 226 } 227 228 //================================================================== 229 //= OOutputStreamWrapper 230 //================================================================== 231 //------------------------------------------------------------------------------ 232 void SAL_CALL OOutputStreamWrapper::writeBytes(const staruno::Sequence< sal_Int8 >& aData) throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException ) 233 { 234 sal_uInt32 nWritten = rStream.Write(aData.getConstArray(),aData.getLength()); 235 ErrCode err = rStream.GetError(); 236 if ( (ERRCODE_NONE != err) 237 || (nWritten != (sal_uInt32)aData.getLength()) 238 ) 239 { 240 throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this)); 241 } 242 } 243 244 //------------------------------------------------------------------ 245 void SAL_CALL OOutputStreamWrapper::flush() throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException ) 246 { 247 rStream.Flush(); 248 checkError(); 249 } 250 251 //------------------------------------------------------------------ 252 void SAL_CALL OOutputStreamWrapper::closeOutput() throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException ) 253 { 254 } 255 256 //------------------------------------------------------------------------------ 257 void OOutputStreamWrapper::checkError() const 258 { 259 if (rStream.GetError() != ERRCODE_NONE) 260 // TODO: really evaluate the error 261 throw stario::NotConnectedException(::rtl::OUString(), const_cast<staruno::XWeak*>(static_cast<const staruno::XWeak*>(this))); 262 } 263 264 //================================================================== 265 //= OSeekableOutputStreamWrapper 266 //================================================================== 267 //------------------------------------------------------------------------------ 268 OSeekableOutputStreamWrapper::OSeekableOutputStreamWrapper(SvStream& _rStream) 269 :OOutputStreamWrapper(_rStream) 270 { 271 } 272 273 //------------------------------------------------------------------------------ 274 Any SAL_CALL OSeekableOutputStreamWrapper::queryInterface( const Type& _rType ) throw (RuntimeException) 275 { 276 Any aReturn = OOutputStreamWrapper::queryInterface(_rType); 277 if (!aReturn.hasValue()) 278 aReturn = OSeekableOutputStreamWrapper_Base::queryInterface(_rType); 279 return aReturn; 280 } 281 282 //------------------------------------------------------------------------------ 283 void SAL_CALL OSeekableOutputStreamWrapper::acquire( ) throw () 284 { 285 OOutputStreamWrapper::acquire(); 286 } 287 288 //------------------------------------------------------------------------------ 289 void SAL_CALL OSeekableOutputStreamWrapper::release( ) throw () 290 { 291 OOutputStreamWrapper::release(); 292 } 293 294 //------------------------------------------------------------------------------ 295 void SAL_CALL OSeekableOutputStreamWrapper::seek( sal_Int64 _nLocation ) throw (IllegalArgumentException, IOException, RuntimeException) 296 { 297 rStream.Seek((sal_uInt32)_nLocation); 298 checkError(); 299 } 300 301 //------------------------------------------------------------------------------ 302 sal_Int64 SAL_CALL OSeekableOutputStreamWrapper::getPosition( ) throw (IOException, RuntimeException) 303 { 304 sal_uInt32 nPos = rStream.Tell(); 305 checkError(); 306 return (sal_Int64)nPos; 307 } 308 309 //------------------------------------------------------------------------------ 310 sal_Int64 SAL_CALL OSeekableOutputStreamWrapper::getLength( ) throw (IOException, RuntimeException) 311 { 312 sal_uInt32 nCurrentPos = rStream.Tell(); 313 checkError(); 314 315 rStream.Seek(STREAM_SEEK_TO_END); 316 sal_uInt32 nEndPos = rStream.Tell(); 317 rStream.Seek(nCurrentPos); 318 319 checkError(); 320 321 return (sal_Int64)nEndPos; 322 } 323 324 //------------------------------------------------------------------------------ 325 OStreamWrapper::OStreamWrapper(SvStream& _rStream) 326 { 327 SetStream( &_rStream, sal_False ); 328 } 329 330 //------------------------------------------------------------------------------ 331 ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SAL_CALL OStreamWrapper::getInputStream( ) throw (::com::sun::star::uno::RuntimeException) 332 { 333 return this; 334 } 335 336 //------------------------------------------------------------------------------ 337 ::com::sun::star::uno::Reference< ::com::sun::star::io::XOutputStream > SAL_CALL OStreamWrapper::getOutputStream( ) throw (::com::sun::star::uno::RuntimeException) 338 { 339 return this; 340 } 341 342 //------------------------------------------------------------------------------ 343 void SAL_CALL OStreamWrapper::writeBytes(const staruno::Sequence< sal_Int8 >& aData) throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException) 344 { 345 sal_uInt32 nWritten = m_pSvStream->Write(aData.getConstArray(),aData.getLength()); 346 ErrCode err = m_pSvStream->GetError(); 347 if ( (ERRCODE_NONE != err) 348 || (nWritten != (sal_uInt32)aData.getLength()) 349 ) 350 { 351 throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this)); 352 } 353 } 354 355 //------------------------------------------------------------------------------ 356 void SAL_CALL OStreamWrapper::flush() throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException) 357 { 358 m_pSvStream->Flush(); 359 if (m_pSvStream->GetError() != ERRCODE_NONE) 360 throw stario::NotConnectedException(::rtl::OUString(),static_cast<staruno::XWeak*>(this)); 361 } 362 363 //------------------------------------------------------------------------------ 364 void SAL_CALL OStreamWrapper::closeOutput() throw(stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException) 365 { 366 } 367 368 //------------------------------------------------------------------------------ 369 void SAL_CALL OStreamWrapper::truncate() throw(::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException) 370 { 371 m_pSvStream->SetStreamSize(0); 372 } 373 374 } // namespace utl 375 376