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