msctf: Add code to track created ITfDocumentMgrs.

This commit is contained in:
Aric Stewart 2009-07-10 07:36:56 -05:00 committed by Alexandre Julliard
parent 025df7d605
commit 171a1ad0a2
3 changed files with 57 additions and 1 deletions

View File

@ -69,7 +69,12 @@ static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface)
static void DocumentMgr_Destructor(DocumentMgr *This) static void DocumentMgr_Destructor(DocumentMgr *This)
{ {
ITfThreadMgr *tm;
TRACE("destroying %p\n", This); TRACE("destroying %p\n", This);
TF_GetThreadMgr(&tm);
ThreadMgr_OnDocumentMgrDestruction(tm, (ITfDocumentMgr*)This);
if (This->contextStack[0]) if (This->contextStack[0])
ITfContext_Release(This->contextStack[0]); ITfContext_Release(This->contextStack[0]);
if (This->contextStack[1]) if (This->contextStack[1])

View File

@ -43,6 +43,7 @@ extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This);
extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager); extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager);
extern HRESULT Context_Uninitialize(ITfContext *cxt); 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); extern HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp);
/* cookie function */ /* cookie function */

View File

@ -65,6 +65,12 @@ typedef struct tagPreservedKey
TfClientId tid; TfClientId tid;
} PreservedKey; } PreservedKey;
typedef struct tagDocumentMgrs
{
struct list entry;
ITfDocumentMgr *docmgr;
} DocumentMgrEntry;
typedef struct tagACLMulti { typedef struct tagACLMulti {
const ITfThreadMgrVtbl *ThreadMgrVtbl; const ITfThreadMgrVtbl *ThreadMgrVtbl;
const ITfSourceVtbl *SourceVtbl; const ITfSourceVtbl *SourceVtbl;
@ -90,6 +96,7 @@ typedef struct tagACLMulti {
CLSID forgroundTextService; CLSID forgroundTextService;
struct list CurrentPreservedKeys; struct list CurrentPreservedKeys;
struct list CreatedDocumentMgrs;
/* kept as separate lists to reduce unnecessary iterations */ /* kept as separate lists to reduce unnecessary iterations */
struct list ActiveLanguageProfileNotifySink; struct list ActiveLanguageProfileNotifySink;
@ -186,6 +193,14 @@ static void ThreadMgr_Destructor(ThreadMgr *This)
HeapFree(GetProcessHeap(),0,key); 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); CompartmentMgr_Destructor(This->CompartmentMgr);
HeapFree(GetProcessHeap(),0,This); HeapFree(GetProcessHeap(),0,This);
@ -303,8 +318,25 @@ static HRESULT WINAPI ThreadMgr_CreateDocumentMgr( ITfThreadMgr* iface, ITfDocum
**ppdim) **ppdim)
{ {
ThreadMgr *This = (ThreadMgr *)iface; ThreadMgr *This = (ThreadMgr *)iface;
DocumentMgrEntry *mgrentry;
HRESULT hr;
TRACE("(%p)\n",iface); 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 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); CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr);
list_init(&This->CurrentPreservedKeys); list_init(&This->CurrentPreservedKeys);
list_init(&This->CreatedDocumentMgrs);
list_init(&This->ActiveLanguageProfileNotifySink); list_init(&This->ActiveLanguageProfileNotifySink);
list_init(&This->DisplayAttributeNotifySink); list_init(&This->DisplayAttributeNotifySink);
@ -1095,3 +1128,20 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
*ppOut = (IUnknown *)This; *ppOut = (IUnknown *)This;
return S_OK; 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);
}