Aric Stewart : msctf: Add code to track created ITfDocumentMgrs.

Alexandre Julliard julliard at winehq.org
Fri Jul 10 08:52:07 CDT 2009


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Fri Jul 10 07:36:56 2009 -0500

msctf: Add code to track created ITfDocumentMgrs.

---

 dlls/msctf/documentmgr.c    |    5 ++++
 dlls/msctf/msctf_internal.h |    1 +
 dlls/msctf/threadmgr.c      |   52 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 57 insertions(+), 1 deletions(-)

diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c
index 66f0f50..0a25b3d 100644
--- a/dlls/msctf/documentmgr.c
+++ b/dlls/msctf/documentmgr.c
@@ -69,7 +69,12 @@ static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
 
 static void DocumentMgr_Destructor(DocumentMgr *This)
 {
+    ITfThreadMgr *tm;
     TRACE("destroying %p\n", This);
+
+    TF_GetThreadMgr(&tm);
+    ThreadMgr_OnDocumentMgrDestruction(tm, (ITfDocumentMgr*)This);
+
     if (This->contextStack[0])
         ITfContext_Release(This->contextStack[0]);
     if (This->contextStack[1])
diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h
index 928b046..3bb0baa 100644
--- a/dlls/msctf/msctf_internal.h
+++ b/dlls/msctf/msctf_internal.h
@@ -43,6 +43,7 @@ extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This);
 
 extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager);
 extern HRESULT Context_Uninitialize(ITfContext *cxt);
+extern void    ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr);
 extern HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp);
 
 /* cookie function */
diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c
index b109107..da2c74a 100644
--- a/dlls/msctf/threadmgr.c
+++ b/dlls/msctf/threadmgr.c
@@ -65,6 +65,12 @@ typedef struct tagPreservedKey
     TfClientId      tid;
 } PreservedKey;
 
+typedef struct tagDocumentMgrs
+{
+    struct list     entry;
+    ITfDocumentMgr  *docmgr;
+} DocumentMgrEntry;
+
 typedef struct tagACLMulti {
     const ITfThreadMgrVtbl *ThreadMgrVtbl;
     const ITfSourceVtbl *SourceVtbl;
@@ -90,6 +96,7 @@ typedef struct tagACLMulti {
     CLSID forgroundTextService;
 
     struct list CurrentPreservedKeys;
+    struct list CreatedDocumentMgrs;
 
     /* kept as separate lists to reduce unnecessary iterations */
     struct list     ActiveLanguageProfileNotifySink;
@@ -186,6 +193,14 @@ static void ThreadMgr_Destructor(ThreadMgr *This)
         HeapFree(GetProcessHeap(),0,key);
     }
 
+    LIST_FOR_EACH_SAFE(cursor, cursor2, &This->CreatedDocumentMgrs)
+    {
+        DocumentMgrEntry *mgr = LIST_ENTRY(cursor,DocumentMgrEntry,entry);
+        list_remove(cursor);
+        FIXME("Left Over ITfDocumentMgr.  Should we do something with it?\n");
+        HeapFree(GetProcessHeap(),0,mgr);
+    }
+
     CompartmentMgr_Destructor(This->CompartmentMgr);
 
     HeapFree(GetProcessHeap(),0,This);
@@ -303,8 +318,25 @@ static HRESULT WINAPI ThreadMgr_CreateDocumentMgr( ITfThreadMgr* iface, ITfDocum
 **ppdim)
 {
     ThreadMgr *This = (ThreadMgr *)iface;
+    DocumentMgrEntry *mgrentry;
+    HRESULT hr;
+
     TRACE("(%p)\n",iface);
-    return DocumentMgr_Constructor((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, ppdim);
+    mgrentry = HeapAlloc(GetProcessHeap(),0,sizeof(DocumentMgrEntry));
+    if (mgrentry == NULL)
+        return E_OUTOFMEMORY;
+
+    hr = DocumentMgr_Constructor((ITfThreadMgrEventSink*)&This->ThreadMgrEventSinkVtbl, ppdim);
+
+    if (SUCCEEDED(hr))
+    {
+        mgrentry->docmgr = *ppdim;
+        list_add_head(&This->CreatedDocumentMgrs,&mgrentry->entry);
+    }
+    else
+        HeapFree(GetProcessHeap(),0,mgrentry);
+
+    return hr;
 }
 
 static HRESULT WINAPI ThreadMgr_EnumDocumentMgrs( ITfThreadMgr* iface, IEnumTfDocumentMgrs
@@ -1083,6 +1115,7 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
     CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
 
     list_init(&This->CurrentPreservedKeys);
+    list_init(&This->CreatedDocumentMgrs);
 
     list_init(&This->ActiveLanguageProfileNotifySink);
     list_init(&This->DisplayAttributeNotifySink);
@@ -1095,3 +1128,20 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
     *ppOut = (IUnknown *)This;
     return S_OK;
 }
+
+void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr)
+{
+    ThreadMgr *This = (ThreadMgr *)tm;
+    struct list *cursor;
+    LIST_FOR_EACH(cursor, &This->CreatedDocumentMgrs)
+    {
+        DocumentMgrEntry *mgrentry = LIST_ENTRY(cursor,DocumentMgrEntry,entry);
+        if (mgrentry->docmgr == mgr)
+        {
+            list_remove(cursor);
+            HeapFree(GetProcessHeap(),0,mgrentry);
+            return;
+        }
+    }
+    FIXME("ITfDocumenMgr %p not found in this thread\n",mgr);
+}




More information about the wine-cvs mailing list