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