xref: /aoo4110/main/store/workben/t_base.cxx (revision b1cdbd2c)
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