Rob Shearman : ole32: Implement CoGetObjectContext.

Alexandre Julliard julliard at winehq.org
Fri Nov 2 08:10:16 CDT 2007


Module: wine
Branch: master
Commit: 23dc7b6a67b3472d8ad30d9420c28fe7e34716ae
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=23dc7b6a67b3472d8ad30d9420c28fe7e34716ae

Author: Rob Shearman <rob at codeweavers.com>
Date:   Thu Nov  1 13:27:20 2007 +0000

ole32: Implement CoGetObjectContext.

---

 dlls/ole32/compobj.c  |  137 +++++++++++++++++++++++++++++++++++++++++++++++++
 dlls/ole32/ole32.spec |    1 +
 2 files changed, 138 insertions(+), 0 deletions(-)

diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index 95dff3b..4bd8e81 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -3565,6 +3565,143 @@ HRESULT WINAPI CoRegisterChannelHook(REFGUID guidExtension, IChannelHook *pChann
     return RPC_RegisterChannelHook(guidExtension, pChannelHook);
 }
 
+typedef struct Context
+{
+    const IComThreadingInfoVtbl *lpVtbl;
+    LONG refs;
+    APTTYPE apttype;
+} Context;
+
+static HRESULT WINAPI Context_QueryInterface(IComThreadingInfo *iface, REFIID riid, LPVOID *ppv)
+{
+    *ppv = NULL;
+
+    if (IsEqualIID(riid, &IID_IComThreadingInfo) ||
+        IsEqualIID(riid, &IID_IUnknown))
+    {
+        *ppv = iface;
+        IUnknown_AddRef(iface);
+        return S_OK;
+    }
+
+    FIXME("interface not implemented %s\n", debugstr_guid(riid));
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Context_AddRef(IComThreadingInfo *iface)
+{
+    Context *This = (Context *)iface;
+    return InterlockedIncrement(&This->refs);
+}
+
+static ULONG WINAPI Context_Release(IComThreadingInfo *iface)
+{
+    Context *This = (Context *)iface;
+    ULONG refs = InterlockedDecrement(&This->refs);
+    if (!refs)
+        HeapFree(GetProcessHeap(), 0, This);
+    return refs;
+}
+
+static HRESULT WINAPI Context_GetCurrentApartmentType(IComThreadingInfo *iface, APTTYPE *apttype)
+{
+    Context *This = (Context *)iface;
+
+    TRACE("(%p)\n", apttype);
+
+    *apttype = This->apttype;
+    return S_OK;
+}
+
+static HRESULT WINAPI Context_GetCurrentThreadType(IComThreadingInfo *iface, THDTYPE *thdtype)
+{
+    Context *This = (Context *)iface;
+
+    TRACE("(%p)\n", thdtype);
+
+    switch (This->apttype)
+    {
+    case APTTYPE_STA:
+    case APTTYPE_MAINSTA:
+        *thdtype = THDTYPE_PROCESSMESSAGES;
+        break;
+    default:
+        *thdtype = THDTYPE_BLOCKMESSAGES;
+        break;
+    }
+    return S_OK;
+}
+
+static HRESULT WINAPI Context_GetCurrentLogicalThreadId(IComThreadingInfo *iface, GUID *logical_thread_id)
+{
+    FIXME("(%p): stub\n", logical_thread_id);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Context_SetCurrentLogicalThreadId(IComThreadingInfo *iface, REFGUID logical_thread_id)
+{
+    FIXME("(%s): stub\n", debugstr_guid(logical_thread_id));
+    return E_NOTIMPL;
+}
+
+static const IComThreadingInfoVtbl Context_Threading_Vtbl =
+{
+    Context_QueryInterface,
+    Context_AddRef,
+    Context_Release,
+    Context_GetCurrentApartmentType,
+    Context_GetCurrentThreadType,
+    Context_GetCurrentLogicalThreadId,
+    Context_SetCurrentLogicalThreadId
+};
+
+/***********************************************************************
+ *           CoGetObjectContext [OLE32.@]
+ *
+ * Retrieves an object associated with the current context (i.e. apartment).
+ *
+ * PARAMS
+ *  riid [I] ID of the interface of the object to retrieve.
+ *  ppv  [O] Address where object will be stored on return.
+ *
+ * RETURNS
+ *  Success: S_OK.
+ *  Failure: HRESULT code.
+ */
+HRESULT WINAPI CoGetObjectContext(REFIID riid, void **ppv)
+{
+    APARTMENT *apt = COM_CurrentApt();
+    Context *context;
+    HRESULT hr;
+
+    TRACE("(%s, %p)\n", debugstr_guid(riid), ppv);
+
+    *ppv = NULL;
+    if (!apt)
+    {
+        ERR("apartment not initialised\n");
+        return CO_E_NOTINITIALIZED;
+    }
+
+    context = HeapAlloc(GetProcessHeap(), 0, sizeof(*context));
+    if (!context)
+        return E_OUTOFMEMORY;
+
+    context->lpVtbl = &Context_Threading_Vtbl;
+    context->refs = 1;
+    if (apt->multi_threaded)
+        context->apttype = APTTYPE_MTA;
+    else if (apt->main)
+        context->apttype = APTTYPE_MAINSTA;
+    else
+        context->apttype = APTTYPE_STA;
+
+    hr = IUnknown_QueryInterface((IUnknown *)&context->lpVtbl, riid, ppv);
+    IUnknown_Release((IUnknown *)&context->lpVtbl);
+
+    return hr;
+}
+
 /***********************************************************************
  *		DllMain (OLE32.@)
  */
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index 0b62995..1643484 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -32,6 +32,7 @@
 @ stdcall CoGetMalloc(long ptr)
 @ stdcall CoGetMarshalSizeMax(ptr ptr ptr long ptr long)
 @ stdcall CoGetObject(wstr ptr ptr ptr)
+@ stdcall CoGetObjectContext(ptr ptr)
 @ stdcall CoGetPSClsid(ptr ptr)
 @ stdcall CoGetStandardMarshal(ptr ptr long ptr long ptr)
 @ stdcall CoGetState(ptr)




More information about the wine-cvs mailing list