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