xref: /trunk/main/store/workben/t_base.cxx (revision 73d9b18a)
1*73d9b18aSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*73d9b18aSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*73d9b18aSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*73d9b18aSAndrew Rist  * distributed with this work for additional information
6*73d9b18aSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*73d9b18aSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*73d9b18aSAndrew Rist  * "License"); you may not use this file except in compliance
9*73d9b18aSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*73d9b18aSAndrew Rist  *
11*73d9b18aSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*73d9b18aSAndrew Rist  *
13*73d9b18aSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*73d9b18aSAndrew Rist  * software distributed under the License is distributed on an
15*73d9b18aSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*73d9b18aSAndrew Rist  * KIND, either express or implied.  See the License for the
17*73d9b18aSAndrew Rist  * specific language governing permissions and limitations
18*73d9b18aSAndrew Rist  * under the License.
19*73d9b18aSAndrew Rist  *
20*73d9b18aSAndrew Rist  *************************************************************/
21*73d9b18aSAndrew Rist 
22*73d9b18aSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_store.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "sal/types.h"
28cdf0e10cSrcweir #include "osl/diagnose.h"
29cdf0e10cSrcweir #include "osl/thread.h"
30cdf0e10cSrcweir #include "rtl/memory.h"
31cdf0e10cSrcweir #include "rtl/ustring.hxx"
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include "object.hxx"
34cdf0e10cSrcweir #include "storbase.hxx"
35cdf0e10cSrcweir #include "storbios.hxx"
36cdf0e10cSrcweir #include "lockbyte.hxx"
37cdf0e10cSrcweir 
38cdf0e10cSrcweir using namespace store;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir #define TEST_PAGESIZE 1024
41cdf0e10cSrcweir 
42cdf0e10cSrcweir /*========================================================================
43cdf0e10cSrcweir  *
44cdf0e10cSrcweir  * OTestObject.
45cdf0e10cSrcweir  *
46cdf0e10cSrcweir  *======================================================================*/
47cdf0e10cSrcweir class OTestObject : public store::OStoreObject
48cdf0e10cSrcweir {
49cdf0e10cSrcweir public:
50cdf0e10cSrcweir 	OTestObject (void);
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 	virtual sal_Bool SAL_CALL isKindOf (sal_uInt32 nTypeId);
53cdf0e10cSrcweir 
54cdf0e10cSrcweir protected:
55cdf0e10cSrcweir 	virtual ~OTestObject (void);
56cdf0e10cSrcweir };
57cdf0e10cSrcweir 
OTestObject(void)58cdf0e10cSrcweir OTestObject::OTestObject (void)
59cdf0e10cSrcweir {
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
~OTestObject(void)62cdf0e10cSrcweir OTestObject::~OTestObject (void)
63cdf0e10cSrcweir {
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
isKindOf(sal_uInt32 nTypeId)66cdf0e10cSrcweir sal_Bool SAL_CALL OTestObject::isKindOf (sal_uInt32 nTypeId)
67cdf0e10cSrcweir {
68cdf0e10cSrcweir 	return (nTypeId == 42);
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir namespace store
72cdf0e10cSrcweir {
query(IStoreHandle * pHandle,OTestObject *)73cdf0e10cSrcweir static OTestObject* SAL_CALL query (IStoreHandle *pHandle, OTestObject*)
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	if (pHandle && pHandle->isKindOf (42))
76cdf0e10cSrcweir 		return static_cast<OTestObject*>(pHandle);
77cdf0e10cSrcweir 	else
78cdf0e10cSrcweir 		return 0;
79cdf0e10cSrcweir }
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir /*========================================================================
83cdf0e10cSrcweir  *
84cdf0e10cSrcweir  * OTestBIOS.
85cdf0e10cSrcweir  *
86cdf0e10cSrcweir  *======================================================================*/
87cdf0e10cSrcweir namespace store
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 
90cdf0e10cSrcweir class OTestBIOS : public store::OStorePageBIOS
91cdf0e10cSrcweir {
92cdf0e10cSrcweir 	typedef store::OStorePageBIOS base;
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	friend OTestBIOS* SAL_CALL query<> (IStoreHandle * pHandle, OTestBIOS *);
95cdf0e10cSrcweir 
96cdf0e10cSrcweir public:
97cdf0e10cSrcweir 	OTestBIOS (void);
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 	virtual storeError initialize (
100cdf0e10cSrcweir 		ILockBytes *    pLockBytes,
101cdf0e10cSrcweir 		storeAccessMode eAccessMode,
102cdf0e10cSrcweir 		sal_uInt16 &    rnPageSize);
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 	virtual sal_Bool SAL_CALL isKindOf (sal_uInt32 nTypeId);
105cdf0e10cSrcweir 
106cdf0e10cSrcweir protected:
107cdf0e10cSrcweir 	virtual ~OTestBIOS (void);
108cdf0e10cSrcweir };
109cdf0e10cSrcweir 
110cdf0e10cSrcweir } // namespace store
111cdf0e10cSrcweir 
OTestBIOS(void)112cdf0e10cSrcweir OTestBIOS::OTestBIOS (void)
113cdf0e10cSrcweir {
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
~OTestBIOS(void)116cdf0e10cSrcweir OTestBIOS::~OTestBIOS (void)
117cdf0e10cSrcweir {
118cdf0e10cSrcweir }
119cdf0e10cSrcweir 
isKindOf(sal_uInt32 nTypeId)120cdf0e10cSrcweir sal_Bool SAL_CALL OTestBIOS::isKindOf (sal_uInt32 nTypeId)
121cdf0e10cSrcweir {
122cdf0e10cSrcweir 	return (nTypeId == 4242);
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
initialize(ILockBytes * pLockBytes,storeAccessMode eAccessMode,sal_uInt16 & rnPageSize)125cdf0e10cSrcweir storeError OTestBIOS::initialize (
126cdf0e10cSrcweir 	ILockBytes *pLockBytes, storeAccessMode eAccessMode, sal_uInt16 & rnPageSize)
127cdf0e10cSrcweir {
128cdf0e10cSrcweir 	return base::initialize (pLockBytes, eAccessMode, rnPageSize);
129cdf0e10cSrcweir }
130cdf0e10cSrcweir 
131cdf0e10cSrcweir namespace store
132cdf0e10cSrcweir {
query(IStoreHandle * pHandle,OTestBIOS *)133cdf0e10cSrcweir template<> OTestBIOS* SAL_CALL query (IStoreHandle *pHandle, OTestBIOS*)
134cdf0e10cSrcweir {
135cdf0e10cSrcweir 	if (pHandle && pHandle->isKindOf (4242))
136cdf0e10cSrcweir 		return static_cast<OTestBIOS*>(pHandle);
137cdf0e10cSrcweir 	else
138cdf0e10cSrcweir 		return 0;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir /*========================================================================
143cdf0e10cSrcweir  *
144cdf0e10cSrcweir  * __store_test_handle.
145cdf0e10cSrcweir  *
146cdf0e10cSrcweir  *======================================================================*/
__store_test_handle(void * Handle)147cdf0e10cSrcweir static void __store_test_handle (void* Handle)
148cdf0e10cSrcweir {
149cdf0e10cSrcweir 	IStoreHandle *pHandle = static_cast<IStoreHandle*>(Handle);
150cdf0e10cSrcweir 	if (pHandle)
151cdf0e10cSrcweir 	{
152cdf0e10cSrcweir 		pHandle->acquire();
153cdf0e10cSrcweir 		pHandle->isKindOf (42);
154cdf0e10cSrcweir 		pHandle->release();
155cdf0e10cSrcweir 	}
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 	OTestObject *pObj = query (pHandle, static_cast<OTestObject*>(0));
158cdf0e10cSrcweir 	if (pObj)
159cdf0e10cSrcweir 	{
160cdf0e10cSrcweir 		pObj->acquire();
161cdf0e10cSrcweir 		pObj->isKindOf (42);
162cdf0e10cSrcweir 		pObj->release();
163cdf0e10cSrcweir 	}
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir /*========================================================================
167cdf0e10cSrcweir  *
168cdf0e10cSrcweir  * unicode.
169cdf0e10cSrcweir  *
170cdf0e10cSrcweir  *======================================================================*/
__store_string_newFromUnicode_WithLength(rtl_String ** newString,const sal_Unicode * value,sal_Int32 length)171cdf0e10cSrcweir static void __store_string_newFromUnicode_WithLength (
172cdf0e10cSrcweir 	rtl_String **newString, const sal_Unicode *value, sal_Int32 length)
173cdf0e10cSrcweir {
174cdf0e10cSrcweir 	rtl_uString2String (
175cdf0e10cSrcweir 		newString,
176cdf0e10cSrcweir 		value, length,
177cdf0e10cSrcweir 		RTL_TEXTENCODING_UTF8,
178cdf0e10cSrcweir 		OUSTRING_TO_OSTRING_CVTFLAGS);
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir #if 0  /* UNSUSED */
182cdf0e10cSrcweir static void __store_string_newFromUnicode (
183cdf0e10cSrcweir 	rtl_String **newString, const rtl_uString *value)
184cdf0e10cSrcweir {
185cdf0e10cSrcweir 	__store_string_newFromUnicode_WithLength (
186cdf0e10cSrcweir 		newString, value->buffer, value->length);
187cdf0e10cSrcweir }
188cdf0e10cSrcweir #endif /* UNUSED */
189cdf0e10cSrcweir 
__store_string_newFromUnicode(rtl_String ** newString,const sal_Unicode * value)190cdf0e10cSrcweir static void __store_string_newFromUnicode (
191cdf0e10cSrcweir 	rtl_String **newString, const sal_Unicode *value)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir 	__store_string_newFromUnicode_WithLength (
194cdf0e10cSrcweir 		newString, value, rtl_ustr_getLength (value));
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
__store_namei(const sal_Unicode * pszPath,const sal_Unicode * pszName,OStorePageKey & rKey)197cdf0e10cSrcweir static storeError __store_namei (
198cdf0e10cSrcweir 	const sal_Unicode *pszPath,
199cdf0e10cSrcweir 	const sal_Unicode *pszName,
200cdf0e10cSrcweir 	OStorePageKey     &rKey)
201cdf0e10cSrcweir {
202cdf0e10cSrcweir 	rtl::OString aName (
203cdf0e10cSrcweir 		pszName, rtl_ustr_getLength (pszName), RTL_TEXTENCODING_UTF8);
204cdf0e10cSrcweir 
205cdf0e10cSrcweir 	rtl_String *pszNameA = 0;
206cdf0e10cSrcweir 	__store_string_newFromUnicode (&pszNameA, pszName);
207cdf0e10cSrcweir 
208cdf0e10cSrcweir 	storeError eErrCode = store_E_NameTooLong;
209cdf0e10cSrcweir 	if (pszNameA->length < sal_Int32(sizeof(sal_Char[STORE_MAXIMUM_NAMESIZE])))
210cdf0e10cSrcweir 	{
211cdf0e10cSrcweir 		rtl_String *pszPathA = 0;
212cdf0e10cSrcweir 		__store_string_newFromUnicode (&pszPathA, pszPath);
213cdf0e10cSrcweir 
214cdf0e10cSrcweir 		rKey.m_nLow  = rtl_crc32 (0, pszNameA->buffer, pszNameA->length);
215cdf0e10cSrcweir 		rKey.m_nHigh = rtl_crc32 (0, pszPathA->buffer, pszPathA->length);
216cdf0e10cSrcweir 
217cdf0e10cSrcweir 		rtl_string_release (pszPathA);
218cdf0e10cSrcweir 		eErrCode = store_E_None;
219cdf0e10cSrcweir 	}
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	rtl_string_release (pszNameA);
222cdf0e10cSrcweir 	return eErrCode;
223cdf0e10cSrcweir }
224cdf0e10cSrcweir 
__store_convertTextToUnicode(rtl_TextToUnicodeConverter hConvert,const sal_Char * pszText,sal_Size nTextLen,sal_Unicode * pBuffer,sal_Size nBuffer)225cdf0e10cSrcweir static sal_Size __store_convertTextToUnicode (
226cdf0e10cSrcweir 	rtl_TextToUnicodeConverter hConvert,
227cdf0e10cSrcweir 	const sal_Char *pszText, sal_Size nTextLen,
228cdf0e10cSrcweir 	sal_Unicode    *pBuffer, sal_Size nBuffer)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir 	sal_uInt32 nInfo = 0;
231cdf0e10cSrcweir 	sal_Size   nSrcLen = 0;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 	sal_Int32 nDstLen = rtl_convertTextToUnicode (
234cdf0e10cSrcweir 		hConvert, 0,
235cdf0e10cSrcweir 		pszText, nTextLen,
236cdf0e10cSrcweir 		pBuffer, nBuffer,
237cdf0e10cSrcweir 		OSTRING_TO_OUSTRING_CVTFLAGS,
238cdf0e10cSrcweir 		&nInfo, &nSrcLen);
239cdf0e10cSrcweir 
240cdf0e10cSrcweir 	pBuffer[nDstLen] = 0;
241cdf0e10cSrcweir 	return nDstLen;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
244cdf0e10cSrcweir struct MyFindData
245cdf0e10cSrcweir {
246cdf0e10cSrcweir 	sal_Unicode m_pszName[STORE_MAXIMUM_NAMESIZE];
247cdf0e10cSrcweir 	sal_Int32   m_nLength;
248cdf0e10cSrcweir 	sal_uInt32  m_nAttrib;
249cdf0e10cSrcweir 	sal_uInt32  m_nSize;
250cdf0e10cSrcweir 	sal_uInt32  m_nReserved;
251cdf0e10cSrcweir };
252cdf0e10cSrcweir 
__store_testUnicode(const sal_Char * pszFilename)253cdf0e10cSrcweir static void __store_testUnicode (const sal_Char *pszFilename)
254cdf0e10cSrcweir {
255cdf0e10cSrcweir 	// ...
256cdf0e10cSrcweir 	rtl_TextToUnicodeConverter hConvert;
257cdf0e10cSrcweir 	hConvert = rtl_createTextToUnicodeConverter (RTL_TEXTENCODING_UTF8);
258cdf0e10cSrcweir 
259cdf0e10cSrcweir 	MyFindData it;
260cdf0e10cSrcweir 	rtl_zeroMemory (&it, sizeof(it));
261cdf0e10cSrcweir 
262cdf0e10cSrcweir 	sal_Int32 n = rtl_str_getLength (pszFilename);
263cdf0e10cSrcweir 	n = __store_convertTextToUnicode (
264cdf0e10cSrcweir 		hConvert, pszFilename, n,
265cdf0e10cSrcweir 		it.m_pszName, STORE_MAXIMUM_NAMESIZE - 1);
266cdf0e10cSrcweir 	if (it.m_nLength > n)
267cdf0e10cSrcweir 		rtl_zeroMemory (
268cdf0e10cSrcweir 			&it.m_pszName[n], ((it.m_nLength - n) * sizeof(sal_Unicode)));
269cdf0e10cSrcweir 	it.m_nLength = n;
270cdf0e10cSrcweir 
271cdf0e10cSrcweir 	rtl_destroyTextToUnicodeConverter (hConvert);
272cdf0e10cSrcweir 
273cdf0e10cSrcweir 	// ...
274cdf0e10cSrcweir 	rtl_String  *pszFileA = NULL;
275cdf0e10cSrcweir 	rtl_uString *pszFileW = NULL;
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 	// rtl_uString_newFromAscii (&pszFileW, pszFilename);
278cdf0e10cSrcweir 
279cdf0e10cSrcweir 	// ...
280cdf0e10cSrcweir 	rtl_string_newFromStr (&pszFileA, pszFilename);
281cdf0e10cSrcweir 
282cdf0e10cSrcweir 	rtl_string2UString (
283cdf0e10cSrcweir 		&pszFileW,
284cdf0e10cSrcweir 		pszFileA->buffer, pszFileA->length,
285cdf0e10cSrcweir 		RTL_TEXTENCODING_MS_1252,
286cdf0e10cSrcweir 		OSTRING_TO_OUSTRING_CVTFLAGS);
287cdf0e10cSrcweir 
288cdf0e10cSrcweir 	rtl_string_release (pszFileA);
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	// ...
291cdf0e10cSrcweir 	OStorePageKey aKey;
292cdf0e10cSrcweir 	__store_namei (pszFileW->buffer, pszFileW->buffer, aKey);
293cdf0e10cSrcweir 
294cdf0e10cSrcweir 	// ...
295cdf0e10cSrcweir 	rtl_uString2String (
296cdf0e10cSrcweir 		&pszFileA,
297cdf0e10cSrcweir 		pszFileW->buffer, pszFileW->length,
298cdf0e10cSrcweir 		RTL_TEXTENCODING_UTF8,
299cdf0e10cSrcweir 		OUSTRING_TO_OSTRING_CVTFLAGS);
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 	rtl_uString_release (pszFileW);
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	// ...
304cdf0e10cSrcweir 	rtl_string_release (pszFileA);
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir /*========================================================================
308cdf0e10cSrcweir  *
309cdf0e10cSrcweir  * main.
310cdf0e10cSrcweir  *
311cdf0e10cSrcweir  *======================================================================*/
main(int argc,char ** argv)312cdf0e10cSrcweir int SAL_CALL main (int argc, char **argv)
313cdf0e10cSrcweir {
314cdf0e10cSrcweir 	OSL_PRECOND(argc > 1, "t_base: error: insufficient number of arguments.");
315cdf0e10cSrcweir 	if (argc < 2)
316cdf0e10cSrcweir 		return 0;
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 	__store_testUnicode (argv[1]);
319cdf0e10cSrcweir 
320cdf0e10cSrcweir 	rtl::Reference<ILockBytes> xLockBytes;
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 	rtl::OUString aFilename (
323cdf0e10cSrcweir 		argv[1], rtl_str_getLength(argv[1]),
324cdf0e10cSrcweir 		osl_getThreadTextEncoding());
325cdf0e10cSrcweir 
326cdf0e10cSrcweir 	storeError eErrCode = FileLockBytes_createInstance (
327cdf0e10cSrcweir 		xLockBytes, aFilename.pData, store_AccessReadCreate);
328cdf0e10cSrcweir 	if (eErrCode != store_E_None)
329cdf0e10cSrcweir 		return eErrCode;
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 
332cdf0e10cSrcweir 	rtl::Reference<OTestObject> xObject (new OTestObject());
333cdf0e10cSrcweir 	__store_test_handle (&*xObject);
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 	rtl::Reference<OTestBIOS> xBIOS (new OTestBIOS());
336cdf0e10cSrcweir 	__store_test_handle (&*xBIOS);
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 
339cdf0e10cSrcweir 	if (!xBIOS.is())
340cdf0e10cSrcweir 		return 0;
341cdf0e10cSrcweir 
342cdf0e10cSrcweir 	sal_uInt16 nPageSize = TEST_PAGESIZE;
343cdf0e10cSrcweir 	eErrCode = xBIOS->initialize (&*xLockBytes, store_AccessReadWrite, nPageSize);
344cdf0e10cSrcweir 	if (eErrCode != store_E_None)
345cdf0e10cSrcweir 	{
346cdf0e10cSrcweir 		// Check reason.
347cdf0e10cSrcweir 		if (eErrCode != store_E_NotExists)
348cdf0e10cSrcweir 			return eErrCode;
349cdf0e10cSrcweir 
350cdf0e10cSrcweir 		// Create.
351cdf0e10cSrcweir 		eErrCode = xBIOS->initialize (&*xLockBytes, store_AccessReadCreate, nPageSize);
352cdf0e10cSrcweir 		if (eErrCode != store_E_None)
353cdf0e10cSrcweir 			return eErrCode;
354cdf0e10cSrcweir 	}
355cdf0e10cSrcweir 	xLockBytes.clear();
356cdf0e10cSrcweir 
357cdf0e10cSrcweir 	sal_Char pBuffer[TEST_PAGESIZE];
358cdf0e10cSrcweir 	rtl_zeroMemory (pBuffer, sizeof (pBuffer));
359cdf0e10cSrcweir 	rtl_copyMemory (pBuffer, argv[0], rtl_str_getLength(argv[0]) + 1);
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 	eErrCode = xBIOS->write (TEST_PAGESIZE, pBuffer, sizeof (pBuffer));
362cdf0e10cSrcweir 	if (eErrCode != store_E_None)
363cdf0e10cSrcweir 		return eErrCode;
364cdf0e10cSrcweir 
365cdf0e10cSrcweir 	xBIOS.clear();
366cdf0e10cSrcweir 	return 0;
367cdf0e10cSrcweir }
368