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