diff options
Diffstat (limited to 'store/source/storpage.cxx')
-rw-r--r-- | store/source/storpage.cxx | 472 |
1 files changed, 0 insertions, 472 deletions
diff --git a/store/source/storpage.cxx b/store/source/storpage.cxx index a50182681174..2892908599c1 100644 --- a/store/source/storpage.cxx +++ b/store/source/storpage.cxx @@ -437,282 +437,6 @@ storeError OStorePageManager::save_dirpage_Impl ( } /* - * attrib [nAttrib = ((nAttrib & ~nMask1) | nMask2)]. - * Precond: initialized. - */ -storeError OStorePageManager::attrib ( - const OStorePageKey &rKey, - sal_uInt32 nMask1, - sal_uInt32 nMask2, - sal_uInt32 &rAttrib) -{ - // Acquire exclusive access. - osl::MutexGuard aGuard(*this); - - // Check precond. - if (!self::isValid()) - return store_E_InvalidAccess; - - // Find NodePage and index. - OStoreBTreeNodeObject aNode; - sal_uInt16 i = 0; - storeError eErrCode = find_lookup (aNode, i, rKey); - if (eErrCode != store_E_None) - return eErrCode; - - // Existing entry. - PageHolderObject< page > xNode (aNode.get()); - entry e (xNode->m_pData[i]); - if (nMask1 != nMask2) - { - // Evaluate new attributes. - sal_uInt32 nAttrib = store::ntohl(e.m_nAttrib); - - nAttrib &= ~nMask1; - nAttrib |= nMask2; - - if (store::htonl(nAttrib) != e.m_nAttrib) - { - // Check access mode. - if (base::isWriteable()) - { - // Set new attributes. - e.m_nAttrib = store::htonl(nAttrib); - xNode->m_pData[i] = e; - - // Save modified NodePage. - eErrCode = saveObjectAt (aNode, aNode.location()); - } - else - { - // Access denied. - eErrCode = store_E_AccessViolation; - } - } - } - - // Obtain current attributes. - rAttrib = store::ntohl(e.m_nAttrib); - return eErrCode; -} - -/* - * link (insert 'Source' as hardlink to 'Destination'). - * Precond: initialized, writeable. - */ -storeError OStorePageManager::link ( - const OStorePageKey &rSrcKey, - const OStorePageKey &rDstKey) -{ - // Acquire exclusive access. - osl::MutexGuard aGuard(*this); - - // Check precond. - if (!self::isValid()) - return store_E_InvalidAccess; - - if (!base::isWriteable()) - return store_E_AccessViolation; - - // Find 'Destination' NodePage and Index. - OStoreBTreeNodeObject aDstNode; - sal_uInt16 i = 0; - storeError eErrCode = find_lookup (aDstNode, i, rDstKey); - if (eErrCode != store_E_None) - return eErrCode; - - // Existing 'Destination' entry. - PageHolderObject< page > xDstNode (aDstNode.get()); - entry e (xDstNode->m_pData[i]); - OStorePageLink aDstLink (e.m_aLink); - - // Find 'Source' NodePage and Index. - OStoreBTreeNodeObject aSrcNode; - eErrCode = m_aRoot.find_insert (aSrcNode, i, rSrcKey, *this); - if (eErrCode != store_E_None) - return eErrCode; - - // Insert 'Source' entry. - PageHolderObject< page > xSrcNode (aSrcNode.get()); - xSrcNode->insert (i + 1, entry (rSrcKey, aDstLink, STORE_ATTRIB_ISLINK)); - return saveObjectAt (aSrcNode, aSrcNode.location()); -} - -/* - * symlink (insert 'Source' DirectoryPage as symlink to 'Destination'). - * Precond: initialized, writeable. - */ -storeError OStorePageManager::symlink ( - const rtl_String *pSrcPath, - const rtl_String *pSrcName, - const OStorePageKey &rDstKey) -{ - // Acquire exclusive access. - osl::MutexGuard aGuard(*this); - - // Check precond. - if (!self::isValid()) - return store_E_InvalidAccess; - - if (!base::isWriteable()) - return store_E_AccessViolation; - - // Check 'Source' parameter. - storeError eErrCode = store_E_InvalidParameter; - if (!(pSrcPath && pSrcName)) - return eErrCode; - - // Setup 'Source' page key. - OStorePageKey aSrcKey; - eErrCode = namei (pSrcPath, pSrcName, aSrcKey); - if (eErrCode != store_E_None) - return eErrCode; - - // Find 'Source' NodePage and Index. - OStoreBTreeNodeObject aSrcNode; - sal_uInt16 i = 0; - eErrCode = m_aRoot.find_insert (aSrcNode, i, aSrcKey, *this); - if (eErrCode != store_E_None) - return eErrCode; - - // Initialize directory page. - OStoreDirectoryPageObject aPage; - eErrCode = aPage.construct< inode >(base::allocator()); - if (eErrCode != store_E_None) - return eErrCode; - - // Setup as 'Source' directory page. - inode_holder_type xNode (aPage.get()); - aPage.key (aSrcKey); - memcpy ( - &(xNode->m_aNameBlock.m_pData[0]), - pSrcName->buffer, pSrcName->length); - - // Store 'Destination' page key. - OStorePageKey aDstKey (rDstKey); - memcpy (&(xNode->m_pData[0]), &aDstKey, sizeof(aDstKey)); - - // Mark 'Source' as symbolic link to 'Destination'. - aPage.attrib (STORE_ATTRIB_ISLINK); - aPage.dataLength (sal_uInt32(sizeof(aDstKey))); - - // Allocate and save 'Source' directory page. - eErrCode = base::allocate (aPage); - if (eErrCode != store_E_None) - return eErrCode; - - // Insert 'Source' entry. - PageHolderObject< page > xSrcNode (aSrcNode.get()); - OStorePageLink aSrcLink (aPage.location()); - xSrcNode->insert (i + 1, entry(aSrcKey, aSrcLink)); - - // Save modified NodePage. - return saveObjectAt (aSrcNode, aSrcNode.location()); -} - -/* - * rename. - * Precond: initialized, writeable. - */ -storeError OStorePageManager::rename ( - const OStorePageKey &rSrcKey, - const rtl_String *pDstPath, - const rtl_String *pDstName) -{ - // Acquire exclusive access. - osl::MutexGuard aGuard(*this); - - // Check precond. - if (!self::isValid()) - return store_E_InvalidAccess; - - if (!base::isWriteable()) - return store_E_AccessViolation; - - // Check 'Destination' parameter. - storeError eErrCode = store_E_InvalidParameter; - if (!(pDstPath && pDstName)) - return eErrCode; - - // Setup 'Destination' page key. - OStorePageKey aDstKey; - eErrCode = namei (pDstPath, pDstName, aDstKey); - if (eErrCode != store_E_None) - return eErrCode; - - // Find 'Source' NodePage and Index. - OStoreBTreeNodeObject aSrcNode; - sal_uInt16 i = 0; - eErrCode = find_lookup (aSrcNode, i, rSrcKey); - if (eErrCode != store_E_None) - return eErrCode; - - // Existing 'Source' entry. - PageHolderObject< page > xSrcNode (aSrcNode.get()); - entry e (xSrcNode->m_pData[i]); - - // Check for (not a) hardlink. - OStoreDirectoryPageObject aPage; - if (!(store::ntohl(e.m_nAttrib) & STORE_ATTRIB_ISLINK)) - { - // Load directory page. - eErrCode = base::loadObjectAt (aPage, e.m_aLink.location()); - if (eErrCode != store_E_None) - return eErrCode; - - // Check for directory. - if (aPage.attrib() & STORE_ATTRIB_ISDIR) - { - // Ugly, but necessary (backward compatibility). - aDstKey.m_nLow = store::htonl(rtl_crc32 (store::ntohl(aDstKey.m_nLow), "/", 1)); - } - } - - // Let 'Source' entry be 'Destination' entry. - e.m_aKey = aDstKey; - - // Find 'Destination' NodePage and Index. - OStoreBTreeNodeObject aDstNode; - eErrCode = m_aRoot.find_insert (aDstNode, i, e.m_aKey, *this); - if (eErrCode != store_E_None) - return eErrCode; - - // Insert 'Destination' entry. - PageHolderObject< page > xDstNode (aDstNode.get()); - xDstNode->insert (i + 1, e); - - eErrCode = saveObjectAt (aDstNode, aDstNode.location()); - if (eErrCode != store_E_None) - return eErrCode; - - // Check for (not a) hardlink. - if (!(store::ntohl(e.m_nAttrib) & STORE_ATTRIB_ISLINK)) - { - // Modify 'Source' directory page. - inode_holder_type xNode (aPage.get()); - - // Setup 'Destination' NameBlock. - sal_Int32 nDstLen = pDstName->length; - memcpy ( - &(xNode->m_aNameBlock.m_pData[0]), - pDstName->buffer, pDstName->length); - memset ( - &(xNode->m_aNameBlock.m_pData[nDstLen]), - 0, STORE_MAXIMUM_NAMESIZE - nDstLen); - aPage.key (e.m_aKey); - - // Save directory page. - eErrCode = base::saveObjectAt (aPage, e.m_aLink.location()); - if (eErrCode != store_E_None) - return eErrCode; - } - - // Remove 'Source' entry. - e.m_aKey = rSrcKey; - return remove_Impl (e); -} - -/* * remove. * Precond: initialized, writeable. */ @@ -785,201 +509,5 @@ storeError OStorePageManager::remove (const OStorePageKey &rKey) return remove_Impl (e); } -/* - * RebuildContext. - */ -struct RebuildContext -{ - /** Representation. - */ - rtl::Reference<OStorePageBIOS> m_xBIOS; - OStorePageBIOS::ScanContext m_aCtx; - sal_uInt16 m_nPageSize; - - /** Construction. - */ - RebuildContext() - : m_xBIOS (new OStorePageBIOS()), - m_nPageSize (0) - {} - - /** initialize (PageBIOS and ScanContext). - */ - storeError initialize (ILockBytes *pLockBytes, sal_uInt32 nMagic = 0) - { - storeError eErrCode = store_E_InvalidParameter; - if (pLockBytes) - { - m_xBIOS->initialize (pLockBytes, store_AccessReadOnly, m_nPageSize); - eErrCode = m_xBIOS->scanBegin (m_aCtx, nMagic); - } - return eErrCode; - } - - /** initialize (ScanContext). - */ - storeError initialize (sal_uInt32 nMagic = 0) - { - return m_xBIOS->scanBegin (m_aCtx, nMagic); - } - - /** load (next ScanContext matching page). - */ - storeError load (OStorePageObject &rPage) - { - if (m_aCtx.isValid()) - return m_xBIOS->scanNext (m_aCtx, rPage); - else - return store_E_CantSeek; - } -}; - -/* - * rebuild. - * Precond: none. - */ -storeError OStorePageManager::rebuild ( - ILockBytes *pSrcLB, ILockBytes *pDstLB) -{ - // Acquire exclusive access. - osl::MutexGuard aGuard(*this); - - // Check arguments. - storeError eErrCode = store_E_InvalidParameter; - if (!(pSrcLB && pDstLB)) - return eErrCode; - - // Initialize 'Source' rebuild context. - RebuildContext aCtx; - eErrCode = aCtx.initialize (pSrcLB, STORE_MAGIC_DIRECTORYPAGE); - if (eErrCode != store_E_None) - return eErrCode; - rtl::Reference<OStorePageBIOS> xSrcBIOS (aCtx.m_xBIOS); - - // Initialize as 'Destination' with 'Source' page size. - eErrCode = self::initialize (pDstLB, store_AccessCreate, aCtx.m_nPageSize); - if (eErrCode != store_E_None) - return eErrCode; - - // Pass One: Scan 'Source' directory pages. - { - // Scan 'Source' directory pages. - OStoreDirectoryPageObject aSrcPage; - while ((eErrCode = aCtx.load(aSrcPage)) == store_E_None) - { - OStoreDirectoryPageObject aDstPage; - eErrCode = aDstPage.construct< inode >(base::allocator()); - if (eErrCode != store_E_None) - break; - - inode_holder_type xSrcDir (aSrcPage.get()); - inode_holder_type xDstDir (aDstPage.get()); - - // Copy NameBlock @@@ OLD @@@ - memcpy (&(xDstDir->m_aNameBlock), &(xSrcDir->m_aNameBlock), sizeof(xSrcDir->m_aNameBlock)); - - // Obtain 'Source' data length. - sal_uInt32 nDataLen = aSrcPage.dataLength(); - if (nDataLen > 0) - { - // Copy internal data area @@@ OLD @@@ - memcpy (&(xDstDir->m_pData[0]), &(xSrcDir->m_pData[0]), xSrcDir->capacity()); - } - - // Insert 'Destination' directory page. - eErrCode = save_dirpage_Impl (aDstPage.key(), aDstPage); - if (eErrCode != store_E_None) - break; - - // Check for external data page scope. - if (xSrcDir->scope(nDataLen) != inode::SCOPE_INTERNAL) - { - // Initialize 'Destination' data page. - typedef OStoreDataPageData data; - PageHolderObject< data > xData; - if (!xData.construct(base::allocator())) - return store_E_OutOfMemory; - - // Determine data page count. - inode::ChunkDescriptor aDescr ( - nDataLen - xDstDir->capacity(), xData->capacity()); - - sal_uInt32 i, n = aDescr.m_nPage; - if (aDescr.m_nOffset) n += 1; - - // Copy data pages. - OStoreDataPageObject aData; - for (i = 0; i < n; i++) - { - // Read 'Source' data page. - osl::MutexGuard aSrcGuard (*xSrcBIOS); - - eErrCode = aSrcPage.read (i, aData, *xSrcBIOS); - if (eErrCode != store_E_None) - continue; - - // Write 'Destination' data page. @@@ READONLY @@@ - (void) aDstPage.write (i, aData, *this); - } - } - - // Update 'Destination' directory page. - aDstPage.dataLength (nDataLen); - (void) base::saveObjectAt (aDstPage, aDstPage.location()); - } - - // Save directory scan results. - flush(); - } - - // Pass Two: Scan 'Source' BTree nodes. - { - // Re-start 'Source' rebuild context. - aCtx.initialize (STORE_MAGIC_BTREENODE); - - // Scan 'Source' BTree nodes. - OStoreBTreeNodeObject aNode; - while ((eErrCode = aCtx.load(aNode)) == store_E_None) - { - // Check for leaf node. - PageHolderObject< page > xNode (aNode.get()); - if (xNode->depth() == 0) - { - sal_uInt16 i, n = xNode->usageCount(); - for (i = 0; i < n; i++) - { - entry e (xNode->m_pData[i]); - - // Check for Hard link. - if (e.m_nAttrib & STORE_ATTRIB_ISLINK) - { - // Load the hard link destination. - OStoreDirectoryPageObject aSrcPage; - eErrCode = xSrcBIOS->loadObjectAt (aSrcPage, e.m_aLink.location()); - if (eErrCode == store_E_None) - { - OStorePageKey aDstKey (aSrcPage.key()); - link (e.m_aKey, aDstKey); - } - e.m_nAttrib &= ~STORE_ATTRIB_ISLINK; - } - - if (e.m_nAttrib) - { - // Ordinary attributes. - sal_uInt32 nAttrib = 0; - attrib (e.m_aKey, 0, e.m_nAttrib, nAttrib); - } - } - } - } - - // Save BTree node scan results. - flush(); - } - - // Done. - return store_E_None; -} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |