Huw Davies : oledlg: Retrieve names from the OBJECTDESCRIPTOR
structure.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Oct 20 04:46:04 CDT 2006
Module: wine
Branch: master
Commit: 39131cf5450af8c88148197af359d43df9126e75
URL: http://source.winehq.org/git/wine.git/?a=commit;h=39131cf5450af8c88148197af359d43df9126e75
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Oct 19 11:40:54 2006 +0100
oledlg: Retrieve names from the OBJECTDESCRIPTOR structure.
---
dlls/oledlg/pastespl.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 86 insertions(+), 0 deletions(-)
diff --git a/dlls/oledlg/pastespl.c b/dlls/oledlg/pastespl.c
index d4cdadc..ff3a8b5 100644
--- a/dlls/oledlg/pastespl.c
+++ b/dlls/oledlg/pastespl.c
@@ -20,6 +20,8 @@
#define COM_NO_WINDOWS_H
#define COBJMACROS
+#define NONAMELESSSTRUCT
+#define NONAMELESSUNION
#include <stdarg.h>
@@ -43,6 +45,11 @@ typedef struct
{
OLEUIPASTESPECIALW *ps;
DWORD flags;
+ WCHAR *source_name;
+ WCHAR *link_source_name;
+ WCHAR *type_name;
+ WCHAR *link_type_name;
+ LPOLESTR app_name;
} ps_struct_t;
static const struct ps_flag
@@ -120,6 +127,73 @@ static inline WCHAR *strdupAtoW(const ch
return ret;
}
+static inline WCHAR *strdupW(const WCHAR *str)
+{
+ DWORD len;
+ WCHAR *ret;
+ if(!str) return NULL;
+ len = lstrlenW(str) + 1;
+ ret = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ memcpy(ret, str, len * sizeof(WCHAR));
+ return ret;
+}
+
+static void get_descriptors(HWND hdlg, ps_struct_t *ps_struct)
+{
+ FORMATETC fmtetc;
+ STGMEDIUM stg;
+
+ fmtetc.tymed = TYMED_HGLOBAL;
+ fmtetc.dwAspect = DVASPECT_CONTENT;
+ fmtetc.ptd = NULL;
+ fmtetc.lindex = -1;
+
+ fmtetc.cfFormat = cf_object_descriptor;
+ if(IDataObject_GetData(ps_struct->ps->lpSrcDataObj, &fmtetc, &stg) == S_OK)
+ {
+ OBJECTDESCRIPTOR *obj_desc = GlobalLock(stg.u.hGlobal);
+ if(obj_desc->dwSrcOfCopy)
+ ps_struct->source_name = strdupW((WCHAR*)((char*)obj_desc + obj_desc->dwSrcOfCopy));
+ if(obj_desc->dwFullUserTypeName)
+ ps_struct->type_name = strdupW((WCHAR*)((char*)obj_desc + obj_desc->dwFullUserTypeName));
+ OleRegGetUserType(&obj_desc->clsid, USERCLASSTYPE_APPNAME, &ps_struct->app_name);
+ /* Get the icon here. If dwDrawAspect & DVASCPECT_ICON call GetData(CF_METAFILEPICT), otherwise
+ native calls OleGetIconFromClass(obj_desc->clsid) */
+ GlobalUnlock(stg.u.hGlobal);
+ GlobalFree(stg.u.hGlobal);
+ }
+ else
+ {
+ /* Try to get some data using some of the other clipboard formats */
+ }
+
+ fmtetc.cfFormat = cf_link_src_descriptor;
+ if(IDataObject_GetData(ps_struct->ps->lpSrcDataObj, &fmtetc, &stg) == S_OK)
+ {
+ OBJECTDESCRIPTOR *obj_desc = GlobalLock(stg.u.hGlobal);
+ if(obj_desc->dwSrcOfCopy)
+ ps_struct->link_source_name = strdupW((WCHAR*)((char*)obj_desc + obj_desc->dwSrcOfCopy));
+ if(obj_desc->dwFullUserTypeName)
+ ps_struct->link_type_name = strdupW((WCHAR*)((char*)obj_desc + obj_desc->dwFullUserTypeName));
+ GlobalUnlock(stg.u.hGlobal);
+ GlobalFree(stg.u.hGlobal);
+ }
+
+ if(ps_struct->source_name == NULL && ps_struct->link_source_name == NULL)
+ {
+ WCHAR buf[200];
+ LoadStringW(OLEDLG_hInstance, IDS_PS_UNKNOWN_SRC, buf, sizeof(buf)/sizeof(WCHAR));
+ ps_struct->source_name = strdupW(buf);
+ }
+
+ if(ps_struct->type_name == NULL && ps_struct->link_type_name == NULL)
+ {
+ WCHAR buf[200];
+ LoadStringW(OLEDLG_hInstance, IDS_PS_UNKNOWN_TYPE, buf, sizeof(buf)/sizeof(WCHAR));
+ ps_struct->type_name = strdupW(buf);
+ }
+}
+
static BOOL add_entry_to_lb(HWND hdlg, UINT id, OLEUIPASTEENTRYW *pe)
{
HWND hwnd = GetDlgItem(hdlg, id);
@@ -397,6 +471,11 @@ static void update_structure(HWND hdlg,
static void free_structure(ps_struct_t *ps_struct)
{
+ HeapFree(GetProcessHeap(), 0, ps_struct->type_name);
+ HeapFree(GetProcessHeap(), 0, ps_struct->source_name);
+ HeapFree(GetProcessHeap(), 0, ps_struct->link_type_name);
+ HeapFree(GetProcessHeap(), 0, ps_struct->link_source_name);
+ CoTaskMemFree(ps_struct->app_name);
HeapFree(GetProcessHeap(), 0, ps_struct);
}
@@ -429,6 +508,11 @@ static INT_PTR CALLBACK ps_dlg_proc(HWND
{
ps_struct = HeapAlloc(GetProcessHeap(), 0, sizeof(*ps_struct));
ps_struct->ps = (OLEUIPASTESPECIALW*)lp;
+ ps_struct->type_name = NULL;
+ ps_struct->source_name = NULL;
+ ps_struct->link_type_name = NULL;
+ ps_struct->link_source_name = NULL;
+ ps_struct->app_name = NULL;
ps_struct->flags = ps_struct->ps->dwFlags;
SetPropW(hdlg, prop_name, ps_struct);
@@ -442,6 +526,8 @@ static INT_PTR CALLBACK ps_dlg_proc(HWND
if(ps_struct->ps->lpszCaption)
SetWindowTextW(hdlg, ps_struct->ps->lpszCaption);
+ get_descriptors(hdlg, ps_struct);
+
init_lists(hdlg, ps_struct);
selection_change(hdlg, ps_struct);
More information about the wine-cvs
mailing list