diff options
Diffstat (limited to 'configmgr/source/backend/binaryreader.cxx')
-rw-r--r-- | configmgr/source/backend/binaryreader.cxx | 693 |
1 files changed, 0 insertions, 693 deletions
diff --git a/configmgr/source/backend/binaryreader.cxx b/configmgr/source/backend/binaryreader.cxx deleted file mode 100644 index 8f8af945026a..000000000000 --- a/configmgr/source/backend/binaryreader.cxx +++ /dev/null @@ -1,693 +0,0 @@ -/************************************************************************* - * - * 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: binaryreader.cxx,v $ - * $Revision: 1.10 $ - * - * 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 "binaryreader.hxx" -#include "binarytype.hxx" -#include "valuenode.hxx" -#include "filehelper.hxx" -#include "oslstream.hxx" - - -#include <com/sun/star/uno/Type.hxx> -#include <com/sun/star/uno/Any.hxx> -#include <com/sun/star/io/IOException.hpp> -#include <com/sun/star/io/XOutputStream.hpp> -#include <com/sun/star/io/XActiveDataSource.hpp> -#include <com/sun/star/io/XDataInputStream.hpp> -#include <com/sun/star/io/XDataOutputStream.hpp> -#include <com/sun/star/io/BufferSizeExceededException.hpp> -#include <com/sun/star/io/UnexpectedEOFException.hpp> - -#include <cppuhelper/implbase1.hxx> -#include <osl/file.hxx> - -#ifndef INCLUDED_ALGORITHM -#include <algorithm> -#define INCLUDED_ALGORITHM -#endif -#include "tracer.hxx" - -#define ASCII(x) rtl::OUString::createFromAscii(x) - -namespace configmgr -{ - // ----------------------------------------------------------------------------- - namespace backend - { - namespace uno = com::sun::star::uno; - namespace io = com::sun::star::io; - - - // -------------------------------------------------------------------------- - - inline rtl::OUString ErrorToMessage_Impl (osl::FileBase::RC eError) - { - return FileHelper::createOSLErrorString (eError); - } - - // -------------------------------------------------------------------------- - - class BinaryReader_Impl : - public cppu::WeakImplHelper1< com::sun::star::io::XDataInputStream > - { - public: - /** Construction. - */ - explicit BinaryReader_Impl (rtl::OUString const & rFileUrl) - SAL_THROW( (io::IOException, uno::RuntimeException) ); - - /** XInputStream. - */ - virtual sal_Int32 SAL_CALL readBytes ( - uno::Sequence<sal_Int8> & rData, sal_Int32 nBytesToRead) - throw ( - io::NotConnectedException, - io::BufferSizeExceededException, - io::IOException, uno::RuntimeException); - - virtual sal_Int32 SAL_CALL readSomeBytes ( - uno::Sequence<sal_Int8> & rData, sal_Int32 nBytesToRead) - throw ( - io::NotConnectedException, - io::BufferSizeExceededException, - io::IOException, uno::RuntimeException); - - virtual void SAL_CALL skipBytes (sal_Int32 nBytesToSkip) - throw ( - io::NotConnectedException, - io::BufferSizeExceededException, - io::IOException, uno::RuntimeException); - - virtual sal_Int32 SAL_CALL available() - throw ( - io::NotConnectedException, - io::IOException, uno::RuntimeException); - - virtual void SAL_CALL closeInput() - throw ( - io::NotConnectedException, - io::IOException, uno::RuntimeException); - - - /** XDataInputStream. - */ - virtual sal_Int8 SAL_CALL readBoolean() - throw ( - io::IOException, uno::RuntimeException); - - virtual sal_Int8 SAL_CALL readByte() - throw ( - io::IOException, uno::RuntimeException); - - virtual sal_Unicode SAL_CALL readChar() - throw ( - io::IOException, uno::RuntimeException); - - virtual sal_Int16 SAL_CALL readShort() - throw ( - io::IOException, uno::RuntimeException); - - virtual sal_Int32 SAL_CALL readLong() - throw ( - io::IOException, uno::RuntimeException); - - virtual sal_Int64 SAL_CALL readHyper() - throw ( - io::IOException, uno::RuntimeException); - - virtual float SAL_CALL readFloat() - throw ( - io::IOException, uno::RuntimeException); - - virtual double SAL_CALL readDouble() - throw ( - io::IOException, uno::RuntimeException); - - virtual rtl::OUString SAL_CALL readUTF() - throw ( - io::IOException, uno::RuntimeException); - - protected: - /** Destruction. - */ - virtual ~BinaryReader_Impl(); - - private: - sal_uInt32 checkAvail(); // may throw NotConnectedException - sal_uInt32 getMaxAvail(sal_Int32 nRequest); // may throw NotConnectedException, BufferSizeExceededException - sal_uInt8 const * readBuffer(sal_uInt32 nRequired); // may throw NotConnectedException, UnexpectedEOFException - private: - /** Representation. - */ - sal_uInt8 * m_pBuffer; - sal_uInt32 m_nLength; - sal_uInt32 m_nOffset; - - /** Not implemented. - */ - BinaryReader_Impl (const BinaryReader_Impl&); - BinaryReader_Impl& operator= (const BinaryReader_Impl&); - }; - - // -------------------------------------------------------------------------- - static inline void checkIOError(osl::File::RC errcode) - { - if (errcode != osl::FileBase::E_None) - { - throw io::IOException (ErrorToMessage_Impl (errcode), NULL); - } - } - static void raiseBufferError() - { - rtl::OUString sMsg = rtl::OUString::createFromAscii("Cannot allocate Buffer: Too large"); - throw io:: BufferSizeExceededException(sMsg, NULL); - } - // ------------------------------------------------------------------------- - BinaryReader_Impl::BinaryReader_Impl (rtl::OUString const & rFileUrl) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - : m_pBuffer (0) - , m_nLength (0) - , m_nOffset (0) - { - osl::File aFile (rFileUrl); - - checkIOError( aFile.open (OpenFlag_Read) ); - sal_uInt64 nLength = 0; - checkIOError( aFile.getSize (nLength) ); - if (nLength > 0xffffffff) - raiseBufferError(); - m_nLength = sal_uInt32(nLength); - - sal_uInt8 *pBuffer = static_cast<sal_uInt8*>(rtl_allocateMemory (m_nLength)); - if (!pBuffer) - raiseBufferError(); - - sal_uInt64 nRead = 0; - osl::File::RC result = aFile.read (pBuffer, nLength, nRead); - if (result != osl::FileBase::E_None) - { - rtl_freeMemory (pBuffer); - checkIOError( result ); - } - if (nRead != nLength) - { - rtl_freeMemory (pBuffer); - rtl::OUString sMsg = rtl::OUString::createFromAscii("BinaryCache - Could not read entire size of file: "); - throw io::UnexpectedEOFException(sMsg.concat(rFileUrl),NULL); - } - m_pBuffer = pBuffer; - } - - // -------------------------------------------------------------------------- - - BinaryReader_Impl::~BinaryReader_Impl() - { - if (m_pBuffer) rtl_freeMemory (m_pBuffer); - } - - // -------------------------------------------------------------------------- - // XInputStream implementation. - // -------------------------------------------------------------------------- - sal_uInt32 BinaryReader_Impl::checkAvail () - { - if (!m_pBuffer) - { - rtl::OUString sMsg = rtl::OUString::createFromAscii("BinaryCache - Stream is not open. No data available for reading."); - throw io::NotConnectedException(sMsg,*this); - } - OSL_ASSERT(m_nLength >= m_nOffset); - return m_nLength - m_nOffset; - } - // -------------------------------------------------------------------------- - - sal_uInt32 BinaryReader_Impl::getMaxAvail (sal_Int32 nRequest) - { - if (nRequest < 0) - { - rtl::OUString sMsg = rtl::OUString::createFromAscii("BinaryCache - Invalid read request - negative byte count requested."); - throw io::BufferSizeExceededException(sMsg,*this); - } - sal_uInt32 const uRequest = sal_uInt32(nRequest); - sal_uInt32 const uAvail = checkAvail (); - return std::min(uRequest,uAvail); - } - // -------------------------------------------------------------------------- - - sal_uInt8 const * BinaryReader_Impl::readBuffer (sal_uInt32 nRequest) - { - sal_uInt32 const nAvail = checkAvail (); - if (nRequest > nAvail) - { - rtl::OUString sMsg = rtl::OUString::createFromAscii("BinaryCache - Invalid file format - read past end-of-file."); - throw io::UnexpectedEOFException(sMsg,*this); - } - sal_uInt8 const * pData = m_pBuffer + m_nOffset; - m_nOffset += nRequest; - return pData; - } - // -------------------------------------------------------------------------- - - sal_Int32 SAL_CALL BinaryReader_Impl::readBytes ( - uno::Sequence<sal_Int8> & rData, sal_Int32 nBytesToRead) - throw ( - io::NotConnectedException, - io::BufferSizeExceededException, - io::IOException, uno::RuntimeException) - { - sal_uInt32 nRead = getMaxAvail(nBytesToRead); - if (nRead > 0) - { - rData.realloc (nRead); - memcpy (rData.getArray(), readBuffer(nRead), nRead); - } - return sal_Int32(nRead); - } - - // -------------------------------------------------------------------------- - - sal_Int32 SAL_CALL BinaryReader_Impl::readSomeBytes ( - uno::Sequence<sal_Int8> & rData, sal_Int32 nBytesToRead) - throw ( - io::NotConnectedException, - io::BufferSizeExceededException, - io::IOException, uno::RuntimeException) - { - return readBytes(rData,nBytesToRead); - } - - // -------------------------------------------------------------------------- - - void SAL_CALL BinaryReader_Impl::skipBytes (sal_Int32 nBytesToSkip) - throw ( - io::NotConnectedException, - io::BufferSizeExceededException, - io::IOException, uno::RuntimeException) - { - (void) readBuffer(sal_uInt32(nBytesToSkip)); - } - - // -------------------------------------------------------------------------- - - sal_Int32 SAL_CALL BinaryReader_Impl::available() - throw ( - io::NotConnectedException, - io::IOException, uno::RuntimeException) - { - const sal_uInt32 nMaxAvail = 0x7FFFFFFF; - const sal_uInt32 nAvail = checkAvail(); - return sal_Int32(std::min(nAvail,nMaxAvail)); - } - - // -------------------------------------------------------------------------- - - void SAL_CALL BinaryReader_Impl::closeInput() - throw ( - io::NotConnectedException, - io::IOException, uno::RuntimeException) - { - OSL_ENSURE(m_pBuffer,"BinaryCache - Closing stream that is already closed"); - if (m_pBuffer) - { - rtl_freeMemory (m_pBuffer); - m_pBuffer = 0; - } - } - - // -------------------------------------------------------------------------- - // XDataInputStream implementation. - // -------------------------------------------------------------------------- - - sal_Int8 SAL_CALL BinaryReader_Impl::readBoolean() - throw (io::IOException, uno::RuntimeException) - { - return this->readByte(); - } - - // -------------------------------------------------------------------------- - - sal_Int8 SAL_CALL BinaryReader_Impl::readByte() - throw (io::IOException, uno::RuntimeException) - { - sal_Int8 result = sal_Int8(*readBuffer(1)); - - return result; - } - - // -------------------------------------------------------------------------- - - sal_Unicode SAL_CALL BinaryReader_Impl::readChar() - throw (io::IOException, uno::RuntimeException) - { - sal_Unicode result; - - sal_uInt8 const * pData = readBuffer(sizeof result); - - result = sal_Unicode( - (sal_uInt16(pData[0]) << 8) | - (sal_uInt16(pData[1]) << 0) ); - - return result; - } - - // -------------------------------------------------------------------------- - - sal_Int16 SAL_CALL BinaryReader_Impl::readShort() - throw (io::IOException, uno::RuntimeException) - { - sal_Int16 result; - - sal_uInt8 const * pData = readBuffer(sizeof result); - - result = sal_Int16( - (sal_uInt16(pData[0]) << 8) | - (sal_uInt16(pData[1]) << 0) ); - - return result; - } - - // -------------------------------------------------------------------------- - - sal_Int32 SAL_CALL BinaryReader_Impl::readLong() - throw (io::IOException, uno::RuntimeException) - { - sal_Int32 result; - - sal_uInt8 const * pData = readBuffer(sizeof result); - - result = sal_Int32( - (sal_uInt32(pData[0]) << 24) | - (sal_uInt32(pData[1]) << 16) | - (sal_uInt32(pData[2]) << 8) | - (sal_uInt32(pData[3]) << 0) ); - - return result; - } - - // -------------------------------------------------------------------------- - - sal_Int64 SAL_CALL BinaryReader_Impl::readHyper() - throw (io::IOException, uno::RuntimeException) - { - sal_Int64 result; - - sal_uInt8 const * pData = readBuffer(sizeof result); - - result = sal_Int64( - (sal_uInt64(pData[0]) << 56) | - (sal_uInt64(pData[1]) << 48) | - (sal_uInt64(pData[2]) << 40) | - (sal_uInt64(pData[3]) << 32) | - (sal_uInt64(pData[4]) << 24) | - (sal_uInt64(pData[5]) << 16) | - (sal_uInt64(pData[6]) << 8) | - (sal_uInt64(pData[7]) << 0) ); - - return result; - } - - // -------------------------------------------------------------------------- - - float SAL_CALL BinaryReader_Impl::readFloat() - throw (io::IOException, uno::RuntimeException) - { - union { float f; sal_uInt32 n; } result; - - sal_uInt8 const * pData = readBuffer(sizeof result.n); - - result.n = sal_uInt32( - (sal_uInt32(pData[0]) << 24) | - (sal_uInt32(pData[1]) << 16) | - (sal_uInt32(pData[2]) << 8) | - (sal_uInt32(pData[3]) << 0) ); - - return result.f; - } - - // -------------------------------------------------------------------------- - - double SAL_CALL BinaryReader_Impl::readDouble() - throw (io::IOException, uno::RuntimeException) - { - union { double d; sal_uInt64 n; } result; - - sal_uInt8 const * pData = readBuffer(sizeof result.n); - - result.n = sal_uInt64( - (sal_uInt64(pData[0]) << 56) | - (sal_uInt64(pData[1]) << 48) | - (sal_uInt64(pData[2]) << 40) | - (sal_uInt64(pData[3]) << 32) | - (sal_uInt64(pData[4]) << 24) | - (sal_uInt64(pData[5]) << 16) | - (sal_uInt64(pData[6]) << 8) | - (sal_uInt64(pData[7]) << 0) ); - - return result.d; - } - - // -------------------------------------------------------------------------- - - rtl::OUString SAL_CALL BinaryReader_Impl::readUTF() - throw (io::IOException, uno::RuntimeException) - { - sal_uInt32 nLength; - - sal_uInt8 const * const pData = readBuffer(sizeof nLength); - - nLength = sal_uInt32( - (sal_uInt32(pData[0]) << 24) | - (sal_uInt32(pData[1]) << 16) | - (sal_uInt32(pData[2]) << 8) | - (sal_uInt32(pData[3]) << 0) ); - - bool bIsAscii = (nLength & binary::STR_ASCII_MASK) == binary::STR_ASCII_MASK; - nLength &=~binary::STR_ASCII_MASK; - - rtl::OUString result; - if (nLength != 0) - { - sal_Char const * const pUTF = reinterpret_cast<sal_Char const * >(readBuffer(nLength)); - - sal_Int32 const nStrLength = sal_Int32(nLength); - OSL_ASSERT(nStrLength >= 0); - - rtl_TextEncoding const enc = bIsAscii ? RTL_TEXTENCODING_ASCII_US : RTL_TEXTENCODING_UTF8; - - rtl_uString_internConvert(&result.pData, pUTF, nStrLength, enc, - OSTRING_TO_OUSTRING_CVTFLAGS, NULL); - } - - return result; - } - - // -------------------------------------------------------------------------- - // BinaryReader implementation. - // -------------------------------------------------------------------------- - - BinaryReader::BinaryReader(rtl::OUString const & _sFileURL): - m_sFileURL(_sFileURL) {} - - BinaryReader::~BinaryReader() {} - - bool BinaryReader::open() - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - OSL_PRECOND(!m_xDataInputStream.is(),"Binary Reader: already open"); - if (m_xDataInputStream.is()) - return false; - - if (m_sFileURL.getLength() == 0) - return false; - - if (!FileHelper::fileExists(m_sFileURL)) - return false; - - m_xDataInputStream.set(new BinaryReader_Impl (m_sFileURL)); - return true; - } - - // -------------------------------------------------------------------------- - - inline BinaryReader_Impl * BinaryReader::getDataInputStream() - { - OSL_ENSURE(m_xDataInputStream.is(),"Binary Cache: Reader was not opened - no input stream"); - return m_xDataInputStream.get(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(sal_Bool &_bValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _bValue = getDataInputStream()->readBoolean(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(sal_Int8 &_nValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _nValue = getDataInputStream()->readByte(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(sal_Int16 &_nValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _nValue = getDataInputStream()->readShort(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(sal_Int32 &_nValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _nValue = getDataInputStream()->readLong(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(sal_Int64 &_nValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _nValue = getDataInputStream()->readHyper(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(double &_nValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _nValue = getDataInputStream()->readDouble(); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read(rtl::OUString& _aStr) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - _aStr = getDataInputStream()->readUTF(); - } - - // ----------------------------------------------------------------------------- - template <class Element> - void readSequence(BinaryReader& _rReader, uno::Sequence< Element > & aSequence) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - // PRE: the Sequence must exist - sal_Int32 nLength; - _rReader.read(nLength); - - aSequence.realloc(nLength); - - Element* const pElement = aSequence.getArray(); // fill the hole array - for(sal_Int32 i=0; i<nLength; ++i) - { - _rReader.read(pElement[i]); // read one element - } - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read (uno::Sequence< sal_Int8 > &_aValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - readSequence(*this, _aValue); - } - - // -------------------------------------------------------------------------- - - void BinaryReader::read (uno::Sequence< rtl::OUString > &_aValue) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - readSequence(*this, _aValue); - } - - // -------------------------------------------------------------------------- - - uno::Sequence< sal_Int8 > const * const for_binary = 0; - - #define CASE_READ_SEQUENCE(TYPE_CLASS, DATA_TYPE) \ - case TYPE_CLASS: \ - { \ - OSL_ENSURE( ::getCppuType(static_cast<DATA_TYPE const*>(0)).getTypeClass() == (TYPE_CLASS), "Typeclass does not match element type" ); \ - uno::Sequence< DATA_TYPE > aData; \ - readSequence(_rReader, aData); \ - _aValue <<= aData; \ - } break - - bool readSequenceValue ( - BinaryReader & _rReader, - uno::Any & _aValue, - uno::Type const & _aElementType) - SAL_THROW( (io::IOException, uno::RuntimeException) ) - { - switch(_aElementType.getTypeClass()) - { - CASE_READ_SEQUENCE( uno::TypeClass_BOOLEAN, sal_Bool ); - - CASE_READ_SEQUENCE( uno::TypeClass_SHORT, sal_Int16 ); - - CASE_READ_SEQUENCE( uno::TypeClass_LONG, sal_Int32 ); - - CASE_READ_SEQUENCE( uno::TypeClass_HYPER, sal_Int64 ); - - CASE_READ_SEQUENCE( uno::TypeClass_DOUBLE, double ); - - CASE_READ_SEQUENCE( uno::TypeClass_STRING, rtl::OUString ); - - case uno::TypeClass_SEQUENCE: - if (_aElementType == ::getCppuType(for_binary)) - { - uno::Sequence< sal_Int8 > aData; - readSequence(_rReader, aData); - _aValue <<= aData; - break; - } - // else fall through - - default: - OSL_ENSURE(false, "Unexpected type for sequence elements"); - return false; - } - return true; - } - - #undef CASE_READ_SEQUENCE - - // -------------------------------------------------------------------------- - - - } -} |