Huw Davies : ole32: Add a helper function to set and release the source IDataObject.

Alexandre Julliard julliard at winehq.org
Thu Apr 16 14:34:50 CDT 2009


Module: wine
Branch: master
Commit: 6ce9922f3d98c15b827a8179e3d132f10aff7218
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6ce9922f3d98c15b827a8179e3d132f10aff7218

Author: Huw Davies <huw at codeweavers.com>
Date:   Thu Apr 16 12:08:11 2009 +0100

ole32: Add a helper function to set and release the source IDataObject.

---

 dlls/ole32/clipboard.c |  244 +++++++++++++++++++++++------------------------
 1 files changed, 119 insertions(+), 125 deletions(-)

diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c
index 2c39e45..0b67476 100644
--- a/dlls/ole32/clipboard.c
+++ b/dlls/ole32/clipboard.c
@@ -753,68 +753,6 @@ static HRESULT render_format(IDataObject *data, LPFORMATETC fmt)
     return hr;
 }
 
-/***********************************************************************
- *                   clipbrd_wndproc
- */
-static LRESULT CALLBACK clipbrd_wndproc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
-{
-    ole_clipbrd *clipbrd;
-
-    get_ole_clipbrd(&clipbrd);
-
-    switch (message)
-    {
-    case WM_RENDERFORMAT:
-    {
-        UINT cf = wparam;
-        ole_priv_data_entry *entry;
-
-        TRACE("(): WM_RENDERFORMAT(cfFormat=%x)\n", cf);
-        entry = find_format_in_list(clipbrd->cached_enum->entries, clipbrd->cached_enum->count, cf);
-
-        if(entry)
-            render_format(clipbrd->pIDataObjectSrc, &entry->fmtetc);
-
-        break;
-    }
-
-    case WM_RENDERALLFORMATS:
-    {
-        DWORD i;
-        ole_priv_data_entry *entries = clipbrd->cached_enum->entries;
-
-        TRACE("(): WM_RENDERALLFORMATS\n");
-
-        for(i = 0; i < clipbrd->cached_enum->count; i++)
-        {
-            if(entries[i].first_use)
-                render_format(clipbrd->pIDataObjectSrc, &entries[i].fmtetc);
-        }
-        break;
-    }
-
-    case WM_DESTROYCLIPBOARD:
-    {
-        TRACE("(): WM_DESTROYCLIPBOARD\n");
-
-        if ( clipbrd->pIDataObjectSrc )
-        {
-            IDataObject_Release(clipbrd->pIDataObjectSrc);
-            clipbrd->pIDataObjectSrc = NULL;
-            HeapFree(GetProcessHeap(), 0, clipbrd->cached_enum);
-            clipbrd->cached_enum = NULL;
-        }
-        break;
-    }
-
-    default:
-        return DefWindowProcW(hwnd, message, wparam, lparam);
-    }
-
-    return 0;
-}
-
-
 /*---------------------------------------------------------------------*
  *  Implementation of the internal IDataObject interface exposed by
  *  the OLE clipboard.
@@ -1249,37 +1187,6 @@ void OLEClipbrd_UnInitialize(void)
   }
 }
 
-/***********************************************************************
- * OLEClipbrd_CreateWindow()
- * Create the clipboard window
- */
-static HWND OLEClipbrd_CreateWindow(void)
-{
-    WNDCLASSEXW class;
-    static const WCHAR ole32W[] = {'o','l','e','3','2',0};
-    static const WCHAR title[] = {'C','l','i','p','b','o','a','r','d','W','i','n','d','o','w',0};
-    HINSTANCE hinst = GetModuleHandleW(ole32W);
-
-    class.cbSize         = sizeof(class);
-    class.style          = 0;
-    class.lpfnWndProc    = clipbrd_wndproc;
-    class.cbClsExtra     = 0;
-    class.cbWndExtra     = 0;
-    class.hInstance      = hinst;
-    class.hIcon          = 0;
-    class.hCursor        = 0;
-    class.hbrBackground  = 0;
-    class.lpszMenuName   = NULL;
-    class.lpszClassName  = clipbrd_wndclass;
-    class.hIconSm        = NULL;
-
-    RegisterClassExW(&class);
-
-    return CreateWindowW(clipbrd_wndclass, title, WS_POPUP | WS_CLIPSIBLINGS | WS_OVERLAPPED,
-                         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
-                         NULL, NULL, hinst, 0);
-}
-
 /*********************************************************************
  *          set_clipboard_formats
  *
@@ -1372,6 +1279,119 @@ static HRESULT set_clipboard_formats(ole_clipbrd *clipbrd, IDataObject *data)
     return S_OK;
 }
 
+/***********************************************************************
+ *                   set_src_dataobject
+ *
+ * Clears and sets the clipboard's src IDataObject.
+ */
+static HRESULT set_src_dataobject(ole_clipbrd *clipbrd, IDataObject *data)
+{
+    HRESULT hr = S_OK;
+
+    if(clipbrd->pIDataObjectSrc)
+    {
+        IDataObject_Release(clipbrd->pIDataObjectSrc);
+        clipbrd->pIDataObjectSrc = NULL;
+        HeapFree(GetProcessHeap(), 0, clipbrd->cached_enum);
+        clipbrd->cached_enum = NULL;
+    }
+
+    if(data)
+    {
+        IDataObject_AddRef(data);
+        clipbrd->pIDataObjectSrc = data;
+        hr = set_clipboard_formats(clipbrd, data);
+    }
+    return hr;
+}
+
+/***********************************************************************
+ *                   clipbrd_wndproc
+ */
+static LRESULT CALLBACK clipbrd_wndproc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
+{
+    ole_clipbrd *clipbrd;
+
+    get_ole_clipbrd(&clipbrd);
+
+    switch (message)
+    {
+    case WM_RENDERFORMAT:
+    {
+        UINT cf = wparam;
+        ole_priv_data_entry *entry;
+
+        TRACE("(): WM_RENDERFORMAT(cfFormat=%x)\n", cf);
+        entry = find_format_in_list(clipbrd->cached_enum->entries, clipbrd->cached_enum->count, cf);
+
+        if(entry)
+            render_format(clipbrd->pIDataObjectSrc, &entry->fmtetc);
+
+        break;
+    }
+
+    case WM_RENDERALLFORMATS:
+    {
+        DWORD i;
+        ole_priv_data_entry *entries = clipbrd->cached_enum->entries;
+
+        TRACE("(): WM_RENDERALLFORMATS\n");
+
+        for(i = 0; i < clipbrd->cached_enum->count; i++)
+        {
+            if(entries[i].first_use)
+                render_format(clipbrd->pIDataObjectSrc, &entries[i].fmtetc);
+        }
+        break;
+    }
+
+    case WM_DESTROYCLIPBOARD:
+    {
+        TRACE("(): WM_DESTROYCLIPBOARD\n");
+
+        set_src_dataobject(clipbrd, NULL);
+        break;
+    }
+
+    default:
+        return DefWindowProcW(hwnd, message, wparam, lparam);
+    }
+
+    return 0;
+}
+
+
+/***********************************************************************
+ * OLEClipbrd_CreateWindow()
+ * Create the clipboard window
+ */
+static HWND OLEClipbrd_CreateWindow(void)
+{
+    WNDCLASSEXW class;
+    static const WCHAR ole32W[] = {'o','l','e','3','2',0};
+    static const WCHAR title[] = {'C','l','i','p','b','o','a','r','d','W','i','n','d','o','w',0};
+    HINSTANCE hinst = GetModuleHandleW(ole32W);
+
+    class.cbSize         = sizeof(class);
+    class.style          = 0;
+    class.lpfnWndProc    = clipbrd_wndproc;
+    class.cbClsExtra     = 0;
+    class.cbWndExtra     = 0;
+    class.hInstance      = hinst;
+    class.hIcon          = 0;
+    class.hCursor        = 0;
+    class.hbrBackground  = 0;
+    class.lpszMenuName   = NULL;
+    class.lpszClassName  = clipbrd_wndclass;
+    class.hIconSm        = NULL;
+
+    RegisterClassExW(&class);
+
+    return CreateWindowW(clipbrd_wndclass, title, WS_POPUP | WS_CLIPSIBLINGS | WS_OVERLAPPED,
+                         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
+                         NULL, NULL, hinst, 0);
+}
+
 /*********************************************************************
  *          set_dataobject_format
  *
@@ -1416,12 +1436,12 @@ static HRESULT set_dataobject_format(HWND hwnd)
  *    CLIPBRD_E_CANT_SET    SetClipboard failed
  */
 
-HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj)
+HRESULT WINAPI OleSetClipboard(IDataObject* data)
 {
   HRESULT hr;
   ole_clipbrd *clipbrd;
 
-  TRACE("(%p)\n", pDataObj);
+  TRACE("(%p)\n", data);
 
   if(FAILED(hr = get_ole_clipbrd(&clipbrd))) return hr;
 
@@ -1444,25 +1464,8 @@ HRESULT WINAPI OleSetClipboard(IDataObject* pDataObj)
     goto end;
   }
 
-  /*
-   * If we are already holding on to an IDataObject first release that.
-   */
-  if ( clipbrd->pIDataObjectSrc )
-  {
-    IDataObject_Release(clipbrd->pIDataObjectSrc);
-    clipbrd->pIDataObjectSrc = NULL;
-    HeapFree(GetProcessHeap(), 0, clipbrd->cached_enum);
-    clipbrd->cached_enum = NULL;
-  }
-
-  /* A NULL value indicates that the clipboard should be emptied. */
-  clipbrd->pIDataObjectSrc = pDataObj;
-  if ( pDataObj )
-  {
-    IDataObject_AddRef(clipbrd->pIDataObjectSrc);
-    hr = set_clipboard_formats(clipbrd, pDataObj);
-    if(FAILED(hr)) goto end;
-  }
+  hr = set_src_dataobject(clipbrd, data);
+  if(FAILED(hr)) goto end;
 
   hr = set_dataobject_format(clipbrd->hWndClipboard);
 
@@ -1472,13 +1475,7 @@ end:
 
   if ( FAILED(hr) )
   {
-    if (clipbrd->pIDataObjectSrc)
-    {
-      IDataObject_Release(clipbrd->pIDataObjectSrc);
-      clipbrd->pIDataObjectSrc = NULL;
-      HeapFree(GetProcessHeap(), 0, clipbrd->cached_enum);
-      clipbrd->cached_enum = NULL;
-    }
+    set_src_dataobject(clipbrd, NULL);
   }
 
   return hr;
@@ -1561,10 +1558,7 @@ HRESULT WINAPI OleFlushClipboard(void)
 
   hr = set_dataobject_format(NULL);
 
-  IDataObject_Release(clipbrd->pIDataObjectSrc);
-  clipbrd->pIDataObjectSrc = NULL;
-  HeapFree(GetProcessHeap(), 0, clipbrd->cached_enum);
-  clipbrd->cached_enum = NULL;
+  set_src_dataobject(clipbrd, NULL);
 
 end:
 




More information about the wine-cvs mailing list