xref: /trunk/main/store/source/store.cxx (revision 6fd2419af095b9e12baf06e33db2129edf4d719b)
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