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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_store.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include "stordir.hxx"
28*b1cdbd2cSJim Jagielski
29*b1cdbd2cSJim Jagielski #ifndef _SAL_TYPES_H_
30*b1cdbd2cSJim Jagielski #include <sal/types.h>
31*b1cdbd2cSJim Jagielski #endif
32*b1cdbd2cSJim Jagielski
33*b1cdbd2cSJim Jagielski #ifndef _RTL_TEXTCVT_H_
34*b1cdbd2cSJim Jagielski #include <rtl/textcvt.h>
35*b1cdbd2cSJim Jagielski #endif
36*b1cdbd2cSJim Jagielski #ifndef _RTL_REF_HXX_
37*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
38*b1cdbd2cSJim Jagielski #endif
39*b1cdbd2cSJim Jagielski
40*b1cdbd2cSJim Jagielski #ifndef _OSL_MUTEX_HXX_
41*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
42*b1cdbd2cSJim Jagielski #endif
43*b1cdbd2cSJim Jagielski
44*b1cdbd2cSJim Jagielski #ifndef _STORE_TYPES_H_
45*b1cdbd2cSJim Jagielski #include "store/types.h"
46*b1cdbd2cSJim Jagielski #endif
47*b1cdbd2cSJim Jagielski #ifndef _STORE_OBJECT_HXX_
48*b1cdbd2cSJim Jagielski #include "object.hxx"
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski #ifndef _STORE_STORBASE_HXX_
52*b1cdbd2cSJim Jagielski #include "storbase.hxx"
53*b1cdbd2cSJim Jagielski #endif
54*b1cdbd2cSJim Jagielski #ifndef _STORE_STORDATA_HXX_
55*b1cdbd2cSJim Jagielski #include "stordata.hxx"
56*b1cdbd2cSJim Jagielski #endif
57*b1cdbd2cSJim Jagielski #ifndef _STORE_STORPAGE_HXX_
58*b1cdbd2cSJim Jagielski #include "storpage.hxx"
59*b1cdbd2cSJim Jagielski #endif
60*b1cdbd2cSJim Jagielski
61*b1cdbd2cSJim Jagielski using namespace store;
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski /*========================================================================
64*b1cdbd2cSJim Jagielski *
65*b1cdbd2cSJim Jagielski * OStore... internals.
66*b1cdbd2cSJim Jagielski *
67*b1cdbd2cSJim Jagielski *======================================================================*/
68*b1cdbd2cSJim Jagielski /*
69*b1cdbd2cSJim Jagielski * __store_convertTextToUnicode.
70*b1cdbd2cSJim Jagielski */
__store_convertTextToUnicode(rtl_TextToUnicodeConverter hConverter,const sal_Char * pSrcBuffer,sal_Size nSrcLength,sal_Unicode * pDstBuffer,sal_Size nDstLength)71*b1cdbd2cSJim Jagielski inline sal_Size __store_convertTextToUnicode (
72*b1cdbd2cSJim Jagielski rtl_TextToUnicodeConverter hConverter,
73*b1cdbd2cSJim Jagielski const sal_Char *pSrcBuffer, sal_Size nSrcLength,
74*b1cdbd2cSJim Jagielski sal_Unicode *pDstBuffer, sal_Size nDstLength)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski sal_uInt32 nCvtInfo = 0;
77*b1cdbd2cSJim Jagielski sal_Size nCvtBytes = 0;
78*b1cdbd2cSJim Jagielski return rtl_convertTextToUnicode (
79*b1cdbd2cSJim Jagielski hConverter, 0,
80*b1cdbd2cSJim Jagielski pSrcBuffer, nSrcLength,
81*b1cdbd2cSJim Jagielski pDstBuffer, nDstLength,
82*b1cdbd2cSJim Jagielski OSTRING_TO_OUSTRING_CVTFLAGS,
83*b1cdbd2cSJim Jagielski &nCvtInfo, &nCvtBytes);
84*b1cdbd2cSJim Jagielski }
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski /*========================================================================
87*b1cdbd2cSJim Jagielski *
88*b1cdbd2cSJim Jagielski * OStoreDirectory_Impl implementation.
89*b1cdbd2cSJim Jagielski *
90*b1cdbd2cSJim Jagielski *======================================================================*/
91*b1cdbd2cSJim Jagielski const sal_uInt32 OStoreDirectory_Impl::m_nTypeId = sal_uInt32(0x89191107);
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski /*
94*b1cdbd2cSJim Jagielski * OStoreDirectory_Impl.
95*b1cdbd2cSJim Jagielski */
OStoreDirectory_Impl(void)96*b1cdbd2cSJim Jagielski OStoreDirectory_Impl::OStoreDirectory_Impl (void)
97*b1cdbd2cSJim Jagielski : m_xManager (),
98*b1cdbd2cSJim Jagielski m_aDescr (0, 0, 0),
99*b1cdbd2cSJim Jagielski m_nPath (0),
100*b1cdbd2cSJim Jagielski m_hTextCvt (NULL)
101*b1cdbd2cSJim Jagielski {}
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski /*
104*b1cdbd2cSJim Jagielski * ~OStoreDirectory_Impl.
105*b1cdbd2cSJim Jagielski */
~OStoreDirectory_Impl(void)106*b1cdbd2cSJim Jagielski OStoreDirectory_Impl::~OStoreDirectory_Impl (void)
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski if (m_xManager.is())
109*b1cdbd2cSJim Jagielski {
110*b1cdbd2cSJim Jagielski if (m_aDescr.m_nAddr != STORE_PAGE_NULL)
111*b1cdbd2cSJim Jagielski m_xManager->releasePage (m_aDescr, store_AccessReadOnly);
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski rtl_destroyTextToUnicodeConverter (m_hTextCvt);
114*b1cdbd2cSJim Jagielski }
115*b1cdbd2cSJim Jagielski
116*b1cdbd2cSJim Jagielski /*
117*b1cdbd2cSJim Jagielski * isKindOf.
118*b1cdbd2cSJim Jagielski */
isKindOf(sal_uInt32 nTypeId)119*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL OStoreDirectory_Impl::isKindOf (sal_uInt32 nTypeId)
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski return (nTypeId == m_nTypeId);
122*b1cdbd2cSJim Jagielski }
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski /*
125*b1cdbd2cSJim Jagielski * create.
126*b1cdbd2cSJim Jagielski */
create(OStorePageManager * pManager,rtl_String * pPath,rtl_String * pName,storeAccessMode eMode)127*b1cdbd2cSJim Jagielski storeError OStoreDirectory_Impl::create (
128*b1cdbd2cSJim Jagielski OStorePageManager *pManager,
129*b1cdbd2cSJim Jagielski rtl_String *pPath,
130*b1cdbd2cSJim Jagielski rtl_String *pName,
131*b1cdbd2cSJim Jagielski storeAccessMode eMode)
132*b1cdbd2cSJim Jagielski {
133*b1cdbd2cSJim Jagielski rtl::Reference<OStorePageManager> xManager (pManager);
134*b1cdbd2cSJim Jagielski if (!xManager.is())
135*b1cdbd2cSJim Jagielski return store_E_InvalidAccess;
136*b1cdbd2cSJim Jagielski
137*b1cdbd2cSJim Jagielski if (!(pPath && pName))
138*b1cdbd2cSJim Jagielski return store_E_InvalidParameter;
139*b1cdbd2cSJim Jagielski
140*b1cdbd2cSJim Jagielski OStoreDirectoryPageObject aPage;
141*b1cdbd2cSJim Jagielski storeError eErrCode = xManager->iget (
142*b1cdbd2cSJim Jagielski aPage, STORE_ATTRIB_ISDIR,
143*b1cdbd2cSJim Jagielski pPath, pName, eMode);
144*b1cdbd2cSJim Jagielski if (eErrCode != store_E_None)
145*b1cdbd2cSJim Jagielski return eErrCode;
146*b1cdbd2cSJim Jagielski
147*b1cdbd2cSJim Jagielski if (!(aPage.attrib() & STORE_ATTRIB_ISDIR))
148*b1cdbd2cSJim Jagielski return store_E_NotDirectory;
149*b1cdbd2cSJim Jagielski
150*b1cdbd2cSJim Jagielski inode_holder_type xNode (aPage.get());
151*b1cdbd2cSJim Jagielski eErrCode = xManager->acquirePage (xNode->m_aDescr, store_AccessReadOnly);
152*b1cdbd2cSJim Jagielski if (eErrCode != store_E_None)
153*b1cdbd2cSJim Jagielski return eErrCode;
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski // Evaluate iteration path.
156*b1cdbd2cSJim Jagielski m_nPath = aPage.path();
157*b1cdbd2cSJim Jagielski m_nPath = rtl_crc32 (m_nPath, "/", 1);
158*b1cdbd2cSJim Jagielski
159*b1cdbd2cSJim Jagielski // Save page manager, and descriptor.
160*b1cdbd2cSJim Jagielski m_xManager = xManager;
161*b1cdbd2cSJim Jagielski m_aDescr = xNode->m_aDescr;
162*b1cdbd2cSJim Jagielski
163*b1cdbd2cSJim Jagielski return store_E_None;
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski
166*b1cdbd2cSJim Jagielski /*
167*b1cdbd2cSJim Jagielski * iterate.
168*b1cdbd2cSJim Jagielski */
iterate(storeFindData & rFindData)169*b1cdbd2cSJim Jagielski storeError OStoreDirectory_Impl::iterate (storeFindData &rFindData)
170*b1cdbd2cSJim Jagielski {
171*b1cdbd2cSJim Jagielski if (!m_xManager.is())
172*b1cdbd2cSJim Jagielski return store_E_InvalidAccess;
173*b1cdbd2cSJim Jagielski
174*b1cdbd2cSJim Jagielski storeError eErrCode = store_E_NoMoreFiles;
175*b1cdbd2cSJim Jagielski if (!rFindData.m_nReserved)
176*b1cdbd2cSJim Jagielski return eErrCode;
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski // Acquire exclusive access.
179*b1cdbd2cSJim Jagielski osl::MutexGuard aGuard (*m_xManager);
180*b1cdbd2cSJim Jagielski
181*b1cdbd2cSJim Jagielski // Check TextConverter.
182*b1cdbd2cSJim Jagielski if (m_hTextCvt == NULL)
183*b1cdbd2cSJim Jagielski m_hTextCvt = rtl_createTextToUnicodeConverter(RTL_TEXTENCODING_UTF8);
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski // Setup iteration key.
186*b1cdbd2cSJim Jagielski OStorePageKey aKey (rFindData.m_nReserved, m_nPath);
187*b1cdbd2cSJim Jagielski
188*b1cdbd2cSJim Jagielski // Iterate.
189*b1cdbd2cSJim Jagielski for (;;)
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski OStorePageLink aLink;
192*b1cdbd2cSJim Jagielski eErrCode = m_xManager->iterate (aKey, aLink, rFindData.m_nAttrib);
193*b1cdbd2cSJim Jagielski if (!((eErrCode == store_E_None) && (aKey.m_nHigh == store::htonl(m_nPath))))
194*b1cdbd2cSJim Jagielski break;
195*b1cdbd2cSJim Jagielski
196*b1cdbd2cSJim Jagielski if (!(rFindData.m_nAttrib & STORE_ATTRIB_ISLINK))
197*b1cdbd2cSJim Jagielski {
198*b1cdbd2cSJim Jagielski // Load page.
199*b1cdbd2cSJim Jagielski OStoreDirectoryPageObject aPage;
200*b1cdbd2cSJim Jagielski eErrCode = m_xManager->loadObjectAt (aPage, aLink.location());
201*b1cdbd2cSJim Jagielski if (eErrCode == store_E_None)
202*b1cdbd2cSJim Jagielski {
203*b1cdbd2cSJim Jagielski inode_holder_type xNode (aPage.get());
204*b1cdbd2cSJim Jagielski
205*b1cdbd2cSJim Jagielski // Setup FindData.
206*b1cdbd2cSJim Jagielski sal_Char *p = xNode->m_aNameBlock.m_pData;
207*b1cdbd2cSJim Jagielski sal_Size n = rtl_str_getLength (p);
208*b1cdbd2cSJim Jagielski sal_Size k = rFindData.m_nLength;
209*b1cdbd2cSJim Jagielski
210*b1cdbd2cSJim Jagielski n = __store_convertTextToUnicode (
211*b1cdbd2cSJim Jagielski m_hTextCvt, p, n,
212*b1cdbd2cSJim Jagielski rFindData.m_pszName, STORE_MAXIMUM_NAMESIZE - 1);
213*b1cdbd2cSJim Jagielski if (k > n)
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski k = (k - n) * sizeof(sal_Unicode);
216*b1cdbd2cSJim Jagielski memset (&rFindData.m_pszName[n], 0, k);
217*b1cdbd2cSJim Jagielski }
218*b1cdbd2cSJim Jagielski
219*b1cdbd2cSJim Jagielski rFindData.m_nLength = n;
220*b1cdbd2cSJim Jagielski rFindData.m_nAttrib |= aPage.attrib();
221*b1cdbd2cSJim Jagielski rFindData.m_nSize = aPage.dataLength();
222*b1cdbd2cSJim Jagielski
223*b1cdbd2cSJim Jagielski // Leave.
224*b1cdbd2cSJim Jagielski rFindData.m_nReserved = store::ntohl(aKey.m_nLow);
225*b1cdbd2cSJim Jagielski return store_E_None;
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski
229*b1cdbd2cSJim Jagielski if (aKey.m_nLow == 0)
230*b1cdbd2cSJim Jagielski break;
231*b1cdbd2cSJim Jagielski aKey.m_nLow = store::htonl(store::ntohl(aKey.m_nLow) - 1);
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski // Finished.
235*b1cdbd2cSJim Jagielski memset (&rFindData, 0, sizeof (storeFindData));
236*b1cdbd2cSJim Jagielski return store_E_NoMoreFiles;
237*b1cdbd2cSJim Jagielski }
238