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 58 OTestObject::OTestObject (void) 59 { 60 } 61 62 OTestObject::~OTestObject (void) 63 { 64 } 65 66 sal_Bool SAL_CALL OTestObject::isKindOf (sal_uInt32 nTypeId) 67 { 68 return (nTypeId == 42); 69 } 70 71 namespace store 72 { 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 112 OTestBIOS::OTestBIOS (void) 113 { 114 } 115 116 OTestBIOS::~OTestBIOS (void) 117 { 118 } 119 120 sal_Bool SAL_CALL OTestBIOS::isKindOf (sal_uInt32 nTypeId) 121 { 122 return (nTypeId == 4242); 123 } 124 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 { 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 *======================================================================*/ 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 *======================================================================*/ 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 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 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 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 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 *======================================================================*/ 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