xref: /aoo4110/main/store/source/stordir.cxx (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 // 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