Huw Davies : ole32: Add a helper function to retrieve the implementation ptr.
Alexandre Julliard
julliard at winehq.org
Mon Mar 23 12:34:56 CDT 2009
Module: wine
Branch: master
Commit: 96bd8c5a7d2f99d540a69fd86c21cb86f17eff61
URL: http://source.winehq.org/git/wine.git/?a=commit;h=96bd8c5a7d2f99d540a69fd86c21cb86f17eff61
Author: Huw Davies <huw at codeweavers.com>
Date: Tue Mar 17 12:44:20 2009 +0000
ole32: Add a helper function to retrieve the implementation ptr.
---
dlls/ole32/clipboard.c | 94 +++++++++++++++---------------------------------
1 files changed, 29 insertions(+), 65 deletions(-)
diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c
index a1fed82..b386b1e 100644
--- a/dlls/ole32/clipboard.c
+++ b/dlls/ole32/clipboard.c
@@ -86,35 +86,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
/****************************************************************************
- * OLEClipbrd
- * DO NOT add any members before the VTables declaration!
+ * ole_clipbrd
*/
-struct OLEClipbrd
+struct ole_clipbrd
{
- /*
- * List all interface VTables here
- */
- const IDataObjectVtbl* lpvtbl1; /* IDataObject VTable */
-
- /*
- * The hidden OLE clipboard window. This window is used as the bridge between the
- * the OLE and windows clipboard API. (Windows creates one such window per process)
- */
- HWND hWndClipboard;
+ const IDataObjectVtbl* lpvtbl; /* Exposed IDataObject vtable */
- /*
- * Pointer to the source data object (via OleSetClipboard)
- */
- IDataObject* pIDataObjectSrc;
+ LONG ref;
- /*
- * Reference count of this object
- */
- LONG ref;
+ HWND hWndClipboard; /* Hidden clipboard window */
+ IDataObject* pIDataObjectSrc; /* Source object passed to OleSetClipboard */
};
-typedef struct OLEClipbrd OLEClipbrd;
+typedef struct ole_clipbrd ole_clipbrd;
+static inline ole_clipbrd *impl_from_IDataObject(IDataObject *iface)
+{
+ return (ole_clipbrd*)((char*)iface - FIELD_OFFSET(ole_clipbrd, lpvtbl));
+}
/****************************************************************************
* IEnumFORMATETC implementation
@@ -151,9 +140,9 @@ typedef struct PresentationDataHeader
} PresentationDataHeader;
/*
- * The one and only OLEClipbrd object which is created by OLEClipbrd_Initialize()
+ * The one and only ole_clipbrd object which is created by OLEClipbrd_Initialize()
*/
-static OLEClipbrd* theOleClipboard;
+static ole_clipbrd* theOleClipboard;
/*
@@ -161,8 +150,8 @@ static OLEClipbrd* theOleClipboard;
*/
void OLEClipbrd_Initialize(void);
void OLEClipbrd_UnInitialize(void);
-static OLEClipbrd* OLEClipbrd_Construct(void);
-static void OLEClipbrd_Destroy(OLEClipbrd* ptrToDestroy);
+static ole_clipbrd* OLEClipbrd_Construct(void);
+static void OLEClipbrd_Destroy(ole_clipbrd* ptrToDestroy);
static HWND OLEClipbrd_CreateWindow(void);
static void OLEClipbrd_DestroyWindow(HWND hwnd);
static LRESULT CALLBACK OLEClipbrd_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
@@ -467,7 +456,7 @@ HRESULT WINAPI OleGetClipboard(IDataObject** ppDataObj)
return E_OUTOFMEMORY;
/* Return a reference counted IDataObject */
- hr = IDataObject_QueryInterface( (IDataObject*)&(theOleClipboard->lpvtbl1),
+ hr = IDataObject_QueryInterface( (IDataObject*)&(theOleClipboard->lpvtbl),
&IID_IDataObject, (void**)ppDataObj);
return hr;
}
@@ -635,14 +624,14 @@ void OLEClipbrd_UnInitialize(void)
/*********************************************************
* Construct the OLEClipbrd class.
*/
-static OLEClipbrd* OLEClipbrd_Construct(void)
+static ole_clipbrd* OLEClipbrd_Construct(void)
{
- OLEClipbrd* This;
+ ole_clipbrd* This;
This = HeapAlloc( GetProcessHeap(), 0, sizeof(*This) );
if (!This) return NULL;
- This->lpvtbl1 = &OLEClipbrd_IDataObject_VTable;
+ This->lpvtbl = &OLEClipbrd_IDataObject_VTable;
This->ref = 1;
This->hWndClipboard = NULL;
@@ -652,7 +641,7 @@ static OLEClipbrd* OLEClipbrd_Construct(void)
return This;
}
-static void OLEClipbrd_Destroy(OLEClipbrd* This)
+static void OLEClipbrd_Destroy(ole_clipbrd* This)
{
TRACE("()\n");
@@ -666,7 +655,6 @@ static void OLEClipbrd_Destroy(OLEClipbrd* This)
HeapFree(GetProcessHeap(), 0, This);
}
-
/***********************************************************************
* OLEClipbrd_CreateWindow()
* Create the clipboard window
@@ -773,7 +761,7 @@ static LRESULT CALLBACK OLEClipbrd_WndProc
* Render the clipboard data.
* (We must have a source data object or we wouldn't be in this WndProc)
*/
- OLEClipbrd_RenderFormat( (IDataObject*)&(theOleClipboard->lpvtbl1), &rgelt );
+ OLEClipbrd_RenderFormat( (IDataObject*)&(theOleClipboard->lpvtbl), &rgelt );
break;
}
@@ -799,7 +787,7 @@ static LRESULT CALLBACK OLEClipbrd_WndProc
* Render all HGLOBAL formats supported by the source into
* the windows clipboard.
*/
- if ( FAILED( IDataObject_EnumFormatEtc( (IDataObject*)&(theOleClipboard->lpvtbl1),
+ if ( FAILED( IDataObject_EnumFormatEtc( (IDataObject*)&(theOleClipboard->lpvtbl),
DATADIR_GET, &penumFormatetc) ) )
{
WARN("(): WM_RENDERALLFORMATS failed to retrieve EnumFormatEtc!\n");
@@ -813,7 +801,7 @@ static LRESULT CALLBACK OLEClipbrd_WndProc
/*
* Render the clipboard data.
*/
- if ( FAILED(OLEClipbrd_RenderFormat( (IDataObject*)&(theOleClipboard->lpvtbl1), &rgelt )) )
+ if ( FAILED(OLEClipbrd_RenderFormat( (IDataObject*)&(theOleClipboard->lpvtbl), &rgelt )) )
continue;
TRACE("(): WM_RENDERALLFORMATS(cfFormat=%d)\n", rgelt.cfFormat);
@@ -1064,10 +1052,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_QueryInterface(
REFIID riid,
void** ppvObject)
{
- /*
- * Declare "This" pointer
- */
- OLEClipbrd *This = (OLEClipbrd *)iface;
+ ole_clipbrd *This = impl_from_IDataObject(iface);
TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObject);
/*
@@ -1090,7 +1075,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_QueryInterface(
}
else if (memcmp(&IID_IDataObject, riid, sizeof(IID_IDataObject)) == 0)
{
- *ppvObject = &This->lpvtbl1;
+ *ppvObject = &This->lpvtbl;
}
else /* We only support IUnknown and IDataObject */
{
@@ -1115,15 +1100,11 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_QueryInterface(
static ULONG WINAPI OLEClipbrd_IDataObject_AddRef(
IDataObject* iface)
{
- /*
- * Declare "This" pointer
- */
- OLEClipbrd *This = (OLEClipbrd *)iface;
+ ole_clipbrd *This = impl_from_IDataObject(iface);
TRACE("(%p)->(count=%u)\n",This, This->ref);
return InterlockedIncrement(&This->ref);
-
}
/************************************************************************
@@ -1134,22 +1115,13 @@ static ULONG WINAPI OLEClipbrd_IDataObject_AddRef(
static ULONG WINAPI OLEClipbrd_IDataObject_Release(
IDataObject* iface)
{
- /*
- * Declare "This" pointer
- */
- OLEClipbrd *This = (OLEClipbrd *)iface;
+ ole_clipbrd *This = impl_from_IDataObject(iface);
ULONG ref;
TRACE("(%p)->(count=%u)\n",This, This->ref);
- /*
- * Decrease the reference count on this object.
- */
ref = InterlockedDecrement(&This->ref);
- /*
- * If the reference count goes down to 0, perform suicide.
- */
if (ref == 0)
{
OLEClipbrd_Destroy(This);
@@ -1176,11 +1148,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_GetData(
BOOL bClipboardOpen = FALSE;
HRESULT hr = S_OK;
LPVOID src;
-
- /*
- * Declare "This" pointer
- */
- OLEClipbrd *This = (OLEClipbrd *)iface;
+ ole_clipbrd *This = impl_from_IDataObject(iface);
TRACE("(%p,%p,%p)\n", iface, pformatetcIn, pmedium);
@@ -1346,11 +1314,7 @@ static HRESULT WINAPI OLEClipbrd_IDataObject_EnumFormatEtc(
int cfmt, i;
UINT format;
BOOL bClipboardOpen;
-
- /*
- * Declare "This" pointer
- */
- OLEClipbrd *This = (OLEClipbrd *)iface;
+ ole_clipbrd *This = impl_from_IDataObject(iface);
TRACE("(%p, %x, %p)\n", iface, dwDirection, ppenumFormatEtc);
More information about the wine-cvs
mailing list