* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#include "msctf_internal.h"
+#include "config.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define COBJMACROS
-#include <rpcproxy.h>
-#include <inputscope.h>
+#include "wine/debug.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "shlwapi.h"
+#include "shlguid.h"
+#include "comcat.h"
+#include "olectl.h"
+#include "rpcproxy.h"
+#include "msctf.h"
+#include "inputscope.h"
+
+#include "msctf_internal.h"
-static LONG MSCTF_refCount;
+WINE_DEFAULT_DEBUG_CHANNEL(msctf);
static HINSTANCE MSCTF_hinstance;
typedef struct {
TF_LANGUAGEPROFILE LanguageProfile;
ITfTextInputProcessor *pITfTextInputProcessor;
- ITfThreadMgr *pITfThreadMgr;
+ ITfThreadMgrEx *pITfThreadMgrEx;
ITfKeyEventSink *pITfKeyEventSink;
TfClientId tid;
} ActivatedTextService;
{
TRACE("Destroying class factory %p\n", This);
HeapFree(GetProcessHeap(),0,This);
- MSCTF_refCount--;
}
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppvOut)
TRACE("(%p)->(%x)\n", This, fLock);
- if(fLock)
- InterlockedIncrement(&MSCTF_refCount);
- else
- InterlockedDecrement(&MSCTF_refCount);
-
return S_OK;
}
This->IClassFactory_iface.lpVtbl = &ClassFactoryVtbl;
This->ref = 1;
This->ctor = ctor;
- *ppvOut = This;
+ *ppvOut = &This->IClassFactory_iface;
TRACE("Created class factory %p\n", This);
- MSCTF_refCount++;
return S_OK;
}
return 0x0;
}
+HRESULT advise_sink(struct list *sink_list, REFIID riid, DWORD cookie_magic, IUnknown *unk, DWORD *cookie)
+{
+ Sink *sink;
+
+ sink = HeapAlloc(GetProcessHeap(), 0, sizeof(*sink));
+ if (!sink)
+ return E_OUTOFMEMORY;
+
+ if (FAILED(IUnknown_QueryInterface(unk, riid, (void**)&sink->interfaces.pIUnknown)))
+ {
+ HeapFree(GetProcessHeap(), 0, sink);
+ return CONNECT_E_CANNOTCONNECT;
+ }
+
+ list_add_head(sink_list, &sink->entry);
+ *cookie = generate_Cookie(cookie_magic, sink);
+ TRACE("cookie %x\n", *cookie);
+ return S_OK;
+}
+
+static void free_sink(Sink *sink)
+{
+ list_remove(&sink->entry);
+ IUnknown_Release(sink->interfaces.pIUnknown);
+ HeapFree(GetProcessHeap(), 0, sink);
+}
+
+HRESULT unadvise_sink(DWORD cookie)
+{
+ Sink *sink;
+
+ sink = remove_Cookie(cookie);
+ if (!sink)
+ return CONNECT_E_NOCONNECTION;
+
+ free_sink(sink);
+ return S_OK;
+}
+
+void free_sinks(struct list *sink_list)
+{
+ while(!list_empty(sink_list))
+ {
+ Sink* sink = LIST_ENTRY(sink_list->next, Sink, entry);
+ free_sink(sink);
+ }
+}
+
/*****************************************************************************
* Active Text Service Management
*****************************************************************************/
-static HRESULT activate_given_ts(ActivatedTextService *actsvr, ITfThreadMgr* tm)
+static HRESULT activate_given_ts(ActivatedTextService *actsvr, ITfThreadMgrEx *tm)
{
HRESULT hr;
&IID_ITfTextInputProcessor, (void**)&actsvr->pITfTextInputProcessor);
if (FAILED(hr)) return hr;
- hr = ITfTextInputProcessor_Activate(actsvr->pITfTextInputProcessor, tm, actsvr->tid);
+ hr = ITfTextInputProcessor_Activate(actsvr->pITfTextInputProcessor, (ITfThreadMgr *)tm, actsvr->tid);
if (FAILED(hr))
{
ITfTextInputProcessor_Release(actsvr->pITfTextInputProcessor);
return hr;
}
- actsvr->pITfThreadMgr = tm;
- ITfThreadMgr_AddRef(tm);
+ actsvr->pITfThreadMgrEx = tm;
+ ITfThreadMgrEx_AddRef(tm);
return hr;
}
{
hr = ITfTextInputProcessor_Deactivate(actsvr->pITfTextInputProcessor);
ITfTextInputProcessor_Release(actsvr->pITfTextInputProcessor);
- ITfThreadMgr_Release(actsvr->pITfThreadMgr);
+ ITfThreadMgrEx_Release(actsvr->pITfThreadMgrEx);
actsvr->pITfTextInputProcessor = NULL;
- actsvr->pITfThreadMgr = NULL;
+ actsvr->pITfThreadMgrEx = NULL;
}
return hr;
list_remove(&ats->entry);
HeapFree(GetProcessHeap(),0,ats->ats);
HeapFree(GetProcessHeap(),0,ats);
- /* we are guarenteeing there is only 1 */
+ /* we are guaranteeing there is only 1 */
break;
}
}
ActivatedTextService *actsvr;
ITfCategoryMgr *catmgr;
AtsEntry *entry;
- ITfThreadMgr *tm = TlsGetValue(tlsIndex);
+ ITfThreadMgrEx *tm = TlsGetValue(tlsIndex);
ITfClientId *clientid;
if (!tm) return E_UNEXPECTED;
actsvr = HeapAlloc(GetProcessHeap(),0,sizeof(ActivatedTextService));
if (!actsvr) return E_OUTOFMEMORY;
- ITfThreadMgr_QueryInterface(tm,&IID_ITfClientId,(LPVOID)&clientid);
+ ITfThreadMgrEx_QueryInterface(tm, &IID_ITfClientId, (void **)&clientid);
ITfClientId_GetClientId(clientid, &lp->clsid, &actsvr->tid);
ITfClientId_Release(clientid);
actsvr->pITfTextInputProcessor = NULL;
actsvr->LanguageProfile = *lp;
- actsvr->LanguageProfile.fActive = TRUE;
actsvr->pITfKeyEventSink = NULL;
/* get TIP category */
return FALSE;
}
-HRESULT activate_textservices(ITfThreadMgr *tm)
+HRESULT activate_textservices(ITfThreadMgrEx *tm)
{
HRESULT hr = S_OK;
AtsEntry *ats;
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
- return MSCTF_refCount ? S_FALSE : S_OK;
+ return S_FALSE;
}
/***********************************************************************
return E_NOTIMPL;
}
+
+/***********************************************************************
+ * TF_InitMlngInfo (MSCTF.@)
+ */
+HRESULT WINAPI TF_InitMlngInfo(void)
+{
+ FIXME("stub\n");
+ return S_OK;
+}