From b712f39b66dbf2a7b9831365b8dfa6c2cb0c86df Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Mon, 2 Feb 2009 10:24:59 -0600 Subject: [PATCH] msctf: Implement stub ITfContext. --- dlls/msctf/Makefile.in | 1 + dlls/msctf/context.c | 262 ++++++++++++++++++++++++++++++++++++ dlls/msctf/documentmgr.c | 4 +- dlls/msctf/msctf_internal.h | 1 + include/msctf.idl | 114 +++++++++++++++- 5 files changed, 379 insertions(+), 3 deletions(-) create mode 100644 dlls/msctf/context.c diff --git a/dlls/msctf/Makefile.in b/dlls/msctf/Makefile.in index a62955444dd..cdb51d8804e 100644 --- a/dlls/msctf/Makefile.in +++ b/dlls/msctf/Makefile.in @@ -6,6 +6,7 @@ MODULE = msctf.dll IMPORTS = uuid ole32 user32 advapi32 kernel32 ntdll C_SRCS = \ + context.c \ documentmgr.c \ msctf.c \ regsvr.c \ diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c new file mode 100644 index 00000000000..696db65df41 --- /dev/null +++ b/dlls/msctf/context.c @@ -0,0 +1,262 @@ +/* + * ITfContext implementation + * + * Copyright 2009 Aric Stewart, CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" + +#include "wine/unicode.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagContext { + const ITfContextVtbl *ContextVtbl; + LONG refCount; + + TfClientId tidOwner; + IUnknown *punk; /* possible ITextStoreACP or ITfContextOwnerCompositionSink */ +} Context; + +static void Context_Destructor(Context *This) +{ + TRACE("destroying %p\n", This); + HeapFree(GetProcessHeap(),0,This); +} + +static HRESULT WINAPI Context_QueryInterface(ITfContext *iface, REFIID iid, LPVOID *ppvOut) +{ + Context *This = (Context *)iface; + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfContext)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI Context_AddRef(ITfContext *iface) +{ + Context *This = (Context *)iface; + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI Context_Release(ITfContext *iface) +{ + Context *This = (Context *)iface; + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + Context_Destructor(This); + return ret; +} + +/***************************************************** + * ITfContext functions + *****************************************************/ +static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface, + TfClientId tid, ITfEditSession *pes, DWORD dwFlags, + HRESULT *phrSession) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_InWriteSession (ITfContext *iface, + TfClientId tid, + BOOL *pfWriteSession) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetSelection (ITfContext *iface, + TfEditCookie ec, ULONG ulIndex, ULONG ulCount, + TF_SELECTION *pSelection, ULONG *pcFetched) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_SetSelection (ITfContext *iface, + TfEditCookie ec, ULONG ulCount, const TF_SELECTION *pSelection) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetStart (ITfContext *iface, + TfEditCookie ec, ITfRange **ppStart) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetEnd (ITfContext *iface, + TfEditCookie ec, ITfRange **ppEnd) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetActiveView (ITfContext *iface, + ITfContextView **ppView) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_EnumViews (ITfContext *iface, + IEnumTfContextViews **ppEnum) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetStatus (ITfContext *iface, + TF_STATUS *pdcs) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetProperty (ITfContext *iface, + REFGUID guidProp, ITfProperty **ppProp) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetAppProperty (ITfContext *iface, + REFGUID guidProp, ITfReadOnlyProperty **ppProp) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_TrackProperties (ITfContext *iface, + const GUID **prgProp, ULONG cProp, const GUID **prgAppProp, + ULONG cAppProp, ITfReadOnlyProperty **ppProperty) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_EnumProperties (ITfContext *iface, + IEnumTfProperties **ppEnum) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_GetDocumentMgr (ITfContext *iface, + ITfDocumentMgr **ppDm) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static HRESULT WINAPI Context_CreateRangeBackup (ITfContext *iface, + TfEditCookie ec, ITfRange *pRange, ITfRangeBackup **ppBackup) +{ + Context *This = (Context *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfContextVtbl Context_ContextVtbl = +{ + Context_QueryInterface, + Context_AddRef, + Context_Release, + + Context_RequestEditSession, + Context_InWriteSession, + Context_GetSelection, + Context_SetSelection, + Context_GetStart, + Context_GetEnd, + Context_GetActiveView, + Context_EnumViews, + Context_GetStatus, + Context_GetProperty, + Context_GetAppProperty, + Context_TrackProperties, + Context_EnumProperties, + Context_GetDocumentMgr, + Context_CreateRangeBackup +}; + +HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore) +{ + Context *This; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Context)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->ContextVtbl= &Context_ContextVtbl; + This->refCount = 1; + This->tidOwner = tidOwner; + This->punk = punk; + + TRACE("returning %p\n", This); + *ppOut = (ITfContext*)This; + /* FIXME */ + *pecTextStore = 0xdeaddead; + return S_OK; +} diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c index fe0232055d8..6245037051c 100644 --- a/dlls/msctf/documentmgr.c +++ b/dlls/msctf/documentmgr.c @@ -97,8 +97,8 @@ static HRESULT WINAPI DocumentMgr_CreateContext(ITfDocumentMgr *iface, TfEditCookie *pecTextStore) { DocumentMgr *This = (DocumentMgr *)iface; - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; + TRACE("(%p) 0x%x 0x%x %p %p %p\n",This,tidOwner,dwFlags,punk,ppic,pecTextStore); + return Context_Constructor(tidOwner, punk, ppic, pecTextStore); } static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic) diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h index fa4a6ef814d..347c475bbe0 100644 --- a/dlls/msctf/msctf_internal.h +++ b/dlls/msctf/msctf_internal.h @@ -24,5 +24,6 @@ extern DWORD tlsIndex; extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT DocumentMgr_Constructor(ITfDocumentMgr **ppOut); +extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **ppOut, TfEditCookie *pecTextStore); #endif /* __WINE_MSCTF_I_H */ diff --git a/include/msctf.idl b/include/msctf.idl index 620b65f7b92..29f3a80c631 100644 --- a/include/msctf.idl +++ b/include/msctf.idl @@ -19,7 +19,7 @@ #ifndef DO_NO_IMPORTS import "oaidl.idl"; import "comcat.idl"; -/* import "textstor.idl"; */ +import "textstor.idl"; /* import "ctfutb.idl"; */ #endif @@ -35,6 +35,14 @@ interface IEnumTfContexts; interface ITfFunctionProvider; interface IEnumTfFunctionProviders; interface ITfCompartmentMgr; +interface ITfEditSession; +interface ITfRange; +interface ITfContextView; +interface IEnumTfContextViews; +interface ITfProperty; +interface ITfReadOnlyProperty; +interface IEnumTfProperties; +interface ITfRangeBackup; [ object, @@ -111,3 +119,107 @@ interface ITfDocumentMgr: IUnknown HRESULT EnumContexts( [out] IEnumTfContexts **ppEnum); }; + +[ + object, + uuid(aa80e7fd-2021-11d2-93e0-0060b067b86e), + pointer_default(unique) +] +interface ITfContext : IUnknown +{ + const DWORD TF_ES_ASYNCDONTCARE = 0x0; + const DWORD TF_ES_SYNC = 0x1; + const DWORD TF_ES_READ = 0x2; + const DWORD TF_ES_READWRITE = 0x6; + const DWORD TF_ES_ASYNC = 0x8; + + HRESULT RequestEditSession( + [in] TfClientId tid, + [in] ITfEditSession *pes, + [in] DWORD dwFlags, + [out] HRESULT *phrSession); + + HRESULT InWriteSession( + [in] TfClientId tid, + [out] BOOL *pfWriteSession); + + typedef [uuid(1690be9b-d3e9-49f6-8d8b-51b905af4c43)] enum { TF_AE_NONE, TF_AE_START, TF_AE_END } TfActiveSelEnd; + + typedef [uuid(36ae42a4-6989-4bdc-b48a-6137b7bf2e42)] struct TF_SELECTIONSTYLE + { + TfActiveSelEnd ase; + BOOL fInterimChar; + } TF_SELECTIONSTYLE; + + typedef [uuid(75eb22f2-b0bf-46a8-8006-975a3b6efcf1)] struct TF_SELECTION + { + ITfRange *range; + TF_SELECTIONSTYLE style; + } TF_SELECTION; + + const ULONG TF_DEFAULT_SELECTION = TS_DEFAULT_SELECTION; + + HRESULT GetSelection( + [in] TfEditCookie ec, + [in] ULONG ulIndex, + [in] ULONG ulCount, + [out, size_is(ulCount), length_is(*pcFetched)] TF_SELECTION *pSelection, + [out] ULONG *pcFetched); + + HRESULT SetSelection( + [in] TfEditCookie ec, + [in] ULONG ulCount, + [in, size_is(ulCount)] const TF_SELECTION *pSelection); + + HRESULT GetStart( + [in] TfEditCookie ec, + [out] ITfRange **ppStart); + + HRESULT GetEnd( + [in] TfEditCookie ec, + [out] ITfRange **ppEnd); + + typedef [uuid(bc7d979a-846a-444d-afef-0a9bfa82b961)] TS_STATUS TF_STATUS; + const DWORD TF_SD_READONLY = TS_SD_READONLY; + const DWORD TF_SD_LOADING = TS_SD_LOADING; + const DWORD TF_SS_DISJOINTSEL = TS_SS_DISJOINTSEL; + const DWORD TF_SS_REGIONS = TS_SS_REGIONS; + const DWORD TF_SS_TRANSITORY = TS_SS_TRANSITORY; + + + HRESULT GetActiveView( + [out] ITfContextView **ppView); + + HRESULT EnumViews( + [out] IEnumTfContextViews **ppEnum); + + HRESULT GetStatus( + [out] TF_STATUS *pdcs); + + HRESULT GetProperty( + [in] REFGUID guidProp, + [out] ITfProperty **ppProp); + + HRESULT GetAppProperty( + [in] REFGUID guidProp, + [out] ITfReadOnlyProperty **ppProp); + + HRESULT TrackProperties( + [in, size_is(cProp)] const GUID **prgProp, + [in] ULONG cProp, + [in, size_is(cAppProp)] const GUID **prgAppProp, + [in] ULONG cAppProp, + [out] ITfReadOnlyProperty **ppProperty); + + HRESULT EnumProperties( + [out] IEnumTfProperties **ppEnum); + + HRESULT GetDocumentMgr( + [out] ITfDocumentMgr **ppDm); + + HRESULT CreateRangeBackup( + [in] TfEditCookie ec, + [in] ITfRange *pRange, + [out] ITfRangeBackup **ppBackup); + +};