Aric Stewart : msctf: Implement ITfCompartmentEventSink.

Alexandre Julliard julliard at winehq.org
Mon Jun 22 09:04:19 CDT 2009


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Jun 22 12:04:41 2009 +0900

msctf: Implement ITfCompartmentEventSink.

---

 dlls/msctf/compartmentmgr.c |   34 +++++++++++++++++++++++++++++++---
 include/msctf.idl           |   11 +++++++++++
 2 files changed, 42 insertions(+), 3 deletions(-)

diff --git a/dlls/msctf/compartmentmgr.c b/dlls/msctf/compartmentmgr.c
index 7e11690..3afcfda 100644
--- a/dlls/msctf/compartmentmgr.c
+++ b/dlls/msctf/compartmentmgr.c
@@ -72,7 +72,7 @@ typedef struct tagCompartmentSink {
     struct list         entry;
     union {
         IUnknown            *pIUnknown;
-        /* ITfCompartmentEventSink *pITfCompartmentEventSink; */
+        ITfCompartmentEventSink *pITfCompartmentEventSink;
     } interfaces;
 } CompartmentSink;
 
@@ -493,6 +493,7 @@ static HRESULT WINAPI Compartment_SetValue(ITfCompartment *iface,
     TfClientId tid, const VARIANT *pvarValue)
 {
     Compartment *This = (Compartment *)iface;
+    struct list *cursor;
 
     TRACE("(%p) %i %p\n",This,tid,pvarValue);
 
@@ -517,6 +518,12 @@ static HRESULT WINAPI Compartment_SetValue(ITfCompartment *iface,
     else if (V_VT(pvarValue) == VT_UNKNOWN)
         IUnknown_AddRef(V_UNKNOWN(&This->variant));
 
+    LIST_FOR_EACH(cursor, &This->CompartmentEventSink)
+    {
+        CompartmentSink* sink = LIST_ENTRY(cursor,CompartmentSink,entry);
+        ITfCompartmentEventSink_OnChange(sink->interfaces.pITfCompartmentEventSink,&This->valueData->guid);
+    }
+
     return S_OK;
 }
 
@@ -570,6 +577,7 @@ static ULONG WINAPI Source_Release(ITfSource *iface)
 static WINAPI HRESULT CompartmentSource_AdviseSink(ITfSource *iface,
         REFIID riid, IUnknown *punk, DWORD *pdwCookie)
 {
+    CompartmentSink *cs;
     Compartment *This = impl_from_ITfSourceVtbl(iface);
 
     TRACE("(%p) %s %p %p\n",This,debugstr_guid(riid),punk,pdwCookie);
@@ -577,8 +585,28 @@ static WINAPI HRESULT CompartmentSource_AdviseSink(ITfSource *iface,
     if (!riid || !punk || !pdwCookie)
         return E_INVALIDARG;
 
-    FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
-    return E_NOTIMPL;
+    if (IsEqualIID(riid, &IID_ITfCompartmentEventSink))
+    {
+        cs = HeapAlloc(GetProcessHeap(),0,sizeof(CompartmentSink));
+        if (!cs)
+            return E_OUTOFMEMORY;
+        if (FAILED(IUnknown_QueryInterface(punk, riid, (LPVOID *)&cs->interfaces.pITfCompartmentEventSink)))
+        {
+            HeapFree(GetProcessHeap(),0,cs);
+            return CONNECT_E_CANNOTCONNECT;
+        }
+        list_add_head(&This->CompartmentEventSink,&cs->entry);
+        *pdwCookie = generate_Cookie(COOKIE_MAGIC_COMPARTMENTSINK , cs);
+    }
+    else
+    {
+        FIXME("(%p) Unhandled Sink: %s\n",This,debugstr_guid(riid));
+        return E_NOTIMPL;
+    }
+
+    TRACE("cookie %x\n",*pdwCookie);
+
+    return S_OK;
 }
 
 static WINAPI HRESULT CompartmentSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie)
diff --git a/include/msctf.idl b/include/msctf.idl
index 4db67f4..1058057 100644
--- a/include/msctf.idl
+++ b/include/msctf.idl
@@ -938,3 +938,14 @@ interface ITfCompartmentMgr : IUnknown
     HRESULT EnumCompartments(
         [out] IEnumGUID **ppEnum);
 };
+
+[
+  object,
+  uuid(743abd5f-f26d-48df-8cc5-238492419b64),
+  pointer_default(unique)
+]
+interface ITfCompartmentEventSink : IUnknown
+{
+    HRESULT OnChange(
+        [in] REFGUID rguid);
+}




More information about the wine-cvs mailing list