Module: wine Branch: master Commit: c6793a2e27d4e6ce093b23592fb59553f2da26ff URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6793a2e27d4e6ce093b23592f...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Aug 13 11:41:02 2012 +0200
ole32: Added ISynchronizeHandle implementation.
---
dlls/ole32/compobj.c | 63 ++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 51 insertions(+), 12 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index d0ae995..0055d15 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -464,7 +464,8 @@ static void COM_RevokeAllClasses(const struct apartment *apt) */
typedef struct ManualResetEvent { - ISynchronize ISynchronize_iface; + ISynchronize ISynchronize_iface; + ISynchronizeHandle ISynchronizeHandle_iface; LONG ref; HANDLE event; } MREImpl; @@ -477,22 +478,21 @@ static inline MREImpl *impl_from_ISynchronize(ISynchronize *iface) static HRESULT WINAPI ISynchronize_fnQueryInterface(ISynchronize *iface, REFIID riid, void **ppv) { MREImpl *This = impl_from_ISynchronize(iface); + TRACE("%p (%s, %p)\n", This, debugstr_guid(riid), ppv);
- *ppv = NULL; - if(IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_ISynchronize)) - *ppv = This; - else + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ISynchronize)) { + *ppv = &This->ISynchronize_iface; + }else if(IsEqualGUID(riid, &IID_ISynchronizeHandle)) { + *ppv = &This->ISynchronizeHandle_iface; + }else { ERR("Unknown interface %s requested.\n", debugstr_guid(riid)); - - if(*ppv) - { - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + *ppv = NULL; + return E_NOINTERFACE; }
- return E_NOINTERFACE; + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; }
static ULONG WINAPI ISynchronize_fnAddRef(ISynchronize *iface) @@ -552,6 +552,44 @@ static ISynchronizeVtbl vt_ISynchronize = { ISynchronize_fnReset };
+static inline MREImpl *impl_from_ISynchronizeHandle(ISynchronizeHandle *iface) +{ + return CONTAINING_RECORD(iface, MREImpl, ISynchronizeHandle_iface); +} + +static HRESULT WINAPI SynchronizeHandle_QueryInterface(ISynchronizeHandle *iface, REFIID riid, void **ppv) +{ + MREImpl *This = impl_from_ISynchronizeHandle(iface); + return ISynchronize_QueryInterface(&This->ISynchronize_iface, riid, ppv); +} + +static ULONG WINAPI SynchronizeHandle_AddRef(ISynchronizeHandle *iface) +{ + MREImpl *This = impl_from_ISynchronizeHandle(iface); + return ISynchronize_AddRef(&This->ISynchronize_iface); +} + +static ULONG WINAPI SynchronizeHandle_Release(ISynchronizeHandle *iface) +{ + MREImpl *This = impl_from_ISynchronizeHandle(iface); + return ISynchronize_Release(&This->ISynchronize_iface); +} + +static HRESULT WINAPI SynchronizeHandle_GetHandle(ISynchronizeHandle *iface, HANDLE *ph) +{ + MREImpl *This = impl_from_ISynchronizeHandle(iface); + + *ph = This->event; + return S_OK; +} + +static const ISynchronizeHandleVtbl SynchronizeHandleVtbl = { + SynchronizeHandle_QueryInterface, + SynchronizeHandle_AddRef, + SynchronizeHandle_Release, + SynchronizeHandle_GetHandle +}; + static HRESULT ManualResetEvent_Construct(IUnknown *punkouter, REFIID iid, void **ppv) { MREImpl *This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MREImpl)); @@ -562,6 +600,7 @@ static HRESULT ManualResetEvent_Construct(IUnknown *punkouter, REFIID iid, void
This->ref = 1; This->ISynchronize_iface.lpVtbl = &vt_ISynchronize; + This->ISynchronizeHandle_iface.lpVtbl = &SynchronizeHandleVtbl; This->event = CreateEventW(NULL, TRUE, FALSE, NULL);
hr = ISynchronize_QueryInterface(&This->ISynchronize_iface, iid, ppv);