* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-#define WIN32_NO_STATUS
-#define _INC_WINDOWS
-#define COM_NO_WINDOWS_H
+#include "config.h"
-#include <config.h>
-
-//#include <stdarg.h>
-//#include <stdio.h>
+#include <stdarg.h>
+#include <stdio.h>
#define COBJMACROS
-#include <wine/debug.h>
-#include <wine/list.h>
-//#include "windef.h"
-#include <winbase.h>
-#include <winreg.h>
-#include <shlwapi.h>
-//#include "shlguid.h"
-//#include "comcat.h"
-#include <rpcproxy.h>
-#include <msctf.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"
WINE_DEFAULT_DEBUG_CHANNEL(msctf);
-static LONG MSCTF_refCount;
-
static HINSTANCE MSCTF_hinstance;
typedef struct
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;
}
*/
DWORD generate_Cookie(DWORD magic, LPVOID data)
{
- int i;
+ UINT i;
/* try to reuse IDs if possible */
for (i = 0; i < id_last; i++)
DWORD enumerate_Cookie(DWORD magic, DWORD *index)
{
- int i;
+ unsigned int i;
for (i = *index; i < id_last; i++)
if (cookies[i].id != 0 && cookies[i].magic == magic)
{
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;
tlsIndex = TlsAlloc();
break;
case DLL_PROCESS_DETACH:
+ if (fImpLoad) break;
TlsFree(tlsIndex);
break;
}
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
- return MSCTF_refCount ? S_FALSE : S_OK;
+ return S_FALSE;
}
/***********************************************************************
/***********************************************************************
* SetInputScope(MSCTF.@)
*/
-HRESULT WINAPI SetInputScope(HWND hwnd, INT inputscope)
+HRESULT WINAPI SetInputScope(HWND hwnd, InputScope inputscope)
{
FIXME("STUB: %p %i\n",hwnd,inputscope);
return S_OK;
/***********************************************************************
* SetInputScopes(MSCTF.@)
*/
-HRESULT WINAPI SetInputScopes(HWND hwnd, const INT *pInputScopes,
+HRESULT WINAPI SetInputScopes(HWND hwnd, const InputScope *pInputScopes,
UINT cInputScopes, WCHAR **ppszPhraseList,
UINT cPhrases, WCHAR *pszRegExp, WCHAR *pszSRGS)
{
- int i;
+ UINT i;
FIXME("STUB: %p ... %s %s\n",hwnd, debugstr_w(pszRegExp), debugstr_w(pszSRGS));
for (i = 0; i < cInputScopes; i++)
- TRACE("\tScope[%i] = %i\n",i,pInputScopes[i]);
+ TRACE("\tScope[%u] = %i\n",i,pInputScopes[i]);
for (i = 0; i < cPhrases; i++)
- TRACE("\tPhrase[%i] = %s\n",i,debugstr_w(ppszPhraseList[i]));
+ TRACE("\tPhrase[%u] = %s\n",i,debugstr_w(ppszPhraseList[i]));
return S_OK;
}
TRACE("\n");
return LangBarMgr_Constructor(NULL,(IUnknown**)pppbm);
}
+
+HRESULT WINAPI TF_CreateLangBarItemMgr(ITfLangBarItemMgr **pplbim)
+{
+ FIXME("stub %p\n", pplbim);
+ *pplbim = NULL;
+
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * TF_InitMlngInfo (MSCTF.@)
+ */
+HRESULT WINAPI TF_InitMlngInfo(void)
+{
+ FIXME("stub\n");
+ return S_OK;
+}