summaryrefslogtreecommitdiff
path: root/store/source/storpage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'store/source/storpage.cxx')
-rw-r--r--store/source/storpage.cxx472
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: */