Jacek Caban : ole32: Added ISynchronizeHandle implementation.
Alexandre Julliard
julliard at winehq.org
Mon Aug 13 13:21:19 CDT 2012
Module: wine
Branch: master
Commit: c6793a2e27d4e6ce093b23592fb59553f2da26ff
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6793a2e27d4e6ce093b23592fb59553f2da26ff
Author: Jacek Caban <jacek at 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);
More information about the wine-cvs
mailing list