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