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