xref: /aoo4110/main/sot/source/sdstor/stgdir.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _STGDIR_HXX
25*b1cdbd2cSJim Jagielski #define _STGDIR_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "stgavl.hxx"
28*b1cdbd2cSJim Jagielski #include "stgelem.hxx"
29*b1cdbd2cSJim Jagielski #include "stgstrms.hxx"
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski class StgIo;
32*b1cdbd2cSJim Jagielski class StgEntry;
33*b1cdbd2cSJim Jagielski class StgDirEntry;
34*b1cdbd2cSJim Jagielski class StgDirStrm;
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski class BaseStorageStream;
37*b1cdbd2cSJim Jagielski class StgDirEntry : public StgAvlNode
38*b1cdbd2cSJim Jagielski {
39*b1cdbd2cSJim Jagielski 	friend class StgIterator;
40*b1cdbd2cSJim Jagielski 	friend class StgDirStrm;
41*b1cdbd2cSJim Jagielski 	StgEntry	 aSave;						// original dir entry
42*b1cdbd2cSJim Jagielski 	StgDirEntry*  pUp;						// parent directory
43*b1cdbd2cSJim Jagielski 	StgDirEntry*  pDown;					// child directory for storages
44*b1cdbd2cSJim Jagielski 	StgDirEntry** ppRoot;					// root of TOC tree
45*b1cdbd2cSJim Jagielski     StgStrm*     pStgStrm; 	                // storage stream
46*b1cdbd2cSJim Jagielski 	StgTmpStrm*	 pTmpStrm;					// temporary stream
47*b1cdbd2cSJim Jagielski 	StgTmpStrm*  pCurStrm;					// temp stream after commit
48*b1cdbd2cSJim Jagielski 	sal_Int32		 nEntry;					// entry # in TOC stream (temp)
49*b1cdbd2cSJim Jagielski 	sal_Int32		 nPos;						// current position
50*b1cdbd2cSJim Jagielski 	sal_Bool		 bDirty;					// dirty directory entry
51*b1cdbd2cSJim Jagielski 	sal_Bool		 bCreated;					// newly created entry
52*b1cdbd2cSJim Jagielski 	sal_Bool		 bRemoved;					// removed per Invalidate()
53*b1cdbd2cSJim Jagielski 	sal_Bool		 bRenamed;					// renamed
54*b1cdbd2cSJim Jagielski 	void		 InitMembers();				// ctor helper
55*b1cdbd2cSJim Jagielski 	virtual short Compare( const StgAvlNode* ) const;
56*b1cdbd2cSJim Jagielski 	sal_Bool		 StoreStream( StgIo& );		// store the stream
57*b1cdbd2cSJim Jagielski 	sal_Bool		 StoreStreams( StgIo& );	// store all streams
58*b1cdbd2cSJim Jagielski 	void		 RevertAll();				// revert the whole tree
59*b1cdbd2cSJim Jagielski 	sal_Bool		 Strm2Tmp();				// copy stgstream to temp file
60*b1cdbd2cSJim Jagielski 	sal_Bool		 Tmp2Strm();				// copy temp file to stgstream
61*b1cdbd2cSJim Jagielski public:
62*b1cdbd2cSJim Jagielski 	StgEntry 	 aEntry;					// entry data
63*b1cdbd2cSJim Jagielski 	sal_Int32  		 nRefCnt;					// reference count
64*b1cdbd2cSJim Jagielski     StreamMode   nMode;             		// open mode
65*b1cdbd2cSJim Jagielski 	sal_Bool		 bTemp;						// sal_True: delete on dir flush
66*b1cdbd2cSJim Jagielski 	sal_Bool		 bDirect; 		  			// sal_True: direct mode
67*b1cdbd2cSJim Jagielski 	sal_Bool         bZombie;                   // sal_True: Removed From StgIo
68*b1cdbd2cSJim Jagielski 	sal_Bool		 bInvalid;					// sal_True: invalid entry
69*b1cdbd2cSJim Jagielski 	StgDirEntry( const void* pBuffer, sal_uInt32 nBufferLen, sal_Bool * pbOk );
70*b1cdbd2cSJim Jagielski 	StgDirEntry( const StgEntry& );
71*b1cdbd2cSJim Jagielski 	~StgDirEntry();
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 	void Invalidate( sal_Bool=sal_False ); 			// invalidate all open entries
74*b1cdbd2cSJim Jagielski 	void Enum( sal_Int32& );					// enumerate entries for iteration
75*b1cdbd2cSJim Jagielski 	void DelTemp( sal_Bool );					// delete temporary entries
76*b1cdbd2cSJim Jagielski 	sal_Bool Store( StgDirStrm& );				// save entry into dir strm
77*b1cdbd2cSJim Jagielski 	sal_Bool IsContained( StgDirEntry* );		// check if subentry
78*b1cdbd2cSJim Jagielski 
SetDirty()79*b1cdbd2cSJim Jagielski 	void SetDirty()  { bDirty = sal_True;     }
80*b1cdbd2cSJim Jagielski 	sal_Bool IsDirty();
81*b1cdbd2cSJim Jagielski 	void ClearDirty();
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski 	sal_Bool Commit();
84*b1cdbd2cSJim Jagielski 	sal_Bool Revert();
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 	void  OpenStream( StgIo&, sal_Bool=sal_False );		// set up an approbiate stream
87*b1cdbd2cSJim Jagielski 	void  Close();
88*b1cdbd2cSJim Jagielski 	sal_Int32 GetSize();
89*b1cdbd2cSJim Jagielski 	sal_Bool  SetSize( sal_Int32 );
90*b1cdbd2cSJim Jagielski 	sal_Int32 Seek( sal_Int32 );
Tell()91*b1cdbd2cSJim Jagielski 	sal_Int32 Tell() { return nPos; }
92*b1cdbd2cSJim Jagielski 	sal_Int32 Read( void*, sal_Int32 );
93*b1cdbd2cSJim Jagielski 	sal_Int32 Write( const void*, sal_Int32 );
94*b1cdbd2cSJim Jagielski 	void  Copy( StgDirEntry& );
95*b1cdbd2cSJim Jagielski     void  Copy( BaseStorageStream& );
96*b1cdbd2cSJim Jagielski };
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski class StgDirStrm : public StgDataStrm
99*b1cdbd2cSJim Jagielski {
100*b1cdbd2cSJim Jagielski 	friend class StgIterator;
101*b1cdbd2cSJim Jagielski 	StgDirEntry* pRoot;							// root of dir tree
102*b1cdbd2cSJim Jagielski 	short 		 nEntries;						// entries per page
103*b1cdbd2cSJim Jagielski     void SetupEntry(
104*b1cdbd2cSJim Jagielski         const sal_Int32 n,
105*b1cdbd2cSJim Jagielski         StgDirEntry* pUpper,
106*b1cdbd2cSJim Jagielski         const sal_Int32 nEntryCount,
107*b1cdbd2cSJim Jagielski         const sal_Int32 nDepth);
108*b1cdbd2cSJim Jagielski public:
109*b1cdbd2cSJim Jagielski 	StgDirStrm( StgIo& );
110*b1cdbd2cSJim Jagielski 	~StgDirStrm();
111*b1cdbd2cSJim Jagielski 	virtual sal_Bool SetSize( sal_Int32 );				// change the size
112*b1cdbd2cSJim Jagielski 	sal_Bool		 Store();
113*b1cdbd2cSJim Jagielski 	void*	     GetEntry( sal_Int32 n, sal_Bool=sal_False );// get an entry
GetRoot()114*b1cdbd2cSJim Jagielski 	StgDirEntry* GetRoot() { return pRoot; }
115*b1cdbd2cSJim Jagielski 	StgDirEntry* Find( StgDirEntry&, const String& );
116*b1cdbd2cSJim Jagielski 	StgDirEntry* Create( StgDirEntry&, const String&, StgEntryType );
117*b1cdbd2cSJim Jagielski 	sal_Bool         Remove( StgDirEntry&, const String& );
118*b1cdbd2cSJim Jagielski 	sal_Bool         Rename( StgDirEntry&, const String&, const String& );
119*b1cdbd2cSJim Jagielski 	sal_Bool         Move( StgDirEntry&, StgDirEntry&, const String& );
120*b1cdbd2cSJim Jagielski };
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski class StgIterator : public StgAvlIterator
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski public:
StgIterator(StgDirEntry & rStg)125*b1cdbd2cSJim Jagielski 	StgIterator( StgDirEntry& rStg ) : StgAvlIterator( rStg.pDown ) {}
First()126*b1cdbd2cSJim Jagielski 	StgDirEntry* First() { return (StgDirEntry*) StgAvlIterator::First(); }
Next()127*b1cdbd2cSJim Jagielski 	StgDirEntry* Next()  { return (StgDirEntry*) StgAvlIterator::Next();  }
Last()128*b1cdbd2cSJim Jagielski 	StgDirEntry* Last()  { return (StgDirEntry*) StgAvlIterator::Last();  }
Prev()129*b1cdbd2cSJim Jagielski 	StgDirEntry* Prev()  { return (StgDirEntry*) StgAvlIterator::Prev();  }
130*b1cdbd2cSJim Jagielski };
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski #endif
133