From 5585648378d41f8e61e9785e30a5521892847453 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Mon, 2 Nov 2009 12:48:02 -0600 Subject: [PATCH 2/3] 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 { -- 1.6.3.3