Vincent Povirk : ole32: Simplify RenameElement by using the same entry in the file.
Alexandre Julliard
julliard at winehq.org
Wed Nov 11 08:33:23 CST 2009
Module: wine
Branch: master
Commit: 87ed7d9b8b3c73a42e5583372975805089b6c070
URL: http://source.winehq.org/git/wine.git/?a=commit;h=87ed7d9b8b3c73a42e5583372975805089b6c070
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Mon Nov 2 12:48:02 2009 -0600
ole32: Simplify RenameElement by using the same entry in the file.
---
dlls/ole32/storage32.c | 86 +++++------------------------------------------
1 files changed, 10 insertions(+), 76 deletions(-)
diff --git a/dlls/ole32/storage32.c b/dlls/ole32/storage32.c
index 1a4ac90..e5b0717 100644
--- a/dlls/ole32/storage32.c
+++ b/dlls/ole32/storage32.c
@@ -686,10 +686,6 @@ end:
* This method will rename the specified element.
*
* See Windows documentation for more details on IStorage methods.
- *
- * Implementation notes: The method used to rename consists of creating a clone
- * of the deleted StgProperty object setting it with the new name and to
- * perform a DestroyElement of the old StgProperty.
*/
static HRESULT WINAPI StorageBaseImpl_RenameElement(
IStorage* iface,
@@ -726,81 +722,19 @@ static HRESULT WINAPI StorageBaseImpl_RenameElement(
if (foundPropertyIndex != PROPERTY_NULL)
{
- StgProperty renamedProperty;
- ULONG renamedPropertyIndex;
-
- /*
- * Setup a new property for the renamed property
- */
- renamedProperty.sizeOfNameString =
- ( lstrlenW(pwcsNewName)+1 ) * sizeof(WCHAR);
-
- if (renamedProperty.sizeOfNameString > PROPERTY_NAME_BUFFER_LEN)
- return STG_E_INVALIDNAME;
-
- strcpyW(renamedProperty.name, pwcsNewName);
-
- renamedProperty.propertyType = currentProperty.propertyType;
- renamedProperty.startingBlock = currentProperty.startingBlock;
- renamedProperty.size.u.LowPart = currentProperty.size.u.LowPart;
- renamedProperty.size.u.HighPart = currentProperty.size.u.HighPart;
-
- renamedProperty.leftChild = PROPERTY_NULL;
- renamedProperty.rightChild = PROPERTY_NULL;
-
- /*
- * Bring the dirProperty link in case it is a storage and in which
- * case the renamed storage elements don't require to be reorganized.
- */
- renamedProperty.dirProperty = currentProperty.dirProperty;
-
- /* call CoFileTime to get the current time
- renamedProperty.ctime
- renamedProperty.mtime
- renamedProperty.propertyUniqueID
- */
+ /* Remove the element from its current position in the tree */
+ removeFromTree(This->ancestorStorage, This->rootPropertySetIndex,
+ foundPropertyIndex);
- /*
- * Save the new property into a new property spot
- */
- createDirEntry(This->ancestorStorage, &renamedProperty, &renamedPropertyIndex);
+ /* Change the name of the element */
+ strcpyW(currentProperty.name, pwcsNewName);
- /*
- * Find a spot in the property chain for our newly created property.
- */
- insertIntoTree(
- This->ancestorStorage,
- This->rootPropertySetIndex,
- renamedPropertyIndex);
-
- /*
- * At this point the renamed property has been inserted in the tree,
- * now, before Destroying the old property we must zero its dirProperty
- * otherwise the DestroyProperty below will zap it all and we do not want
- * this to happen.
- * Also, we fake that the old property is a storage so the DestroyProperty
- * will not do a SetSize(0) on the stream data.
- *
- * This means that we need to tweak the StgProperty if it is a stream or a
- * non empty storage.
- */
- StorageImpl_ReadProperty(This->ancestorStorage,
- foundPropertyIndex,
- ¤tProperty);
-
- currentProperty.dirProperty = PROPERTY_NULL;
- currentProperty.propertyType = PROPTYPE_STORAGE;
- StorageImpl_WriteProperty(
- This->ancestorStorage,
- foundPropertyIndex,
- ¤tProperty);
-
- /*
- * Invoke Destroy to get rid of the ole property and automatically redo
- * the linking of its previous and next members...
- */
- IStorage_DestroyElement(iface, pwcsOldName);
+ StorageImpl_WriteProperty(This->ancestorStorage, foundPropertyIndex,
+ ¤tProperty);
+ /* Insert the element in a new position in the tree */
+ insertIntoTree(This->ancestorStorage, This->rootPropertySetIndex,
+ foundPropertyIndex);
}
else
{
More information about the wine-cvs
mailing list