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