Mike McCormack : ole32: Store drop targets in a standard list.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 5 12:10:06 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: a8494aa9a904f58ecf1b67b9c51986f8f4cdbd0d
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=a8494aa9a904f58ecf1b67b9c51986f8f4cdbd0d

Author: Mike McCormack <mike at codeweavers.com>
Date:   Tue Apr 25 22:51:09 2006 +0900

ole32: Store drop targets in a standard list.

---

 dlls/ole32/ole2.c |  204 +++++++----------------------------------------------
 1 files changed, 28 insertions(+), 176 deletions(-)

diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index 1c61ff9..fc2926b 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -48,6 +48,7 @@ #include "wownt32.h"
 
 #include "wine/unicode.h"
 #include "compobj_private.h"
+#include "wine/list.h"
 
 #include "wine/debug.h"
 
@@ -61,9 +62,8 @@ WINE_DECLARE_DEBUG_CHANNEL(accel);
 typedef struct tagDropTargetNode
 {
   HWND          hwndTarget;
-  IDropTarget*    dropTarget;
-  struct tagDropTargetNode* prevDropTarget;
-  struct tagDropTargetNode* nextDropTarget;
+  IDropTarget*  dropTarget;
+  struct list   entry;
 } DropTargetNode;
 
 typedef struct tagTrackerWindowInfo
@@ -117,7 +117,7 @@ static const char OLEDD_DRAGTRACKERCLASS
 /*
  * This is the head of the Drop target container.
  */
-static DropTargetNode* targetListHead = NULL;
+static struct list targetListHead = LIST_INIT(targetListHead);
 
 /******************************************************************************
  * These are the prototypes of miscelaneous utility methods
@@ -148,12 +148,9 @@ extern void OLEClipbrd_Initialize(void);
  */
 static void            OLEDD_Initialize(void);
 static void            OLEDD_UnInitialize(void);
-static void            OLEDD_InsertDropTarget(
-			 DropTargetNode* nodeToAdd);
-static DropTargetNode* OLEDD_ExtractDropTarget(
-                         HWND hwndOfTarget);
 static DropTargetNode* OLEDD_FindDropTarget(
                          HWND hwndOfTarget);
+static void            OLEDD_FreeDropTarget(DropTargetNode*);
 static LRESULT WINAPI  OLEDD_DragTrackerWindowProc(
 			 HWND   hwnd,
 			 UINT   uMsg,
@@ -321,19 +318,17 @@ HRESULT WINAPI RegisterDragDrop(
     return E_OUTOFMEMORY;
 
   dropTargetInfo->hwndTarget     = hwnd;
-  dropTargetInfo->prevDropTarget = NULL;
-  dropTargetInfo->nextDropTarget = NULL;
 
   /*
    * Don't forget that this is an interface pointer, need to nail it down since
    * we keep a copy of it.
    */
+  IDropTarget_AddRef(pDropTarget);
   dropTargetInfo->dropTarget  = pDropTarget;
-  IDropTarget_AddRef(dropTargetInfo->dropTarget);
 
-  OLEDD_InsertDropTarget(dropTargetInfo);
+  list_add_tail(&targetListHead, &dropTargetInfo->entry);
 
-	return S_OK;
+  return S_OK;
 }
 
 /***********************************************************************
@@ -349,7 +344,7 @@ HRESULT WINAPI RevokeDragDrop(
   /*
    * First, check if the window is already registered.
    */
-  dropTargetInfo = OLEDD_ExtractDropTarget(hwnd);
+  dropTargetInfo = OLEDD_FindDropTarget(hwnd);
 
   /*
    * If it ain't in there, it's an error.
@@ -357,14 +352,9 @@ HRESULT WINAPI RevokeDragDrop(
   if (dropTargetInfo==NULL)
     return DRAGDROP_E_NOTREGISTERED;
 
-  /*
-   * If it's in there, clean-up it's used memory and
-   * references
-   */
-  IDropTarget_Release(dropTargetInfo->dropTarget);
-  HeapFree(GetProcessHeap(), 0, dropTargetInfo);
+  OLEDD_FreeDropTarget(dropTargetInfo);
 
-	return S_OK;
+  return S_OK;
 }
 
 /***********************************************************************
@@ -1841,148 +1831,33 @@ static void OLEDD_Initialize()
 }
 
 /***
- * OLEDD_UnInitialize()
+ * OLEDD_FreeDropTarget()
  *
- * Releases the OLE drag and drop data structures.
+ * Frees the drag and drop data structure
  */
-static void OLEDD_UnInitialize()
+static void OLEDD_FreeDropTarget(DropTargetNode *dropTargetInfo)
 {
-  /*
-   * Simply empty the list.
-   */
-  while (targetListHead!=NULL)
-  {
-    RevokeDragDrop(targetListHead->hwndTarget);
-  }
+  list_remove(&dropTargetInfo->entry);
+  IDropTarget_Release(dropTargetInfo->dropTarget);
+  HeapFree(GetProcessHeap(), 0, dropTargetInfo);
 }
 
 /***
- * OLEDD_InsertDropTarget()
+ * OLEDD_UnInitialize()
  *
- * Insert the target node in the tree.
+ * Releases the OLE drag and drop data structures.
  */
-static void OLEDD_InsertDropTarget(DropTargetNode* nodeToAdd)
+static void OLEDD_UnInitialize(void)
 {
-  DropTargetNode*  curNode;
-  DropTargetNode** parentNodeLink;
-
   /*
-   * Iterate the tree to find the insertion point.
-   */
-  curNode        = targetListHead;
-  parentNodeLink = &targetListHead;
-
-  while (curNode!=NULL)
-  {
-    if (nodeToAdd->hwndTarget<curNode->hwndTarget)
-    {
-      /*
-       * If the node we want to add has a smaller HWND, go left
-       */
-      parentNodeLink = &curNode->prevDropTarget;
-      curNode        =  curNode->prevDropTarget;
-    }
-    else if (nodeToAdd->hwndTarget>curNode->hwndTarget)
-    {
-      /*
-       * If the node we want to add has a larger HWND, go right
-       */
-      parentNodeLink = &curNode->nextDropTarget;
-      curNode        =  curNode->nextDropTarget;
-    }
-    else
-    {
-      /*
-       * The item was found in the list. It shouldn't have been there
-       */
-      assert(FALSE);
-      return;
-    }
-  }
-
-  /*
-   * If we get here, we have found a spot for our item. The parentNodeLink
-   * pointer points to the pointer that we have to modify.
-   * The curNode should be NULL. We just have to establish the link and Voila!
-   */
-  assert(curNode==NULL);
-  assert(parentNodeLink!=NULL);
-  assert(*parentNodeLink==NULL);
-
-  *parentNodeLink=nodeToAdd;
-}
-
-/***
- * OLEDD_ExtractDropTarget()
- *
- * Removes the target node from the tree.
- */
-static DropTargetNode* OLEDD_ExtractDropTarget(HWND hwndOfTarget)
-{
-  DropTargetNode*  curNode;
-  DropTargetNode** parentNodeLink;
-
-  /*
-   * Iterate the tree to find the insertion point.
+   * Simply empty the list.
    */
-  curNode        = targetListHead;
-  parentNodeLink = &targetListHead;
-
-  while (curNode!=NULL)
+  while (!list_empty(&targetListHead))
   {
-    if (hwndOfTarget<curNode->hwndTarget)
-    {
-      /*
-       * If the node we want to add has a smaller HWND, go left
-       */
-      parentNodeLink = &curNode->prevDropTarget;
-      curNode        =  curNode->prevDropTarget;
-    }
-    else if (hwndOfTarget>curNode->hwndTarget)
-    {
-      /*
-       * If the node we want to add has a larger HWND, go right
-       */
-      parentNodeLink = &curNode->nextDropTarget;
-      curNode        =  curNode->nextDropTarget;
-    }
-    else
-    {
-      /*
-       * The item was found in the list. Detach it from it's parent and
-       * re-insert it's kids in the tree.
-       */
-      assert(parentNodeLink!=NULL);
-      assert(*parentNodeLink==curNode);
-
-      /*
-       * We arbitrately re-attach the left sub-tree to the parent.
-       */
-      *parentNodeLink = curNode->prevDropTarget;
-
-      /*
-       * And we re-insert the right subtree
-       */
-      if (curNode->nextDropTarget!=NULL)
-      {
-	OLEDD_InsertDropTarget(curNode->nextDropTarget);
-      }
-
-      /*
-       * The node we found is still a valid node once we complete
-       * the unlinking of the kids.
-       */
-      curNode->nextDropTarget=NULL;
-      curNode->prevDropTarget=NULL;
-
-      return curNode;
-    }
+    DropTargetNode* curNode;
+    curNode = LIST_ENTRY(list_head(&targetListHead), DropTargetNode, entry);
+    OLEDD_FreeDropTarget(curNode);
   }
-
-  /*
-   * If we get here, the node is not in the tree
-   */
-  return NULL;
 }
 
 /***
@@ -1995,34 +1870,11 @@ static DropTargetNode* OLEDD_FindDropTar
   DropTargetNode*  curNode;
 
   /*
-   * Iterate the tree to find the HWND value.
+   * Iterate the list to find the HWND value.
    */
-  curNode        = targetListHead;
-
-  while (curNode!=NULL)
-  {
-    if (hwndOfTarget<curNode->hwndTarget)
-    {
-      /*
-       * If the node we want to add has a smaller HWND, go left
-       */
-      curNode =  curNode->prevDropTarget;
-    }
-    else if (hwndOfTarget>curNode->hwndTarget)
-    {
-      /*
-       * If the node we want to add has a larger HWND, go right
-       */
-      curNode =  curNode->nextDropTarget;
-    }
-    else
-    {
-      /*
-       * The item was found in the list.
-       */
+  LIST_FOR_EACH_ENTRY(curNode, &targetListHead, DropTargetNode, entry)
+    if (hwndOfTarget==curNode->hwndTarget)
       return curNode;
-    }
-  }
 
   /*
    * If we get here, the item is not in the list




More information about the wine-cvs mailing list