diff options
Diffstat (limited to 'sot/source/sdstor/storage.cxx')
-rw-r--r-- | sot/source/sdstor/storage.cxx | 1395 |
1 files changed, 0 insertions, 1395 deletions
diff --git a/sot/source/sdstor/storage.cxx b/sot/source/sdstor/storage.cxx deleted file mode 100644 index 6756552a16..0000000000 --- a/sot/source/sdstor/storage.cxx +++ /dev/null @@ -1,1395 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * 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_sot.hxx" -#include <com/sun/star/uno/Sequence.hxx> -#include <com/sun/star/lang/XSingleServiceFactory.hpp> -#include <com/sun/star/embed/XStorage.hpp> -#include <com/sun/star/embed/ElementModes.hpp> -#include <com/sun/star/beans/XPropertySet.hpp> - -#include <rtl/digest.h> -#include <osl/file.hxx> -#include <sot/stg.hxx> -#include <sot/storinfo.hxx> -#include <sot/storage.hxx> -#include <sot/formats.hxx> -#include <sot/exchange.hxx> -#include <unotools/ucbstreamhelper.hxx> -#include <tools/fsys.hxx> -#include <tools/cachestr.hxx> -#include <tools/debug.hxx> -#include <tools/urlobj.hxx> -#include <unotools/localfilehelper.hxx> -#include <unotools/ucbhelper.hxx> -#include <comphelper/processfactory.hxx> - -#include "unostorageholder.hxx" - -using namespace ::com::sun::star; - -/************** class SotStorageStream ***********************************/ -class SotStorageStreamFactory : public SotFactory -{ -public: - TYPEINFO(); - SotStorageStreamFactory( const SvGlobalName & rName, - const String & rClassName, - CreateInstanceType pCreateFuncP ) - : SotFactory( rName, rClassName, pCreateFuncP ) - {} -}; -TYPEINIT1(SotStorageStreamFactory,SotFactory); - - -SO2_IMPL_BASIC_CLASS1_DLL(SotStorageStream,SotStorageStreamFactory,SotObject, - SvGlobalName( 0xd7deb420, 0xf902, 0x11d0, - 0xaa, 0xa1, 0x0, 0xa0, 0x24, 0x9d, 0x55, 0x90 ) ) -SO2_IMPL_INVARIANT(SotStorageStream) - - -void SotStorageStream::TestMemberObjRef( sal_Bool /*bFree*/ ) -{ -} - -#ifdef TEST_INVARIANT -void SotStorageStream::TestMemberInvariant( sal_Bool /*bPrint*/ ) -{ -} -#endif - -/************************************************************************ -|* SotStorageStream::SotStorageStream() -|* -|* Beschreibung -*************************************************************************/ -SvLockBytesRef MakeLockBytes_Impl( const String & rName, StreamMode nMode ) -{ - SvLockBytesRef xLB; - if( rName.Len() ) - { - SvStream * pFileStm = new SvFileStream( rName, nMode ); - xLB = new SvLockBytes( pFileStm, sal_True ); - } - else - { - SvStream * pCacheStm = new SvCacheStream(); - xLB = new SvLockBytes( pCacheStm, sal_True ); - } - return xLB; -} - -SotStorageStream::SotStorageStream( const String & rName, StreamMode nMode, - StorageMode - #ifdef DBG_UTIL - nStorageMode - #endif - ) - : SvStream( MakeLockBytes_Impl( rName, nMode ) ) - , pOwnStm( NULL ) -{ - if( nMode & STREAM_WRITE ) - bIsWritable = sal_True; - else - bIsWritable = sal_False; - - DBG_ASSERT( !nStorageMode,"StorageModes ignored" ); -} - -SotStorageStream::SotStorageStream( BaseStorageStream * pStm ) -{ - if( pStm ) - { - if( STREAM_WRITE & pStm->GetMode() ) - bIsWritable = sal_True; - else - bIsWritable = sal_False; - - pOwnStm = pStm; - SetError( pStm->GetError() ); - pStm->ResetError(); - } - else - { - pOwnStm = NULL; - bIsWritable = sal_True; - SetError( SVSTREAM_INVALID_PARAMETER ); - } -} - -SotStorageStream::SotStorageStream() - : pOwnStm( NULL ) -{ - // ??? wenn Init virtuell ist, entsprechen setzen - bIsWritable = sal_True; -} - -/************************************************************************ -|* SotStorageStream::~SotStorageStream() -|* -|* Beschreibung -*************************************************************************/ -SotStorageStream::~SotStorageStream() -{ - Flush(); //SetBufferSize(0); - delete pOwnStm; -} - -/************************************************************************* -|* SotStorageStream::SyncSvStream() -|* -|* Beschreibung: Der SvStream wird auf den Zustand des Standard-Streams -|* gesetzt. Der Puffer des SvStreams wird weggeworfen. -*************************************************************************/ -void SotStorageStream::SyncSvStream() -{ - if( pOwnStm ) - { - pOwnStm->Flush(); - sal_uLong nPos = pOwnStm->Tell(); - SetError( pOwnStm->GetError() ); - SvStream::SyncSvStream( nPos ); - } -} - -/************************************************************************* -|* SotStorageStream::ResetError() -|* -|* Beschreibung -*************************************************************************/ -void SotStorageStream::ResetError() -{ - SvStream::ResetError(); - if( pOwnStm ) - pOwnStm->ResetError(); -} - -/************************************************************************* -|* SotStorageStream::GetData() -|* -|* Beschreibung -*************************************************************************/ -sal_uLong SotStorageStream::GetData( void* pData, sal_uLong nSize ) -{ - sal_uLong nRet = 0; - - if( pOwnStm ) - { - nRet = pOwnStm->Read( pData, nSize ); - SetError( pOwnStm->GetError() ); - } - else - nRet = SvStream::GetData( (sal_Char *)pData, nSize ); - return nRet; -} - -/************************************************************************* -|* SotStorageStream::PutData() -|* -|* Beschreibung -*************************************************************************/ -sal_uLong SotStorageStream::PutData( const void* pData, sal_uLong nSize ) -{ - sal_uLong nRet = 0; - - if( pOwnStm ) - { - nRet = pOwnStm->Write( pData, nSize ); - SetError( pOwnStm->GetError() ); - } - else - nRet = SvStream::PutData( (sal_Char *)pData, nSize ); - return nRet; -} - -/************************************************************************* -|* SotStorageStream::SeekPos() -|* -|* Beschreibung -*************************************************************************/ -sal_uLong SotStorageStream::SeekPos( sal_uLong nPos ) -{ - sal_uLong nRet = 0; - - if( pOwnStm ) - { - nRet = pOwnStm->Seek( nPos ); - SetError( pOwnStm->GetError() ); - } - else - nRet = SvStream::SeekPos( nPos ); - return nRet; -} - -/************************************************************************* -|* SotStorageStream::Flush() -|* -|* Beschreibung -*************************************************************************/ -void SotStorageStream::FlushData() -{ - if( pOwnStm ) - { - pOwnStm->Flush(); - SetError( pOwnStm->GetError() ); - } - else - SvStream::FlushData(); -} - -/************************************************************************* -|* SotStorageStream::SetSize() -|* -|* Beschreibung -*************************************************************************/ -void SotStorageStream::SetSize( sal_uLong nNewSize ) -{ - sal_uLong nPos = Tell(); - if( pOwnStm ) - { - pOwnStm->SetSize( nNewSize ); - SetError( pOwnStm->GetError() ); - } - else - SvStream::SetSize( nNewSize ); - - if( nNewSize < nPos ) - // ans Ende setzen - Seek( nNewSize ); - - //return GetError() == SVSTREAM_OK; -} - -/************************************************************************* -|* -|* SotStorageStream::GetSize() -|* -|* Beschreibung -|* -*************************************************************************/ -sal_uInt32 SotStorageStream::GetSize() const -{ - sal_uLong nPos = Tell(); - ((SotStorageStream *)this)->Seek( STREAM_SEEK_TO_END ); - sal_uLong nSize = Tell(); - ((SotStorageStream *)this)->Seek( nPos ); - return nSize; -} - -/************************************************************************* -|* SotStorageStream::CopyTo() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorageStream::CopyTo( SotStorageStream * pDestStm ) -{ - Flush(); // alle Daten schreiben - pDestStm->ClearBuffer(); - if( !pOwnStm || !pDestStm->pOwnStm ) - { // Wenn Ole2 oder nicht nur eigene StorageStreams - - sal_uLong nPos = Tell(); // Position merken - Seek( 0L ); - pDestStm->SetSize( 0 ); // Ziel-Stream leeren - - void * pMem = new sal_uInt8[ 8192 ]; - sal_uLong nRead; - while( 0 != (nRead = Read( pMem, 8192 )) ) - { - if( nRead != pDestStm->Write( pMem, nRead ) ) - { - SetError( SVSTREAM_GENERALERROR ); - break; - } - } - delete [] static_cast<sal_uInt8*>(pMem); - // Position setzen - pDestStm->Seek( nPos ); - Seek( nPos ); - } - else - { - /* - // Kopieren - nErr = pObjI->CopyTo( pDestStm->pObjI, uSize, NULL, &uWrite ); - if( SUCCEEDED( nErr ) ) - { - // Ziel-Streamzeiger steht hinter den Daten - // SvSeek abgleichen - pDestStm->Seek( uWrite.LowPart ); - } - else if( GetScode( nErr ) == E_NOTIMPL ) - { // Eines Tages werden alle MS... ?!# - */ - pOwnStm->CopyTo( pDestStm->pOwnStm ); - SetError( pOwnStm->GetError() ); - } - return GetError() == SVSTREAM_OK; -} - -/************************************************************************* -|* SotStorageStream::Commit() -|* SotStorageStream::Revert() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorageStream::Commit() -{ - if( pOwnStm ) - { - pOwnStm->Flush(); - if( pOwnStm->GetError() == SVSTREAM_OK ) - pOwnStm->Commit(); - SetError( pOwnStm->GetError() ); - } - return GetError() == SVSTREAM_OK; -} - -sal_Bool SotStorageStream::Revert() -{ - if( !pOwnStm ) - { - pOwnStm->Revert(); - SetError( pOwnStm->GetError() ); - } - return GetError() == SVSTREAM_OK; -} - -sal_Bool SotStorageStream::SetProperty( const String& rName, const ::com::sun::star::uno::Any& rValue ) -{ - UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm ); - if ( pStg ) - { - return pStg->SetProperty( rName, rValue ); - } - else - { - OSL_FAIL("Not implemented!"); - return sal_False; - } -} - -sal_Bool SotStorageStream::GetProperty( const String& rName, ::com::sun::star::uno::Any& rValue ) -{ - UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm ); - if ( pStg ) - { - return pStg->GetProperty( rName, rValue ); - } - else - { - OSL_FAIL("Not implemented!"); - return sal_False; - } -} - -::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SotStorageStream::GetXInputStream() const -{ - UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm ); - if ( pStg ) - { - return pStg->GetXInputStream(); - } - else - { - OSL_FAIL("Not implemented!"); - return ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >(); - } -} - - - -/************** class SotStorage ****************************************** -*************************************************************************/ -class SotStorageFactory : public SotFactory -{ -public: - TYPEINFO(); - SotStorageFactory( const SvGlobalName & rName, - const String & rClassName, - CreateInstanceType pCreateFuncP ) - : SotFactory( rName, rClassName, pCreateFuncP ) - {} -}; -TYPEINIT1(SotStorageFactory,SotFactory); - - -SO2_IMPL_BASIC_CLASS1_DLL(SotStorage,SotStorageFactory,SotObject, - SvGlobalName( 0x980ce7e0, 0xf905, 0x11d0, - 0xaa, 0xa1, 0x0, 0xa0, 0x24, 0x9d, 0x55, 0x90 ) ) -SO2_IMPL_INVARIANT(SotStorage) - - -/************************************************************************ -|* -|* SotStorage::Tes*() -|* -|* Beschreibung -*************************************************************************/ -void SotStorage::TestMemberObjRef( sal_Bool /*bFree*/ ) -{ -} - -#ifdef TEST_INVARIANT -void SotStorage::TestMemberInvariant( sal_Bool /*bPrint*/ ) -{ -} -#endif - -/************************************************************************ -|* -|* SotStorage::SotStorage() -|* -|* Beschreibung Es muss ein I... Objekt an SvObject uebergeben -|* werden, da es sonst selbst ein IUnknown anlegt und -|* festlegt, dass alle weiteren I... Objekte mit -|* delete zerstoert werden (Owner() == sal_True). -|* Es werden aber nur IStorage Objekte benutzt und nicht -|* selbst implementiert, deshalb wird so getan, als ob -|* das IStorage Objekt von aussen kam und es wird mit -|* Release() freigegeben. -|* Die CreateStorage Methoden werden benoetigt, um -|* ein IStorage Objekt vor dem Aufruf von SvObject -|* zu erzeugen (Own, !Own automatik). -|* Hat CreateStorage ein Objekt erzeugt, dann wurde -|* der RefCounter schon um 1 erhoet. -|* Die Uebergabe erfolgt in pStorageCTor. Die Variable -|* ist NULL, wenn es nicht geklappt hat. -|* -*************************************************************************/ -#define INIT_SotStorage() \ - : m_pOwnStg( NULL ) \ - , m_pStorStm( NULL ) \ - , m_nError( SVSTREAM_OK ) \ - , m_bIsRoot( sal_False ) \ - , m_bDelStm( sal_False ) \ - , m_nVersion( SOFFICE_FILEFORMAT_CURRENT ) - -SotStorage::SotStorage() - INIT_SotStorage() -{ - // ??? What's this ??? -} - -#define ERASEMASK ( STREAM_TRUNC | STREAM_WRITE | STREAM_SHARE_DENYALL ) -#include <com/sun/star/uno/Reference.h> -#include <com/sun/star/ucb/XCommandEnvironment.hpp> -#include <ucbhelper/content.hxx> - -SotStorage::SotStorage( const ::ucbhelper::Content& rContent, const String & rName, StreamMode nMode, StorageMode nStorageMode ) - INIT_SotStorage() -{ - m_aName = rName; // Namen merken - m_pOwnStg = new UCBStorage( rContent, m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - - SetError( m_pOwnStg->GetError() ); - - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; - - SignAsRoot( m_pOwnStg->IsRoot() ); -} - -SotStorage::SotStorage( const String & rName, StreamMode nMode, StorageMode nStorageMode ) - INIT_SotStorage() -{ - m_aName = rName; // Namen merken - CreateStorage( sal_True, nMode, nStorageMode ); - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; -} - -void SotStorage::CreateStorage( sal_Bool bForceUCBStorage, StreamMode nMode, StorageMode nStorageMode ) -{ - DBG_ASSERT( !m_pStorStm && !m_pOwnStg, "Use only in ctor!" ); - if( m_aName.Len() ) - { - // named storage - if( ( ( nMode & ERASEMASK ) == ERASEMASK ) ) - ::utl::UCBContentHelper::Kill( m_aName ); - - INetURLObject aObj( m_aName ); - if ( aObj.GetProtocol() == INET_PROT_NOT_VALID ) - { - String aURL; - ::utl::LocalFileHelper::ConvertPhysicalNameToURL( m_aName, aURL ); - aObj.SetURL( aURL ); - m_aName = aObj.GetMainURL( INetURLObject::NO_DECODE ); - } - - // a new unpacked storage should be created - if ( nStorageMode == STORAGE_CREATE_UNPACKED ) - { - // don't open stream readwrite, content provider may not support this ! - String aURL = UCBStorage::CreateLinkFile( m_aName ); - if ( aURL.Len() ) - { - ::ucbhelper::Content aContent( aURL, ::com::sun::star::uno::Reference < ::com::sun::star::ucb::XCommandEnvironment >() ); - m_pOwnStg = new UCBStorage( aContent, aURL, nMode, sal_False ); - } - else - { - m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - SetError( ERRCODE_IO_NOTSUPPORTED ); - } - } - else - { - // check the stream - m_pStorStm = ::utl::UcbStreamHelper::CreateStream( m_aName, nMode ); - if ( m_pStorStm && m_pStorStm->GetError() ) - DELETEZ( m_pStorStm ); - - if ( m_pStorStm ) - { - // try as UCBStorage, next try as OLEStorage - sal_Bool bIsUCBStorage = UCBStorage::IsStorageFile( m_pStorStm ); - if ( !bIsUCBStorage && bForceUCBStorage ) - // if UCBStorage has priority, it should not be used only if it is really an OLEStorage - bIsUCBStorage = !Storage::IsStorageFile( m_pStorStm ); - - if ( bIsUCBStorage ) - { - if ( UCBStorage::GetLinkedFile( *m_pStorStm ).Len() ) - { - // detect special unpacked storages - m_pOwnStg = new UCBStorage( *m_pStorStm, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - m_bDelStm = sal_True; - } - else - { - // detect special disk spanned storages - if ( UCBStorage::IsDiskSpannedFile( m_pStorStm ) ) - nMode |= STORAGE_DISKSPANNED_MODE; - - // UCBStorage always works directly on the UCB content, so discard the stream first - DELETEZ( m_pStorStm ); - m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - } - } - else - { - // OLEStorage can be opened with a stream - m_pOwnStg = new Storage( *m_pStorStm, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - m_bDelStm = sal_True; - } - } - else if ( bForceUCBStorage ) - { - m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - SetError( ERRCODE_IO_NOTSUPPORTED ); - } - else - { - m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - SetError( ERRCODE_IO_NOTSUPPORTED ); - } - } - } - else - { - // temporary storage - if ( bForceUCBStorage ) - m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - else - m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - m_aName = m_pOwnStg->GetName(); - } - - SetError( m_pOwnStg->GetError() ); - - SignAsRoot( m_pOwnStg->IsRoot() ); -} - -SotStorage::SotStorage( sal_Bool bUCBStorage, const String & rName, StreamMode nMode, StorageMode nStorageMode ) - INIT_SotStorage() -{ - m_aName = rName; - CreateStorage( bUCBStorage, nMode, nStorageMode ); - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; -} - -SotStorage::SotStorage( BaseStorage * pStor ) - INIT_SotStorage() -{ - if ( pStor ) - { - m_aName = pStor->GetName(); // Namen merken - SignAsRoot( pStor->IsRoot() ); - SetError( pStor->GetError() ); - } - - m_pOwnStg = pStor; - sal_uLong nErr = m_pOwnStg ? m_pOwnStg->GetError() : SVSTREAM_CANNOT_MAKE; - SetError( nErr ); - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; -} - -SotStorage::SotStorage( sal_Bool bUCBStorage, SvStream & rStm ) - INIT_SotStorage() -{ - SetError( rStm.GetError() ); - - // try as UCBStorage, next try as OLEStorage - if ( UCBStorage::IsStorageFile( &rStm ) || bUCBStorage ) - m_pOwnStg = new UCBStorage( rStm, sal_False ); - else - m_pOwnStg = new Storage( rStm, sal_False ); - - SetError( m_pOwnStg->GetError() ); - - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; - - SignAsRoot( m_pOwnStg->IsRoot() ); -} - -SotStorage::SotStorage( SvStream & rStm ) - INIT_SotStorage() -{ - SetError( rStm.GetError() ); - - // try as UCBStorage, next try as OLEStorage - if ( UCBStorage::IsStorageFile( &rStm ) ) - m_pOwnStg = new UCBStorage( rStm, sal_False ); - else - m_pOwnStg = new Storage( rStm, sal_False ); - - SetError( m_pOwnStg->GetError() ); - - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; - - SignAsRoot( m_pOwnStg->IsRoot() ); -} - -SotStorage::SotStorage( SvStream * pStm, sal_Bool bDelete ) - INIT_SotStorage() -{ - SetError( pStm->GetError() ); - - // try as UCBStorage, next try as OLEStorage - if ( UCBStorage::IsStorageFile( pStm ) ) - m_pOwnStg = new UCBStorage( *pStm, sal_False ); - else - m_pOwnStg = new Storage( *pStm, sal_False ); - - SetError( m_pOwnStg->GetError() ); - - m_pStorStm = pStm; - m_bDelStm = bDelete; - if ( IsOLEStorage() ) - m_nVersion = SOFFICE_FILEFORMAT_50; - - SignAsRoot( m_pOwnStg->IsRoot() ); -} - -/************************************************************************* -|* SotStorage::~SotStorage() -|* -|* Beschreibung -*************************************************************************/ -SotStorage::~SotStorage() -{ - delete m_pOwnStg; - if( m_bDelStm ) - delete m_pStorStm; -} - -/************************************************************************* -|* SotStorage::RemoveUNOStorageHolder() -|* -|* Beschreibung -*************************************************************************/ -void SotStorage::RemoveUNOStorageHolder( UNOStorageHolder* pHolder ) -{ - UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); - if ( pStg ) - { - pStg->GetUNOStorageHolderList()->remove( pHolder ); - pHolder->release(); - } - else - { - OSL_FAIL("Not implemented!"); - } -} - -/************************************************************************* -|* SotStorage::CreateMemoryStream() -|* -|* Beschreibung -*************************************************************************/ -SvMemoryStream * SotStorage::CreateMemoryStream() -{ - SvMemoryStream * pStm = NULL; - pStm = new SvMemoryStream( 0x8000, 0x8000 ); - SotStorageRef aStg = new SotStorage( *pStm ); - if( CopyTo( aStg ) ) - aStg->Commit(); - else - { - aStg.Clear(); // Storage vorher freigeben - delete pStm; - pStm = NULL; - } - return pStm; -} - -/************************************************************************* -|* SotStorage::GetStorage() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::IsStorageFile( const String & rFileName ) -{ - String aName( rFileName ); - INetURLObject aObj( aName ); - if ( aObj.GetProtocol() == INET_PROT_NOT_VALID ) - { - String aURL; - ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aURL ); - aObj.SetURL( aURL ); - aName = aObj.GetMainURL( INetURLObject::NO_DECODE ); - } - - SvStream * pStm = ::utl::UcbStreamHelper::CreateStream( aName, STREAM_STD_READ ); - sal_Bool bRet = SotStorage::IsStorageFile( pStm ); - delete pStm; - return bRet; -} - -sal_Bool SotStorage::IsStorageFile( SvStream* pStream ) -{ - /** code for new storages must come first! **/ - if ( pStream ) - { - long nPos = pStream->Tell(); - sal_Bool bRet = UCBStorage::IsStorageFile( pStream ); - if ( !bRet ) - bRet = Storage::IsStorageFile( pStream ); - pStream->Seek( nPos ); - return bRet; - } - else - return sal_False; -} -/************************************************************************* -|* SotStorage::GetStorage() -|* -|* Beschreibung -*************************************************************************/ -const String & SotStorage::GetName() const -{ - if( !m_aName.Len() ) - { - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - ((SotStorage *)this)->m_aName = m_pOwnStg->GetName(); - } - return m_aName; -} - -void SotStorage::SetName( const String& rName ) -{ - // This method is necessary because most storages will not be opened with a FileName, but an external stream instead - // This stream is a stream opened by a UCP and so aName is only used as a transport for all client code of the SotStorage - // class that depends on the fact that a root storage has a name - DBG_ASSERT( !GetName().Len(), "SetName() must not be called when the storage already has a name!" ); - m_aName = rName; -} - -/************************************************************************* -|* SotStorage::ResetError() -|* -|* Beschreibung -*************************************************************************/ -void SotStorage::ResetError() -{ - m_nError = SVSTREAM_OK; - if( m_pOwnStg ) - m_pOwnStg->ResetError(); -} - -/************************************************************************* -|* SotStorage::SetClass() -|* SotStorage::SetConvertClass() -|* -|* Beschreibung -*************************************************************************/ -void SotStorage::SetClass( const SvGlobalName & rName, - sal_uLong nOriginalClipFormat, - const String & rUserTypeName ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - m_pOwnStg->SetClass( rName, nOriginalClipFormat, rUserTypeName ); - else - SetError( SVSTREAM_GENERALERROR ); -} - -void SotStorage::SetConvertClass( const SvGlobalName & rName, - sal_uLong nOriginalClipFormat, - const String & rUserTypeName ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - m_pOwnStg->SetConvertClass( rName, nOriginalClipFormat, rUserTypeName ); - else - SetError( SVSTREAM_GENERALERROR ); -} - -/************************************************************************* -|* SotStorage::GetClassName() -|* SotStorage::GetFormat() -|* SotStorage::GetUserName() -|* SotStorage::ShouldConvert() -|* -|* Beschreibung -*************************************************************************/ -SvGlobalName SotStorage::GetClassName() -{ - SvGlobalName aGN; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - aGN = m_pOwnStg->GetClassName(); - else - SetError( SVSTREAM_GENERALERROR ); - return aGN; -} - -sal_uLong SotStorage::GetFormat() -{ - sal_uLong nFormat = 0; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - nFormat = m_pOwnStg->GetFormat(); - else - SetError( SVSTREAM_GENERALERROR ); - return nFormat; -} - -String SotStorage::GetUserName() -{ - String aName; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - aName = m_pOwnStg->GetUserName(); - else - SetError( SVSTREAM_GENERALERROR ); - return aName; -} - -sal_Bool SotStorage::ShouldConvert() -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - return m_pOwnStg->ShouldConvert(); - else - SetError( SVSTREAM_GENERALERROR ); - return sal_False; -} - -/************************************************************************* -|* SotStorage::FillInfoList() -|* -|* Beschreibung -*************************************************************************/ -void SotStorage::FillInfoList( SvStorageInfoList * pFillList ) const -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - m_pOwnStg->FillInfoList( pFillList ); -} - -/************************************************************************* -|* SotStorage::CopyTo() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::CopyTo( SotStorage * pDestStg ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - DBG_ASSERT( pDestStg->Owner(), "must be owner" ); - if( m_pOwnStg && pDestStg->m_pOwnStg ) - { - m_pOwnStg->CopyTo( pDestStg->m_pOwnStg ); - SetError( m_pOwnStg->GetError() ); - pDestStg->m_aKey = m_aKey; - pDestStg->m_nVersion = m_nVersion; - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -/************************************************************************* -|* SotStorage::Commit() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::Commit() -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - if( !m_pOwnStg->Commit() ) - SetError( m_pOwnStg->GetError() ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -/************************************************************************* -|* SotStorage::Revert() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::Revert() -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - if( !m_pOwnStg->Revert() ) - SetError( m_pOwnStg->GetError() ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -SotStorageStream * SotStorage::OpenSotStream( const String & rEleName, - StreamMode nMode, - StorageMode nStorageMode ) -{ - DBG_ASSERT( !nStorageMode, "StorageModes ignored" ); - SotStorageStream * pStm = NULL; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - // volle Ole-Patches einschalten - // egal was kommt, nur exclusiv gestattet - nMode |= STREAM_SHARE_DENYALL; - ErrCode nE = m_pOwnStg->GetError(); - BaseStorageStream * p = m_pOwnStg->OpenStream( rEleName, nMode, - (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - pStm = new SotStorageStream( p ); - - if( !nE ) - m_pOwnStg->ResetError(); // kein Fehler setzen - if( nMode & STREAM_TRUNC ) - pStm->SetSize( 0 ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return pStm; -} - -/************************************************************************* -|* SotStorage::OpenStorage() -|* -|* Beschreibung -*************************************************************************/ -SotStorage * SotStorage::OpenSotStorage( const String & rEleName, - StreamMode nMode, - StorageMode nStorageMode ) -{ - SotStorage * pStor = NULL; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - nMode |= STREAM_SHARE_DENYALL; - ErrCode nE = m_pOwnStg->GetError(); - BaseStorage * p = m_pOwnStg->OpenStorage( rEleName, nMode, - (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - if( p ) - { - pStor = new SotStorage( p ); - if( !nE ) - m_pOwnStg->ResetError(); // kein Fehler setzen - - return pStor; - } - } - - SetError( SVSTREAM_GENERALERROR ); - - return NULL; -} - -SotStorage * SotStorage::OpenUCBStorage( const String & rEleName, - StreamMode nMode, - StorageMode nStorageMode ) -{ - SotStorage * pStor = NULL; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - nMode |= STREAM_SHARE_DENYALL; - ErrCode nE = m_pOwnStg->GetError(); - BaseStorage * p = m_pOwnStg->OpenUCBStorage( rEleName, nMode, - (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - pStor = new SotStorage( p ); - if( !nE ) - m_pOwnStg->ResetError(); // kein Fehler setzen - } - else - SetError( SVSTREAM_GENERALERROR ); - return pStor; -} - -SotStorage * SotStorage::OpenOLEStorage( const String & rEleName, - StreamMode nMode, - StorageMode nStorageMode ) -{ - SotStorage * pStor = NULL; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - nMode |= STREAM_SHARE_DENYALL; - ErrCode nE = m_pOwnStg->GetError(); - BaseStorage * p = m_pOwnStg->OpenOLEStorage( rEleName, nMode, - (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); - pStor = new SotStorage( p ); - if( !nE ) - m_pOwnStg->ResetError(); // kein Fehler setzen - } - else - SetError( SVSTREAM_GENERALERROR ); - return pStor; -} - -/************************************************************************* -|* SotStorage::IsStream() -|* SotStorage::IsStorage() -|* SotStorage::IsContained() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::IsStorage( const String & rEleName ) const -{ - DBG_ASSERT( Owner(), "must be owner" ); - // ein bisschen schneller - if( m_pOwnStg ) - return m_pOwnStg->IsStorage( rEleName ); - return sal_False; -} - -sal_Bool SotStorage::IsStream( const String & rEleName ) const -{ - DBG_ASSERT( Owner(), "must be owner" ); - // ein bisschen schneller - if( m_pOwnStg ) - return m_pOwnStg->IsStream( rEleName ); - return sal_False; -} - -sal_Bool SotStorage::IsContained( const String & rEleName ) const -{ - DBG_ASSERT( Owner(), "must be owner" ); - // ein bisschen schneller - if( m_pOwnStg ) - return m_pOwnStg->IsContained( rEleName ); - return sal_False; -} - -/************************************************************************* -|* SotStorage::Remove() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::Remove( const String & rEleName ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - m_pOwnStg->Remove( rEleName ); - SetError( m_pOwnStg->GetError() ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -/************************************************************************* -|* SotStorage::Rename() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::Rename( const String & rEleName, const String & rNewName ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - { - m_pOwnStg->Rename( rEleName, rNewName ); - SetError( m_pOwnStg->GetError() ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -/************************************************************************* -|* SotStorage::CopyTo() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::CopyTo( const String & rEleName, - SotStorage * pNewSt, const String & rNewName ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - DBG_ASSERT( pNewSt->Owner(), "must be owner" ); - if( m_pOwnStg ) - { - m_pOwnStg->CopyTo( rEleName, pNewSt->m_pOwnStg, rNewName ); - SetError( m_pOwnStg->GetError() ); - SetError( pNewSt->GetError() ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -/************************************************************************* -|* SotStorage::MoveTo() -|* -|* Beschreibung -*************************************************************************/ -sal_Bool SotStorage::MoveTo( const String & rEleName, - SotStorage * pNewSt, const String & rNewName ) -{ - DBG_ASSERT( Owner(), "must be owner" ); - DBG_ASSERT( pNewSt->Owner(), "must be owner" ); - if( m_pOwnStg ) - { - m_pOwnStg->MoveTo( rEleName, pNewSt->m_pOwnStg, rNewName ); - SetError( m_pOwnStg->GetError() ); - SetError( pNewSt->GetError() ); - } - else - SetError( SVSTREAM_GENERALERROR ); - return SVSTREAM_OK == GetError(); -} - -const SvStream* SotStorage::GetSvStream() -{ - const SvStream* pResult = 0; - DBG_ASSERT( Owner(), "must be owner" ); - if( m_pOwnStg ) - pResult = m_pOwnStg->GetSvStream(); - return pResult; -} - -sal_Bool SotStorage::Validate() -{ - DBG_ASSERT( m_bIsRoot, "Validate nur an Rootstorage" ); - if( m_pOwnStg ) - return m_pOwnStg->ValidateFAT(); - else - return sal_True; -} - -sal_Bool SotStorage::SetProperty( const String& rName, const ::com::sun::star::uno::Any& rValue ) -{ - UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); - if ( pStg ) - { - return pStg->SetProperty( rName, rValue ); - } - else - { - DBG_WARNING("W1:Not implemented!"); - return sal_False; - } -} - -sal_Bool SotStorage::GetProperty( const String& rName, ::com::sun::star::uno::Any& rValue ) -{ - UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); - if ( pStg ) - { - return pStg->GetProperty( rName, rValue ); - } - else if ( rName.CompareToAscii("MediaType") == COMPARE_EQUAL ) - { - String aStr = SotExchange::GetFormatMimeType( GetFormat() ); - sal_uInt16 nPos = aStr.Search(';'); - if ( nPos != STRING_NOTFOUND ) - aStr = aStr.Copy( 0, nPos ); - rValue <<= (::rtl::OUString) aStr; - return sal_True; - } - else - { - DBG_WARNING("W1:Not implemented!"); - return sal_False; - } -} - -sal_Bool SotStorage::GetProperty( const String& rEleName, const String& rName, ::com::sun::star::uno::Any& rValue ) -{ - UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); - if ( pStg ) - { - return pStg->GetProperty( rEleName, rName, rValue ); - } - else - { - DBG_WARNING("W1:Not implemented!"); - return sal_False; - } -} - -sal_Bool SotStorage::IsOLEStorage() const -{ - UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); - return !pStg; -} - -sal_Bool SotStorage::IsOLEStorage( const String & rFileName ) -{ - return Storage::IsStorageFile( rFileName ); -} - -sal_Bool SotStorage::IsOLEStorage( SvStream* pStream ) -{ - return Storage::IsStorageFile( pStream ); -} - -void SotStorage::SetKey( const ByteString& rKey ) -{ - m_aKey = rKey; - if ( !IsOLEStorage() ) - { - sal_uInt8 aBuffer[RTL_DIGEST_LENGTH_SHA1]; - rtlDigestError nError = rtl_digest_SHA1( m_aKey.GetBuffer(), m_aKey.Len(), aBuffer, RTL_DIGEST_LENGTH_SHA1 ); - if ( nError == rtl_Digest_E_None ) - { - sal_uInt8* pBuffer = aBuffer; - ::com::sun::star::uno::Sequence < sal_Int8 > aSequ( (sal_Int8*) pBuffer, RTL_DIGEST_LENGTH_SHA1 ); - ::com::sun::star::uno::Any aAny; - aAny <<= aSequ; - SetProperty( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EncryptionKey")), aAny ); - } - } -} - -SotStorage* SotStorage::OpenOLEStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage, - const String& rEleName, StreamMode nMode ) -{ - sal_Int32 nEleMode = embed::ElementModes::SEEKABLEREAD; - if ( nMode & STREAM_WRITE ) - nEleMode |= embed::ElementModes::WRITE; - if ( nMode & STREAM_TRUNC ) - nEleMode |= embed::ElementModes::TRUNCATE; - if ( nMode & STREAM_NOCREATE ) - nEleMode |= embed::ElementModes::NOCREATE; - - SvStream* pStream = NULL; - try - { - uno::Reference < io::XStream > xStream = xStorage->openStreamElement( rEleName, nEleMode ); - - // TODO/LATER: should it be done this way? - if ( nMode & STREAM_WRITE ) - { - uno::Reference < beans::XPropertySet > xStreamProps( xStream, uno::UNO_QUERY_THROW ); - xStreamProps->setPropertyValue( - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ), - uno::makeAny( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.star.oleobject" ) ) ) ); - } - - pStream = utl::UcbStreamHelper::CreateStream( xStream ); - } - catch ( uno::Exception& ) - { - //TODO/LATER: ErrorHandling - pStream = new SvMemoryStream; - pStream->SetError( ERRCODE_IO_GENERAL ); - } - - return new SotStorage( pStream, sal_True ); -} - -sal_Int32 SotStorage::GetFormatID( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage ) -{ - uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY ); - if ( !xProps.is() ) - return 0; - - ::rtl::OUString aMediaType; - xProps->getPropertyValue( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MediaType")) ) >>= aMediaType; - if ( aMediaType.getLength() ) - { - ::com::sun::star::datatransfer::DataFlavor aDataFlavor; - aDataFlavor.MimeType = aMediaType; - return SotExchange::GetFormat( aDataFlavor ); - } - - return 0; -} - -sal_Int32 SotStorage::GetVersion( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage ) -{ - sal_Int32 nSotFormatID = SotStorage::GetFormatID( xStorage ); - switch( nSotFormatID ) - { - case SOT_FORMATSTR_ID_STARWRITER_8: - case SOT_FORMATSTR_ID_STARWRITER_8_TEMPLATE: - case SOT_FORMATSTR_ID_STARWRITERWEB_8: - case SOT_FORMATSTR_ID_STARWRITERGLOB_8: - case SOT_FORMATSTR_ID_STARDRAW_8: - case SOT_FORMATSTR_ID_STARDRAW_8_TEMPLATE: - case SOT_FORMATSTR_ID_STARIMPRESS_8: - case SOT_FORMATSTR_ID_STARIMPRESS_8_TEMPLATE: - case SOT_FORMATSTR_ID_STARCALC_8: - case SOT_FORMATSTR_ID_STARCALC_8_TEMPLATE: - case SOT_FORMATSTR_ID_STARCHART_8: - case SOT_FORMATSTR_ID_STARCHART_8_TEMPLATE: - case SOT_FORMATSTR_ID_STARMATH_8: - case SOT_FORMATSTR_ID_STARMATH_8_TEMPLATE: - return SOFFICE_FILEFORMAT_8; - case SOT_FORMATSTR_ID_STARWRITER_60: - case SOT_FORMATSTR_ID_STARWRITERWEB_60: - case SOT_FORMATSTR_ID_STARWRITERGLOB_60: - case SOT_FORMATSTR_ID_STARDRAW_60: - case SOT_FORMATSTR_ID_STARIMPRESS_60: - case SOT_FORMATSTR_ID_STARCALC_60: - case SOT_FORMATSTR_ID_STARCHART_60: - case SOT_FORMATSTR_ID_STARMATH_60: - return SOFFICE_FILEFORMAT_60; - } - - return 0; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |