1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sot.hxx" 30*cdf0e10cSrcweir #include <com/sun/star/uno/Sequence.hxx> 31*cdf0e10cSrcweir #include <com/sun/star/lang/XSingleServiceFactory.hpp> 32*cdf0e10cSrcweir #include <com/sun/star/embed/XStorage.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp> 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <rtl/digest.h> 37*cdf0e10cSrcweir #include <osl/file.hxx> 38*cdf0e10cSrcweir #include <sot/stg.hxx> 39*cdf0e10cSrcweir #include <sot/storinfo.hxx> 40*cdf0e10cSrcweir #include <sot/storage.hxx> 41*cdf0e10cSrcweir #include <sot/formats.hxx> 42*cdf0e10cSrcweir #include <sot/exchange.hxx> 43*cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx> 44*cdf0e10cSrcweir #ifndef _TOOLS_FSYS_HXX 45*cdf0e10cSrcweir #include <tools/fsys.hxx> 46*cdf0e10cSrcweir #endif 47*cdf0e10cSrcweir #include <tools/cachestr.hxx> 48*cdf0e10cSrcweir #include <tools/debug.hxx> 49*cdf0e10cSrcweir #include <tools/urlobj.hxx> 50*cdf0e10cSrcweir #include <unotools/localfilehelper.hxx> 51*cdf0e10cSrcweir #include <unotools/ucbhelper.hxx> 52*cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir #include "unostorageholder.hxx" 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir using namespace ::com::sun::star; 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir /************** class SotStorageStream ***********************************/ 59*cdf0e10cSrcweir class SotStorageStreamFactory : public SotFactory 60*cdf0e10cSrcweir { 61*cdf0e10cSrcweir public: 62*cdf0e10cSrcweir TYPEINFO(); 63*cdf0e10cSrcweir SotStorageStreamFactory( const SvGlobalName & rName, 64*cdf0e10cSrcweir const String & rClassName, 65*cdf0e10cSrcweir CreateInstanceType pCreateFuncP ) 66*cdf0e10cSrcweir : SotFactory( rName, rClassName, pCreateFuncP ) 67*cdf0e10cSrcweir {} 68*cdf0e10cSrcweir }; 69*cdf0e10cSrcweir TYPEINIT1(SotStorageStreamFactory,SotFactory); 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir SO2_IMPL_BASIC_CLASS1_DLL(SotStorageStream,SotStorageStreamFactory,SotObject, 73*cdf0e10cSrcweir SvGlobalName( 0xd7deb420, 0xf902, 0x11d0, 74*cdf0e10cSrcweir 0xaa, 0xa1, 0x0, 0xa0, 0x24, 0x9d, 0x55, 0x90 ) ) 75*cdf0e10cSrcweir SO2_IMPL_INVARIANT(SotStorageStream) 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir void SotStorageStream::TestMemberObjRef( sal_Bool /*bFree*/ ) 79*cdf0e10cSrcweir { 80*cdf0e10cSrcweir } 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir #ifdef TEST_INVARIANT 83*cdf0e10cSrcweir void SotStorageStream::TestMemberInvariant( sal_Bool /*bPrint*/ ) 84*cdf0e10cSrcweir { 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir #endif 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir /************************************************************************ 89*cdf0e10cSrcweir |* SotStorageStream::SotStorageStream() 90*cdf0e10cSrcweir |* 91*cdf0e10cSrcweir |* Beschreibung 92*cdf0e10cSrcweir *************************************************************************/ 93*cdf0e10cSrcweir SvLockBytesRef MakeLockBytes_Impl( const String & rName, StreamMode nMode ) 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir SvLockBytesRef xLB; 96*cdf0e10cSrcweir if( rName.Len() ) 97*cdf0e10cSrcweir { 98*cdf0e10cSrcweir SvStream * pFileStm = new SvFileStream( rName, nMode ); 99*cdf0e10cSrcweir xLB = new SvLockBytes( pFileStm, sal_True ); 100*cdf0e10cSrcweir } 101*cdf0e10cSrcweir else 102*cdf0e10cSrcweir { 103*cdf0e10cSrcweir SvStream * pCacheStm = new SvCacheStream(); 104*cdf0e10cSrcweir xLB = new SvLockBytes( pCacheStm, sal_True ); 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir return xLB; 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir SotStorageStream::SotStorageStream( const String & rName, StreamMode nMode, 110*cdf0e10cSrcweir StorageMode 111*cdf0e10cSrcweir #ifdef DBG_UTIL 112*cdf0e10cSrcweir nStorageMode 113*cdf0e10cSrcweir #endif 114*cdf0e10cSrcweir ) 115*cdf0e10cSrcweir : SvStream( MakeLockBytes_Impl( rName, nMode ) ) 116*cdf0e10cSrcweir , pOwnStm( NULL ) 117*cdf0e10cSrcweir { 118*cdf0e10cSrcweir if( nMode & STREAM_WRITE ) 119*cdf0e10cSrcweir bIsWritable = sal_True; 120*cdf0e10cSrcweir else 121*cdf0e10cSrcweir bIsWritable = sal_False; 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir DBG_ASSERT( !nStorageMode,"StorageModes ignored" ); 124*cdf0e10cSrcweir } 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir SotStorageStream::SotStorageStream( BaseStorageStream * pStm ) 127*cdf0e10cSrcweir { 128*cdf0e10cSrcweir if( pStm ) 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir if( STREAM_WRITE & pStm->GetMode() ) 131*cdf0e10cSrcweir bIsWritable = sal_True; 132*cdf0e10cSrcweir else 133*cdf0e10cSrcweir bIsWritable = sal_False; 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir pOwnStm = pStm; 136*cdf0e10cSrcweir SetError( pStm->GetError() ); 137*cdf0e10cSrcweir pStm->ResetError(); 138*cdf0e10cSrcweir } 139*cdf0e10cSrcweir else 140*cdf0e10cSrcweir { 141*cdf0e10cSrcweir pOwnStm = NULL; 142*cdf0e10cSrcweir bIsWritable = sal_True; 143*cdf0e10cSrcweir SetError( SVSTREAM_INVALID_PARAMETER ); 144*cdf0e10cSrcweir } 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir SotStorageStream::SotStorageStream() 148*cdf0e10cSrcweir : pOwnStm( NULL ) 149*cdf0e10cSrcweir { 150*cdf0e10cSrcweir // ??? wenn Init virtuell ist, entsprechen setzen 151*cdf0e10cSrcweir bIsWritable = sal_True; 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir /************************************************************************ 155*cdf0e10cSrcweir |* SotStorageStream::~SotStorageStream() 156*cdf0e10cSrcweir |* 157*cdf0e10cSrcweir |* Beschreibung 158*cdf0e10cSrcweir *************************************************************************/ 159*cdf0e10cSrcweir SotStorageStream::~SotStorageStream() 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir Flush(); //SetBufferSize(0); 162*cdf0e10cSrcweir delete pOwnStm; 163*cdf0e10cSrcweir } 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir /************************************************************************* 166*cdf0e10cSrcweir |* SotStorageStream::SyncSvStream() 167*cdf0e10cSrcweir |* 168*cdf0e10cSrcweir |* Beschreibung: Der SvStream wird auf den Zustand des Standard-Streams 169*cdf0e10cSrcweir |* gesetzt. Der Puffer des SvStreams wird weggeworfen. 170*cdf0e10cSrcweir *************************************************************************/ 171*cdf0e10cSrcweir void SotStorageStream::SyncSvStream() 172*cdf0e10cSrcweir { 173*cdf0e10cSrcweir sal_uLong nPos = 0; 174*cdf0e10cSrcweir if( pOwnStm ) 175*cdf0e10cSrcweir { 176*cdf0e10cSrcweir pOwnStm->Flush(); 177*cdf0e10cSrcweir nPos = pOwnStm->Tell(); 178*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 179*cdf0e10cSrcweir SvStream::SyncSvStream( nPos ); 180*cdf0e10cSrcweir } 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir /************************************************************************* 184*cdf0e10cSrcweir |* SotStorageStream::ResetError() 185*cdf0e10cSrcweir |* 186*cdf0e10cSrcweir |* Beschreibung 187*cdf0e10cSrcweir *************************************************************************/ 188*cdf0e10cSrcweir void SotStorageStream::ResetError() 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir SvStream::ResetError(); 191*cdf0e10cSrcweir if( pOwnStm ) 192*cdf0e10cSrcweir pOwnStm->ResetError(); 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir /************************************************************************* 196*cdf0e10cSrcweir |* SotStorageStream::GetData() 197*cdf0e10cSrcweir |* 198*cdf0e10cSrcweir |* Beschreibung 199*cdf0e10cSrcweir *************************************************************************/ 200*cdf0e10cSrcweir sal_uLong SotStorageStream::GetData( void* pData, sal_uLong nSize ) 201*cdf0e10cSrcweir { 202*cdf0e10cSrcweir sal_uLong nRet = 0; 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir if( pOwnStm ) 205*cdf0e10cSrcweir { 206*cdf0e10cSrcweir nRet = pOwnStm->Read( pData, nSize ); 207*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 208*cdf0e10cSrcweir } 209*cdf0e10cSrcweir else 210*cdf0e10cSrcweir nRet = SvStream::GetData( (sal_Char *)pData, nSize ); 211*cdf0e10cSrcweir return nRet; 212*cdf0e10cSrcweir } 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir /************************************************************************* 215*cdf0e10cSrcweir |* SotStorageStream::PutData() 216*cdf0e10cSrcweir |* 217*cdf0e10cSrcweir |* Beschreibung 218*cdf0e10cSrcweir *************************************************************************/ 219*cdf0e10cSrcweir sal_uLong SotStorageStream::PutData( const void* pData, sal_uLong nSize ) 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir sal_uLong nRet = 0; 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir if( pOwnStm ) 224*cdf0e10cSrcweir { 225*cdf0e10cSrcweir nRet = pOwnStm->Write( pData, nSize ); 226*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir else 229*cdf0e10cSrcweir nRet = SvStream::PutData( (sal_Char *)pData, nSize ); 230*cdf0e10cSrcweir return nRet; 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir /************************************************************************* 234*cdf0e10cSrcweir |* SotStorageStream::SeekPos() 235*cdf0e10cSrcweir |* 236*cdf0e10cSrcweir |* Beschreibung 237*cdf0e10cSrcweir *************************************************************************/ 238*cdf0e10cSrcweir sal_uLong SotStorageStream::SeekPos( sal_uLong nPos ) 239*cdf0e10cSrcweir { 240*cdf0e10cSrcweir sal_uLong nRet = 0; 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir if( pOwnStm ) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir nRet = pOwnStm->Seek( nPos ); 245*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 246*cdf0e10cSrcweir } 247*cdf0e10cSrcweir else 248*cdf0e10cSrcweir nRet = SvStream::SeekPos( nPos ); 249*cdf0e10cSrcweir return nRet; 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir /************************************************************************* 253*cdf0e10cSrcweir |* SotStorageStream::Flush() 254*cdf0e10cSrcweir |* 255*cdf0e10cSrcweir |* Beschreibung 256*cdf0e10cSrcweir *************************************************************************/ 257*cdf0e10cSrcweir void SotStorageStream::FlushData() 258*cdf0e10cSrcweir { 259*cdf0e10cSrcweir if( pOwnStm ) 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir pOwnStm->Flush(); 262*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 263*cdf0e10cSrcweir } 264*cdf0e10cSrcweir else 265*cdf0e10cSrcweir SvStream::FlushData(); 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir /************************************************************************* 269*cdf0e10cSrcweir |* SotStorageStream::SetSize() 270*cdf0e10cSrcweir |* 271*cdf0e10cSrcweir |* Beschreibung 272*cdf0e10cSrcweir *************************************************************************/ 273*cdf0e10cSrcweir void SotStorageStream::SetSize( sal_uLong nNewSize ) 274*cdf0e10cSrcweir { 275*cdf0e10cSrcweir sal_uLong nPos = Tell(); 276*cdf0e10cSrcweir if( pOwnStm ) 277*cdf0e10cSrcweir { 278*cdf0e10cSrcweir pOwnStm->SetSize( nNewSize ); 279*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 280*cdf0e10cSrcweir } 281*cdf0e10cSrcweir else 282*cdf0e10cSrcweir SvStream::SetSize( nNewSize ); 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir if( nNewSize < nPos ) 285*cdf0e10cSrcweir // ans Ende setzen 286*cdf0e10cSrcweir Seek( nNewSize ); 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir //return GetError() == SVSTREAM_OK; 289*cdf0e10cSrcweir } 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir /************************************************************************* 292*cdf0e10cSrcweir |* 293*cdf0e10cSrcweir |* SotStorageStream::GetSize() 294*cdf0e10cSrcweir |* 295*cdf0e10cSrcweir |* Beschreibung 296*cdf0e10cSrcweir |* 297*cdf0e10cSrcweir *************************************************************************/ 298*cdf0e10cSrcweir sal_uInt32 SotStorageStream::GetSize() const 299*cdf0e10cSrcweir { 300*cdf0e10cSrcweir sal_uLong nPos = Tell(); 301*cdf0e10cSrcweir ((SotStorageStream *)this)->Seek( STREAM_SEEK_TO_END ); 302*cdf0e10cSrcweir sal_uLong nSize = Tell(); 303*cdf0e10cSrcweir ((SotStorageStream *)this)->Seek( nPos ); 304*cdf0e10cSrcweir return nSize; 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir /************************************************************************* 308*cdf0e10cSrcweir |* SotStorageStream::CopyTo() 309*cdf0e10cSrcweir |* 310*cdf0e10cSrcweir |* Beschreibung 311*cdf0e10cSrcweir *************************************************************************/ 312*cdf0e10cSrcweir sal_Bool SotStorageStream::CopyTo( SotStorageStream * pDestStm ) 313*cdf0e10cSrcweir { 314*cdf0e10cSrcweir Flush(); // alle Daten schreiben 315*cdf0e10cSrcweir pDestStm->ClearBuffer(); 316*cdf0e10cSrcweir if( !pOwnStm || !pDestStm->pOwnStm ) 317*cdf0e10cSrcweir { // Wenn Ole2 oder nicht nur eigene StorageStreams 318*cdf0e10cSrcweir 319*cdf0e10cSrcweir sal_uLong nPos = Tell(); // Position merken 320*cdf0e10cSrcweir Seek( 0L ); 321*cdf0e10cSrcweir pDestStm->SetSize( 0 ); // Ziel-Stream leeren 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir void * pMem = new sal_uInt8[ 8192 ]; 324*cdf0e10cSrcweir sal_uLong nRead; 325*cdf0e10cSrcweir while( 0 != (nRead = Read( pMem, 8192 )) ) 326*cdf0e10cSrcweir { 327*cdf0e10cSrcweir if( nRead != pDestStm->Write( pMem, nRead ) ) 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 330*cdf0e10cSrcweir break; 331*cdf0e10cSrcweir } 332*cdf0e10cSrcweir } 333*cdf0e10cSrcweir delete [] static_cast<sal_uInt8*>(pMem); 334*cdf0e10cSrcweir // Position setzen 335*cdf0e10cSrcweir pDestStm->Seek( nPos ); 336*cdf0e10cSrcweir Seek( nPos ); 337*cdf0e10cSrcweir } 338*cdf0e10cSrcweir else 339*cdf0e10cSrcweir { 340*cdf0e10cSrcweir /* 341*cdf0e10cSrcweir // Kopieren 342*cdf0e10cSrcweir nErr = pObjI->CopyTo( pDestStm->pObjI, uSize, NULL, &uWrite ); 343*cdf0e10cSrcweir if( SUCCEEDED( nErr ) ) 344*cdf0e10cSrcweir { 345*cdf0e10cSrcweir // Ziel-Streamzeiger steht hinter den Daten 346*cdf0e10cSrcweir // SvSeek abgleichen 347*cdf0e10cSrcweir pDestStm->Seek( uWrite.LowPart ); 348*cdf0e10cSrcweir } 349*cdf0e10cSrcweir else if( GetScode( nErr ) == E_NOTIMPL ) 350*cdf0e10cSrcweir { // Eines Tages werden alle MS... ?!# 351*cdf0e10cSrcweir */ 352*cdf0e10cSrcweir pOwnStm->CopyTo( pDestStm->pOwnStm ); 353*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 354*cdf0e10cSrcweir } 355*cdf0e10cSrcweir return GetError() == SVSTREAM_OK; 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir 358*cdf0e10cSrcweir /************************************************************************* 359*cdf0e10cSrcweir |* SotStorageStream::Commit() 360*cdf0e10cSrcweir |* SotStorageStream::Revert() 361*cdf0e10cSrcweir |* 362*cdf0e10cSrcweir |* Beschreibung 363*cdf0e10cSrcweir *************************************************************************/ 364*cdf0e10cSrcweir sal_Bool SotStorageStream::Commit() 365*cdf0e10cSrcweir { 366*cdf0e10cSrcweir if( pOwnStm ) 367*cdf0e10cSrcweir { 368*cdf0e10cSrcweir pOwnStm->Flush(); 369*cdf0e10cSrcweir if( pOwnStm->GetError() == SVSTREAM_OK ) 370*cdf0e10cSrcweir pOwnStm->Commit(); 371*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 372*cdf0e10cSrcweir } 373*cdf0e10cSrcweir return GetError() == SVSTREAM_OK; 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir sal_Bool SotStorageStream::Revert() 377*cdf0e10cSrcweir { 378*cdf0e10cSrcweir if( !pOwnStm ) 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir pOwnStm->Revert(); 381*cdf0e10cSrcweir SetError( pOwnStm->GetError() ); 382*cdf0e10cSrcweir } 383*cdf0e10cSrcweir return GetError() == SVSTREAM_OK; 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir sal_Bool SotStorageStream::SetProperty( const String& rName, const ::com::sun::star::uno::Any& rValue ) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm ); 389*cdf0e10cSrcweir if ( pStg ) 390*cdf0e10cSrcweir { 391*cdf0e10cSrcweir return pStg->SetProperty( rName, rValue ); 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir else 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir DBG_ERROR("Not implemented!"); 396*cdf0e10cSrcweir return sal_False; 397*cdf0e10cSrcweir } 398*cdf0e10cSrcweir } 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir sal_Bool SotStorageStream::GetProperty( const String& rName, ::com::sun::star::uno::Any& rValue ) 401*cdf0e10cSrcweir { 402*cdf0e10cSrcweir UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm ); 403*cdf0e10cSrcweir if ( pStg ) 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir return pStg->GetProperty( rName, rValue ); 406*cdf0e10cSrcweir } 407*cdf0e10cSrcweir else 408*cdf0e10cSrcweir { 409*cdf0e10cSrcweir DBG_ERROR("Not implemented!"); 410*cdf0e10cSrcweir return sal_False; 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > SotStorageStream::GetXInputStream() const 415*cdf0e10cSrcweir { 416*cdf0e10cSrcweir UCBStorageStream* pStg = PTR_CAST( UCBStorageStream, pOwnStm ); 417*cdf0e10cSrcweir if ( pStg ) 418*cdf0e10cSrcweir { 419*cdf0e10cSrcweir return pStg->GetXInputStream(); 420*cdf0e10cSrcweir } 421*cdf0e10cSrcweir else 422*cdf0e10cSrcweir { 423*cdf0e10cSrcweir DBG_ERROR("Not implemented!"); 424*cdf0e10cSrcweir return ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream >(); 425*cdf0e10cSrcweir } 426*cdf0e10cSrcweir } 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir 429*cdf0e10cSrcweir 430*cdf0e10cSrcweir /************** class SotStorage ****************************************** 431*cdf0e10cSrcweir *************************************************************************/ 432*cdf0e10cSrcweir class SotStorageFactory : public SotFactory 433*cdf0e10cSrcweir { 434*cdf0e10cSrcweir public: 435*cdf0e10cSrcweir TYPEINFO(); 436*cdf0e10cSrcweir SotStorageFactory( const SvGlobalName & rName, 437*cdf0e10cSrcweir const String & rClassName, 438*cdf0e10cSrcweir CreateInstanceType pCreateFuncP ) 439*cdf0e10cSrcweir : SotFactory( rName, rClassName, pCreateFuncP ) 440*cdf0e10cSrcweir {} 441*cdf0e10cSrcweir }; 442*cdf0e10cSrcweir TYPEINIT1(SotStorageFactory,SotFactory); 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir 445*cdf0e10cSrcweir SO2_IMPL_BASIC_CLASS1_DLL(SotStorage,SotStorageFactory,SotObject, 446*cdf0e10cSrcweir SvGlobalName( 0x980ce7e0, 0xf905, 0x11d0, 447*cdf0e10cSrcweir 0xaa, 0xa1, 0x0, 0xa0, 0x24, 0x9d, 0x55, 0x90 ) ) 448*cdf0e10cSrcweir SO2_IMPL_INVARIANT(SotStorage) 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir 451*cdf0e10cSrcweir /************************************************************************ 452*cdf0e10cSrcweir |* 453*cdf0e10cSrcweir |* SotStorage::Tes*() 454*cdf0e10cSrcweir |* 455*cdf0e10cSrcweir |* Beschreibung 456*cdf0e10cSrcweir *************************************************************************/ 457*cdf0e10cSrcweir void SotStorage::TestMemberObjRef( sal_Bool /*bFree*/ ) 458*cdf0e10cSrcweir { 459*cdf0e10cSrcweir } 460*cdf0e10cSrcweir 461*cdf0e10cSrcweir #ifdef TEST_INVARIANT 462*cdf0e10cSrcweir void SotStorage::TestMemberInvariant( sal_Bool /*bPrint*/ ) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir } 465*cdf0e10cSrcweir #endif 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir /************************************************************************ 468*cdf0e10cSrcweir |* 469*cdf0e10cSrcweir |* SotStorage::SotStorage() 470*cdf0e10cSrcweir |* 471*cdf0e10cSrcweir |* Beschreibung Es muss ein I... Objekt an SvObject uebergeben 472*cdf0e10cSrcweir |* werden, da es sonst selbst ein IUnknown anlegt und 473*cdf0e10cSrcweir |* festlegt, dass alle weiteren I... Objekte mit 474*cdf0e10cSrcweir |* delete zerstoert werden (Owner() == sal_True). 475*cdf0e10cSrcweir |* Es werden aber nur IStorage Objekte benutzt und nicht 476*cdf0e10cSrcweir |* selbst implementiert, deshalb wird so getan, als ob 477*cdf0e10cSrcweir |* das IStorage Objekt von aussen kam und es wird mit 478*cdf0e10cSrcweir |* Release() freigegeben. 479*cdf0e10cSrcweir |* Die CreateStorage Methoden werden benoetigt, um 480*cdf0e10cSrcweir |* ein IStorage Objekt vor dem Aufruf von SvObject 481*cdf0e10cSrcweir |* zu erzeugen (Own, !Own automatik). 482*cdf0e10cSrcweir |* Hat CreateStorage ein Objekt erzeugt, dann wurde 483*cdf0e10cSrcweir |* der RefCounter schon um 1 erhoet. 484*cdf0e10cSrcweir |* Die Uebergabe erfolgt in pStorageCTor. Die Variable 485*cdf0e10cSrcweir |* ist NULL, wenn es nicht geklappt hat. 486*cdf0e10cSrcweir |* Ersterstellung MM 23.06.94 487*cdf0e10cSrcweir |* Letzte Aenderung MM 23.06.94 488*cdf0e10cSrcweir |* 489*cdf0e10cSrcweir *************************************************************************/ 490*cdf0e10cSrcweir #define INIT_SotStorage() \ 491*cdf0e10cSrcweir : m_pOwnStg( NULL ) \ 492*cdf0e10cSrcweir , m_pStorStm( NULL ) \ 493*cdf0e10cSrcweir , m_nError( SVSTREAM_OK ) \ 494*cdf0e10cSrcweir , m_bIsRoot( sal_False ) \ 495*cdf0e10cSrcweir , m_bDelStm( sal_False ) \ 496*cdf0e10cSrcweir , m_nVersion( SOFFICE_FILEFORMAT_CURRENT ) 497*cdf0e10cSrcweir 498*cdf0e10cSrcweir SotStorage::SotStorage() 499*cdf0e10cSrcweir INIT_SotStorage() 500*cdf0e10cSrcweir { 501*cdf0e10cSrcweir // ??? What's this ??? 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir #define ERASEMASK ( STREAM_TRUNC | STREAM_WRITE | STREAM_SHARE_DENYALL ) 505*cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h> 506*cdf0e10cSrcweir #include <com/sun/star/ucb/XCommandEnvironment.hpp> 507*cdf0e10cSrcweir #include <ucbhelper/content.hxx> 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir SotStorage::SotStorage( const ::ucbhelper::Content& rContent, const String & rName, StreamMode nMode, StorageMode nStorageMode ) 510*cdf0e10cSrcweir INIT_SotStorage() 511*cdf0e10cSrcweir { 512*cdf0e10cSrcweir m_aName = rName; // Namen merken 513*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( rContent, m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 514*cdf0e10cSrcweir 515*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir if ( IsOLEStorage() ) 518*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir SignAsRoot( m_pOwnStg->IsRoot() ); 521*cdf0e10cSrcweir } 522*cdf0e10cSrcweir 523*cdf0e10cSrcweir SotStorage::SotStorage( const String & rName, StreamMode nMode, StorageMode nStorageMode ) 524*cdf0e10cSrcweir INIT_SotStorage() 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir m_aName = rName; // Namen merken 527*cdf0e10cSrcweir CreateStorage( sal_True, nMode, nStorageMode ); 528*cdf0e10cSrcweir if ( IsOLEStorage() ) 529*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 530*cdf0e10cSrcweir } 531*cdf0e10cSrcweir 532*cdf0e10cSrcweir void SotStorage::CreateStorage( sal_Bool bForceUCBStorage, StreamMode nMode, StorageMode nStorageMode ) 533*cdf0e10cSrcweir { 534*cdf0e10cSrcweir DBG_ASSERT( !m_pStorStm && !m_pOwnStg, "Use only in ctor!" ); 535*cdf0e10cSrcweir if( m_aName.Len() ) 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir // named storage 538*cdf0e10cSrcweir if( ( ( nMode & ERASEMASK ) == ERASEMASK ) ) 539*cdf0e10cSrcweir ::utl::UCBContentHelper::Kill( m_aName ); 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir INetURLObject aObj( m_aName ); 542*cdf0e10cSrcweir if ( aObj.GetProtocol() == INET_PROT_NOT_VALID ) 543*cdf0e10cSrcweir { 544*cdf0e10cSrcweir String aURL; 545*cdf0e10cSrcweir ::utl::LocalFileHelper::ConvertPhysicalNameToURL( m_aName, aURL ); 546*cdf0e10cSrcweir aObj.SetURL( aURL ); 547*cdf0e10cSrcweir m_aName = aObj.GetMainURL( INetURLObject::NO_DECODE ); 548*cdf0e10cSrcweir } 549*cdf0e10cSrcweir 550*cdf0e10cSrcweir // a new unpacked storage should be created 551*cdf0e10cSrcweir if ( nStorageMode == STORAGE_CREATE_UNPACKED ) 552*cdf0e10cSrcweir { 553*cdf0e10cSrcweir // don't open stream readwrite, content provider may not support this ! 554*cdf0e10cSrcweir String aURL = UCBStorage::CreateLinkFile( m_aName ); 555*cdf0e10cSrcweir if ( aURL.Len() ) 556*cdf0e10cSrcweir { 557*cdf0e10cSrcweir ::ucbhelper::Content aContent( aURL, ::com::sun::star::uno::Reference < ::com::sun::star::ucb::XCommandEnvironment >() ); 558*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( aContent, aURL, nMode, sal_False ); 559*cdf0e10cSrcweir } 560*cdf0e10cSrcweir else 561*cdf0e10cSrcweir { 562*cdf0e10cSrcweir m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 563*cdf0e10cSrcweir SetError( ERRCODE_IO_NOTSUPPORTED ); 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir } 566*cdf0e10cSrcweir else 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir // check the stream 569*cdf0e10cSrcweir m_pStorStm = ::utl::UcbStreamHelper::CreateStream( m_aName, nMode ); 570*cdf0e10cSrcweir if ( m_pStorStm && m_pStorStm->GetError() ) 571*cdf0e10cSrcweir DELETEZ( m_pStorStm ); 572*cdf0e10cSrcweir 573*cdf0e10cSrcweir if ( m_pStorStm ) 574*cdf0e10cSrcweir { 575*cdf0e10cSrcweir // try as UCBStorage, next try as OLEStorage 576*cdf0e10cSrcweir sal_Bool bIsUCBStorage = UCBStorage::IsStorageFile( m_pStorStm ); 577*cdf0e10cSrcweir if ( !bIsUCBStorage && bForceUCBStorage ) 578*cdf0e10cSrcweir // if UCBStorage has priority, it should not be used only if it is really an OLEStorage 579*cdf0e10cSrcweir bIsUCBStorage = !Storage::IsStorageFile( m_pStorStm ); 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir if ( bIsUCBStorage ) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir if ( UCBStorage::GetLinkedFile( *m_pStorStm ).Len() ) 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir // detect special unpacked storages 586*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( *m_pStorStm, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 587*cdf0e10cSrcweir m_bDelStm = sal_True; 588*cdf0e10cSrcweir } 589*cdf0e10cSrcweir else 590*cdf0e10cSrcweir { 591*cdf0e10cSrcweir // detect special disk spanned storages 592*cdf0e10cSrcweir if ( UCBStorage::IsDiskSpannedFile( m_pStorStm ) ) 593*cdf0e10cSrcweir nMode |= STORAGE_DISKSPANNED_MODE; 594*cdf0e10cSrcweir 595*cdf0e10cSrcweir // UCBStorage always works directly on the UCB content, so discard the stream first 596*cdf0e10cSrcweir DELETEZ( m_pStorStm ); 597*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 598*cdf0e10cSrcweir } 599*cdf0e10cSrcweir } 600*cdf0e10cSrcweir else 601*cdf0e10cSrcweir { 602*cdf0e10cSrcweir // OLEStorage can be opened with a stream 603*cdf0e10cSrcweir m_pOwnStg = new Storage( *m_pStorStm, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 604*cdf0e10cSrcweir m_bDelStm = sal_True; 605*cdf0e10cSrcweir } 606*cdf0e10cSrcweir } 607*cdf0e10cSrcweir else if ( bForceUCBStorage ) 608*cdf0e10cSrcweir { 609*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 610*cdf0e10cSrcweir SetError( ERRCODE_IO_NOTSUPPORTED ); 611*cdf0e10cSrcweir } 612*cdf0e10cSrcweir else 613*cdf0e10cSrcweir { 614*cdf0e10cSrcweir m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 615*cdf0e10cSrcweir SetError( ERRCODE_IO_NOTSUPPORTED ); 616*cdf0e10cSrcweir } 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir } 619*cdf0e10cSrcweir else 620*cdf0e10cSrcweir { 621*cdf0e10cSrcweir // temporary storage 622*cdf0e10cSrcweir if ( bForceUCBStorage ) 623*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 624*cdf0e10cSrcweir else 625*cdf0e10cSrcweir m_pOwnStg = new Storage( m_aName, nMode, (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 626*cdf0e10cSrcweir m_aName = m_pOwnStg->GetName(); 627*cdf0e10cSrcweir } 628*cdf0e10cSrcweir 629*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir SignAsRoot( m_pOwnStg->IsRoot() ); 632*cdf0e10cSrcweir } 633*cdf0e10cSrcweir 634*cdf0e10cSrcweir SotStorage::SotStorage( sal_Bool bUCBStorage, const String & rName, StreamMode nMode, StorageMode nStorageMode ) 635*cdf0e10cSrcweir INIT_SotStorage() 636*cdf0e10cSrcweir { 637*cdf0e10cSrcweir m_aName = rName; 638*cdf0e10cSrcweir CreateStorage( bUCBStorage, nMode, nStorageMode ); 639*cdf0e10cSrcweir if ( IsOLEStorage() ) 640*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 641*cdf0e10cSrcweir } 642*cdf0e10cSrcweir 643*cdf0e10cSrcweir SotStorage::SotStorage( BaseStorage * pStor ) 644*cdf0e10cSrcweir INIT_SotStorage() 645*cdf0e10cSrcweir { 646*cdf0e10cSrcweir if ( pStor ) 647*cdf0e10cSrcweir { 648*cdf0e10cSrcweir m_aName = pStor->GetName(); // Namen merken 649*cdf0e10cSrcweir SignAsRoot( pStor->IsRoot() ); 650*cdf0e10cSrcweir SetError( pStor->GetError() ); 651*cdf0e10cSrcweir } 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir m_pOwnStg = pStor; 654*cdf0e10cSrcweir sal_uLong nErr = m_pOwnStg ? m_pOwnStg->GetError() : SVSTREAM_CANNOT_MAKE; 655*cdf0e10cSrcweir SetError( nErr ); 656*cdf0e10cSrcweir if ( IsOLEStorage() ) 657*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir 660*cdf0e10cSrcweir SotStorage::SotStorage( sal_Bool bUCBStorage, SvStream & rStm ) 661*cdf0e10cSrcweir INIT_SotStorage() 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir SetError( rStm.GetError() ); 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir // try as UCBStorage, next try as OLEStorage 666*cdf0e10cSrcweir if ( UCBStorage::IsStorageFile( &rStm ) || bUCBStorage ) 667*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( rStm, sal_False ); 668*cdf0e10cSrcweir else 669*cdf0e10cSrcweir m_pOwnStg = new Storage( rStm, sal_False ); 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 672*cdf0e10cSrcweir 673*cdf0e10cSrcweir if ( IsOLEStorage() ) 674*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 675*cdf0e10cSrcweir 676*cdf0e10cSrcweir SignAsRoot( m_pOwnStg->IsRoot() ); 677*cdf0e10cSrcweir } 678*cdf0e10cSrcweir 679*cdf0e10cSrcweir SotStorage::SotStorage( SvStream & rStm ) 680*cdf0e10cSrcweir INIT_SotStorage() 681*cdf0e10cSrcweir { 682*cdf0e10cSrcweir SetError( rStm.GetError() ); 683*cdf0e10cSrcweir 684*cdf0e10cSrcweir // try as UCBStorage, next try as OLEStorage 685*cdf0e10cSrcweir if ( UCBStorage::IsStorageFile( &rStm ) ) 686*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( rStm, sal_False ); 687*cdf0e10cSrcweir else 688*cdf0e10cSrcweir m_pOwnStg = new Storage( rStm, sal_False ); 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir if ( IsOLEStorage() ) 693*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 694*cdf0e10cSrcweir 695*cdf0e10cSrcweir SignAsRoot( m_pOwnStg->IsRoot() ); 696*cdf0e10cSrcweir } 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir SotStorage::SotStorage( SvStream * pStm, sal_Bool bDelete ) 699*cdf0e10cSrcweir INIT_SotStorage() 700*cdf0e10cSrcweir { 701*cdf0e10cSrcweir SetError( pStm->GetError() ); 702*cdf0e10cSrcweir 703*cdf0e10cSrcweir // try as UCBStorage, next try as OLEStorage 704*cdf0e10cSrcweir if ( UCBStorage::IsStorageFile( pStm ) ) 705*cdf0e10cSrcweir m_pOwnStg = new UCBStorage( *pStm, sal_False ); 706*cdf0e10cSrcweir else 707*cdf0e10cSrcweir m_pOwnStg = new Storage( *pStm, sal_False ); 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 710*cdf0e10cSrcweir 711*cdf0e10cSrcweir m_pStorStm = pStm; 712*cdf0e10cSrcweir m_bDelStm = bDelete; 713*cdf0e10cSrcweir if ( IsOLEStorage() ) 714*cdf0e10cSrcweir m_nVersion = SOFFICE_FILEFORMAT_50; 715*cdf0e10cSrcweir 716*cdf0e10cSrcweir SignAsRoot( m_pOwnStg->IsRoot() ); 717*cdf0e10cSrcweir } 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir /************************************************************************* 720*cdf0e10cSrcweir |* SotStorage::~SotStorage() 721*cdf0e10cSrcweir |* 722*cdf0e10cSrcweir |* Beschreibung 723*cdf0e10cSrcweir *************************************************************************/ 724*cdf0e10cSrcweir SotStorage::~SotStorage() 725*cdf0e10cSrcweir { 726*cdf0e10cSrcweir delete m_pOwnStg; 727*cdf0e10cSrcweir if( m_bDelStm ) 728*cdf0e10cSrcweir delete m_pStorStm; 729*cdf0e10cSrcweir } 730*cdf0e10cSrcweir 731*cdf0e10cSrcweir /************************************************************************* 732*cdf0e10cSrcweir |* SotStorage::RemoveUNOStorageHolder() 733*cdf0e10cSrcweir |* 734*cdf0e10cSrcweir |* Beschreibung 735*cdf0e10cSrcweir *************************************************************************/ 736*cdf0e10cSrcweir void SotStorage::RemoveUNOStorageHolder( UNOStorageHolder* pHolder ) 737*cdf0e10cSrcweir { 738*cdf0e10cSrcweir UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); 739*cdf0e10cSrcweir if ( pStg ) 740*cdf0e10cSrcweir { 741*cdf0e10cSrcweir pStg->GetUNOStorageHolderList()->remove( pHolder ); 742*cdf0e10cSrcweir pHolder->release(); 743*cdf0e10cSrcweir } 744*cdf0e10cSrcweir else 745*cdf0e10cSrcweir { 746*cdf0e10cSrcweir DBG_ERROR("Not implemented!"); 747*cdf0e10cSrcweir } 748*cdf0e10cSrcweir } 749*cdf0e10cSrcweir 750*cdf0e10cSrcweir /************************************************************************* 751*cdf0e10cSrcweir |* SotStorage::GetUNOAPIDuplicate() 752*cdf0e10cSrcweir |* 753*cdf0e10cSrcweir |* Beschreibung 754*cdf0e10cSrcweir *************************************************************************/ 755*cdf0e10cSrcweir uno::Reference< embed::XStorage > SotStorage::GetUNOAPIDuplicate( const String& rEleName, sal_Int32 nUNOStorageMode ) 756*cdf0e10cSrcweir { 757*cdf0e10cSrcweir // after we create a duplicate we will register wrapper 758*cdf0e10cSrcweir // for storage messages, the wrapper will control the real storage 759*cdf0e10cSrcweir // the real storage will be able to ask the duplicate to dispose if it's parent is disposed 760*cdf0e10cSrcweir 761*cdf0e10cSrcweir uno::Reference< embed::XStorage > xResult; 762*cdf0e10cSrcweir 763*cdf0e10cSrcweir UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); 764*cdf0e10cSrcweir if ( !pStg ) 765*cdf0e10cSrcweir return xResult; 766*cdf0e10cSrcweir 767*cdf0e10cSrcweir UNOStorageHolderList* pUNOStorageHolderList = pStg->GetUNOStorageHolderList(); 768*cdf0e10cSrcweir if ( !pUNOStorageHolderList ) 769*cdf0e10cSrcweir return xResult; 770*cdf0e10cSrcweir 771*cdf0e10cSrcweir for ( UNOStorageHolderList::iterator aIter = pUNOStorageHolderList->begin(); 772*cdf0e10cSrcweir aIter != pUNOStorageHolderList->end(); aIter++ ) 773*cdf0e10cSrcweir if ( (*aIter) && (*aIter)->GetStorageName().Equals( rEleName ) ) 774*cdf0e10cSrcweir { 775*cdf0e10cSrcweir // the storage is already in use 776*cdf0e10cSrcweir return xResult; 777*cdf0e10cSrcweir } 778*cdf0e10cSrcweir 779*cdf0e10cSrcweir if ( IsStream( rEleName ) ) 780*cdf0e10cSrcweir return xResult; 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir if ( GetError() == ERRCODE_NONE ) 783*cdf0e10cSrcweir { 784*cdf0e10cSrcweir StreamMode nMode = ( ( nUNOStorageMode & embed::ElementModes::WRITE ) == embed::ElementModes::WRITE ) ? 785*cdf0e10cSrcweir STREAM_WRITE : ( STREAM_READ | STREAM_NOCREATE ); 786*cdf0e10cSrcweir if ( nUNOStorageMode & embed::ElementModes::NOCREATE ) 787*cdf0e10cSrcweir nMode |= STREAM_NOCREATE; 788*cdf0e10cSrcweir 789*cdf0e10cSrcweir sal_Bool bStorageReady = !IsStorage( rEleName ); 790*cdf0e10cSrcweir SotStorageRef pChildStorage = OpenUCBStorage( rEleName, nMode, STORAGE_TRANSACTED ); 791*cdf0e10cSrcweir if ( pChildStorage->GetError() == ERRCODE_NONE && pChildStorage->m_pOwnStg ) 792*cdf0e10cSrcweir { 793*cdf0e10cSrcweir ::utl::TempFile* pTempFile = new ::utl::TempFile(); 794*cdf0e10cSrcweir if ( pTempFile->GetURL().Len() ) 795*cdf0e10cSrcweir { 796*cdf0e10cSrcweir if ( !bStorageReady ) 797*cdf0e10cSrcweir { 798*cdf0e10cSrcweir UCBStorage* pChildUCBStg = PTR_CAST( UCBStorage, pChildStorage->m_pOwnStg ); 799*cdf0e10cSrcweir if ( pChildUCBStg ) 800*cdf0e10cSrcweir { 801*cdf0e10cSrcweir UCBStorage* pTempStorage = new UCBStorage( pTempFile->GetURL(), STREAM_WRITE, sal_False, sal_True ); 802*cdf0e10cSrcweir if ( pTempStorage ) 803*cdf0e10cSrcweir { 804*cdf0e10cSrcweir pChildUCBStg->CopyTo( pTempStorage ); 805*cdf0e10cSrcweir 806*cdf0e10cSrcweir // CopyTo does not transport unknown media type 807*cdf0e10cSrcweir // just workaround it 808*cdf0e10cSrcweir uno::Any aMediaType; 809*cdf0e10cSrcweir 810*cdf0e10cSrcweir if ( pChildUCBStg->GetProperty( 811*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "MediaType" ), aMediaType ) ) 812*cdf0e10cSrcweir pTempStorage->SetProperty( ::rtl::OUString::createFromAscii( "MediaType" ), aMediaType ); 813*cdf0e10cSrcweir 814*cdf0e10cSrcweir bStorageReady = !pChildUCBStg->GetError() && !pTempStorage->GetError() 815*cdf0e10cSrcweir && pTempStorage->Commit(); 816*cdf0e10cSrcweir 817*cdf0e10cSrcweir delete ((BaseStorage*)pTempStorage); 818*cdf0e10cSrcweir pTempStorage = NULL; 819*cdf0e10cSrcweir } 820*cdf0e10cSrcweir } 821*cdf0e10cSrcweir 822*cdf0e10cSrcweir OSL_ENSURE( bStorageReady, "Problem on storage copy!\n" ); 823*cdf0e10cSrcweir } 824*cdf0e10cSrcweir 825*cdf0e10cSrcweir if ( bStorageReady ) 826*cdf0e10cSrcweir { 827*cdf0e10cSrcweir try { 828*cdf0e10cSrcweir uno::Reference< lang::XSingleServiceFactory > xStorageFactory( 829*cdf0e10cSrcweir ::comphelper::getProcessServiceFactory()->createInstance( 830*cdf0e10cSrcweir ::rtl::OUString::createFromAscii( "com.sun.star.embed.StorageFactory" ) ), 831*cdf0e10cSrcweir uno::UNO_QUERY ); 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir OSL_ENSURE( xStorageFactory.is(), "Can't create storage factory!\n" ); 834*cdf0e10cSrcweir if ( xStorageFactory.is() ) 835*cdf0e10cSrcweir { 836*cdf0e10cSrcweir uno::Sequence< uno::Any > aArg( 2 ); 837*cdf0e10cSrcweir aArg[0] <<= ::rtl::OUString( pTempFile->GetURL() ); 838*cdf0e10cSrcweir aArg[1] <<= nUNOStorageMode; 839*cdf0e10cSrcweir uno::Reference< embed::XStorage > xDuplStorage( 840*cdf0e10cSrcweir xStorageFactory->createInstanceWithArguments( aArg ), 841*cdf0e10cSrcweir uno::UNO_QUERY ); 842*cdf0e10cSrcweir 843*cdf0e10cSrcweir OSL_ENSURE( xDuplStorage.is(), "Can't open storage!\n" ); 844*cdf0e10cSrcweir if ( xDuplStorage.is() ) 845*cdf0e10cSrcweir { 846*cdf0e10cSrcweir UNOStorageHolder* pHolder = 847*cdf0e10cSrcweir new UNOStorageHolder( *this, *pChildStorage, xDuplStorage, pTempFile ); 848*cdf0e10cSrcweir pHolder->acquire(); 849*cdf0e10cSrcweir pTempFile = NULL; 850*cdf0e10cSrcweir pUNOStorageHolderList->push_back( pHolder ); 851*cdf0e10cSrcweir xResult = xDuplStorage; 852*cdf0e10cSrcweir } 853*cdf0e10cSrcweir } 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir catch( uno::Exception& e ) 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir (void)e; 858*cdf0e10cSrcweir OSL_ENSURE( sal_False, ::rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_ASCII_US ) ); 859*cdf0e10cSrcweir } 860*cdf0e10cSrcweir } 861*cdf0e10cSrcweir } 862*cdf0e10cSrcweir 863*cdf0e10cSrcweir if ( pTempFile != NULL ) 864*cdf0e10cSrcweir delete pTempFile; 865*cdf0e10cSrcweir } 866*cdf0e10cSrcweir else 867*cdf0e10cSrcweir SetError( pChildStorage->GetError() ); 868*cdf0e10cSrcweir } 869*cdf0e10cSrcweir 870*cdf0e10cSrcweir return xResult; 871*cdf0e10cSrcweir } 872*cdf0e10cSrcweir 873*cdf0e10cSrcweir /************************************************************************* 874*cdf0e10cSrcweir |* SotStorage::CreateMemoryStream() 875*cdf0e10cSrcweir |* 876*cdf0e10cSrcweir |* Beschreibung 877*cdf0e10cSrcweir *************************************************************************/ 878*cdf0e10cSrcweir SvMemoryStream * SotStorage::CreateMemoryStream() 879*cdf0e10cSrcweir { 880*cdf0e10cSrcweir SvMemoryStream * pStm = NULL; 881*cdf0e10cSrcweir pStm = new SvMemoryStream( 0x8000, 0x8000 ); 882*cdf0e10cSrcweir SotStorageRef aStg = new SotStorage( *pStm ); 883*cdf0e10cSrcweir if( CopyTo( aStg ) ) 884*cdf0e10cSrcweir aStg->Commit(); 885*cdf0e10cSrcweir else 886*cdf0e10cSrcweir { 887*cdf0e10cSrcweir aStg.Clear(); // Storage vorher freigeben 888*cdf0e10cSrcweir delete pStm; 889*cdf0e10cSrcweir pStm = NULL; 890*cdf0e10cSrcweir } 891*cdf0e10cSrcweir return pStm; 892*cdf0e10cSrcweir } 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir /************************************************************************* 895*cdf0e10cSrcweir |* SotStorage::GetStorage() 896*cdf0e10cSrcweir |* 897*cdf0e10cSrcweir |* Beschreibung 898*cdf0e10cSrcweir *************************************************************************/ 899*cdf0e10cSrcweir sal_Bool SotStorage::IsStorageFile( const String & rFileName ) 900*cdf0e10cSrcweir { 901*cdf0e10cSrcweir String aName( rFileName ); 902*cdf0e10cSrcweir INetURLObject aObj( aName ); 903*cdf0e10cSrcweir if ( aObj.GetProtocol() == INET_PROT_NOT_VALID ) 904*cdf0e10cSrcweir { 905*cdf0e10cSrcweir String aURL; 906*cdf0e10cSrcweir ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aName, aURL ); 907*cdf0e10cSrcweir aObj.SetURL( aURL ); 908*cdf0e10cSrcweir aName = aObj.GetMainURL( INetURLObject::NO_DECODE ); 909*cdf0e10cSrcweir } 910*cdf0e10cSrcweir 911*cdf0e10cSrcweir SvStream * pStm = ::utl::UcbStreamHelper::CreateStream( aName, STREAM_STD_READ ); 912*cdf0e10cSrcweir sal_Bool bRet = SotStorage::IsStorageFile( pStm ); 913*cdf0e10cSrcweir delete pStm; 914*cdf0e10cSrcweir return bRet; 915*cdf0e10cSrcweir } 916*cdf0e10cSrcweir 917*cdf0e10cSrcweir sal_Bool SotStorage::IsStorageFile( SvStream* pStream ) 918*cdf0e10cSrcweir { 919*cdf0e10cSrcweir /** code for new storages must come first! **/ 920*cdf0e10cSrcweir if ( pStream ) 921*cdf0e10cSrcweir { 922*cdf0e10cSrcweir long nPos = pStream->Tell(); 923*cdf0e10cSrcweir sal_Bool bRet = UCBStorage::IsStorageFile( pStream ); 924*cdf0e10cSrcweir if ( !bRet ) 925*cdf0e10cSrcweir bRet = Storage::IsStorageFile( pStream ); 926*cdf0e10cSrcweir pStream->Seek( nPos ); 927*cdf0e10cSrcweir return bRet; 928*cdf0e10cSrcweir } 929*cdf0e10cSrcweir else 930*cdf0e10cSrcweir return sal_False; 931*cdf0e10cSrcweir } 932*cdf0e10cSrcweir /************************************************************************* 933*cdf0e10cSrcweir |* SotStorage::GetStorage() 934*cdf0e10cSrcweir |* 935*cdf0e10cSrcweir |* Beschreibung 936*cdf0e10cSrcweir *************************************************************************/ 937*cdf0e10cSrcweir const String & SotStorage::GetName() const 938*cdf0e10cSrcweir { 939*cdf0e10cSrcweir if( !m_aName.Len() ) 940*cdf0e10cSrcweir { 941*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 942*cdf0e10cSrcweir if( m_pOwnStg ) 943*cdf0e10cSrcweir ((SotStorage *)this)->m_aName = m_pOwnStg->GetName(); 944*cdf0e10cSrcweir } 945*cdf0e10cSrcweir return m_aName; 946*cdf0e10cSrcweir } 947*cdf0e10cSrcweir 948*cdf0e10cSrcweir void SotStorage::SetName( const String& rName ) 949*cdf0e10cSrcweir { 950*cdf0e10cSrcweir // This method is necessary because most storages will not be opened with a FileName, but an external stream instead 951*cdf0e10cSrcweir // 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 952*cdf0e10cSrcweir // class that depends on the fact that a root storage has a name 953*cdf0e10cSrcweir DBG_ASSERT( !GetName().Len(), "SetName() must not be called when the storage already has a name!" ); 954*cdf0e10cSrcweir m_aName = rName; 955*cdf0e10cSrcweir } 956*cdf0e10cSrcweir 957*cdf0e10cSrcweir /************************************************************************* 958*cdf0e10cSrcweir |* SotStorage::ResetError() 959*cdf0e10cSrcweir |* 960*cdf0e10cSrcweir |* Beschreibung 961*cdf0e10cSrcweir *************************************************************************/ 962*cdf0e10cSrcweir void SotStorage::ResetError() 963*cdf0e10cSrcweir { 964*cdf0e10cSrcweir m_nError = SVSTREAM_OK; 965*cdf0e10cSrcweir if( m_pOwnStg ) 966*cdf0e10cSrcweir m_pOwnStg->ResetError(); 967*cdf0e10cSrcweir } 968*cdf0e10cSrcweir 969*cdf0e10cSrcweir /************************************************************************* 970*cdf0e10cSrcweir |* SotStorage::SetClass() 971*cdf0e10cSrcweir |* SotStorage::SetConvertClass() 972*cdf0e10cSrcweir |* 973*cdf0e10cSrcweir |* Beschreibung 974*cdf0e10cSrcweir *************************************************************************/ 975*cdf0e10cSrcweir void SotStorage::SetClass( const SvGlobalName & rName, 976*cdf0e10cSrcweir sal_uLong nOriginalClipFormat, 977*cdf0e10cSrcweir const String & rUserTypeName ) 978*cdf0e10cSrcweir { 979*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 980*cdf0e10cSrcweir if( m_pOwnStg ) 981*cdf0e10cSrcweir m_pOwnStg->SetClass( rName, nOriginalClipFormat, rUserTypeName ); 982*cdf0e10cSrcweir else 983*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 984*cdf0e10cSrcweir } 985*cdf0e10cSrcweir 986*cdf0e10cSrcweir void SotStorage::SetConvertClass( const SvGlobalName & rName, 987*cdf0e10cSrcweir sal_uLong nOriginalClipFormat, 988*cdf0e10cSrcweir const String & rUserTypeName ) 989*cdf0e10cSrcweir { 990*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 991*cdf0e10cSrcweir if( m_pOwnStg ) 992*cdf0e10cSrcweir m_pOwnStg->SetConvertClass( rName, nOriginalClipFormat, rUserTypeName ); 993*cdf0e10cSrcweir else 994*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 995*cdf0e10cSrcweir } 996*cdf0e10cSrcweir 997*cdf0e10cSrcweir /************************************************************************* 998*cdf0e10cSrcweir |* SotStorage::GetClassName() 999*cdf0e10cSrcweir |* SotStorage::GetFormat() 1000*cdf0e10cSrcweir |* SotStorage::GetUserName() 1001*cdf0e10cSrcweir |* SotStorage::ShouldConvert() 1002*cdf0e10cSrcweir |* 1003*cdf0e10cSrcweir |* Beschreibung 1004*cdf0e10cSrcweir *************************************************************************/ 1005*cdf0e10cSrcweir SvGlobalName SotStorage::GetClassName() 1006*cdf0e10cSrcweir { 1007*cdf0e10cSrcweir SvGlobalName aGN; 1008*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1009*cdf0e10cSrcweir if( m_pOwnStg ) 1010*cdf0e10cSrcweir aGN = m_pOwnStg->GetClassName(); 1011*cdf0e10cSrcweir else 1012*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1013*cdf0e10cSrcweir return aGN; 1014*cdf0e10cSrcweir } 1015*cdf0e10cSrcweir 1016*cdf0e10cSrcweir sal_uLong SotStorage::GetFormat() 1017*cdf0e10cSrcweir { 1018*cdf0e10cSrcweir sal_uLong nFormat = 0; 1019*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1020*cdf0e10cSrcweir if( m_pOwnStg ) 1021*cdf0e10cSrcweir nFormat = m_pOwnStg->GetFormat(); 1022*cdf0e10cSrcweir else 1023*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1024*cdf0e10cSrcweir return nFormat; 1025*cdf0e10cSrcweir } 1026*cdf0e10cSrcweir 1027*cdf0e10cSrcweir String SotStorage::GetUserName() 1028*cdf0e10cSrcweir { 1029*cdf0e10cSrcweir String aName; 1030*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1031*cdf0e10cSrcweir if( m_pOwnStg ) 1032*cdf0e10cSrcweir aName = m_pOwnStg->GetUserName(); 1033*cdf0e10cSrcweir else 1034*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1035*cdf0e10cSrcweir return aName; 1036*cdf0e10cSrcweir } 1037*cdf0e10cSrcweir 1038*cdf0e10cSrcweir sal_Bool SotStorage::ShouldConvert() 1039*cdf0e10cSrcweir { 1040*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1041*cdf0e10cSrcweir if( m_pOwnStg ) 1042*cdf0e10cSrcweir return m_pOwnStg->ShouldConvert(); 1043*cdf0e10cSrcweir else 1044*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1045*cdf0e10cSrcweir return sal_False; 1046*cdf0e10cSrcweir } 1047*cdf0e10cSrcweir 1048*cdf0e10cSrcweir /************************************************************************* 1049*cdf0e10cSrcweir |* SotStorage::FillInfoList() 1050*cdf0e10cSrcweir |* 1051*cdf0e10cSrcweir |* Beschreibung 1052*cdf0e10cSrcweir *************************************************************************/ 1053*cdf0e10cSrcweir void SotStorage::FillInfoList( SvStorageInfoList * pFillList ) const 1054*cdf0e10cSrcweir { 1055*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1056*cdf0e10cSrcweir if( m_pOwnStg ) 1057*cdf0e10cSrcweir m_pOwnStg->FillInfoList( pFillList ); 1058*cdf0e10cSrcweir } 1059*cdf0e10cSrcweir 1060*cdf0e10cSrcweir /************************************************************************* 1061*cdf0e10cSrcweir |* SotStorage::CopyTo() 1062*cdf0e10cSrcweir |* 1063*cdf0e10cSrcweir |* Beschreibung 1064*cdf0e10cSrcweir *************************************************************************/ 1065*cdf0e10cSrcweir sal_Bool SotStorage::CopyTo( SotStorage * pDestStg ) 1066*cdf0e10cSrcweir { 1067*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1068*cdf0e10cSrcweir DBG_ASSERT( pDestStg->Owner(), "must be owner" ); 1069*cdf0e10cSrcweir if( m_pOwnStg && pDestStg->m_pOwnStg ) 1070*cdf0e10cSrcweir { 1071*cdf0e10cSrcweir m_pOwnStg->CopyTo( pDestStg->m_pOwnStg ); 1072*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1073*cdf0e10cSrcweir pDestStg->m_aKey = m_aKey; 1074*cdf0e10cSrcweir pDestStg->m_nVersion = m_nVersion; 1075*cdf0e10cSrcweir } 1076*cdf0e10cSrcweir else 1077*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1078*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1079*cdf0e10cSrcweir } 1080*cdf0e10cSrcweir 1081*cdf0e10cSrcweir /************************************************************************* 1082*cdf0e10cSrcweir |* SotStorage::Commit() 1083*cdf0e10cSrcweir |* 1084*cdf0e10cSrcweir |* Beschreibung 1085*cdf0e10cSrcweir *************************************************************************/ 1086*cdf0e10cSrcweir sal_Bool SotStorage::Commit() 1087*cdf0e10cSrcweir { 1088*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1089*cdf0e10cSrcweir if( m_pOwnStg ) 1090*cdf0e10cSrcweir { 1091*cdf0e10cSrcweir if( !m_pOwnStg->Commit() ) 1092*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1093*cdf0e10cSrcweir } 1094*cdf0e10cSrcweir else 1095*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1096*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1097*cdf0e10cSrcweir } 1098*cdf0e10cSrcweir 1099*cdf0e10cSrcweir /************************************************************************* 1100*cdf0e10cSrcweir |* SotStorage::Revert() 1101*cdf0e10cSrcweir |* 1102*cdf0e10cSrcweir |* Beschreibung 1103*cdf0e10cSrcweir *************************************************************************/ 1104*cdf0e10cSrcweir sal_Bool SotStorage::Revert() 1105*cdf0e10cSrcweir { 1106*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1107*cdf0e10cSrcweir if( m_pOwnStg ) 1108*cdf0e10cSrcweir { 1109*cdf0e10cSrcweir if( !m_pOwnStg->Revert() ) 1110*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1111*cdf0e10cSrcweir } 1112*cdf0e10cSrcweir else 1113*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1114*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1115*cdf0e10cSrcweir } 1116*cdf0e10cSrcweir 1117*cdf0e10cSrcweir /************************************************************************* 1118*cdf0e10cSrcweir |* SotStorage::OpenStream() 1119*cdf0e10cSrcweir |* 1120*cdf0e10cSrcweir |* Beschreibung 1121*cdf0e10cSrcweir *************************************************************************/ 1122*cdf0e10cSrcweir SotStorageStream * SotStorage::OpenEncryptedSotStream( const String & rEleName, const ByteString& rKey, 1123*cdf0e10cSrcweir StreamMode nMode, 1124*cdf0e10cSrcweir StorageMode nStorageMode ) 1125*cdf0e10cSrcweir { 1126*cdf0e10cSrcweir DBG_ASSERT( !nStorageMode, "StorageModes ignored" ); 1127*cdf0e10cSrcweir SotStorageStream * pStm = NULL; 1128*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1129*cdf0e10cSrcweir if( m_pOwnStg ) 1130*cdf0e10cSrcweir { 1131*cdf0e10cSrcweir // volle Ole-Patches einschalten 1132*cdf0e10cSrcweir // egal was kommt, nur exclusiv gestattet 1133*cdf0e10cSrcweir nMode |= STREAM_SHARE_DENYALL; 1134*cdf0e10cSrcweir ErrCode nE = m_pOwnStg->GetError(); 1135*cdf0e10cSrcweir BaseStorageStream* p = m_pOwnStg->OpenStream( rEleName, nMode, 1136*cdf0e10cSrcweir (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True, &rKey ); 1137*cdf0e10cSrcweir pStm = new SotStorageStream( p ); 1138*cdf0e10cSrcweir 1139*cdf0e10cSrcweir if( !nE ) 1140*cdf0e10cSrcweir m_pOwnStg->ResetError(); // kein Fehler setzen 1141*cdf0e10cSrcweir if( nMode & STREAM_TRUNC ) 1142*cdf0e10cSrcweir pStm->SetSize( 0 ); 1143*cdf0e10cSrcweir } 1144*cdf0e10cSrcweir else 1145*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1146*cdf0e10cSrcweir return pStm; 1147*cdf0e10cSrcweir } 1148*cdf0e10cSrcweir 1149*cdf0e10cSrcweir SotStorageStream * SotStorage::OpenSotStream( const String & rEleName, 1150*cdf0e10cSrcweir StreamMode nMode, 1151*cdf0e10cSrcweir StorageMode nStorageMode ) 1152*cdf0e10cSrcweir { 1153*cdf0e10cSrcweir DBG_ASSERT( !nStorageMode, "StorageModes ignored" ); 1154*cdf0e10cSrcweir SotStorageStream * pStm = NULL; 1155*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1156*cdf0e10cSrcweir if( m_pOwnStg ) 1157*cdf0e10cSrcweir { 1158*cdf0e10cSrcweir // volle Ole-Patches einschalten 1159*cdf0e10cSrcweir // egal was kommt, nur exclusiv gestattet 1160*cdf0e10cSrcweir nMode |= STREAM_SHARE_DENYALL; 1161*cdf0e10cSrcweir ErrCode nE = m_pOwnStg->GetError(); 1162*cdf0e10cSrcweir BaseStorageStream * p = m_pOwnStg->OpenStream( rEleName, nMode, 1163*cdf0e10cSrcweir (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 1164*cdf0e10cSrcweir pStm = new SotStorageStream( p ); 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir if( !nE ) 1167*cdf0e10cSrcweir m_pOwnStg->ResetError(); // kein Fehler setzen 1168*cdf0e10cSrcweir if( nMode & STREAM_TRUNC ) 1169*cdf0e10cSrcweir pStm->SetSize( 0 ); 1170*cdf0e10cSrcweir } 1171*cdf0e10cSrcweir else 1172*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1173*cdf0e10cSrcweir return pStm; 1174*cdf0e10cSrcweir } 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir /************************************************************************* 1177*cdf0e10cSrcweir |* SotStorage::OpenStorage() 1178*cdf0e10cSrcweir |* 1179*cdf0e10cSrcweir |* Beschreibung 1180*cdf0e10cSrcweir *************************************************************************/ 1181*cdf0e10cSrcweir SotStorage * SotStorage::OpenSotStorage( const String & rEleName, 1182*cdf0e10cSrcweir StreamMode nMode, 1183*cdf0e10cSrcweir StorageMode nStorageMode ) 1184*cdf0e10cSrcweir { 1185*cdf0e10cSrcweir SotStorage * pStor = NULL; 1186*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1187*cdf0e10cSrcweir if( m_pOwnStg ) 1188*cdf0e10cSrcweir { 1189*cdf0e10cSrcweir nMode |= STREAM_SHARE_DENYALL; 1190*cdf0e10cSrcweir ErrCode nE = m_pOwnStg->GetError(); 1191*cdf0e10cSrcweir BaseStorage * p = m_pOwnStg->OpenStorage( rEleName, nMode, 1192*cdf0e10cSrcweir (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 1193*cdf0e10cSrcweir if( p ) 1194*cdf0e10cSrcweir { 1195*cdf0e10cSrcweir pStor = new SotStorage( p ); 1196*cdf0e10cSrcweir if( !nE ) 1197*cdf0e10cSrcweir m_pOwnStg->ResetError(); // kein Fehler setzen 1198*cdf0e10cSrcweir 1199*cdf0e10cSrcweir return pStor; 1200*cdf0e10cSrcweir } 1201*cdf0e10cSrcweir } 1202*cdf0e10cSrcweir 1203*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1204*cdf0e10cSrcweir 1205*cdf0e10cSrcweir return NULL; 1206*cdf0e10cSrcweir } 1207*cdf0e10cSrcweir 1208*cdf0e10cSrcweir SotStorage * SotStorage::OpenUCBStorage( const String & rEleName, 1209*cdf0e10cSrcweir StreamMode nMode, 1210*cdf0e10cSrcweir StorageMode nStorageMode ) 1211*cdf0e10cSrcweir { 1212*cdf0e10cSrcweir SotStorage * pStor = NULL; 1213*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1214*cdf0e10cSrcweir if( m_pOwnStg ) 1215*cdf0e10cSrcweir { 1216*cdf0e10cSrcweir nMode |= STREAM_SHARE_DENYALL; 1217*cdf0e10cSrcweir ErrCode nE = m_pOwnStg->GetError(); 1218*cdf0e10cSrcweir BaseStorage * p = m_pOwnStg->OpenUCBStorage( rEleName, nMode, 1219*cdf0e10cSrcweir (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 1220*cdf0e10cSrcweir pStor = new SotStorage( p ); 1221*cdf0e10cSrcweir if( !nE ) 1222*cdf0e10cSrcweir m_pOwnStg->ResetError(); // kein Fehler setzen 1223*cdf0e10cSrcweir } 1224*cdf0e10cSrcweir else 1225*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1226*cdf0e10cSrcweir return pStor; 1227*cdf0e10cSrcweir } 1228*cdf0e10cSrcweir 1229*cdf0e10cSrcweir SotStorage * SotStorage::OpenOLEStorage( const String & rEleName, 1230*cdf0e10cSrcweir StreamMode nMode, 1231*cdf0e10cSrcweir StorageMode nStorageMode ) 1232*cdf0e10cSrcweir { 1233*cdf0e10cSrcweir SotStorage * pStor = NULL; 1234*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1235*cdf0e10cSrcweir if( m_pOwnStg ) 1236*cdf0e10cSrcweir { 1237*cdf0e10cSrcweir nMode |= STREAM_SHARE_DENYALL; 1238*cdf0e10cSrcweir ErrCode nE = m_pOwnStg->GetError(); 1239*cdf0e10cSrcweir BaseStorage * p = m_pOwnStg->OpenOLEStorage( rEleName, nMode, 1240*cdf0e10cSrcweir (nStorageMode & STORAGE_TRANSACTED) ? sal_False : sal_True ); 1241*cdf0e10cSrcweir pStor = new SotStorage( p ); 1242*cdf0e10cSrcweir if( !nE ) 1243*cdf0e10cSrcweir m_pOwnStg->ResetError(); // kein Fehler setzen 1244*cdf0e10cSrcweir } 1245*cdf0e10cSrcweir else 1246*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1247*cdf0e10cSrcweir return pStor; 1248*cdf0e10cSrcweir } 1249*cdf0e10cSrcweir 1250*cdf0e10cSrcweir /************************************************************************* 1251*cdf0e10cSrcweir |* SotStorage::IsStream() 1252*cdf0e10cSrcweir |* SotStorage::IsStorage() 1253*cdf0e10cSrcweir |* SotStorage::IsContained() 1254*cdf0e10cSrcweir |* 1255*cdf0e10cSrcweir |* Beschreibung 1256*cdf0e10cSrcweir *************************************************************************/ 1257*cdf0e10cSrcweir sal_Bool SotStorage::IsStorage( const String & rEleName ) const 1258*cdf0e10cSrcweir { 1259*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1260*cdf0e10cSrcweir // ein bisschen schneller 1261*cdf0e10cSrcweir if( m_pOwnStg ) 1262*cdf0e10cSrcweir return m_pOwnStg->IsStorage( rEleName ); 1263*cdf0e10cSrcweir return sal_False; 1264*cdf0e10cSrcweir } 1265*cdf0e10cSrcweir 1266*cdf0e10cSrcweir sal_Bool SotStorage::IsStream( const String & rEleName ) const 1267*cdf0e10cSrcweir { 1268*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1269*cdf0e10cSrcweir // ein bisschen schneller 1270*cdf0e10cSrcweir if( m_pOwnStg ) 1271*cdf0e10cSrcweir return m_pOwnStg->IsStream( rEleName ); 1272*cdf0e10cSrcweir return sal_False; 1273*cdf0e10cSrcweir } 1274*cdf0e10cSrcweir 1275*cdf0e10cSrcweir sal_Bool SotStorage::IsContained( const String & rEleName ) const 1276*cdf0e10cSrcweir { 1277*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1278*cdf0e10cSrcweir // ein bisschen schneller 1279*cdf0e10cSrcweir if( m_pOwnStg ) 1280*cdf0e10cSrcweir return m_pOwnStg->IsContained( rEleName ); 1281*cdf0e10cSrcweir return sal_False; 1282*cdf0e10cSrcweir } 1283*cdf0e10cSrcweir 1284*cdf0e10cSrcweir /************************************************************************* 1285*cdf0e10cSrcweir |* SotStorage::Remove() 1286*cdf0e10cSrcweir |* 1287*cdf0e10cSrcweir |* Beschreibung 1288*cdf0e10cSrcweir *************************************************************************/ 1289*cdf0e10cSrcweir sal_Bool SotStorage::Remove( const String & rEleName ) 1290*cdf0e10cSrcweir { 1291*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1292*cdf0e10cSrcweir if( m_pOwnStg ) 1293*cdf0e10cSrcweir { 1294*cdf0e10cSrcweir m_pOwnStg->Remove( rEleName ); 1295*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1296*cdf0e10cSrcweir } 1297*cdf0e10cSrcweir else 1298*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1299*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1300*cdf0e10cSrcweir } 1301*cdf0e10cSrcweir 1302*cdf0e10cSrcweir /************************************************************************* 1303*cdf0e10cSrcweir |* SotStorage::Rename() 1304*cdf0e10cSrcweir |* 1305*cdf0e10cSrcweir |* Beschreibung 1306*cdf0e10cSrcweir *************************************************************************/ 1307*cdf0e10cSrcweir sal_Bool SotStorage::Rename( const String & rEleName, const String & rNewName ) 1308*cdf0e10cSrcweir { 1309*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1310*cdf0e10cSrcweir if( m_pOwnStg ) 1311*cdf0e10cSrcweir { 1312*cdf0e10cSrcweir m_pOwnStg->Rename( rEleName, rNewName ); 1313*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1314*cdf0e10cSrcweir } 1315*cdf0e10cSrcweir else 1316*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1317*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1318*cdf0e10cSrcweir } 1319*cdf0e10cSrcweir 1320*cdf0e10cSrcweir /************************************************************************* 1321*cdf0e10cSrcweir |* SotStorage::CopyTo() 1322*cdf0e10cSrcweir |* 1323*cdf0e10cSrcweir |* Beschreibung 1324*cdf0e10cSrcweir *************************************************************************/ 1325*cdf0e10cSrcweir sal_Bool SotStorage::CopyTo( const String & rEleName, 1326*cdf0e10cSrcweir SotStorage * pNewSt, const String & rNewName ) 1327*cdf0e10cSrcweir { 1328*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1329*cdf0e10cSrcweir DBG_ASSERT( pNewSt->Owner(), "must be owner" ); 1330*cdf0e10cSrcweir if( m_pOwnStg ) 1331*cdf0e10cSrcweir { 1332*cdf0e10cSrcweir m_pOwnStg->CopyTo( rEleName, pNewSt->m_pOwnStg, rNewName ); 1333*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1334*cdf0e10cSrcweir SetError( pNewSt->GetError() ); 1335*cdf0e10cSrcweir } 1336*cdf0e10cSrcweir else 1337*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1338*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1339*cdf0e10cSrcweir } 1340*cdf0e10cSrcweir 1341*cdf0e10cSrcweir /************************************************************************* 1342*cdf0e10cSrcweir |* SotStorage::MoveTo() 1343*cdf0e10cSrcweir |* 1344*cdf0e10cSrcweir |* Beschreibung 1345*cdf0e10cSrcweir *************************************************************************/ 1346*cdf0e10cSrcweir sal_Bool SotStorage::MoveTo( const String & rEleName, 1347*cdf0e10cSrcweir SotStorage * pNewSt, const String & rNewName ) 1348*cdf0e10cSrcweir { 1349*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1350*cdf0e10cSrcweir DBG_ASSERT( pNewSt->Owner(), "must be owner" ); 1351*cdf0e10cSrcweir if( m_pOwnStg ) 1352*cdf0e10cSrcweir { 1353*cdf0e10cSrcweir m_pOwnStg->MoveTo( rEleName, pNewSt->m_pOwnStg, rNewName ); 1354*cdf0e10cSrcweir SetError( m_pOwnStg->GetError() ); 1355*cdf0e10cSrcweir SetError( pNewSt->GetError() ); 1356*cdf0e10cSrcweir } 1357*cdf0e10cSrcweir else 1358*cdf0e10cSrcweir SetError( SVSTREAM_GENERALERROR ); 1359*cdf0e10cSrcweir return SVSTREAM_OK == GetError(); 1360*cdf0e10cSrcweir } 1361*cdf0e10cSrcweir 1362*cdf0e10cSrcweir const SvStream* SotStorage::GetSvStream() 1363*cdf0e10cSrcweir { 1364*cdf0e10cSrcweir const SvStream* pResult = 0; 1365*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1366*cdf0e10cSrcweir if( m_pOwnStg ) 1367*cdf0e10cSrcweir pResult = m_pOwnStg->GetSvStream(); 1368*cdf0e10cSrcweir return pResult; 1369*cdf0e10cSrcweir } 1370*cdf0e10cSrcweir 1371*cdf0e10cSrcweir SvStream* SotStorage::GetTargetSvStream() const 1372*cdf0e10cSrcweir { 1373*cdf0e10cSrcweir SvStream* pResult = 0; 1374*cdf0e10cSrcweir DBG_ASSERT( Owner(), "must be owner" ); 1375*cdf0e10cSrcweir if( m_pOwnStg ) 1376*cdf0e10cSrcweir pResult = (SvStream*)(m_pOwnStg->GetSvStream()); 1377*cdf0e10cSrcweir return pResult; 1378*cdf0e10cSrcweir } 1379*cdf0e10cSrcweir 1380*cdf0e10cSrcweir 1381*cdf0e10cSrcweir sal_Bool SotStorage::Validate() 1382*cdf0e10cSrcweir { 1383*cdf0e10cSrcweir DBG_ASSERT( m_bIsRoot, "Validate nur an Rootstorage" ); 1384*cdf0e10cSrcweir if( m_pOwnStg ) 1385*cdf0e10cSrcweir return m_pOwnStg->ValidateFAT(); 1386*cdf0e10cSrcweir else 1387*cdf0e10cSrcweir return sal_True; 1388*cdf0e10cSrcweir } 1389*cdf0e10cSrcweir 1390*cdf0e10cSrcweir sal_Bool SotStorage::SetProperty( const String& rName, const ::com::sun::star::uno::Any& rValue ) 1391*cdf0e10cSrcweir { 1392*cdf0e10cSrcweir UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); 1393*cdf0e10cSrcweir if ( pStg ) 1394*cdf0e10cSrcweir { 1395*cdf0e10cSrcweir return pStg->SetProperty( rName, rValue ); 1396*cdf0e10cSrcweir } 1397*cdf0e10cSrcweir else 1398*cdf0e10cSrcweir { 1399*cdf0e10cSrcweir DBG_WARNING("W1:Not implemented!"); 1400*cdf0e10cSrcweir return sal_False; 1401*cdf0e10cSrcweir } 1402*cdf0e10cSrcweir } 1403*cdf0e10cSrcweir 1404*cdf0e10cSrcweir sal_Bool SotStorage::GetProperty( const String& rName, ::com::sun::star::uno::Any& rValue ) 1405*cdf0e10cSrcweir { 1406*cdf0e10cSrcweir UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); 1407*cdf0e10cSrcweir if ( pStg ) 1408*cdf0e10cSrcweir { 1409*cdf0e10cSrcweir return pStg->GetProperty( rName, rValue ); 1410*cdf0e10cSrcweir } 1411*cdf0e10cSrcweir else if ( rName.CompareToAscii("MediaType") == COMPARE_EQUAL ) 1412*cdf0e10cSrcweir { 1413*cdf0e10cSrcweir String aStr = SotExchange::GetFormatMimeType( GetFormat() ); 1414*cdf0e10cSrcweir sal_uInt16 nPos = aStr.Search(';'); 1415*cdf0e10cSrcweir if ( nPos != STRING_NOTFOUND ) 1416*cdf0e10cSrcweir aStr = aStr.Copy( 0, nPos ); 1417*cdf0e10cSrcweir rValue <<= (::rtl::OUString) aStr; 1418*cdf0e10cSrcweir return sal_True; 1419*cdf0e10cSrcweir } 1420*cdf0e10cSrcweir else 1421*cdf0e10cSrcweir { 1422*cdf0e10cSrcweir DBG_WARNING("W1:Not implemented!"); 1423*cdf0e10cSrcweir return sal_False; 1424*cdf0e10cSrcweir } 1425*cdf0e10cSrcweir } 1426*cdf0e10cSrcweir 1427*cdf0e10cSrcweir sal_Bool SotStorage::GetProperty( const String& rEleName, const String& rName, ::com::sun::star::uno::Any& rValue ) 1428*cdf0e10cSrcweir { 1429*cdf0e10cSrcweir UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); 1430*cdf0e10cSrcweir if ( pStg ) 1431*cdf0e10cSrcweir { 1432*cdf0e10cSrcweir return pStg->GetProperty( rEleName, rName, rValue ); 1433*cdf0e10cSrcweir } 1434*cdf0e10cSrcweir else 1435*cdf0e10cSrcweir { 1436*cdf0e10cSrcweir DBG_WARNING("W1:Not implemented!"); 1437*cdf0e10cSrcweir return sal_False; 1438*cdf0e10cSrcweir } 1439*cdf0e10cSrcweir } 1440*cdf0e10cSrcweir 1441*cdf0e10cSrcweir sal_Bool SotStorage::IsOLEStorage() const 1442*cdf0e10cSrcweir { 1443*cdf0e10cSrcweir UCBStorage* pStg = PTR_CAST( UCBStorage, m_pOwnStg ); 1444*cdf0e10cSrcweir return !pStg; 1445*cdf0e10cSrcweir } 1446*cdf0e10cSrcweir 1447*cdf0e10cSrcweir sal_Bool SotStorage::IsOLEStorage( const String & rFileName ) 1448*cdf0e10cSrcweir { 1449*cdf0e10cSrcweir return Storage::IsStorageFile( rFileName ); 1450*cdf0e10cSrcweir } 1451*cdf0e10cSrcweir 1452*cdf0e10cSrcweir sal_Bool SotStorage::IsOLEStorage( SvStream* pStream ) 1453*cdf0e10cSrcweir { 1454*cdf0e10cSrcweir return Storage::IsStorageFile( pStream ); 1455*cdf0e10cSrcweir } 1456*cdf0e10cSrcweir 1457*cdf0e10cSrcweir void SotStorage::SetKey( const ByteString& rKey ) 1458*cdf0e10cSrcweir { 1459*cdf0e10cSrcweir m_aKey = rKey; 1460*cdf0e10cSrcweir if ( !IsOLEStorage() ) 1461*cdf0e10cSrcweir { 1462*cdf0e10cSrcweir sal_uInt8 aBuffer[RTL_DIGEST_LENGTH_SHA1]; 1463*cdf0e10cSrcweir rtlDigestError nError = rtl_digest_SHA1( m_aKey.GetBuffer(), m_aKey.Len(), aBuffer, RTL_DIGEST_LENGTH_SHA1 ); 1464*cdf0e10cSrcweir if ( nError == rtl_Digest_E_None ) 1465*cdf0e10cSrcweir { 1466*cdf0e10cSrcweir sal_uInt8* pBuffer = aBuffer; 1467*cdf0e10cSrcweir ::com::sun::star::uno::Sequence < sal_Int8 > aSequ( (sal_Int8*) pBuffer, RTL_DIGEST_LENGTH_SHA1 ); 1468*cdf0e10cSrcweir ::com::sun::star::uno::Any aAny; 1469*cdf0e10cSrcweir aAny <<= aSequ; 1470*cdf0e10cSrcweir SetProperty( ::rtl::OUString::createFromAscii("EncryptionKey"), aAny ); 1471*cdf0e10cSrcweir } 1472*cdf0e10cSrcweir } 1473*cdf0e10cSrcweir } 1474*cdf0e10cSrcweir 1475*cdf0e10cSrcweir SotStorage* SotStorage::OpenOLEStorage( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage, 1476*cdf0e10cSrcweir const String& rEleName, StreamMode nMode ) 1477*cdf0e10cSrcweir { 1478*cdf0e10cSrcweir sal_Int32 nEleMode = embed::ElementModes::SEEKABLEREAD; 1479*cdf0e10cSrcweir if ( nMode & STREAM_WRITE ) 1480*cdf0e10cSrcweir nEleMode |= embed::ElementModes::WRITE; 1481*cdf0e10cSrcweir if ( nMode & STREAM_TRUNC ) 1482*cdf0e10cSrcweir nEleMode |= embed::ElementModes::TRUNCATE; 1483*cdf0e10cSrcweir if ( nMode & STREAM_NOCREATE ) 1484*cdf0e10cSrcweir nEleMode |= embed::ElementModes::NOCREATE; 1485*cdf0e10cSrcweir 1486*cdf0e10cSrcweir SvStream* pStream = NULL; 1487*cdf0e10cSrcweir try 1488*cdf0e10cSrcweir { 1489*cdf0e10cSrcweir uno::Reference < io::XStream > xStream = xStorage->openStreamElement( rEleName, nEleMode ); 1490*cdf0e10cSrcweir 1491*cdf0e10cSrcweir // TODO/LATER: should it be done this way? 1492*cdf0e10cSrcweir if ( nMode & STREAM_WRITE ) 1493*cdf0e10cSrcweir { 1494*cdf0e10cSrcweir uno::Reference < beans::XPropertySet > xStreamProps( xStream, uno::UNO_QUERY_THROW ); 1495*cdf0e10cSrcweir xStreamProps->setPropertyValue( 1496*cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "MediaType" ) ), 1497*cdf0e10cSrcweir uno::makeAny( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "application/vnd.sun.star.oleobject" ) ) ) ); 1498*cdf0e10cSrcweir } 1499*cdf0e10cSrcweir 1500*cdf0e10cSrcweir pStream = utl::UcbStreamHelper::CreateStream( xStream ); 1501*cdf0e10cSrcweir } 1502*cdf0e10cSrcweir catch ( uno::Exception& ) 1503*cdf0e10cSrcweir { 1504*cdf0e10cSrcweir //TODO/LATER: ErrorHandling 1505*cdf0e10cSrcweir pStream = new SvMemoryStream; 1506*cdf0e10cSrcweir pStream->SetError( ERRCODE_IO_GENERAL ); 1507*cdf0e10cSrcweir } 1508*cdf0e10cSrcweir 1509*cdf0e10cSrcweir return new SotStorage( pStream, sal_True ); 1510*cdf0e10cSrcweir } 1511*cdf0e10cSrcweir 1512*cdf0e10cSrcweir sal_Int32 SotStorage::GetFormatID( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage ) 1513*cdf0e10cSrcweir { 1514*cdf0e10cSrcweir uno::Reference< beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY ); 1515*cdf0e10cSrcweir if ( !xProps.is() ) 1516*cdf0e10cSrcweir return 0; 1517*cdf0e10cSrcweir 1518*cdf0e10cSrcweir ::rtl::OUString aMediaType; 1519*cdf0e10cSrcweir xProps->getPropertyValue( ::rtl::OUString::createFromAscii( "MediaType" ) ) >>= aMediaType; 1520*cdf0e10cSrcweir if ( aMediaType.getLength() ) 1521*cdf0e10cSrcweir { 1522*cdf0e10cSrcweir ::com::sun::star::datatransfer::DataFlavor aDataFlavor; 1523*cdf0e10cSrcweir aDataFlavor.MimeType = aMediaType; 1524*cdf0e10cSrcweir return SotExchange::GetFormat( aDataFlavor ); 1525*cdf0e10cSrcweir } 1526*cdf0e10cSrcweir 1527*cdf0e10cSrcweir return 0; 1528*cdf0e10cSrcweir } 1529*cdf0e10cSrcweir 1530*cdf0e10cSrcweir sal_Int32 SotStorage::GetVersion( const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage ) 1531*cdf0e10cSrcweir { 1532*cdf0e10cSrcweir sal_Int32 nSotFormatID = SotStorage::GetFormatID( xStorage ); 1533*cdf0e10cSrcweir switch( nSotFormatID ) 1534*cdf0e10cSrcweir { 1535*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITER_8: 1536*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITER_8_TEMPLATE: 1537*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITERWEB_8: 1538*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITERGLOB_8: 1539*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARDRAW_8: 1540*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARDRAW_8_TEMPLATE: 1541*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARIMPRESS_8: 1542*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARIMPRESS_8_TEMPLATE: 1543*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARCALC_8: 1544*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARCALC_8_TEMPLATE: 1545*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARCHART_8: 1546*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARCHART_8_TEMPLATE: 1547*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARMATH_8: 1548*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARMATH_8_TEMPLATE: 1549*cdf0e10cSrcweir return SOFFICE_FILEFORMAT_8; 1550*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITER_60: 1551*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITERWEB_60: 1552*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARWRITERGLOB_60: 1553*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARDRAW_60: 1554*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARIMPRESS_60: 1555*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARCALC_60: 1556*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARCHART_60: 1557*cdf0e10cSrcweir case SOT_FORMATSTR_ID_STARMATH_60: 1558*cdf0e10cSrcweir return SOFFICE_FILEFORMAT_60; 1559*cdf0e10cSrcweir } 1560*cdf0e10cSrcweir 1561*cdf0e10cSrcweir return 0; 1562*cdf0e10cSrcweir } 1563*cdf0e10cSrcweir 1564