office-gobmx/configmgr/source/misc/oslstream.cxx
Rüdiger Timm 510c194066 INTEGRATION: CWS changefileheader (1.8.72); FILE MERGED
2008/04/01 12:27:29 thb 1.8.72.2: #i85898# Stripping all external header guards
2008/03/31 12:22:50 rt 1.8.72.1: #i87441# Change license header to LPGL v3.
2008-04-11 12:22:13 +00:00

362 lines
13 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: oslstream.cxx,v $
* $Revision: 1.9 $
*
* 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_configmgr.hxx"
#include "oslstream.hxx"
#include "filehelper.hxx"
namespace configmgr
{
using namespace osl;
static void raiseIOException(osl::File::RC error, staruno::Reference<staruno::XInterface> const & context)
{
const rtl::OUString message = FileHelper::createOSLErrorString(error);
switch (error)
{
case File::E_NOMEM:
throw stario::BufferSizeExceededException(message, context);
case File::E_BADF:
throw stario::NotConnectedException(message, context);
default:
throw stario::IOException(message, context);
}
}
//------------------------------------------------------------------
OSLInputStreamWrapper::OSLInputStreamWrapper( File& _rFile )
:m_pFile(&_rFile)
,m_bFileOwner(sal_False)
{
}
//------------------------------------------------------------------
OSLInputStreamWrapper::OSLInputStreamWrapper( File* pStream, sal_Bool bOwner )
:m_pFile( pStream )
,m_bFileOwner( bOwner )
{
}
//------------------------------------------------------------------
OSLInputStreamWrapper::~OSLInputStreamWrapper()
{
if( m_bFileOwner )
delete m_pFile;
}
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL OSLInputStreamWrapper::readBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead)
throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException )
{
if (!m_pFile)
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
if (nBytesToRead < 0)
throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
osl::MutexGuard aGuard( m_aMutex );
aData.realloc(nBytesToRead);
sal_uInt64 nRead = 0;
File::RC eError = m_pFile->read(aData.getArray(), nBytesToRead, nRead);
if (eError != File::E_None)
throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
// Wenn gelesene Zeichen < MaxLength, staruno::Sequence anpassen
if (nRead < (sal_uInt64)nBytesToRead)
aData.realloc( sal::static_int_cast<sal_Int32>( nRead ));
return sal::static_int_cast<sal_Int32>( nRead );
}
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL OSLInputStreamWrapper::readSomeBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead) throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException )
{
if (!m_pFile)
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
if (nMaxBytesToRead < 0)
throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
/*
if (m_pFile->IsEof())
{
aData.realloc(0);
return 0;
}
else
*/
return readBytes(aData, nMaxBytesToRead);
}
//------------------------------------------------------------------------------
void SAL_CALL OSLInputStreamWrapper::skipBytes(sal_Int32 nBytesToSkip) throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException )
{
osl::MutexGuard aGuard( m_aMutex );
if (!m_pFile)
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
sal_uInt64 nCurrentPos;
m_pFile->getPos(nCurrentPos);
sal_uInt64 nNewPos = nCurrentPos + nBytesToSkip;
File::RC eError = m_pFile->setPos(osl_Pos_Absolut, nNewPos);
if (eError != File::E_None)
{
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
}
}
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL OSLInputStreamWrapper::available() throw( stario::NotConnectedException, staruno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
if (!m_pFile)
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
sal_uInt64 nPos;
File::RC eError = m_pFile->getPos(nPos);
if (eError != File::E_None)
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
sal_uInt64 nDummy = 0;
eError = m_pFile->setPos(Pos_End, nDummy);
if (eError != File::E_None)
throw stario::NotConnectedException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
sal_uInt64 nAvailable;
eError = m_pFile->getPos(nAvailable);
if (eError != File::E_None)
throw stario::NotConnectedException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
nAvailable = nAvailable - nPos;
eError = m_pFile->setPos(Pos_Absolut, nPos);
if (eError != File::E_None)
throw stario::NotConnectedException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
return sal::static_int_cast<sal_Int32>( nAvailable );
}
//------------------------------------------------------------------------------
void SAL_CALL OSLInputStreamWrapper::closeInput() throw( stario::NotConnectedException, staruno::RuntimeException )
{
if (!m_pFile)
throw stario::NotConnectedException(::rtl::OUString(), static_cast<staruno::XWeak*>(this));
m_pFile->close();
if (m_bFileOwner)
delete m_pFile;
m_pFile = NULL;
}
/*************************************************************************/
// stario::XOutputStream
//------------------------------------------------------------------------------
void SAL_CALL OSLOutputStreamWrapper::writeBytes(const staruno::Sequence< sal_Int8 >& aData) throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException )
{
sal_uInt32 const nLength = sal_uInt32(aData.getLength());
if (nLength != 0)
{
sal_uInt64 nWritten;
File::RC eError = rFile.write(aData.getConstArray(),nLength, nWritten);
if (eError != File::E_None || nWritten != nLength)
{
throw stario::BufferSizeExceededException(::rtl::OUString(),static_cast<staruno::XWeak*>(this));
}
}
}
//------------------------------------------------------------------
void SAL_CALL OSLOutputStreamWrapper::flush() throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException )
{
}
//------------------------------------------------------------------
void SAL_CALL OSLOutputStreamWrapper::closeOutput() throw( stario::NotConnectedException, stario::BufferSizeExceededException, staruno::RuntimeException )
{
rFile.close();
}
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// ----------------------------- Buffered OSLStream -----------------------------
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
//------------------------------------------------------------------
/*
BufferedFileInputStream::BufferedFileInputStream( File& _rFile )
:m_pFile(&_rFile)
,m_bFileOwner(sal_False)
{
}
*/
//------------------------------------------------------------------
BufferedFileInputStream::BufferedFileInputStream( rtl::OUString const & aFileURL)
: m_aFile( aFileURL )
{
osl::File::RC rc = m_aFile.open(osl_File_OpenFlag_Read);
if (rc != File::E_None)
raiseIOException(rc,NULL);
}
//------------------------------------------------------------------
BufferedFileInputStream::~BufferedFileInputStream()
{
}
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL BufferedFileInputStream::readBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nBytesToRead)
throw( stario::NotConnectedException, stario::BufferSizeExceededException,
stario::IOException, staruno::RuntimeException )
{
if (nBytesToRead < 0)
raiseIOException(osl::File::E_INVAL, *this);
aData.realloc(nBytesToRead);
sal_uInt64 nSize = sal_uInt64(nBytesToRead);
sal_uInt64 nRead = 0;
File::RC rc = m_aFile.read(aData.getArray(), nSize, nRead);
if (rc != File::E_None)
raiseIOException(rc,*this);
OSL_ASSERT(nRead <= nSize);
return sal_Int32(nRead);
}
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL BufferedFileInputStream::readSomeBytes(staruno::Sequence< sal_Int8 >& aData, sal_Int32 nMaxBytesToRead)
throw( stario::NotConnectedException, stario::BufferSizeExceededException,
stario::IOException, staruno::RuntimeException )
{
return readBytes(aData, nMaxBytesToRead);
}
//------------------------------------------------------------------------------
void SAL_CALL BufferedFileInputStream::skipBytes(sal_Int32 nBytesToSkip)
throw( stario::NotConnectedException, stario::BufferSizeExceededException,
stario::IOException, staruno::RuntimeException )
{
if (nBytesToSkip < 0)
raiseIOException(osl::File::E_INVAL, *this);
sal_uInt64 nOffset = sal_uInt64(nBytesToSkip);
File::RC rc = m_aFile.setPos(osl_Pos_Current, nOffset);
if (rc != File::E_None)
raiseIOException(rc,*this);
}
//------------------------------------------------------------------------------
sal_Int32 SAL_CALL BufferedFileInputStream::available()
throw( stario::NotConnectedException, stario::IOException, staruno::RuntimeException )
{
sal_uInt64 avail = 0;
File::RC rc = m_aFile.available(avail);
if (rc != File::E_None)
raiseIOException(rc,*this);
sal_Int32 result = sal_Int32(avail);
if (result < 0 || sal_uInt64(result) < avail)
result = SAL_MAX_INT32;
return result;
}
//------------------------------------------------------------------------------
void SAL_CALL BufferedFileInputStream::closeInput()
throw( stario::NotConnectedException, stario::IOException, staruno::RuntimeException )
{
File::RC rc = m_aFile.close();
if (rc != File::E_None)
raiseIOException(rc,*this);
}
//------------------------------------------------------------------
//------------------------------------------------------------------
BufferedFileOutputStream::BufferedFileOutputStream( rtl::OUString const & aFileURL, bool bCreate, sal_uInt32 nBufferSizeHint)
: m_aFile( aFileURL, nBufferSizeHint )
{
sal_Int32 flags = bCreate ? OpenFlag_Write|OpenFlag_Create : OpenFlag_Write;
osl::File::RC rc = m_aFile.open(flags);
if (rc != File::E_None)
raiseIOException(rc,NULL);
}
//------------------------------------------------------------------
BufferedFileOutputStream::~BufferedFileOutputStream()
{
}
//------------------------------------------------------------------------------
void SAL_CALL BufferedFileOutputStream::writeBytes(const staruno::Sequence< sal_Int8 >& aData)
throw( stario::NotConnectedException, stario::BufferSizeExceededException,
stario::IOException, staruno::RuntimeException )
{
const sal_uInt64 size = sal_uInt64(aData.getLength());
sal_uInt64 written = 0;
osl::File::RC rc = m_aFile.write(aData.getConstArray(), size, written);
if (rc != File::E_None)
raiseIOException(rc,*this);
// we don't support special files where multiple write passes are needed
if (written < size)
raiseIOException(File::E_IO,*this);
}
void SAL_CALL BufferedFileOutputStream::flush()
throw( stario::NotConnectedException, stario::BufferSizeExceededException,
stario::IOException, staruno::RuntimeException )
{
osl::File::RC rc = m_aFile.sync();
if (rc != File::E_None)
raiseIOException(rc,*this);
}
void SAL_CALL BufferedFileOutputStream::closeOutput()
throw( stario::NotConnectedException, stario::BufferSizeExceededException,
stario::IOException, staruno::RuntimeException )
{
osl::File::RC rc = m_aFile.close();
if (rc != File::E_None)
raiseIOException(rc,*this);
}
} // namespace configmgr