xref: /trunk/main/sot/inc/sot/stg.hxx (revision bbfc4cc7)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _STG_HXX
25 #define _STG_HXX
26 
27 #include <com/sun/star/uno/Any.h>
28 #include <com/sun/star/uno/Reference.h>
29 
30 #ifndef _COM_SUN_STAR_IO_XINPUTSTREAM_H_
31 #include <com/sun/star/io/XInputStream.hpp>
32 #endif
33 
34 #ifndef _COM_SUN_STAR_UCB_XCOMMANDENVIRONMENT_H_
35 #include <com/sun/star/ucb/XCommandEnvironment.hpp>
36 #endif
37 
38 #ifndef _COM_SUN_STAR_EMBED_XSTORAGE_H_
39 #include <com/sun/star/embed/XStorage.hpp>
40 #endif
41 
42 
43 #include <tools/rtti.hxx>
44 #ifndef _TOOLS_STREAM_HXX //autogen
45 #include <tools/stream.hxx>
46 #endif
47 #ifndef _TOOLS_GLOBNAME_HXX //autogen
48 #include <tools/globname.hxx>
49 #endif
50 #include "sot/sotdllapi.h"
51 
52 #include <list>
53 class UNOStorageHolder;
54 typedef ::std::list< UNOStorageHolder* > UNOStorageHolderList;
55 
56 class Storage;
57 class StorageStream;
58 class StgIo;
59 class StgDirEntry;
60 class StgStrm;
61 class SvGlobalName;
62 struct ClsId
63 {
64 	sal_Int32	n1;
65 	sal_Int16	n2, n3;
66 	sal_uInt8	n4, n5, n6, n7, n8, n9, n10, n11;
67 };
68 
69 class SOT_DLLPUBLIC StorageBase : public SvRefBase
70 {
71 protected:
72     sal_uLong           m_nError;                   // error code
73     StreamMode      m_nMode;                    // open mode
74     sal_Bool            m_bAutoCommit;
75                     StorageBase();
76     virtual         ~StorageBase();
77 public:
78                     TYPEINFO();
79     virtual const SvStream* GetSvStream() const = 0;
80     virtual sal_Bool    Validate( sal_Bool=sal_False ) const = 0;
81     virtual sal_Bool    ValidateMode( StreamMode ) const = 0;
82     void            ResetError() const;
83     void            SetError( sal_uLong ) const;
84     sal_uLong           GetError() const;
Good() const85     sal_Bool            Good() const          { return sal_Bool( m_nError == SVSTREAM_OK ); }
GetMode() const86     StreamMode      GetMode() const  { return m_nMode;  }
SetAutoCommit(sal_Bool bSet)87 	void			SetAutoCommit( sal_Bool bSet )
88 					{ m_bAutoCommit = bSet; }
89 };
90 
91 class BaseStorageStream : public StorageBase
92 {
93 public:
94                     TYPEINFO();
95     virtual sal_uLong   Read( void * pData, sal_uLong nSize ) = 0;
96     virtual sal_uLong   Write( const void* pData, sal_uLong nSize ) = 0;
97     virtual sal_uLong   Seek( sal_uLong nPos ) = 0;
98     virtual sal_uLong   Tell() = 0;
99     virtual void    Flush() = 0;
100     virtual sal_Bool    SetSize( sal_uLong nNewSize ) = 0;
101     virtual sal_Bool    CopyTo( BaseStorageStream * pDestStm ) = 0;
102     virtual sal_Bool    Commit() = 0;
103     virtual sal_Bool    Revert() = 0;
104     virtual sal_Bool    Equals( const BaseStorageStream& rStream ) const = 0;
105 };
106 
107 class SvStorageInfoList;
108 class BaseStorage : public StorageBase
109 {
110 public:
111                                 TYPEINFO();
112     virtual const String&       GetName() const = 0;
113     virtual sal_Bool                IsRoot() const = 0;
114     virtual void                SetClassId( const ClsId& ) = 0;
115     virtual const ClsId&        GetClassId() const = 0;
116     virtual void                SetDirty() = 0;
117     virtual void                SetClass( const SvGlobalName & rClass,
118                                     sal_uLong nOriginalClipFormat,
119                                     const String & rUserTypeName ) = 0;
120     virtual void                SetConvertClass( const SvGlobalName & rConvertClass,
121                                            sal_uLong nOriginalClipFormat,
122                                            const String & rUserTypeName ) = 0;
123     virtual SvGlobalName        GetClassName() = 0;
124     virtual sal_uLong               GetFormat() = 0;
125     virtual String              GetUserName() = 0;
126     virtual sal_Bool                ShouldConvert() = 0;
127     virtual void                FillInfoList( SvStorageInfoList* ) const = 0;
128     virtual sal_Bool                CopyTo( BaseStorage* pDestStg ) const = 0;
129     virtual sal_Bool                Commit() = 0;
130     virtual sal_Bool                Revert() = 0;
131     virtual BaseStorageStream*  OpenStream( const String & rEleName,
132                                   StreamMode = STREAM_STD_READWRITE,
133                                   sal_Bool bDirect = sal_True, const ByteString* pKey=0 ) = 0;
134     virtual BaseStorage*        OpenStorage( const String & rEleName,
135                                    StreamMode = STREAM_STD_READWRITE,
136                                    sal_Bool bDirect = sal_False ) = 0;
137     virtual BaseStorage*        OpenUCBStorage( const String & rEleName,
138                                    StreamMode = STREAM_STD_READWRITE,
139                                    sal_Bool bDirect = sal_False ) = 0;
140     virtual BaseStorage*        OpenOLEStorage( const String & rEleName,
141                                    StreamMode = STREAM_STD_READWRITE,
142                                    sal_Bool bDirect = sal_False ) = 0;
143     virtual sal_Bool                IsStream( const String& rEleName ) const = 0;
144     virtual sal_Bool                IsStorage( const String& rEleName ) const = 0;
145     virtual sal_Bool                IsContained( const String& rEleName ) const = 0;
146     virtual sal_Bool                Remove( const String & rEleName ) = 0;
147     virtual sal_Bool                Rename( const String & rEleName, const String & rNewName ) = 0;
148     virtual sal_Bool                CopyTo( const String & rEleName, BaseStorage * pDest, const String & rNewName ) = 0;
149     virtual sal_Bool                MoveTo( const String & rEleName, BaseStorage * pDest, const String & rNewName ) = 0;
150     virtual sal_Bool                ValidateFAT() = 0;
151     virtual sal_Bool                Equals( const BaseStorage& rStream ) const = 0;
152 };
153 
154 class OLEStorageBase
155 {
156 protected:
157     StreamMode&     nStreamMode;              // open mode
158     StgIo*          pIo;                      // I/O subsystem
159     StgDirEntry*    pEntry;                   // the dir entry
160                     OLEStorageBase( StgIo*, StgDirEntry*, StreamMode& );
161                     ~OLEStorageBase();
162     sal_Bool            Validate_Impl( sal_Bool=sal_False ) const;
163     sal_Bool            ValidateMode_Impl( StreamMode, StgDirEntry* p = NULL ) const ;
164     const SvStream* GetSvStream_Impl() const;
165 public:
166 };
167 
168 class StorageStream : public BaseStorageStream, public OLEStorageBase
169 {
170 //friend class Storage;
171     sal_uLong           nPos;                             // current position
172 protected:
173                     ~StorageStream();
174 public:
175                     TYPEINFO();
176                     StorageStream( StgIo*, StgDirEntry*, StreamMode );
177     virtual sal_uLong   Read( void * pData, sal_uLong nSize );
178     virtual sal_uLong   Write( const void* pData, sal_uLong nSize );
179     virtual sal_uLong   Seek( sal_uLong nPos );
Tell()180     virtual sal_uLong   Tell() { return nPos; }
181     virtual void    Flush();
182     virtual sal_Bool    SetSize( sal_uLong nNewSize );
183     virtual sal_Bool    CopyTo( BaseStorageStream * pDestStm );
184     virtual sal_Bool    Commit();
185     virtual sal_Bool    Revert();
186     virtual sal_Bool    Validate( sal_Bool=sal_False ) const;
187     virtual sal_Bool    ValidateMode( StreamMode ) const;
188     sal_Bool            ValidateMode( StreamMode, StgDirEntry* p ) const;
189 	const SvStream* GetSvStream() const;
190     virtual sal_Bool    Equals( const BaseStorageStream& rStream ) const;
191 };
192 
193 class UCBStorageStream;
194 
195 class SOT_DLLPUBLIC Storage : public BaseStorage, public OLEStorageBase
196 {
197     String                      aName;
198     sal_Bool                        bIsRoot;
199     void                        Init( sal_Bool bCreate );
200                                 Storage( StgIo*, StgDirEntry*, StreamMode );
201 protected:
202                                 ~Storage();
203 public:
204                                 TYPEINFO();
205                                 Storage( const String &, StreamMode = STREAM_STD_READWRITE, sal_Bool bDirect = sal_True );
206                                 Storage( SvStream& rStrm, sal_Bool bDirect = sal_True );
207                                 Storage( UCBStorageStream& rStrm, sal_Bool bDirect = sal_True );
208 
209     static sal_Bool                 IsStorageFile( const String & rFileName );
210     static sal_Bool                 IsStorageFile( SvStream* );
211 
212     virtual const String&       GetName() const;
IsRoot() const213     virtual sal_Bool                IsRoot() const { return bIsRoot; }
214     virtual void                SetClassId( const ClsId& );
215     virtual const ClsId&        GetClassId() const;
216     virtual void                SetDirty();
217     virtual void                SetClass( const SvGlobalName & rClass,
218                                     sal_uLong nOriginalClipFormat,
219                                     const String & rUserTypeName );
220     virtual void                SetConvertClass( const SvGlobalName & rConvertClass,
221                                            sal_uLong nOriginalClipFormat,
222                                            const String & rUserTypeName );
223     virtual SvGlobalName        GetClassName();
224     virtual sal_uLong               GetFormat();
225     virtual String              GetUserName();
226     virtual sal_Bool                ShouldConvert();
227     virtual void                FillInfoList( SvStorageInfoList* ) const;
228     virtual sal_Bool                CopyTo( BaseStorage* pDestStg ) const;
229     virtual sal_Bool                Commit();
230     virtual sal_Bool                Revert();
231     virtual BaseStorageStream*  OpenStream( const String & rEleName,
232                                   StreamMode = STREAM_STD_READWRITE,
233                                   sal_Bool bDirect = sal_True, const ByteString* pKey=0 );
234     virtual BaseStorage*        OpenStorage( const String & rEleName,
235                                        StreamMode = STREAM_STD_READWRITE,
236                                        sal_Bool bDirect = sal_False );
237     virtual BaseStorage*        OpenUCBStorage( const String & rEleName,
238                                    StreamMode = STREAM_STD_READWRITE,
239                                    sal_Bool bDirect = sal_False );
240     virtual BaseStorage*        OpenOLEStorage( const String & rEleName,
241                                    StreamMode = STREAM_STD_READWRITE,
242                                    sal_Bool bDirect = sal_False );
243     virtual sal_Bool                IsStream( const String& rEleName ) const;
244     virtual sal_Bool                IsStorage( const String& rEleName ) const;
245     virtual sal_Bool                IsContained( const String& rEleName ) const;
246     virtual sal_Bool                Remove( const String & rEleName );
247     virtual sal_Bool                Rename( const String & rEleName, const String & rNewName );
248     virtual sal_Bool                CopyTo( const String & rEleName, BaseStorage * pDest, const String & rNewName );
249     virtual sal_Bool                MoveTo( const String & rEleName, BaseStorage * pDest, const String & rNewName );
250     virtual sal_Bool                ValidateFAT();
251     virtual sal_Bool                Validate( sal_Bool=sal_False ) const;
252     virtual sal_Bool                ValidateMode( StreamMode ) const;
253     sal_Bool                        ValidateMode( StreamMode, StgDirEntry* p ) const;
254     virtual const SvStream*     GetSvStream() const;
255     virtual sal_Bool                Equals( const BaseStorage& rStream ) const;
256 };
257 
258 class UCBStorageStream_Impl;
259 class UCBStorageStream : public BaseStorageStream
260 {
261 friend class UCBStorage;
262 
263     UCBStorageStream_Impl*
264 			pImp;
265 protected:
266                                 ~UCBStorageStream();
267 public:
268                                 TYPEINFO();
269                                 UCBStorageStream( const String& rName, StreamMode nMode, sal_Bool bDirect, const ByteString* pKey=0 );
270                                 UCBStorageStream( const String& rName, StreamMode nMode, sal_Bool bDirect, const ByteString* pKey, sal_Bool bRepair, ::com::sun::star::uno::Reference< ::com::sun::star::ucb::XProgressHandler > xProgress );
271                                 UCBStorageStream( UCBStorageStream_Impl* );
272 
273     virtual sal_uLong               Read( void * pData, sal_uLong nSize );
274     virtual sal_uLong               Write( const void* pData, sal_uLong nSize );
275     virtual sal_uLong               Seek( sal_uLong nPos );
276     virtual sal_uLong               Tell();
277     virtual void                Flush();
278     virtual sal_Bool                SetSize( sal_uLong nNewSize );
279     virtual sal_Bool                CopyTo( BaseStorageStream * pDestStm );
280     virtual sal_Bool                Commit();
281     virtual sal_Bool                Revert();
282     virtual sal_Bool                Validate( sal_Bool=sal_False ) const;
283     virtual sal_Bool                ValidateMode( StreamMode ) const;
284     const SvStream*             GetSvStream() const;
285     virtual sal_Bool                Equals( const BaseStorageStream& rStream ) const;
286     sal_Bool                        SetProperty( const String& rName, const ::com::sun::star::uno::Any& rValue );
287     sal_Bool                        GetProperty( const String& rName, ::com::sun::star::uno::Any& rValue );
288 
289 	SvStream*					GetModifySvStream();
290 
291     ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream > GetXInputStream() const;
292 };
293 
294 namespace ucbhelper
295 {
296 	class Content;
297 }
298 
299 class UCBStorage_Impl;
300 struct UCBStorageElement_Impl;
301 class SOT_DLLPUBLIC UCBStorage : public BaseStorage
302 {
303     UCBStorage_Impl*            pImp;
304 
305 protected:
306                                 ~UCBStorage();
307 public:
308     static sal_Bool                 IsStorageFile( SvStream* );
309     static sal_Bool                 IsStorageFile( const String& rName );
310     static sal_Bool                 IsDiskSpannedFile( SvStream* );
311 	static String				GetLinkedFile( SvStream& );
312 	static String				CreateLinkFile( const String& rName );
313 
314                                 UCBStorage( const ::ucbhelper::Content& rContent, const String& rName, StreamMode nMode, sal_Bool bDirect = sal_True, sal_Bool bIsRoot = sal_True );
315                                 UCBStorage( const String& rName,
316 											StreamMode nMode,
317 											sal_Bool bDirect = sal_True,
318 											sal_Bool bIsRoot = sal_True );
319 
320                                 UCBStorage( const String& rName,
321 											StreamMode nMode,
322 											sal_Bool bDirect,
323 											sal_Bool bIsRoot,
324 											sal_Bool bIsRepair,
325 											::com::sun::star::uno::Reference< ::com::sun::star::ucb::XProgressHandler >
326 												xProgressHandler );
327 
328                                 UCBStorage( UCBStorage_Impl* );
329                                 UCBStorage( SvStream& rStrm, sal_Bool bDirect = sal_True );
330 
331                                 TYPEINFO();
332     virtual const String&       GetName() const;
333     virtual sal_Bool                IsRoot() const;
334     virtual void                SetClassId( const ClsId& );
335     virtual const ClsId&        GetClassId() const;
336     virtual void                SetDirty();
337     virtual void                SetClass( const SvGlobalName & rClass,
338                                     sal_uLong nOriginalClipFormat,
339                                     const String & rUserTypeName );
340     virtual void                SetConvertClass( const SvGlobalName & rConvertClass,
341                                            sal_uLong nOriginalClipFormat,
342                                            const String & rUserTypeName );
343     virtual SvGlobalName        GetClassName();
344     virtual sal_uLong               GetFormat();
345     virtual String              GetUserName();
346     virtual sal_Bool                ShouldConvert();
347     virtual void                FillInfoList( SvStorageInfoList* ) const;
348     virtual sal_Bool                CopyTo( BaseStorage* pDestStg ) const;
349     virtual sal_Bool                Commit();
350     virtual sal_Bool                Revert();
351     virtual BaseStorageStream*  OpenStream( const String & rEleName,
352                                   StreamMode = STREAM_STD_READWRITE,
353                                   sal_Bool bDirect = sal_True, const ByteString* pKey=0 );
354     virtual BaseStorage*        OpenStorage( const String & rEleName,
355                                        StreamMode = STREAM_STD_READWRITE,
356                                        sal_Bool bDirect = sal_False );
357     virtual BaseStorage*        OpenUCBStorage( const String & rEleName,
358                                    StreamMode = STREAM_STD_READWRITE,
359                                    sal_Bool bDirect = sal_False );
360     virtual BaseStorage*        OpenOLEStorage( const String & rEleName,
361                                    StreamMode = STREAM_STD_READWRITE,
362                                    sal_Bool bDirect = sal_False );
363     virtual sal_Bool                IsStream( const String& rEleName ) const;
364     virtual sal_Bool                IsStorage( const String& rEleName ) const;
365     virtual sal_Bool                IsContained( const String& rEleName ) const;
366     virtual sal_Bool                Remove( const String & rEleName );
367     virtual sal_Bool                Rename( const String & rEleName, const String & rNewName );
368     virtual sal_Bool                CopyTo( const String & rEleName, BaseStorage * pDest, const String & rNewName );
369     virtual sal_Bool                MoveTo( const String & rEleName, BaseStorage * pDest, const String & rNewName );
370     virtual sal_Bool                ValidateFAT();
371     virtual sal_Bool                Validate( sal_Bool=sal_False ) const;
372     virtual sal_Bool                ValidateMode( StreamMode ) const;
373     virtual const SvStream*     GetSvStream() const;
374     virtual sal_Bool                Equals( const BaseStorage& rStream ) const;
375     sal_Bool                        SetProperty( const String& rName, const ::com::sun::star::uno::Any& rValue );
376     sal_Bool                        GetProperty( const String& rName, ::com::sun::star::uno::Any& rValue );
377     sal_Bool                		GetProperty( const String& rEleName, const String& rName, ::com::sun::star::uno::Any& rValue );
378 
379 	// HACK to avoid incompatible build, can be done since this feature is only for development
380 	// should be removed before release
381 	UNOStorageHolderList* GetUNOStorageHolderList();
382 
383 //#if _SOLAR__PRIVATE
384     UCBStorageElement_Impl*     FindElement_Impl( const String& rName ) const;
385     sal_Bool                        CopyStorageElement_Impl( UCBStorageElement_Impl& rElement,
386                                     BaseStorage* pDest, const String& rNew ) const;
387     BaseStorage*        		OpenStorage_Impl( const String & rEleName,
388                                        StreamMode, sal_Bool bDirect, sal_Bool bForceUCBStorage );
389 //#endif
390 
391 };
392 
393 
394 #endif
395