Vincent Povirk : ole32: Convert adjustPropertyChain into real binary tree removal.
Alexandre Julliard
julliard at winehq.org
Fri Oct 30 11:04:30 CDT 2009
Module: wine
Branch: master
Commit: 13b9666443cae8a5f6ece8498d1560c67dc66925
URL: http://source.winehq.org/git/wine.git/?a=commit;h=13b9666443cae8a5f6ece8498d1560c67dc66925
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Wed Oct 28 14:24:18 2009 -0500
ole32: Convert adjustPropertyChain into real binary tree removal.
Finding the parent of a node in a binary tree is a detail that should
be handled inside the function.
---
dlls/ole32/storage32.c | 57 ++++++++++++++++++++++-------------------------
1 files changed, 27 insertions(+), 30 deletions(-)
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 18ced72..b793b85 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -169,12 +169,10 @@ static HRESULT deleteStreamProperty(
ULONG foundPropertyIndexToDelete,
StgProperty propertyToDelete);
-static HRESULT adjustPropertyChain(
+static HRESULT removeFromTree(
StorageImpl *This,
- StgProperty propertyToDelete,
- StgProperty parentProperty,
- ULONG parentPropertyId,
- INT typeOfRelation);
+ ULONG parentStorageIndex,
+ ULONG deletedIndex);
/***********************************************************************
* Declaration of the functions used to manipulate StgProperty
@@ -1755,10 +1753,7 @@ static HRESULT WINAPI StorageImpl_DestroyElement(
HRESULT hr = S_OK;
StgProperty propertyToDelete;
- StgProperty parentProperty;
ULONG foundPropertyIndexToDelete;
- ULONG typeOfRelation;
- ULONG parentPropertyId = 0;
TRACE("(%p, %s)\n",
iface, debugstr_w(pwcsName));
@@ -1780,15 +1775,6 @@ static HRESULT WINAPI StorageImpl_DestroyElement(
return STG_E_FILENOTFOUND;
}
- /*
- * Find the property that links to the one we want to delete.
- */
- hr = findTreeParent(This->base.ancestorStorage, This->base.rootPropertySetIndex,
- pwcsName, &parentProperty, &parentPropertyId, &typeOfRelation);
-
- if (hr != S_OK)
- return hr;
-
if ( propertyToDelete.propertyType == PROPTYPE_STORAGE )
{
hr = deleteStorageProperty(
@@ -1810,12 +1796,10 @@ static HRESULT WINAPI StorageImpl_DestroyElement(
/*
* Adjust the property chain
*/
- hr = adjustPropertyChain(
- This,
- propertyToDelete,
- parentProperty,
- parentPropertyId,
- typeOfRelation);
+ hr = removeFromTree(
+ This->base.ancestorStorage,
+ This->base.rootPropertySetIndex,
+ foundPropertyIndexToDelete);
/*
* Invalidate the property by zeroing its name member.
@@ -2018,18 +2002,31 @@ static void setPropertyLink(StgProperty *property, ULONG relation, ULONG new_tar
*
* Internal Method
*
- * This method takes the previous and the next property link of a property
- * to be deleted and find them a place in the Storage.
+ * This method removes a directory entry from its parent storage tree without
+ * freeing any resources attached to it.
*/
-static HRESULT adjustPropertyChain(
+static HRESULT removeFromTree(
StorageImpl *This,
- StgProperty propertyToDelete,
- StgProperty parentProperty,
- ULONG parentPropertyId,
- INT typeOfRelation)
+ ULONG parentStorageIndex,
+ ULONG deletedIndex)
{
HRESULT hr = S_OK;
BOOL res = TRUE;
+ StgProperty propertyToDelete;
+ StgProperty parentProperty;
+ ULONG parentPropertyId;
+ ULONG typeOfRelation;
+
+ res = StorageImpl_ReadProperty(This, deletedIndex, &propertyToDelete);
+
+ /*
+ * Find the property that links to the one we want to delete.
+ */
+ hr = findTreeParent(This, parentStorageIndex, propertyToDelete.name,
+ &parentProperty, &parentPropertyId, &typeOfRelation);
+
+ if (hr != S_OK)
+ return hr;
if (propertyToDelete.leftChild != PROPERTY_NULL)
{
More information about the wine-cvs
mailing list