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 "store/store.h" 28 #include "store/dllapi.h" 29 30 #include <sal/types.h> 31 #include <rtl/memory.h> 32 #include <rtl/string.hxx> 33 #include <rtl/ref.hxx> 34 35 #include "object.hxx" 36 #include "lockbyte.hxx" 37 38 #include "storbase.hxx" 39 #include "storpage.hxx" 40 #include "stordir.hxx" 41 #include "storlckb.hxx" 42 43 using rtl::Reference; 44 using rtl::OString; 45 46 namespace store 47 { 48 /** Template helper class as type safe Reference to store_handle_type. 49 */ 50 template<class store_handle_type> 51 class OStoreHandle : public rtl::Reference<store_handle_type> 52 { 53 public: 54 OStoreHandle (store_handle_type * pHandle) 55 : rtl::Reference<store_handle_type> (pHandle) 56 {} 57 58 static store_handle_type * SAL_CALL query (void * pHandle) 59 { 60 return store::query ( 61 static_cast<IStoreHandle*>(pHandle), 62 static_cast<store_handle_type*>(0)); 63 } 64 }; 65 } 66 67 68 using namespace store; 69 70 /*======================================================================== 71 * 72 * storeHandle implementation. 73 * 74 *======================================================================*/ 75 /* 76 * store_acquireHandle. 77 */ 78 storeError SAL_CALL store_acquireHandle ( 79 storeHandle Handle 80 ) SAL_THROW_EXTERN_C() 81 { 82 IStoreHandle *pHandle = static_cast<IStoreHandle*>(Handle); 83 if (!pHandle) 84 return store_E_InvalidHandle; 85 86 pHandle->acquire(); 87 return store_E_None; 88 } 89 90 /* 91 * store_releaseHandle. 92 */ 93 storeError SAL_CALL store_releaseHandle ( 94 storeHandle Handle 95 ) SAL_THROW_EXTERN_C() 96 { 97 IStoreHandle *pHandle = static_cast<IStoreHandle*>(Handle); 98 if (!pHandle) 99 return store_E_InvalidHandle; 100 101 pHandle->release(); 102 return store_E_None; 103 } 104 105 /*======================================================================== 106 * 107 * storeFileHandle implementation. 108 * 109 *======================================================================*/ 110 /* 111 * store_createMemoryFile. 112 */ 113 storeError SAL_CALL store_createMemoryFile ( 114 sal_uInt16 nPageSize, 115 storeFileHandle *phFile 116 ) SAL_THROW_EXTERN_C() 117 { 118 if (!phFile) 119 return store_E_InvalidParameter; 120 *phFile = NULL; 121 122 Reference<ILockBytes> xLockBytes; 123 124 storeError eErrCode = MemoryLockBytes_createInstance(xLockBytes); 125 if (eErrCode != store_E_None) 126 return eErrCode; 127 OSL_ASSERT(xLockBytes.is()); 128 129 Reference<OStorePageManager> xManager (new OStorePageManager()); 130 if (!xManager.is()) 131 return store_E_OutOfMemory; 132 133 eErrCode = xManager->initialize ( 134 &*xLockBytes, store_AccessCreate, nPageSize); 135 if (eErrCode != store_E_None) 136 return eErrCode; 137 138 xManager->acquire(); 139 140 *phFile = (storeFileHandle)&(*xManager); 141 return store_E_None; 142 } 143 144 /* 145 * store_openFile. 146 */ 147 storeError SAL_CALL store_openFile ( 148 rtl_uString *pFilename, 149 storeAccessMode eAccessMode, 150 sal_uInt16 nPageSize, 151 storeFileHandle *phFile 152 ) SAL_THROW_EXTERN_C() 153 { 154 if (phFile) 155 *phFile = NULL; 156 157 if (!(pFilename && phFile)) 158 return store_E_InvalidParameter; 159 160 Reference<ILockBytes> xLockBytes; 161 162 storeError eErrCode = FileLockBytes_createInstance (xLockBytes, pFilename, eAccessMode); 163 if (eErrCode != store_E_None) 164 return eErrCode; 165 OSL_ASSERT(xLockBytes.is()); 166 167 Reference<OStorePageManager> xManager (new OStorePageManager()); 168 if (!xManager.is()) 169 return store_E_OutOfMemory; 170 171 eErrCode = xManager->initialize ( 172 &*xLockBytes, eAccessMode, nPageSize); 173 if (eErrCode != store_E_None) 174 return eErrCode; 175 176 xManager->acquire(); 177 178 *phFile = (storeFileHandle)&(*xManager); 179 return store_E_None; 180 } 181 182 /* 183 * store_closeFile. 184 */ 185 storeError SAL_CALL store_closeFile ( 186 storeFileHandle Handle 187 ) SAL_THROW_EXTERN_C() 188 { 189 OStorePageManager *pManager = 190 OStoreHandle<OStorePageManager>::query (Handle); 191 if (!pManager) 192 return store_E_InvalidHandle; 193 194 storeError eErrCode = pManager->close(); 195 pManager->release(); 196 return eErrCode; 197 } 198 199 /* 200 * store_flushFile. 201 */ 202 storeError SAL_CALL store_flushFile ( 203 storeFileHandle Handle 204 ) SAL_THROW_EXTERN_C() 205 { 206 OStoreHandle<OStorePageManager> xManager ( 207 OStoreHandle<OStorePageManager>::query (Handle)); 208 if (!xManager.is()) 209 return store_E_InvalidHandle; 210 211 return xManager->flush(); 212 } 213 214 /* 215 * store_getFileRefererCount. 216 */ 217 storeError SAL_CALL store_getFileRefererCount ( 218 storeFileHandle Handle, 219 sal_uInt32 *pnRefCount 220 ) SAL_THROW_EXTERN_C() 221 { 222 OStoreHandle<OStorePageManager> xManager ( 223 OStoreHandle<OStorePageManager>::query (Handle)); 224 if (!xManager.is()) 225 return store_E_InvalidHandle; 226 227 if (!pnRefCount) 228 return store_E_InvalidParameter; 229 230 *pnRefCount = xManager->getRefererCount(); 231 return store_E_None; 232 } 233 234 /* 235 * store_getFileSize. 236 */ 237 storeError SAL_CALL store_getFileSize ( 238 storeFileHandle Handle, 239 sal_uInt32 *pnSize 240 ) SAL_THROW_EXTERN_C() 241 { 242 OStoreHandle<OStorePageManager> xManager ( 243 OStoreHandle<OStorePageManager>::query (Handle)); 244 if (!xManager.is()) 245 return store_E_InvalidHandle; 246 247 if (!pnSize) 248 return store_E_InvalidParameter; 249 250 return xManager->size (*pnSize); 251 } 252 253 /* 254 * store_rebuildFile. 255 */ 256 storeError SAL_CALL store_rebuildFile ( 257 rtl_uString *pSrcFilename, 258 rtl_uString *pDstFilename 259 ) SAL_THROW_EXTERN_C() 260 { 261 storeError eErrCode = store_E_None; 262 263 if (!(pSrcFilename && pDstFilename)) 264 return store_E_InvalidParameter; 265 266 Reference<OStorePageManager> xManager (new OStorePageManager()); 267 if (!xManager.is()) 268 return store_E_OutOfMemory; 269 270 Reference<ILockBytes> xSrcLB; 271 eErrCode = FileLockBytes_createInstance (xSrcLB, pSrcFilename, store_AccessReadOnly); 272 if (eErrCode != store_E_None) 273 return eErrCode; 274 OSL_ASSERT(xSrcLB.is()); 275 276 Reference<ILockBytes> xDstLB; 277 eErrCode = FileLockBytes_createInstance (xDstLB, pDstFilename, store_AccessCreate); 278 if (eErrCode != store_E_None) 279 return eErrCode; 280 OSL_ASSERT(xDstLB.is()); 281 282 return xManager->rebuild (&*xSrcLB, &*xDstLB); 283 } 284 285 /*======================================================================== 286 * 287 * storeDirectoryHandle implementation. 288 * 289 *======================================================================*/ 290 /* 291 * store_openDirectory. 292 */ 293 storeError SAL_CALL store_openDirectory ( 294 storeFileHandle hFile, 295 rtl_uString *pPath, 296 rtl_uString *pName, 297 storeAccessMode eAccessMode, 298 storeDirectoryHandle *phDirectory 299 ) SAL_THROW_EXTERN_C() 300 { 301 storeError eErrCode = store_E_None; 302 if (phDirectory) 303 *phDirectory = NULL; 304 305 OStoreHandle<OStorePageManager> xManager ( 306 OStoreHandle<OStorePageManager>::query (hFile)); 307 if (!xManager.is()) 308 return store_E_InvalidHandle; 309 310 if (!(pPath && pName && phDirectory)) 311 return store_E_InvalidParameter; 312 313 Reference<OStoreDirectory_Impl> xDirectory (new OStoreDirectory_Impl()); 314 if (!xDirectory.is()) 315 return store_E_OutOfMemory; 316 317 OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); 318 OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); 319 320 eErrCode = xDirectory->create (&*xManager, aPath.pData, aName.pData, eAccessMode); 321 if (eErrCode != store_E_None) 322 return eErrCode; 323 324 xDirectory->acquire(); 325 326 *phDirectory = (storeDirectoryHandle)&(*xDirectory); 327 return store_E_None; 328 } 329 330 /* 331 * store_closeDirectory. 332 */ 333 storeError SAL_CALL store_closeDirectory ( 334 storeDirectoryHandle Handle 335 ) SAL_THROW_EXTERN_C() 336 { 337 OStoreDirectory_Impl *pDirectory = 338 OStoreHandle<OStoreDirectory_Impl>::query (Handle); 339 if (!pDirectory) 340 return store_E_InvalidHandle; 341 342 pDirectory->release(); 343 return store_E_None; 344 } 345 346 /* 347 * store_findFirst. 348 */ 349 storeError SAL_CALL store_findFirst ( 350 storeDirectoryHandle Handle, 351 storeFindData *pFindData 352 ) SAL_THROW_EXTERN_C() 353 { 354 OStoreHandle<OStoreDirectory_Impl> xDirectory ( 355 OStoreHandle<OStoreDirectory_Impl>::query (Handle)); 356 if (!xDirectory.is()) 357 return store_E_InvalidHandle; 358 359 if (!pFindData) 360 return store_E_InvalidParameter; 361 362 // Initialize FindData. 363 rtl_zeroMemory (pFindData, sizeof (storeFindData)); 364 365 // Find first. 366 pFindData->m_nReserved = (sal_uInt32)(~0); 367 return xDirectory->iterate (*pFindData); 368 } 369 370 /* 371 * store_findNext. 372 */ 373 storeError SAL_CALL store_findNext ( 374 storeDirectoryHandle Handle, 375 storeFindData *pFindData 376 ) SAL_THROW_EXTERN_C() 377 { 378 OStoreHandle<OStoreDirectory_Impl> xDirectory ( 379 OStoreHandle<OStoreDirectory_Impl>::query (Handle)); 380 if (!xDirectory.is()) 381 return store_E_InvalidHandle; 382 383 if (!pFindData) 384 return store_E_InvalidParameter; 385 386 // Check FindData. 387 if (!pFindData->m_nReserved) 388 return store_E_NoMoreFiles; 389 390 // Find next. 391 pFindData->m_nReserved -= 1; 392 return xDirectory->iterate (*pFindData); 393 } 394 395 /*======================================================================== 396 * 397 * storeStreamHandle implementation. 398 * 399 *======================================================================*/ 400 /* 401 * store_openStream 402 */ 403 storeError SAL_CALL store_openStream ( 404 storeFileHandle hFile, 405 rtl_uString *pPath, 406 rtl_uString *pName, 407 storeAccessMode eAccessMode, 408 storeStreamHandle *phStream 409 ) SAL_THROW_EXTERN_C() 410 { 411 storeError eErrCode = store_E_None; 412 if (phStream) 413 *phStream = NULL; 414 415 OStoreHandle<OStorePageManager> xManager ( 416 OStoreHandle<OStorePageManager>::query (hFile)); 417 if (!xManager.is()) 418 return store_E_InvalidHandle; 419 420 if (!(pPath && pName && phStream)) 421 return store_E_InvalidParameter; 422 423 Reference<OStoreLockBytes> xLockBytes (new OStoreLockBytes()); 424 if (!xLockBytes.is()) 425 return store_E_OutOfMemory; 426 427 OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); 428 OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); 429 430 eErrCode = xLockBytes->create (&*xManager, aPath.pData, aName.pData, eAccessMode); 431 if (eErrCode != store_E_None) 432 return eErrCode; 433 434 xLockBytes->acquire(); 435 436 *phStream = (storeStreamHandle)&(*xLockBytes); 437 return store_E_None; 438 } 439 440 /* 441 * store_closeStream. 442 */ 443 storeError SAL_CALL store_closeStream ( 444 storeStreamHandle Handle 445 ) SAL_THROW_EXTERN_C() 446 { 447 OStoreLockBytes *pLockBytes = 448 OStoreHandle<OStoreLockBytes>::query (Handle); 449 if (!pLockBytes) 450 return store_E_InvalidHandle; 451 452 pLockBytes->release(); 453 return store_E_None; 454 } 455 456 /* 457 * store_readStream. 458 */ 459 storeError SAL_CALL store_readStream ( 460 storeStreamHandle Handle, 461 sal_uInt32 nOffset, 462 void *pBuffer, 463 sal_uInt32 nBytes, 464 sal_uInt32 *pnDone 465 ) SAL_THROW_EXTERN_C() 466 { 467 OStoreHandle<OStoreLockBytes> xLockBytes ( 468 OStoreHandle<OStoreLockBytes>::query (Handle)); 469 if (!xLockBytes.is()) 470 return store_E_InvalidHandle; 471 472 if (!(pBuffer && pnDone)) 473 return store_E_InvalidParameter; 474 475 return xLockBytes->readAt (nOffset, pBuffer, nBytes, *pnDone); 476 } 477 478 /* 479 * store_writeStream. 480 */ 481 storeError SAL_CALL store_writeStream ( 482 storeStreamHandle Handle, 483 sal_uInt32 nOffset, 484 const void *pBuffer, 485 sal_uInt32 nBytes, 486 sal_uInt32 *pnDone 487 ) SAL_THROW_EXTERN_C() 488 { 489 OStoreHandle<OStoreLockBytes> xLockBytes ( 490 OStoreHandle<OStoreLockBytes>::query (Handle)); 491 if (!xLockBytes.is()) 492 return store_E_InvalidHandle; 493 494 if (!(pBuffer && pnDone)) 495 return store_E_InvalidParameter; 496 497 return xLockBytes->writeAt (nOffset, pBuffer, nBytes, *pnDone); 498 } 499 500 /* 501 * store_flushStream. 502 */ 503 storeError SAL_CALL store_flushStream ( 504 storeStreamHandle Handle 505 ) SAL_THROW_EXTERN_C() 506 { 507 OStoreHandle<OStoreLockBytes> xLockBytes ( 508 OStoreHandle<OStoreLockBytes>::query (Handle)); 509 if (!xLockBytes.is()) 510 return store_E_InvalidHandle; 511 512 return xLockBytes->flush(); 513 } 514 515 /* 516 * store_getStreamSize. 517 */ 518 storeError SAL_CALL store_getStreamSize ( 519 storeStreamHandle Handle, 520 sal_uInt32 *pnSize 521 ) SAL_THROW_EXTERN_C() 522 { 523 OStoreHandle<OStoreLockBytes> xLockBytes ( 524 OStoreHandle<OStoreLockBytes>::query (Handle)); 525 if (!xLockBytes.is()) 526 return store_E_InvalidHandle; 527 528 if (!pnSize) 529 return store_E_InvalidParameter; 530 531 return xLockBytes->stat (*pnSize); 532 } 533 534 /* 535 * store_setStreamSize. 536 */ 537 storeError SAL_CALL store_setStreamSize ( 538 storeStreamHandle Handle, 539 sal_uInt32 nSize 540 ) SAL_THROW_EXTERN_C() 541 { 542 OStoreHandle<OStoreLockBytes> xLockBytes ( 543 OStoreHandle<OStoreLockBytes>::query (Handle)); 544 if (!xLockBytes.is()) 545 return store_E_InvalidHandle; 546 547 return xLockBytes->setSize (nSize); 548 } 549 550 /*======================================================================== 551 * 552 * Common storeDirectoryHandle and storeStreamHandle operations. 553 * 554 *======================================================================*/ 555 /* 556 * store_attrib. 557 */ 558 storeError SAL_CALL store_attrib ( 559 storeFileHandle Handle, 560 rtl_uString *pPath, 561 rtl_uString *pName, 562 sal_uInt32 nMask1, 563 sal_uInt32 nMask2, 564 sal_uInt32 *pnAttrib 565 ) SAL_THROW_EXTERN_C() 566 { 567 storeError eErrCode = store_E_None; 568 if (pnAttrib) 569 *pnAttrib = 0; 570 571 OStoreHandle<OStorePageManager> xManager ( 572 OStoreHandle<OStorePageManager>::query (Handle)); 573 if (!xManager.is()) 574 return store_E_InvalidHandle; 575 576 if (!(pPath && pName)) 577 return store_E_InvalidParameter; 578 579 // Setup page key. 580 OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); 581 OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); 582 OStorePageKey aKey; 583 584 eErrCode = OStorePageManager::namei (aPath.pData, aName.pData, aKey); 585 if (eErrCode != store_E_None) 586 return eErrCode; 587 588 // Obtain or modify page attributes. 589 sal_uInt32 nAttrib = 0; 590 eErrCode = xManager->attrib (aKey, nMask1, nMask2, nAttrib); 591 if (pnAttrib) 592 *pnAttrib = nAttrib; 593 return eErrCode; 594 } 595 596 /* 597 * store_link. 598 */ 599 storeError SAL_CALL store_link ( 600 storeFileHandle Handle, 601 rtl_uString *pSrcPath, rtl_uString *pSrcName, 602 rtl_uString *pDstPath, rtl_uString *pDstName 603 ) SAL_THROW_EXTERN_C() 604 { 605 storeError eErrCode = store_E_None; 606 607 OStoreHandle<OStorePageManager> xManager ( 608 OStoreHandle<OStorePageManager>::query (Handle)); 609 if (!xManager.is()) 610 return store_E_InvalidHandle; 611 612 if (!(pSrcPath && pSrcName)) 613 return store_E_InvalidParameter; 614 615 if (!(pDstPath && pDstName)) 616 return store_E_InvalidParameter; 617 618 // Setup 'Source' page key. 619 OString aSrcPath ( 620 pSrcPath->buffer, pSrcPath->length, RTL_TEXTENCODING_UTF8); 621 OString aSrcName ( 622 pSrcName->buffer, pSrcName->length, RTL_TEXTENCODING_UTF8); 623 OStorePageKey aSrcKey; 624 625 eErrCode = OStorePageManager::namei ( 626 aSrcPath.pData, aSrcName.pData, aSrcKey); 627 if (eErrCode != store_E_None) 628 return eErrCode; 629 630 // Setup 'Destination' page key. 631 OString aDstPath ( 632 pDstPath->buffer, pDstPath->length, RTL_TEXTENCODING_UTF8); 633 OString aDstName ( 634 pDstName->buffer, pDstName->length, RTL_TEXTENCODING_UTF8); 635 OStorePageKey aDstKey; 636 637 eErrCode = OStorePageManager::namei ( 638 aDstPath.pData, aDstName.pData, aDstKey); 639 if (eErrCode != store_E_None) 640 return eErrCode; 641 642 // Link 'Source' hard to 'Destination'. 643 return xManager->link (aSrcKey, aDstKey); 644 } 645 646 /* 647 * store_symlink. 648 */ 649 storeError SAL_CALL store_symlink ( 650 storeFileHandle Handle, 651 rtl_uString *pSrcPath, rtl_uString *pSrcName, 652 rtl_uString *pDstPath, rtl_uString *pDstName 653 ) SAL_THROW_EXTERN_C() 654 { 655 storeError eErrCode = store_E_None; 656 657 OStoreHandle<OStorePageManager> xManager ( 658 OStoreHandle<OStorePageManager>::query (Handle)); 659 if (!xManager.is()) 660 return store_E_InvalidHandle; 661 662 if (!(pSrcPath && pSrcName)) 663 return store_E_InvalidParameter; 664 665 if (!(pDstPath && pDstName)) 666 return store_E_InvalidParameter; 667 668 // Setup 'Destination' page key. 669 OString aDstPath ( 670 pDstPath->buffer, pDstPath->length, RTL_TEXTENCODING_UTF8); 671 OString aDstName ( 672 pDstName->buffer, pDstName->length, RTL_TEXTENCODING_UTF8); 673 OStorePageKey aDstKey; 674 675 eErrCode = OStorePageManager::namei ( 676 aDstPath.pData, aDstName.pData, aDstKey); 677 if (eErrCode != store_E_None) 678 return eErrCode; 679 680 // Insert 'Source' as symlink to 'Destination'. 681 OString aSrcPath ( 682 pSrcPath->buffer, pSrcPath->length, RTL_TEXTENCODING_UTF8); 683 OString aSrcName ( 684 pSrcName->buffer, pSrcName->length, RTL_TEXTENCODING_UTF8); 685 686 return xManager->symlink (aSrcPath.pData, aSrcName.pData, aDstKey); 687 } 688 689 /* 690 * store_rename. 691 */ 692 storeError SAL_CALL store_rename ( 693 storeFileHandle Handle, 694 rtl_uString *pSrcPath, rtl_uString *pSrcName, 695 rtl_uString *pDstPath, rtl_uString *pDstName 696 ) SAL_THROW_EXTERN_C() 697 { 698 storeError eErrCode = store_E_None; 699 700 OStoreHandle<OStorePageManager> xManager ( 701 OStoreHandle<OStorePageManager>::query (Handle)); 702 if (!xManager.is()) 703 return store_E_InvalidHandle; 704 705 if (!(pSrcPath && pSrcName)) 706 return store_E_InvalidParameter; 707 708 if (!(pDstPath && pDstName)) 709 return store_E_InvalidParameter; 710 711 // Setup 'Source' page key. 712 OString aSrcPath ( 713 pSrcPath->buffer, pSrcPath->length, RTL_TEXTENCODING_UTF8); 714 OString aSrcName ( 715 pSrcName->buffer, pSrcName->length, RTL_TEXTENCODING_UTF8); 716 OStorePageKey aSrcKey; 717 718 eErrCode = OStorePageManager::namei ( 719 aSrcPath.pData, aSrcName.pData, aSrcKey); 720 if (eErrCode != store_E_None) 721 return eErrCode; 722 723 // Rename 'Source' into 'Destination'. 724 OString aDstPath ( 725 pDstPath->buffer, pDstPath->length, RTL_TEXTENCODING_UTF8); 726 OString aDstName ( 727 pDstName->buffer, pDstName->length, RTL_TEXTENCODING_UTF8); 728 729 return xManager->rename (aSrcKey, aDstPath.pData, aDstName.pData); 730 } 731 732 /* 733 * store_remove. 734 */ 735 storeError SAL_CALL store_remove ( 736 storeFileHandle Handle, 737 rtl_uString *pPath, 738 rtl_uString *pName 739 ) SAL_THROW_EXTERN_C() 740 { 741 storeError eErrCode = store_E_None; 742 743 OStoreHandle<OStorePageManager> xManager ( 744 OStoreHandle<OStorePageManager>::query (Handle)); 745 if (!xManager.is()) 746 return store_E_InvalidHandle; 747 748 if (!(pPath && pName)) 749 return store_E_InvalidParameter; 750 751 // Setup page key. 752 OString aPath (pPath->buffer, pPath->length, RTL_TEXTENCODING_UTF8); 753 OString aName (pName->buffer, pName->length, RTL_TEXTENCODING_UTF8); 754 OStorePageKey aKey; 755 756 eErrCode = OStorePageManager::namei (aPath.pData, aName.pData, aKey); 757 if (eErrCode != store_E_None) 758 return eErrCode; 759 760 // Remove. 761 return xManager->remove (aKey); 762 } 763