Module: wine Branch: master Commit: 96bd8c5a7d2f99d540a69fd86c21cb86f17eff61 URL: http://source.winehq.org/git/wine.git/?a=commit;h=96bd8c5a7d2f99d540a69fd86c...
Author: Huw Davies huw@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);