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