xref: /aoo42x/main/sot/source/sdstor/stgdir.hxx (revision f6efcac4)
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 _STGDIR_HXX
25 #define _STGDIR_HXX
26 
27 #include "stgavl.hxx"
28 #include "stgelem.hxx"
29 #include "stgstrms.hxx"
30 
31 class StgIo;
32 class StgEntry;
33 class StgDirEntry;
34 class StgDirStrm;
35 
36 class BaseStorageStream;
37 class StgDirEntry : public StgAvlNode
38 {
39 	friend class StgIterator;
40 	friend class StgDirStrm;
41 	StgEntry	 aSave;						// original dir entry
42 	StgDirEntry*  pUp;						// parent directory
43 	StgDirEntry*  pDown;					// child directory for storages
44 	StgDirEntry** ppRoot;					// root of TOC tree
45     StgStrm*     pStgStrm; 	                // storage stream
46 	StgTmpStrm*	 pTmpStrm;					// temporary stream
47 	StgTmpStrm*  pCurStrm;					// temp stream after commit
48 	sal_Int32		 nEntry;					// entry # in TOC stream (temp)
49 	sal_Int32		 nPos;						// current position
50 	sal_Bool		 bDirty;					// dirty directory entry
51 	sal_Bool		 bCreated;					// newly created entry
52 	sal_Bool		 bRemoved;					// removed per Invalidate()
53 	sal_Bool		 bRenamed;					// renamed
54 	void		 InitMembers();				// ctor helper
55 	virtual short Compare( const StgAvlNode* ) const;
56 	sal_Bool		 StoreStream( StgIo& );		// store the stream
57 	sal_Bool		 StoreStreams( StgIo& );	// store all streams
58 	void		 RevertAll();				// revert the whole tree
59 	sal_Bool		 Strm2Tmp();				// copy stgstream to temp file
60 	sal_Bool		 Tmp2Strm();				// copy temp file to stgstream
61 public:
62 	StgEntry 	 aEntry;					// entry data
63 	sal_Int32  		 nRefCnt;					// reference count
64     StreamMode   nMode;             		// open mode
65 	sal_Bool		 bTemp;						// sal_True: delete on dir flush
66 	sal_Bool		 bDirect; 		  			// sal_True: direct mode
67 	sal_Bool         bZombie;                   // sal_True: Removed From StgIo
68 	sal_Bool		 bInvalid;					// sal_True: invalid entry
69 	StgDirEntry( const void* pBuffer, sal_uInt32 nBufferLen, sal_Bool * pbOk );
70 	StgDirEntry( const StgEntry& );
71 	~StgDirEntry();
72 
73 	void Invalidate( sal_Bool=sal_False ); 			// invalidate all open entries
74 	void Enum( sal_Int32& );					// enumerate entries for iteration
75 	void DelTemp( sal_Bool );					// delete temporary entries
76 	sal_Bool Store( StgDirStrm& );				// save entry into dir strm
77 	sal_Bool IsContained( StgDirEntry* );		// check if subentry
78 
79 	void SetDirty()  { bDirty = sal_True;     }
80 	sal_Bool IsDirty();
81 	void ClearDirty();
82 
83 	sal_Bool Commit();
84 	sal_Bool Revert();
85 
86 	void  OpenStream( StgIo&, sal_Bool=sal_False );		// set up an approbiate stream
87 	void  Close();
88 	sal_Int32 GetSize();
89 	sal_Bool  SetSize( sal_Int32 );
90 	sal_Int32 Seek( sal_Int32 );
91 	sal_Int32 Tell() { return nPos; }
92 	sal_Int32 Read( void*, sal_Int32 );
93 	sal_Int32 Write( const void*, sal_Int32 );
94 	void  Copy( StgDirEntry& );
95     void  Copy( BaseStorageStream& );
96 };
97 
98 class StgDirStrm : public StgDataStrm
99 {
100 	friend class StgIterator;
101 	StgDirEntry* pRoot;							// root of dir tree
102 	short 		 nEntries;						// entries per page
103     void SetupEntry(
104         const sal_Int32 n,
105         StgDirEntry* pUpper,
106         const sal_Int32 nEntryCount,
107         const sal_Int32 nDepth);
108 public:
109 	StgDirStrm( StgIo& );
110 	~StgDirStrm();
111 	virtual sal_Bool SetSize( sal_Int32 );				// change the size
112 	sal_Bool		 Store();
113 	void*	     GetEntry( sal_Int32 n, sal_Bool=sal_False );// get an entry
114 	StgDirEntry* GetRoot() { return pRoot; }
115 	StgDirEntry* Find( StgDirEntry&, const String& );
116 	StgDirEntry* Create( StgDirEntry&, const String&, StgEntryType );
117 	sal_Bool         Remove( StgDirEntry&, const String& );
118 	sal_Bool         Rename( StgDirEntry&, const String&, const String& );
119 	sal_Bool         Move( StgDirEntry&, StgDirEntry&, const String& );
120 };
121 
122 class StgIterator : public StgAvlIterator
123 {
124 public:
125 	StgIterator( StgDirEntry& rStg ) : StgAvlIterator( rStg.pDown ) {}
126 	StgDirEntry* First() { return (StgDirEntry*) StgAvlIterator::First(); }
127 	StgDirEntry* Next()  { return (StgDirEntry*) StgAvlIterator::Next();  }
128 	StgDirEntry* Last()  { return (StgDirEntry*) StgAvlIterator::Last();  }
129 	StgDirEntry* Prev()  { return (StgDirEntry*) StgAvlIterator::Prev();  }
130 };
131 
132 #endif
133