LCOV - code coverage report
Current view: top level - sot/source/sdstor - storage.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 262 456 57.5 %
Date: 2014-11-03 Functions: 40 95 42.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/uno/Sequence.hxx>
      21             : #include <com/sun/star/lang/XSingleServiceFactory.hpp>
      22             : #include <com/sun/star/embed/XStorage.hpp>
      23             : #include <com/sun/star/embed/ElementModes.hpp>
      24             : #include <com/sun/star/beans/XPropertySet.hpp>
      25             : 
      26             : #include <rtl/digest.h>
      27             : #include <osl/file.hxx>
      28             : #include <sot/stg.hxx>
      29             : #include <sot/storinfo.hxx>
      30             : #include <sot/storage.hxx>
      31             : #include <sot/formats.hxx>
      32             : #include <sot/exchange.hxx>
      33             : #include <unotools/ucbstreamhelper.hxx>
      34             : #include <tools/debug.hxx>
      35             : #include <tools/urlobj.hxx>
      36             : #include <unotools/localfilehelper.hxx>
      37             : #include <unotools/ucbhelper.hxx>
      38             : #include <comphelper/processfactory.hxx>
      39             : #include <boost/scoped_array.hpp>
      40             : #include <boost/scoped_ptr.hpp>
      41             : 
      42             : using namespace ::com::sun::star;
      43             : 
      44             : /************** class SotStorageStream ***********************************/
      45           0 : class SotStorageStreamFactory : public SotFactory
      46             : {
      47             : public:
      48             :          TYPEINFO_OVERRIDE();
      49           0 :         SotStorageStreamFactory( const SvGlobalName & rName,
      50             :                                  const OUString & rClassName,
      51             :                                  CreateInstanceType pCreateFuncP )
      52           0 :             : SotFactory( rName, rClassName, pCreateFuncP )
      53           0 :         {}
      54             : };
      55           0 : TYPEINIT1(SotStorageStreamFactory,SotFactory);
      56             : 
      57             : 
      58           0 : SO2_IMPL_BASIC_CLASS1_DLL(SotStorageStream,SotStorageStreamFactory,SotObject,
      59             :                         SvGlobalName( 0xd7deb420, 0xf902, 0x11d0,
      60             :                             0xaa, 0xa1, 0x0, 0xa0, 0x24, 0x9d, 0x55, 0x90 ) )
      61             : 
      62           0 : SvLockBytesRef MakeLockBytes_Impl( const OUString & rName, StreamMode nMode )
      63             : {
      64           0 :     SvLockBytesRef xLB;
      65           0 :     if( !rName.isEmpty() )
      66             :     {
      67           0 :         SvStream * pFileStm = new SvFileStream( rName, nMode );
      68           0 :         xLB = new SvLockBytes( pFileStm, true );
      69             :     }
      70             :     else
      71             :     {
      72           0 :         SvStream * pCacheStm = new SvMemoryStream();
      73           0 :         xLB = new SvLockBytes( pCacheStm, true );
      74             :     }
      75           0 :     return xLB;
      76             : }
      77             : 
      78           0 : SotStorageStream::SotStorageStream( const OUString & rName, StreamMode nMode,
      79             :                                     StorageMode
      80             :                                     #ifdef DBG_UTIL
      81             :                                     nStorageMode
      82             :                                     #endif
      83             :                                   )
      84             :     : SvStream( MakeLockBytes_Impl( rName, nMode ) )
      85           0 :     , pOwnStm( NULL )
      86             : {
      87           0 :     if( nMode & STREAM_WRITE )
      88           0 :         bIsWritable = true;
      89             :     else
      90           0 :         bIsWritable = false;
      91             : 
      92             :     DBG_ASSERT( !nStorageMode,"StorageModes ignored" );
      93           0 : }
      94             : 
      95        2456 : SotStorageStream::SotStorageStream( BaseStorageStream * pStm )
      96             : {
      97        2456 :     if( pStm )
      98             :     {
      99        2456 :         if( STREAM_WRITE & pStm->GetMode() )
     100         702 :             bIsWritable = true;
     101             :         else
     102        1754 :             bIsWritable = false;
     103             : 
     104        2456 :         pOwnStm = pStm;
     105        2456 :         SetError( pStm->GetError() );
     106        2456 :         pStm->ResetError();
     107             :     }
     108             :     else
     109             :     {
     110           0 :         pOwnStm = NULL;
     111           0 :         bIsWritable = true;
     112           0 :         SetError( SVSTREAM_INVALID_PARAMETER );
     113             :     }
     114        2456 : }
     115             : 
     116           0 : SotStorageStream::SotStorageStream()
     117           0 :     : pOwnStm( NULL )
     118             : {
     119             :     // ??? wenn Init virtuell ist, entsprechen setzen
     120           0 :     bIsWritable = true;
     121           0 : }
     122             : 
     123        7368 : SotStorageStream::~SotStorageStream()
     124             : {
     125        2456 :     Flush(); //SetBufferSize(0);
     126        2456 :     delete pOwnStm;
     127        4912 : }
     128             : 
     129           0 : void SotStorageStream::ResetError()
     130             : {
     131           0 :     SvStream::ResetError();
     132           0 :     if( pOwnStm )
     133           0 :          pOwnStm->ResetError();
     134           0 : }
     135             : 
     136     2174836 : sal_uLong SotStorageStream::GetData( void* pData, sal_uLong nSize )
     137             : {
     138     2174836 :     sal_uLong nRet = 0;
     139             : 
     140     2174836 :     if( pOwnStm )
     141             :     {
     142     2174836 :         nRet = pOwnStm->Read( pData, nSize );
     143     2174836 :         SetError( pOwnStm->GetError() );
     144             :     }
     145             :     else
     146           0 :         nRet = SvStream::GetData( (sal_Char *)pData, nSize );
     147             : 
     148     2174836 :     return nRet;
     149             : }
     150             : 
     151       17258 : sal_uLong SotStorageStream::PutData( const void* pData, sal_uLong nSize )
     152             : {
     153       17258 :     sal_uLong nRet = 0;
     154             : 
     155       17258 :     if( pOwnStm )
     156             :     {
     157       17258 :         nRet = pOwnStm->Write( pData, nSize );
     158       17258 :         SetError( pOwnStm->GetError() );
     159             :     }
     160             :     else
     161           0 :         nRet = SvStream::PutData( (sal_Char *)pData, nSize );
     162       17258 :     return nRet;
     163             : }
     164             : 
     165     1598994 : sal_uInt64 SotStorageStream::SeekPos(sal_uInt64 nPos)
     166             : {
     167     1598994 :     sal_uLong nRet = 0;
     168             : 
     169     1598994 :     if( pOwnStm )
     170             :     {
     171     1598994 :         nRet = pOwnStm->Seek( nPos );
     172     1598994 :         SetError( pOwnStm->GetError() );
     173             :     }
     174             :     else
     175           0 :         nRet = SvStream::SeekPos( nPos );
     176             : 
     177     1598994 :     return nRet;
     178             : }
     179             : 
     180         812 : void SotStorageStream::FlushData()
     181             : {
     182         812 :     if( pOwnStm )
     183             :     {
     184         812 :         pOwnStm->Flush();
     185         812 :         SetError( pOwnStm->GetError() );
     186             :     }
     187             :     else
     188           0 :         SvStream::FlushData();
     189         812 : }
     190             : 
     191         150 : void SotStorageStream::SetSize(sal_uInt64 const nNewSize)
     192             : {
     193         150 :     sal_uInt64 const nPos = Tell();
     194         150 :     if( pOwnStm )
     195             :     {
     196         150 :         pOwnStm->SetSize( nNewSize );
     197         150 :         SetError( pOwnStm->GetError() );
     198             :     }
     199             :     else
     200           0 :         SvStream::SetSize( nNewSize );
     201             : 
     202         150 :     if( nNewSize < nPos )
     203             :         // ans Ende setzen
     204           0 :         Seek( nNewSize );
     205         150 : }
     206             : 
     207         122 : sal_uInt32 SotStorageStream::GetSize() const
     208             : {
     209         122 :     sal_uLong nPos = Tell();
     210         122 :     ((SotStorageStream *)this)->Seek( STREAM_SEEK_TO_END );
     211         122 :     sal_uLong nSize = Tell();
     212         122 :     ((SotStorageStream *)this)->Seek( nPos );
     213         122 :     return nSize;
     214             : }
     215             : 
     216       23366 : sal_uInt64 SotStorageStream::remainingSize()
     217             : {
     218       23366 :     if (pOwnStm)
     219       23366 :         return pOwnStm->GetSize() - Tell();
     220             : 
     221           0 :     return SvStream::remainingSize();
     222             : }
     223             : 
     224           0 : bool SotStorageStream::CopyTo( SotStorageStream * pDestStm )
     225             : {
     226           0 :     Flush(); // alle Daten schreiben
     227           0 :     pDestStm->ClearBuffer();
     228           0 :     if( !pOwnStm || !pDestStm->pOwnStm )
     229             :     {
     230             :         // Wenn Ole2 oder nicht nur eigene StorageStreams
     231           0 :         sal_uLong nPos = Tell();    // Position merken
     232           0 :         Seek( 0L );
     233           0 :         pDestStm->SetSize( 0 ); // Ziel-Stream leeren
     234             : 
     235           0 :         boost::scoped_array<sal_uInt8> pMem(new sal_uInt8[ 8192 ]);
     236             :         sal_uLong  nRead;
     237           0 :         while( 0 != (nRead = Read( pMem.get(), 8192 )) )
     238             :         {
     239           0 :             if( nRead != pDestStm->Write( pMem.get(), nRead ) )
     240             :             {
     241           0 :                 SetError( SVSTREAM_GENERALERROR );
     242           0 :                 break;
     243             :             }
     244             :         }
     245           0 :         pMem.reset();
     246             :         // Position setzen
     247           0 :         pDestStm->Seek( nPos );
     248           0 :         Seek( nPos );
     249             :     }
     250             :     else
     251             :     {
     252           0 :         pOwnStm->CopyTo( pDestStm->pOwnStm );
     253           0 :         SetError( pOwnStm->GetError() );
     254             :     }
     255           0 :     return GetError() == SVSTREAM_OK;
     256             : }
     257             : 
     258          30 : bool SotStorageStream::Commit()
     259             : {
     260          30 :     if( pOwnStm )
     261             :     {
     262          30 :         pOwnStm->Flush();
     263          30 :         if( pOwnStm->GetError() == SVSTREAM_OK )
     264          30 :             pOwnStm->Commit();
     265          30 :         SetError( pOwnStm->GetError() );
     266             :     }
     267          30 :     return GetError() == SVSTREAM_OK;
     268             : }
     269             : 
     270           0 : bool SotStorageStream::Revert()
     271             : {
     272           0 :     if( pOwnStm )
     273             :     {
     274           0 :         pOwnStm->Revert();
     275           0 :         SetError( pOwnStm->GetError() );
     276             :     }
     277           0 :     return GetError() == SVSTREAM_OK;
     278             : }
     279             : 
     280           0 : bool SotStorageStream::SetProperty( const OUString& rName, const ::com::sun::star::uno::Any& rValue )
     281             : {
     282           0 :     UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm );
     283           0 :     if ( pStg )
     284             :     {
     285           0 :         return pStg->SetProperty( rName, rValue );
     286             :     }
     287             :     else
     288             :     {
     289             :         OSL_FAIL("Not implemented!");
     290           0 :         return false;
     291             :     }
     292             : }
     293             : 
     294             : /************** class SotStorage ******************************************
     295             : *************************************************************************/
     296           0 : class SotStorageFactory : public SotFactory
     297             : {
     298             : public:
     299             :          TYPEINFO_OVERRIDE();
     300           0 :         SotStorageFactory( const SvGlobalName & rName,
     301             :                            const OUString & rClassName,
     302             :                            CreateInstanceType pCreateFuncP )
     303           0 :             : SotFactory( rName, rClassName, pCreateFuncP )
     304           0 :         {}
     305             : };
     306           0 : TYPEINIT1(SotStorageFactory,SotFactory);
     307             : 
     308             : 
     309           0 : SO2_IMPL_BASIC_CLASS1_DLL(SotStorage,SotStorageFactory,SotObject,
     310             :                           SvGlobalName( 0x980ce7e0, 0xf905, 0x11d0,
     311             :                                         0xaa, 0xa1, 0x0, 0xa0, 0x24, 0x9d, 0x55, 0x90 ) )
     312             : 
     313             : /************************************************************************
     314             : |*
     315             : |*    SotStorage::SotStorage()
     316             : |*
     317             : |*    Beschreibung      Es muss ein I... Objekt an SvObject uebergeben
     318             : |*                      werden, da es sonst selbst ein IUnknown anlegt und
     319             : |*                      festlegt, dass alle weiteren I... Objekte mit
     320             : |*                      delete zerstoert werden (Owner() == true).
     321             : |*                      Es werden aber nur IStorage Objekte benutzt und nicht
     322             : |*                      selbst implementiert, deshalb wird so getan, als ob
     323             : |*                      das IStorage Objekt von aussen kam und es wird mit
     324             : |*                      Release() freigegeben.
     325             : |*                      Die CreateStorage Methoden werden benoetigt, um
     326             : |*                      ein IStorage Objekt vor dem Aufruf von SvObject
     327             : |*                      zu erzeugen (Own, !Own automatik).
     328             : |*                      Hat CreateStorage ein Objekt erzeugt, dann wurde
     329             : |*                      der RefCounter schon um 1 erhoet.
     330             : |*                      Die Uebergabe erfolgt in pStorageCTor. Die Variable
     331             : |*                      ist NULL, wenn es nicht geklappt hat.
     332             : |*
     333             : *************************************************************************/
     334             : #define INIT_SotStorage()                     \
     335             :     : m_pOwnStg( NULL )                       \
     336             :     , m_pStorStm( NULL )                      \
     337             :     , m_nError( SVSTREAM_OK )                 \
     338             :     , m_bIsRoot( false )                      \
     339             :     , m_bDelStm( false )                      \
     340             :     , m_nVersion( SOFFICE_FILEFORMAT_CURRENT )
     341             : 
     342           0 : SotStorage::SotStorage()
     343           0 :     INIT_SotStorage()
     344             : {
     345             :     // ??? What's this ???
     346           0 : }
     347             : 
     348             : #define ERASEMASK  ( STREAM_TRUNC | STREAM_WRITE | STREAM_SHARE_DENYALL )
     349             : #include <com/sun/star/uno/Reference.h>
     350             : #include <com/sun/star/ucb/XCommandEnvironment.hpp>
     351             : #include <ucbhelper/content.hxx>
     352             : 
     353        3642 : SotStorage::SotStorage( const OUString & rName, StreamMode nMode, StorageMode nStorageMode )
     354        3642 :     INIT_SotStorage()
     355             : {
     356        3642 :     m_aName = rName; // Namen merken
     357        3642 :     CreateStorage( true, nMode, nStorageMode );
     358        3642 :     if ( IsOLEStorage() )
     359           0 :         m_nVersion = SOFFICE_FILEFORMAT_50;
     360        3642 : }
     361             : 
     362        3664 : void SotStorage::CreateStorage( bool bForceUCBStorage, StreamMode nMode, StorageMode nStorageMode  )
     363             : {
     364             :     DBG_ASSERT( !m_pStorStm && !m_pOwnStg, "Use only in ctor!" );
     365        3664 :     if( !m_aName.isEmpty() )
     366             :     {
     367             :         // named storage
     368          22 :         if( ( ( nMode & ERASEMASK ) == ERASEMASK ) )
     369           0 :             ::utl::UCBContentHelper::Kill( m_aName );
     370             : 
     371          22 :         INetURLObject aObj( m_aName );
     372          22 :         if ( aObj.GetProtocol() == INET_PROT_NOT_VALID )
     373             :         {
     374           0 :             OUString aURL;
     375           0 :             ::utl::LocalFileHelper::ConvertPhysicalNameToURL( m_aName, aURL );
     376           0 :             aObj.SetURL( aURL );
     377           0 :             m_aName = aObj.GetMainURL( INetURLObject::NO_DECODE );
     378             :         }
     379             : 
     380             :         // a new unpacked storage should be created
     381          22 :         if ( nStorageMode == STORAGE_CREATE_UNPACKED )
     382             :         {
     383             :             // don't open stream readwrite, content provider may not support this !
     384           0 :             OUString aURL = UCBStorage::CreateLinkFile( m_aName );
     385           0 :             if ( !aURL.isEmpty() )
     386             :             {
     387           0 :                 ::ucbhelper::Content aContent( aURL, ::com::sun::star::uno::Reference < ::com::sun::star::ucb::XCommandEnvironment >(), comphelper::getProcessComponentContext() );
     388           0 :                 m_pOwnStg = new UCBStorage( aContent, aURL, nMode, false );
     389             :             }
     390             :             else
     391             :             {
     392           0 :                 m_pOwnStg = new Storage( m_aName, nMode, false );
     393           0 :                 SetError( ERRCODE_IO_NOTSUPPORTED );
     394           0 :             }
     395             :         }
     396             :         else
     397             :         {
     398             :             // check the stream
     399          22 :             m_pStorStm = ::utl::UcbStreamHelper::CreateStream( m_aName, nMode );
     400          22 :             if ( m_pStorStm && m_pStorStm->GetError() )
     401           0 :                 DELETEZ( m_pStorStm );
     402             : 
     403          22 :             if ( m_pStorStm )
     404             :             {
     405             :                 // try as UCBStorage, next try as OLEStorage
     406          22 :                 bool bIsUCBStorage = UCBStorage::IsStorageFile( m_pStorStm );
     407          22 :                 if ( !bIsUCBStorage && bForceUCBStorage )
     408             :                     // if UCBStorage has priority, it should not be used only if it is really an OLEStorage
     409           0 :                     bIsUCBStorage = !Storage::IsStorageFile( m_pStorStm );
     410             : 
     411          22 :                 if ( bIsUCBStorage )
     412             :                 {
     413           0 :                     if ( !(UCBStorage::GetLinkedFile( *m_pStorStm ).isEmpty()) )
     414             :                     {
     415             :                         // detect special unpacked storages
     416           0 :                         m_pOwnStg = new UCBStorage( *m_pStorStm, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     417           0 :                         m_bDelStm = true;
     418             :                     }
     419             :                     else
     420             :                     {
     421             :                         // detect special disk spanned storages
     422           0 :                         if ( UCBStorage::IsDiskSpannedFile( m_pStorStm ) )
     423           0 :                             nMode |= STORAGE_DISKSPANNED_MODE;
     424             : 
     425             :                         // UCBStorage always works directly on the UCB content, so discard the stream first
     426           0 :                         DELETEZ( m_pStorStm );
     427           0 :                         m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     428             :                     }
     429             :                 }
     430             :                 else
     431             :                 {
     432             :                     // OLEStorage can be opened with a stream
     433          22 :                     m_pOwnStg = new Storage( *m_pStorStm, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     434          22 :                     m_bDelStm = true;
     435             :                 }
     436             :             }
     437           0 :             else if ( bForceUCBStorage )
     438             :             {
     439           0 :                 m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     440           0 :                 SetError( ERRCODE_IO_NOTSUPPORTED );
     441             :             }
     442             :             else
     443             :             {
     444           0 :                 m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     445           0 :                 SetError( ERRCODE_IO_NOTSUPPORTED );
     446             :             }
     447          22 :         }
     448             :     }
     449             :     else
     450             :     {
     451             :         // temporary storage
     452        3642 :         if ( bForceUCBStorage )
     453        3642 :             m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     454             :         else
     455           0 :             m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     456        3642 :         m_aName = m_pOwnStg->GetName();
     457             :     }
     458             : 
     459        3664 :     SetError( m_pOwnStg->GetError() );
     460             : 
     461        3664 :     SignAsRoot( m_pOwnStg->IsRoot() );
     462        3664 : }
     463             : 
     464          22 : SotStorage::SotStorage( bool bUCBStorage, const OUString & rName, StreamMode nMode, StorageMode nStorageMode )
     465          22 :     INIT_SotStorage()
     466             : {
     467          22 :     m_aName = rName;
     468          22 :     CreateStorage( bUCBStorage, nMode, nStorageMode );
     469          22 :     if ( IsOLEStorage() )
     470          22 :         m_nVersion = SOFFICE_FILEFORMAT_50;
     471          22 : }
     472             : 
     473         268 : SotStorage::SotStorage( BaseStorage * pStor )
     474         268 :     INIT_SotStorage()
     475             : {
     476         268 :     if ( pStor )
     477             :     {
     478         268 :         m_aName = pStor->GetName(); // Namen merken
     479         268 :         SignAsRoot( pStor->IsRoot() );
     480         268 :         SetError( pStor->GetError() );
     481             :     }
     482             : 
     483         268 :     m_pOwnStg = pStor;
     484         268 :     sal_uLong nErr = m_pOwnStg ? m_pOwnStg->GetError() : SVSTREAM_CANNOT_MAKE;
     485         268 :     SetError( nErr );
     486         268 :     if ( IsOLEStorage() )
     487         268 :         m_nVersion = SOFFICE_FILEFORMAT_50;
     488         268 : }
     489             : 
     490          24 : SotStorage::SotStorage( bool bUCBStorage, SvStream & rStm )
     491          24 :     INIT_SotStorage()
     492             : {
     493          24 :     SetError( rStm.GetError() );
     494             : 
     495             :     // try as UCBStorage, next try as OLEStorage
     496          24 :     if ( UCBStorage::IsStorageFile( &rStm ) || bUCBStorage )
     497           0 :         m_pOwnStg = new UCBStorage( rStm, false );
     498             :     else
     499          24 :         m_pOwnStg = new Storage( rStm, false );
     500             : 
     501          24 :     SetError( m_pOwnStg->GetError() );
     502             : 
     503          24 :     if ( IsOLEStorage() )
     504          24 :         m_nVersion = SOFFICE_FILEFORMAT_50;
     505             : 
     506          24 :     SignAsRoot( m_pOwnStg->IsRoot() );
     507          24 : }
     508             : 
     509         230 : SotStorage::SotStorage( SvStream & rStm )
     510         230 :     INIT_SotStorage()
     511             : {
     512         230 :     SetError( rStm.GetError() );
     513             : 
     514             :     // try as UCBStorage, next try as OLEStorage
     515         230 :     if ( UCBStorage::IsStorageFile( &rStm ) )
     516           0 :         m_pOwnStg = new UCBStorage( rStm, false );
     517             :     else
     518         230 :         m_pOwnStg = new Storage( rStm, false );
     519             : 
     520         230 :     SetError( m_pOwnStg->GetError() );
     521             : 
     522         230 :     if ( IsOLEStorage() )
     523         230 :         m_nVersion = SOFFICE_FILEFORMAT_50;
     524             : 
     525         230 :     SignAsRoot( m_pOwnStg->IsRoot() );
     526         230 : }
     527             : 
     528        1246 : SotStorage::SotStorage( SvStream * pStm, bool bDelete )
     529        1246 :     INIT_SotStorage()
     530             : {
     531        1246 :     SetError( pStm->GetError() );
     532             : 
     533             :     // try as UCBStorage, next try as OLEStorage
     534        1246 :     if ( UCBStorage::IsStorageFile( pStm ) )
     535          60 :         m_pOwnStg = new UCBStorage( *pStm, false );
     536             :     else
     537        1186 :         m_pOwnStg = new Storage( *pStm, false );
     538             : 
     539        1246 :     SetError( m_pOwnStg->GetError() );
     540             : 
     541        1246 :     m_pStorStm = pStm;
     542        1246 :     m_bDelStm = bDelete;
     543        1246 :     if ( IsOLEStorage() )
     544        1186 :         m_nVersion = SOFFICE_FILEFORMAT_50;
     545             : 
     546        1246 :     SignAsRoot( m_pOwnStg->IsRoot() );
     547        1246 : }
     548             : 
     549       16296 : SotStorage::~SotStorage()
     550             : {
     551        5432 :     delete m_pOwnStg;
     552        5432 :     if( m_bDelStm )
     553         120 :         delete m_pStorStm;
     554       10864 : }
     555             : 
     556           0 : SvMemoryStream * SotStorage::CreateMemoryStream()
     557             : {
     558           0 :     SvMemoryStream * pStm = NULL;
     559           0 :     pStm = new SvMemoryStream( 0x8000, 0x8000 );
     560           0 :     SotStorageRef aStg = new SotStorage( *pStm );
     561           0 :     if( CopyTo( aStg ) )
     562             :     {
     563           0 :         aStg->Commit();
     564             :     }
     565             :     else
     566             :     {
     567           0 :         aStg.Clear(); // Storage vorher freigeben
     568           0 :         delete pStm;
     569           0 :         pStm = NULL;
     570             :     }
     571           0 :     return pStm;
     572             : }
     573             : 
     574          64 : bool SotStorage::IsStorageFile( const OUString & rFileName )
     575             : {
     576          64 :     OUString aName( rFileName );
     577         128 :     INetURLObject aObj( aName );
     578          64 :     if ( aObj.GetProtocol() == INET_PROT_NOT_VALID )
     579             :     {
     580           0 :         OUString aURL;
     581           0 :         ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aURL );
     582           0 :         aObj.SetURL( aURL );
     583           0 :         aName = aObj.GetMainURL( INetURLObject::NO_DECODE );
     584             :     }
     585             : 
     586         128 :     boost::scoped_ptr<SvStream> pStm(::utl::UcbStreamHelper::CreateStream( aName, STREAM_STD_READ ));
     587          64 :     bool bRet = SotStorage::IsStorageFile( pStm.get() );
     588         128 :     return bRet;
     589             : }
     590             : 
     591         858 : bool SotStorage::IsStorageFile( SvStream* pStream )
     592             : {
     593             :     /** code for new storages must come first! **/
     594         858 :     if ( pStream )
     595             :     {
     596         858 :         long nPos = pStream->Tell();
     597         858 :         bool bRet = UCBStorage::IsStorageFile( pStream );
     598         858 :         if ( !bRet )
     599         838 :             bRet = Storage::IsStorageFile( pStream );
     600         858 :         pStream->Seek( nPos );
     601         858 :         return bRet;
     602             :     }
     603             :     else
     604           0 :         return false;
     605             : }
     606             : 
     607        3642 : const OUString & SotStorage::GetName() const
     608             : {
     609        3642 :     if( m_aName.isEmpty() )
     610             :     {
     611             :         DBG_ASSERT( Owner(), "must be owner" );
     612           0 :         if( m_pOwnStg )
     613           0 :             ((SotStorage *)this)->m_aName = m_pOwnStg->GetName();
     614             :     }
     615        3642 :     return m_aName;
     616             : }
     617             : 
     618             : 
     619           0 : void SotStorage::ResetError()
     620             : {
     621           0 :     m_nError = SVSTREAM_OK;
     622           0 :     if( m_pOwnStg )
     623           0 :         m_pOwnStg->ResetError();
     624           0 : }
     625             : 
     626          62 : void SotStorage::SetClass( const SvGlobalName & rName,
     627             :                            sal_uLong nOriginalClipFormat,
     628             :                            const OUString & rUserTypeName )
     629             : {
     630             :     DBG_ASSERT( Owner(), "must be owner" );
     631          62 :     if( m_pOwnStg )
     632          62 :         m_pOwnStg->SetClass( rName, nOriginalClipFormat, rUserTypeName );
     633             :     else
     634           0 :         SetError( SVSTREAM_GENERALERROR );
     635          62 : }
     636             : 
     637           0 : void SotStorage::SetConvertClass( const SvGlobalName & rName,
     638             :                                   sal_uLong nOriginalClipFormat,
     639             :                                   const OUString & rUserTypeName )
     640             : {
     641             :     DBG_ASSERT( Owner(), "must be owner" );
     642           0 :     if( m_pOwnStg )
     643           0 :         m_pOwnStg->SetConvertClass( rName, nOriginalClipFormat, rUserTypeName );
     644             :     else
     645           0 :         SetError( SVSTREAM_GENERALERROR );
     646           0 : }
     647             : 
     648          48 : SvGlobalName SotStorage::GetClassName()
     649             : {
     650          48 :     SvGlobalName aGN;
     651             :     DBG_ASSERT( Owner(), "must be owner" );
     652          48 :     if( m_pOwnStg )
     653          48 :         aGN = m_pOwnStg->GetClassName();
     654             :     else
     655           0 :         SetError( SVSTREAM_GENERALERROR );
     656          48 :     return aGN;
     657             : }
     658             : 
     659           0 : sal_uLong SotStorage::GetFormat()
     660             : {
     661           0 :     sal_uLong nFormat = 0;
     662             :     DBG_ASSERT( Owner(), "must be owner" );
     663           0 :     if( m_pOwnStg )
     664           0 :         nFormat = m_pOwnStg->GetFormat();
     665             :     else
     666           0 :         SetError( SVSTREAM_GENERALERROR );
     667           0 :     return nFormat;
     668             : }
     669             : 
     670           0 : OUString SotStorage::GetUserName()
     671             : {
     672           0 :     OUString aName;
     673             :     DBG_ASSERT( Owner(), "must be owner" );
     674           0 :     if( m_pOwnStg )
     675           0 :         aName = m_pOwnStg->GetUserName();
     676             :     else
     677           0 :         SetError( SVSTREAM_GENERALERROR );
     678           0 :     return aName;
     679             : }
     680             : 
     681           0 : bool SotStorage::ShouldConvert()
     682             : {
     683             :     DBG_ASSERT( Owner(), "must be owner" );
     684           0 :     if( m_pOwnStg )
     685           0 :         return m_pOwnStg->ShouldConvert();
     686             :     else
     687           0 :         SetError( SVSTREAM_GENERALERROR );
     688           0 :     return false;
     689             : }
     690             : 
     691         186 : void SotStorage::FillInfoList( SvStorageInfoList * pFillList ) const
     692             : {
     693             :     DBG_ASSERT( Owner(), "must be owner" );
     694         186 :     if( m_pOwnStg )
     695         186 :         m_pOwnStg->FillInfoList( pFillList );
     696         186 : }
     697             : 
     698          38 : bool SotStorage::CopyTo( SotStorage * pDestStg )
     699             : {
     700             :     DBG_ASSERT( Owner(), "must be owner" );
     701             :     DBG_ASSERT( pDestStg->Owner(), "must be owner" );
     702          38 :     if( m_pOwnStg && pDestStg->m_pOwnStg )
     703             :     {
     704          38 :         m_pOwnStg->CopyTo( pDestStg->m_pOwnStg );
     705          38 :         SetError( m_pOwnStg->GetError() );
     706          38 :         pDestStg->m_aKey = m_aKey;
     707          38 :         pDestStg->m_nVersion = m_nVersion;
     708             :     }
     709             :     else
     710           0 :         SetError( SVSTREAM_GENERALERROR );
     711             : 
     712          38 :     return SVSTREAM_OK == GetError();
     713             : }
     714             : 
     715          96 : bool SotStorage::Commit()
     716             : {
     717             :     DBG_ASSERT( Owner(), "must be owner" );
     718          96 :     if( m_pOwnStg )
     719             :     {
     720          96 :         if( !m_pOwnStg->Commit() )
     721           0 :             SetError( m_pOwnStg->GetError() );
     722             :     }
     723             :     else
     724           0 :         SetError( SVSTREAM_GENERALERROR );
     725             : 
     726          96 :     return SVSTREAM_OK == GetError();
     727             : }
     728             : 
     729           0 : bool SotStorage::Revert()
     730             : {
     731             :     DBG_ASSERT( Owner(), "must be owner" );
     732           0 :     if( m_pOwnStg )
     733             :     {
     734           0 :         if( !m_pOwnStg->Revert() )
     735           0 :             SetError( m_pOwnStg->GetError() );
     736             :     }
     737             :     else
     738           0 :         SetError( SVSTREAM_GENERALERROR );
     739             : 
     740           0 :     return SVSTREAM_OK == GetError();
     741             : }
     742             : 
     743        2456 : SotStorageStream * SotStorage::OpenSotStream( const OUString & rEleName,
     744             :                                               StreamMode nMode,
     745             :                                               StorageMode nStorageMode )
     746             : {
     747             :     DBG_ASSERT( !nStorageMode, "StorageModes ignored" );
     748        2456 :     SotStorageStream * pStm = NULL;
     749             :     DBG_ASSERT( Owner(), "must be owner" );
     750        2456 :     if( m_pOwnStg )
     751             :     {
     752             :         // volle Ole-Patches einschalten
     753             :         // egal was kommt, nur exclusiv gestattet
     754        2456 :         nMode |= STREAM_SHARE_DENYALL;
     755        2456 :         ErrCode nE = m_pOwnStg->GetError();
     756             :         BaseStorageStream * p = m_pOwnStg->OpenStream( rEleName, nMode,
     757        2456 :                             (nStorageMode & STORAGE_TRANSACTED) ? false : true );
     758        2456 :         pStm = new SotStorageStream( p );
     759             : 
     760        2456 :         if( !nE )
     761        2456 :             m_pOwnStg->ResetError(); // kein Fehler setzen
     762        2456 :         if( nMode & STREAM_TRUNC )
     763         150 :             pStm->SetSize( 0 );
     764             :     }
     765             :     else
     766           0 :         SetError( SVSTREAM_GENERALERROR );
     767             : 
     768        2456 :     return pStm;
     769             : }
     770             : 
     771         260 : SotStorage * SotStorage::OpenSotStorage( const OUString & rEleName,
     772             :                                          StreamMode nMode,
     773             :                                          bool transacted )
     774             : {
     775             :     DBG_ASSERT( Owner(), "must be owner" );
     776         260 :     if( m_pOwnStg )
     777             :     {
     778         260 :         nMode |= STREAM_SHARE_DENYALL;
     779         260 :         ErrCode nE = m_pOwnStg->GetError();
     780         260 :         BaseStorage * p = m_pOwnStg->OpenStorage(rEleName, nMode, !transacted);
     781         260 :         if( p )
     782             :         {
     783         260 :             SotStorage * pStor = new SotStorage( p );
     784         260 :             if( !nE )
     785         260 :                 m_pOwnStg->ResetError(); // kein Fehler setzen
     786             : 
     787         260 :             return pStor;
     788             :         }
     789             :     }
     790             : 
     791           0 :     SetError( SVSTREAM_GENERALERROR );
     792             : 
     793           0 :     return NULL;
     794             : }
     795             : 
     796           0 : bool SotStorage::IsStorage( const OUString & rEleName ) const
     797             : {
     798             :     DBG_ASSERT( Owner(), "must be owner" );
     799             :     // ein bisschen schneller
     800           0 :     if( m_pOwnStg )
     801           0 :         return m_pOwnStg->IsStorage( rEleName );
     802             : 
     803           0 :     return false;
     804             : }
     805             : 
     806        7708 : bool SotStorage::IsStream( const OUString & rEleName ) const
     807             : {
     808             :     DBG_ASSERT( Owner(), "must be owner" );
     809             :     // ein bisschen schneller
     810        7708 :     if( m_pOwnStg )
     811        7708 :         return m_pOwnStg->IsStream( rEleName );
     812             : 
     813           0 :     return false;
     814             : }
     815             : 
     816        1036 : bool SotStorage::IsContained( const OUString & rEleName ) const
     817             : {
     818             :     DBG_ASSERT( Owner(), "must be owner" );
     819             :     // ein bisschen schneller
     820        1036 :     if( m_pOwnStg )
     821        1036 :         return m_pOwnStg->IsContained( rEleName );
     822             : 
     823           0 :     return false;
     824             : }
     825             : 
     826          28 : bool SotStorage::Remove( const OUString & rEleName )
     827             : {
     828             :     DBG_ASSERT( Owner(), "must be owner" );
     829          28 :     if( m_pOwnStg )
     830             :     {
     831          28 :         m_pOwnStg->Remove( rEleName );
     832          28 :         SetError( m_pOwnStg->GetError() );
     833             :     }
     834             :     else
     835           0 :         SetError( SVSTREAM_GENERALERROR );
     836             : 
     837          28 :     return SVSTREAM_OK == GetError();
     838             : }
     839             : 
     840           0 : bool SotStorage::Rename( const OUString & rEleName, const OUString & rNewName )
     841             : {
     842             :     DBG_ASSERT( Owner(), "must be owner" );
     843           0 :     if( m_pOwnStg )
     844             :     {
     845           0 :         m_pOwnStg->Rename( rEleName, rNewName );
     846           0 :         SetError( m_pOwnStg->GetError() );
     847             :     }
     848             :     else
     849           0 :         SetError( SVSTREAM_GENERALERROR );
     850             : 
     851           0 :     return SVSTREAM_OK == GetError();
     852             : }
     853             : 
     854           0 : bool SotStorage::CopyTo( const OUString & rEleName,
     855             :                          SotStorage * pNewSt, const OUString & rNewName )
     856             : {
     857             :     DBG_ASSERT( Owner(), "must be owner" );
     858             :     DBG_ASSERT( pNewSt->Owner(), "must be owner" );
     859           0 :     if( m_pOwnStg )
     860             :     {
     861           0 :         m_pOwnStg->CopyTo( rEleName, pNewSt->m_pOwnStg, rNewName );
     862           0 :         SetError( m_pOwnStg->GetError() );
     863           0 :         SetError( pNewSt->GetError() );
     864             :     }
     865             :     else
     866           0 :         SetError( SVSTREAM_GENERALERROR );
     867             : 
     868           0 :     return SVSTREAM_OK == GetError();
     869             : }
     870             : 
     871           0 : bool SotStorage::MoveTo( const OUString & rEleName,
     872             :                          SotStorage * pNewSt, const OUString & rNewName )
     873             : {
     874             :     DBG_ASSERT( Owner(), "must be owner" );
     875             :     DBG_ASSERT( pNewSt->Owner(), "must be owner" );
     876           0 :     if( m_pOwnStg )
     877             :     {
     878           0 :         m_pOwnStg->MoveTo( rEleName, pNewSt->m_pOwnStg, rNewName );
     879           0 :         SetError( m_pOwnStg->GetError() );
     880           0 :         SetError( pNewSt->GetError() );
     881             :     }
     882             :     else
     883           0 :         SetError( SVSTREAM_GENERALERROR );
     884             : 
     885           0 :     return SVSTREAM_OK == GetError();
     886             : }
     887             : 
     888           8 : bool SotStorage::Validate()
     889             : {
     890             :     DBG_ASSERT( m_bIsRoot, "Validate nur an Rootstorage" );
     891           8 :     if( m_pOwnStg )
     892           8 :         return m_pOwnStg->ValidateFAT();
     893             :     else
     894           0 :         return true;
     895             : }
     896             : 
     897        5432 : bool SotStorage::IsOLEStorage() const
     898             : {
     899        5432 :     UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg );
     900        5432 :     return !pStg;
     901             : }
     902             : 
     903          34 : bool SotStorage::IsOLEStorage( const OUString & rFileName )
     904             : {
     905          34 :     return Storage::IsStorageFile( rFileName );
     906             : }
     907             : 
     908         648 : bool SotStorage::IsOLEStorage( SvStream* pStream )
     909             : {
     910         648 :     return Storage::IsStorageFile( pStream );
     911             : }
     912             : 
     913          40 : SotStorage* SotStorage::OpenOLEStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage,
     914             :                                         const OUString& rEleName, StreamMode nMode )
     915             : {
     916          40 :     sal_Int32 nEleMode = embed::ElementModes::SEEKABLEREAD;
     917          40 :     if ( nMode & STREAM_WRITE )
     918          40 :         nEleMode |= embed::ElementModes::WRITE;
     919          40 :     if ( nMode & STREAM_TRUNC )
     920           0 :         nEleMode |= embed::ElementModes::TRUNCATE;
     921          40 :     if ( nMode & STREAM_NOCREATE )
     922          26 :         nEleMode |= embed::ElementModes::NOCREATE;
     923             : 
     924          40 :     SvStream* pStream = NULL;
     925             :     try
     926             :     {
     927          40 :         uno::Reference < io::XStream > xStream = xStorage->openStreamElement( rEleName, nEleMode );
     928             : 
     929             :         // TODO/LATER: should it be done this way?
     930          12 :         if ( nMode & STREAM_WRITE )
     931             :         {
     932          12 :             uno::Reference < beans::XPropertySet > xStreamProps( xStream, uno::UNO_QUERY_THROW );
     933          12 :             xStreamProps->setPropertyValue(
     934             :                         OUString(  "MediaType"  ),
     935          12 :                         uno::makeAny( OUString(  "application/vnd.sun.star.oleobject"  ) ) );
     936             :         }
     937             : 
     938          12 :            pStream = utl::UcbStreamHelper::CreateStream( xStream );
     939             :     }
     940          28 :     catch ( uno::Exception& )
     941             :     {
     942             :         //TODO/LATER: ErrorHandling
     943          28 :         pStream = new SvMemoryStream;
     944          28 :         pStream->SetError( ERRCODE_IO_GENERAL );
     945             :     }
     946             : 
     947          40 :     return new SotStorage( pStream, true );
     948             : }
     949             : 
     950        4384 : sal_Int32 SotStorage::GetFormatID( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage )
     951             : {
     952        4384 :     uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY );
     953        4384 :     if ( !xProps.is() )
     954           0 :         return 0;
     955             : 
     956        8768 :     OUString aMediaType;
     957        4384 :     xProps->getPropertyValue("MediaType") >>= aMediaType;
     958        4384 :     if ( !aMediaType.isEmpty() )
     959             :     {
     960        4380 :         ::com::sun::star::datatransfer::DataFlavor aDataFlavor;
     961        4380 :         aDataFlavor.MimeType = aMediaType;
     962        4380 :         return SotExchange::GetFormat( aDataFlavor );
     963             :     }
     964             : 
     965        4388 :     return 0;
     966             : }
     967             : 
     968        4380 : sal_Int32 SotStorage::GetVersion( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage )
     969             : {
     970        4380 :     sal_Int32 nSotFormatID = SotStorage::GetFormatID( xStorage );
     971        4380 :     switch( nSotFormatID )
     972             :     {
     973             :     case SOT_FORMATSTR_ID_STARWRITER_8:
     974             :     case SOT_FORMATSTR_ID_STARWRITER_8_TEMPLATE:
     975             :     case SOT_FORMATSTR_ID_STARWRITERWEB_8:
     976             :     case SOT_FORMATSTR_ID_STARWRITERGLOB_8:
     977             :     case SOT_FORMATSTR_ID_STARWRITERGLOB_8_TEMPLATE:
     978             :     case SOT_FORMATSTR_ID_STARDRAW_8:
     979             :     case SOT_FORMATSTR_ID_STARDRAW_8_TEMPLATE:
     980             :     case SOT_FORMATSTR_ID_STARIMPRESS_8:
     981             :     case SOT_FORMATSTR_ID_STARIMPRESS_8_TEMPLATE:
     982             :     case SOT_FORMATSTR_ID_STARCALC_8:
     983             :     case SOT_FORMATSTR_ID_STARCALC_8_TEMPLATE:
     984             :     case SOT_FORMATSTR_ID_STARCHART_8:
     985             :     case SOT_FORMATSTR_ID_STARCHART_8_TEMPLATE:
     986             :     case SOT_FORMATSTR_ID_STARMATH_8:
     987             :     case SOT_FORMATSTR_ID_STARMATH_8_TEMPLATE:
     988        4342 :         return SOFFICE_FILEFORMAT_8;
     989             :     case SOT_FORMATSTR_ID_STARWRITER_60:
     990             :     case SOT_FORMATSTR_ID_STARWRITERWEB_60:
     991             :     case SOT_FORMATSTR_ID_STARWRITERGLOB_60:
     992             :     case SOT_FORMATSTR_ID_STARDRAW_60:
     993             :     case SOT_FORMATSTR_ID_STARIMPRESS_60:
     994             :     case SOT_FORMATSTR_ID_STARCALC_60:
     995             :     case SOT_FORMATSTR_ID_STARCHART_60:
     996             :     case SOT_FORMATSTR_ID_STARMATH_60:
     997          22 :         return SOFFICE_FILEFORMAT_60;
     998             :     }
     999             : 
    1000          16 :     return 0;
    1001             : }
    1002             : 
    1003             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10