2008/04/01 13:02:57 thb 1.4.82.2: #i85898# Stripping all external header guards 2008/03/31 13:04:25 rt 1.4.82.1: #i87441# Change license header to LPGL v3.
		
			
				
	
	
		
			227 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			227 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*************************************************************************
 | |
|  *
 | |
|  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 | |
|  *
 | |
|  * Copyright 2008 by Sun Microsystems, Inc.
 | |
|  *
 | |
|  * OpenOffice.org - a multi-platform office productivity suite
 | |
|  *
 | |
|  * $RCSfile: inputstream.cxx,v $
 | |
|  * $Revision: 1.5 $
 | |
|  *
 | |
|  * This file is part of OpenOffice.org.
 | |
|  *
 | |
|  * OpenOffice.org is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU Lesser General Public License version 3
 | |
|  * only, as published by the Free Software Foundation.
 | |
|  *
 | |
|  * OpenOffice.org is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU Lesser General Public License version 3 for more details
 | |
|  * (a copy is included in the LICENSE file that accompanied this code).
 | |
|  *
 | |
|  * You should have received a copy of the GNU Lesser General Public License
 | |
|  * version 3 along with OpenOffice.org.  If not, see
 | |
|  * <http://www.openoffice.org/license.html>
 | |
|  * for a copy of the LGPLv3 License.
 | |
|  *
 | |
|  ************************************************************************/
 | |
| 
 | |
| 
 | |
| // MARKER(update_precomp.py): autogen include statement, do not remove
 | |
| #include "precompiled_xmlhelp.hxx"
 | |
| #include "inputstream.hxx"
 | |
| 
 | |
| 
 | |
| using namespace chelp;
 | |
| using namespace com::sun::star;
 | |
| using namespace com::sun::star::ucb;
 | |
| 
 | |
| 
 | |
| 
 | |
| XInputStream_impl::XInputStream_impl( const rtl::OUString& aUncPath )
 | |
|     : m_bIsOpen( false ),
 | |
|       m_aFile( aUncPath )
 | |
| {
 | |
|     m_bIsOpen = ( osl::FileBase::E_None == m_aFile.open( OpenFlag_Read ) );
 | |
| }
 | |
| 
 | |
| 
 | |
| XInputStream_impl::~XInputStream_impl()
 | |
| {
 | |
|     closeInput();
 | |
| }
 | |
| 
 | |
| 
 | |
| bool SAL_CALL XInputStream_impl::CtorSuccess()
 | |
| {
 | |
|     return m_bIsOpen;
 | |
| };
 | |
| 
 | |
| 
 | |
| uno::Any SAL_CALL
 | |
| XInputStream_impl::queryInterface(
 | |
|     const uno::Type& rType )
 | |
|     throw( uno::RuntimeException)
 | |
| {
 | |
|     uno::Any aRet = cppu::queryInterface( rType,
 | |
|                                           SAL_STATIC_CAST( io::XInputStream*,this ),
 | |
|                                           SAL_STATIC_CAST( io::XSeekable*,this ) );
 | |
|     return aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType );
 | |
| }
 | |
| 
 | |
| 
 | |
| void SAL_CALL
 | |
| XInputStream_impl::acquire(
 | |
|     void )
 | |
|     throw()
 | |
| {
 | |
|     OWeakObject::acquire();
 | |
| }
 | |
| 
 | |
| 
 | |
| void SAL_CALL
 | |
| XInputStream_impl::release(
 | |
|     void )
 | |
|     throw()
 | |
| {
 | |
|     OWeakObject::release();
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| sal_Int32 SAL_CALL
 | |
| XInputStream_impl::readBytes(
 | |
|                  uno::Sequence< sal_Int8 >& aData,
 | |
|                  sal_Int32 nBytesToRead )
 | |
|     throw( io::NotConnectedException,
 | |
|            io::BufferSizeExceededException,
 | |
|            io::IOException,
 | |
|            uno::RuntimeException)
 | |
| {
 | |
|     if( ! m_bIsOpen )
 | |
|         throw io::IOException();
 | |
| 
 | |
|     aData.realloc(nBytesToRead);
 | |
|     //TODO! translate memory exhaustion (if it were detectable...) into
 | |
|     // io::BufferSizeExceededException
 | |
| 
 | |
|     sal_uInt64 nrc;
 | |
|     m_aFile.read( aData.getArray(),sal_uInt64(nBytesToRead),nrc );
 | |
| 
 | |
|     // Shrink aData in case we read less than nBytesToRead (XInputStream
 | |
|     // documentation does not tell whether this is required, and I do not know
 | |
|     // if any code relies on this, so be conservative---SB):
 | |
|     if (nrc != sal::static_int_cast<sal_uInt64>( nBytesToRead) )
 | |
|         aData.realloc(sal_Int32(nrc));
 | |
|     return ( sal_Int32 ) nrc;
 | |
| }
 | |
| 
 | |
| sal_Int32 SAL_CALL
 | |
| XInputStream_impl::readSomeBytes(
 | |
|     uno::Sequence< sal_Int8 >& aData,
 | |
|     sal_Int32 nMaxBytesToRead )
 | |
|     throw( io::NotConnectedException,
 | |
|            io::BufferSizeExceededException,
 | |
|            io::IOException,
 | |
|            uno::RuntimeException)
 | |
| {
 | |
|     return readBytes( aData,nMaxBytesToRead );
 | |
| }
 | |
| 
 | |
| 
 | |
| void SAL_CALL
 | |
| XInputStream_impl::skipBytes(
 | |
|     sal_Int32 nBytesToSkip )
 | |
|     throw( io::NotConnectedException,
 | |
|            io::BufferSizeExceededException,
 | |
|            io::IOException,
 | |
|            uno::RuntimeException)
 | |
| {
 | |
|     m_aFile.setPos( osl_Pos_Current, sal_uInt64( nBytesToSkip ) );
 | |
| }
 | |
| 
 | |
| 
 | |
| sal_Int32 SAL_CALL
 | |
| XInputStream_impl::available(
 | |
|     void )
 | |
|     throw( io::NotConnectedException,
 | |
|            io::IOException,
 | |
|            uno::RuntimeException)
 | |
| {
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| void SAL_CALL
 | |
| XInputStream_impl::closeInput(
 | |
|     void )
 | |
|     throw( io::NotConnectedException,
 | |
|            io::IOException,
 | |
|            uno::RuntimeException )
 | |
| {
 | |
|     if( m_bIsOpen )
 | |
|     {
 | |
|         osl::FileBase::RC err = m_aFile.close();
 | |
|         if( err != osl::FileBase::E_None )
 | |
|             throw io::IOException();
 | |
|         m_bIsOpen = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| void SAL_CALL
 | |
| XInputStream_impl::seek(
 | |
|     sal_Int64 location )
 | |
|     throw( lang::IllegalArgumentException,
 | |
|            io::IOException,
 | |
|            uno::RuntimeException )
 | |
| {
 | |
|     if( location < 0 )
 | |
|         throw lang::IllegalArgumentException();
 | |
|     if( osl::FileBase::E_None != m_aFile.setPos( Pos_Absolut, sal_uInt64( location ) ) )
 | |
|         throw io::IOException();
 | |
| }
 | |
| 
 | |
| 
 | |
| sal_Int64 SAL_CALL
 | |
| XInputStream_impl::getPosition(
 | |
|     void )
 | |
|     throw( io::IOException,
 | |
|            uno::RuntimeException )
 | |
| {
 | |
|     sal_uInt64 uPos;
 | |
|     if( osl::FileBase::E_None != m_aFile.getPos( uPos ) )
 | |
|         throw io::IOException();
 | |
|     return sal_Int64( uPos );
 | |
| }
 | |
| 
 | |
| sal_Int64 SAL_CALL
 | |
| XInputStream_impl::getLength(
 | |
|     void )
 | |
|     throw( io::IOException,
 | |
|            uno::RuntimeException )
 | |
| {
 | |
|     osl::FileBase::RC   err;
 | |
|     sal_uInt64          uCurrentPos, uEndPos;
 | |
| 
 | |
|     err = m_aFile.getPos( uCurrentPos );
 | |
|     if( err != osl::FileBase::E_None )
 | |
|         throw io::IOException();
 | |
| 
 | |
|     err = m_aFile.setPos( Pos_End, 0 );
 | |
|     if( err != osl::FileBase::E_None )
 | |
|         throw io::IOException();
 | |
| 
 | |
|     err = m_aFile.getPos( uEndPos );
 | |
|     if( err != osl::FileBase::E_None )
 | |
|         throw io::IOException();
 | |
| 
 | |
|     err = m_aFile.setPos( Pos_Absolut, uCurrentPos );
 | |
|     if( err != osl::FileBase::E_None )
 | |
|         throw io::IOException();
 | |
|     else
 | |
|         return sal_Int64( uEndPos );
 | |
| }
 |