xref: /AOO41X/main/store/source/storpage.hxx (revision 1a5fa39be4c30003d60dac254349a6f82563f140)
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 _STORE_STORPAGE_HXX_
25 #define _STORE_STORPAGE_HXX_ "$Revision: 1.6.8.2 $"
26 
27 #include "sal/types.h"
28 
29 #include "object.hxx"
30 #include "lockbyte.hxx"
31 
32 #include "storbase.hxx"
33 #include "storbios.hxx"
34 #include "stortree.hxx"
35 
36 namespace store
37 {
38 
39 struct OStoreDirectoryPageData;
40 class  OStoreDirectoryPageObject;
41 
42 /*========================================================================
43  *
44  * OStorePageManager interface.
45  *
46  *======================================================================*/
47 class OStorePageManager : public store::OStorePageBIOS
48 {
49 public:
50     /** Construction.
51      */
52     OStorePageManager (void);
53 
54     /** Initialization (two-phase construction).
55      */
56     virtual storeError initialize (
57         ILockBytes *    pLockBytes,
58         storeAccessMode eAccessMode,
59         sal_uInt16 &    rnPageSize);
60 
61     /** isValid.
62      *  @return sal_True  upon successful initialization,
63      *          sal_False otherwise.
64      */
65     inline sal_Bool isValid (void) const;
66 
67     /** DirectoryPage I/O (managed).
68      */
69     static storeError namei (
70         const rtl_String *pPath,
71         const rtl_String *pName,
72         OStorePageKey    &rKey);
73 
74     storeError iget (
75         OStoreDirectoryPageObject & rPage, // [out]
76         sal_uInt32                  nAttrib,
77         const rtl_String *          pPath,
78         const rtl_String *          pName,
79         storeAccessMode             eMode);
80 
81     storeError iterate (
82         OStorePageKey &  rKey,
83         OStorePageLink & rLink,
84         sal_uInt32 &     rAttrib);
85 
86     /** attrib [nAttrib = ((nAttrib & ~nMask1) | nMask2)].
87      *  @see store_attrib()
88      */
89     storeError attrib (
90         const OStorePageKey &rKey,
91         sal_uInt32           nMask1,
92         sal_uInt32           nMask2,
93         sal_uInt32          &rAttrib);
94 
95     /** link (insert Source Key as hardlink to Destination).
96      *  @see store_link()
97      */
98     storeError link (
99         const OStorePageKey &rSrcKey,
100         const OStorePageKey &rDstKey);
101 
102     /** symlink (insert Source DirectoryPage as symlink to Destination).
103      *  @see store_symlink()
104      */
105     storeError symlink (
106         const rtl_String    *pSrcPath,
107         const rtl_String    *pSrcName,
108         const OStorePageKey &rDstKey);
109 
110     /** rename.
111      *  @see store_rename()
112      */
113     storeError rename (
114         const OStorePageKey &rSrcKey,
115         const rtl_String    *pDstPath,
116         const rtl_String    *pDstName);
117 
118     /** remove.
119      *  @see store_remove()
120      */
121     storeError remove (
122         const OStorePageKey &rKey);
123 
124     /** rebuild (combines recover and compact from 'Src' to 'Dst').
125      *  @param  pSrcLB [in] accessed readonly.
126      *  @param  pDstLB [in] truncated and accessed readwrite (as initialize()).
127      *  @return store_E_None upon success.
128      *
129      *  @see store_rebuildFile()
130      */
131     storeError rebuild (
132         ILockBytes *pSrcLB,
133         ILockBytes *pDstLB);
134 
135     /** IStoreHandle.
136      */
137     virtual sal_Bool SAL_CALL isKindOf (sal_uInt32 nTypeId);
138 
139 protected:
140     /** Destruction.
141     */
142     virtual ~OStorePageManager (void);
143 
144 private:
145     /** Implementation.
146     */
147     typedef OStorePageBIOS            base;
148     typedef OStorePageManager         self;
149 
150     typedef OStoreBTreeEntry          entry;
151     typedef OStoreBTreeNodeData       page;
152     typedef OStoreBTreeNodeObject     node;
153 
154     typedef OStoreDirectoryPageData   inode;
155     typedef PageHolderObject< inode > inode_holder_type;
156 
157     /** IStoreHandle TypeId.
158      */
159     static const sal_uInt32 m_nTypeId;
160 
161     /** IStoreHandle query() template function specialization.
162      */
163     friend OStorePageManager*
164     SAL_CALL query<> (IStoreHandle *pHandle, OStorePageManager*);
165 
166     /** Representation.
167     */
168     OStoreBTreeRootObject m_aRoot;
169 
170     /** DirectoryPage I/O (managed).
171      */
172     storeError load_dirpage_Impl ( // @@@ => private: iget() @@@
173         const OStorePageKey       &rKey,
174         OStoreDirectoryPageObject &rPage);
175 
176     storeError save_dirpage_Impl ( // @@@ => private: iget(), rebuild() @@@
177         const OStorePageKey       &rKey,
178         OStoreDirectoryPageObject &rPage);
179 
180     /** find_lookup (node page and index, w/o split).
181     */
182     storeError find_lookup (
183         OStoreBTreeNodeObject & rNode,
184         sal_uInt16 &            rIndex,
185         OStorePageKey const &   rKey);
186 
187     /** remove (possibly down from root).
188     */
189     storeError remove_Impl (entry & rEntry);
190 
191     /** Not implemented.
192     */
193     OStorePageManager (const OStorePageManager&);
194     OStorePageManager& operator= (const OStorePageManager&);
195 };
196 
isValid(void) const197 inline sal_Bool OStorePageManager::isValid (void) const
198 {
199     return (base::isValid() /* @@@ NYI && (m_aRoot.is()) */);
200 }
201 
202 template<> inline OStorePageManager*
query(IStoreHandle * pHandle,OStorePageManager *)203 SAL_CALL query (IStoreHandle *pHandle, OStorePageManager*)
204 {
205     if (pHandle && pHandle->isKindOf (OStorePageManager::m_nTypeId))
206     {
207         // Handle is kind of OStorePageManager.
208         return static_cast<OStorePageManager*>(pHandle);
209     }
210     return 0;
211 }
212 
213 /*========================================================================
214  *
215  * The End.
216  *
217  *======================================================================*/
218 
219 } // namespace store
220 
221 #endif /* !_STORE_STORPAGE_HXX_ */
222 
223