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