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:
OStoreHandle(store_handle_type * pHandle)54 OStoreHandle (store_handle_type * pHandle)
55 : rtl::Reference<store_handle_type> (pHandle)
56 {}
57
query(void * pHandle)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 */
store_acquireHandle(storeHandle Handle)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 */
store_releaseHandle(storeHandle Handle)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 */
store_createMemoryFile(sal_uInt16 nPageSize,storeFileHandle * phFile)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 */
store_openFile(rtl_uString * pFilename,storeAccessMode eAccessMode,sal_uInt16 nPageSize,storeFileHandle * phFile)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 */
store_closeFile(storeFileHandle Handle)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 */
store_flushFile(storeFileHandle Handle)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 */
store_getFileRefererCount(storeFileHandle Handle,sal_uInt32 * pnRefCount)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 */
store_getFileSize(storeFileHandle Handle,sal_uInt32 * pnSize)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 */
store_rebuildFile(rtl_uString * pSrcFilename,rtl_uString * pDstFilename)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 */
store_openDirectory(storeFileHandle hFile,rtl_uString * pPath,rtl_uString * pName,storeAccessMode eAccessMode,storeDirectoryHandle * phDirectory)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 */
store_closeDirectory(storeDirectoryHandle Handle)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 */
store_findFirst(storeDirectoryHandle Handle,storeFindData * pFindData)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 */
store_findNext(storeDirectoryHandle Handle,storeFindData * pFindData)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 */
store_openStream(storeFileHandle hFile,rtl_uString * pPath,rtl_uString * pName,storeAccessMode eAccessMode,storeStreamHandle * phStream)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 */
store_closeStream(storeStreamHandle Handle)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 */
store_readStream(storeStreamHandle Handle,sal_uInt32 nOffset,void * pBuffer,sal_uInt32 nBytes,sal_uInt32 * pnDone)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 */
store_writeStream(storeStreamHandle Handle,sal_uInt32 nOffset,const void * pBuffer,sal_uInt32 nBytes,sal_uInt32 * pnDone)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 */
store_flushStream(storeStreamHandle Handle)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 */
store_getStreamSize(storeStreamHandle Handle,sal_uInt32 * pnSize)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 */
store_setStreamSize(storeStreamHandle Handle,sal_uInt32 nSize)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 */
store_attrib(storeFileHandle Handle,rtl_uString * pPath,rtl_uString * pName,sal_uInt32 nMask1,sal_uInt32 nMask2,sal_uInt32 * pnAttrib)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 */
store_link(storeFileHandle Handle,rtl_uString * pSrcPath,rtl_uString * pSrcName,rtl_uString * pDstPath,rtl_uString * pDstName)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 */
store_symlink(storeFileHandle Handle,rtl_uString * pSrcPath,rtl_uString * pSrcName,rtl_uString * pDstPath,rtl_uString * pDstName)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 */
store_rename(storeFileHandle Handle,rtl_uString * pSrcPath,rtl_uString * pSrcName,rtl_uString * pDstPath,rtl_uString * pDstName)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 */
store_remove(storeFileHandle Handle,rtl_uString * pPath,rtl_uString * pName)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