https://git.reactos.org/?p=reactos.git;a=commitdiff;h=88107adc9249bcc7eb691a8b3f97a797bb58d5ab

commit 88107adc9249bcc7eb691a8b3f97a797bb58d5ab
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Mon Jan 1 16:36:49 2024 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Mon Jan 1 16:36:49 2024 +0900

    [MSCTFIME][SDK] Implement CFunctionProvider (#6269)
    
    Supporting TIPs...
    JIRA issue: CORE-19360
    Define CFunctionProviderBase class.
    Define CFunctionProvider class.
    Strengthen <cicero/cictf.h>.
---
 dll/ime/msctfime/msctfime.cpp      | 233 +++++++++++++++++++++++++++++++++++--
 sdk/include/reactos/cicero/cictf.h |  13 +++
 2 files changed, 235 insertions(+), 11 deletions(-)

diff --git a/dll/ime/msctfime/msctfime.cpp b/dll/ime/msctfime/msctfime.cpp
index c5bfab1abdb..28a1c55d4df 100644
--- a/dll/ime/msctfime/msctfime.cpp
+++ b/dll/ime/msctfime/msctfime.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "msctfime.h"
+#include <ndk/ldrfuncs.h> /* for RtlDllShutdownInProgress */
 
 WINE_DEFAULT_DEBUG_CHANNEL(msctfime);
 
@@ -1071,24 +1072,132 @@ HRESULT CThreadMgrEventSink::_Unadvise()
     return hr;
 }
 
-/* FIXME */
-class CFunctionProvider : public IUnknown
+class CFunctionProviderBase : public ITfFunctionProvider
 {
+protected:
+    TfClientId m_clientId;
+    GUID m_guid;
+    BSTR m_bstr;
+    LONG m_cRefs;
+
 public:
-    CFunctionProvider(_In_ TfClientId clientId)
-    {
-    }
+    CFunctionProviderBase(_In_ TfClientId clientId);
+    virtual ~CFunctionProviderBase();
 
     // IUnknown interface
-    STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObj) override;
+    STDMETHODIMP QueryInterface(_In_ REFIID riid, _Out_ LPVOID* ppvObj) 
override;
     STDMETHODIMP_(ULONG) AddRef() override;
     STDMETHODIMP_(ULONG) Release() override;
+
+    // ITfFunctionProvider interface
+    STDMETHODIMP GetType(_Out_ GUID *guid) override;
+    STDMETHODIMP GetDescription(_Out_ BSTR *desc) override;
+    //STDMETHODIMP GetFunction(_In_ REFGUID guid, _In_ REFIID riid, _Out_ 
IUnknown **func) = 0;
+
+    BOOL Init(_In_ REFGUID rguid, _In_ LPCWSTR psz);
 };
 
+/**
+ * @implemented
+ */
+CFunctionProviderBase::CFunctionProviderBase(_In_ TfClientId clientId)
+{
+    m_clientId = clientId;
+    m_guid = GUID_NULL;
+    m_bstr = NULL;
+    m_cRefs = 1;
+}
+
+/**
+ * @implemented
+ */
+CFunctionProviderBase::~CFunctionProviderBase()
+{
+    if (!RtlDllShutdownInProgress())
+        ::SysFreeString(m_bstr);
+}
+
+/**
+ * @implemented
+ */
+BOOL
+CFunctionProviderBase::Init(
+    _In_ REFGUID rguid,
+    _In_ LPCWSTR psz)
+{
+    m_bstr = ::SysAllocString(psz);
+    m_guid = rguid;
+    return (m_bstr != NULL);
+}
+
+class CFnDocFeed : public IAImmFnDocFeed
+{
+    LONG m_cRefs;
+
+public:
+    CFnDocFeed();
+    virtual ~CFnDocFeed();
+
+    // IUnknown interface
+    STDMETHODIMP QueryInterface(_In_ REFIID riid, _Out_ LPVOID* ppvObj) 
override;
+    STDMETHODIMP_(ULONG) AddRef() override;
+    STDMETHODIMP_(ULONG) Release() override;
+
+    // IAImmFnDocFeed interface
+    STDMETHODIMP DocFeed() override;
+    STDMETHODIMP ClearDocFeedBuffer() override;
+    STDMETHODIMP StartReconvert() override;
+    STDMETHODIMP StartUndoCompositionString() override;
+};
+
+CFnDocFeed::CFnDocFeed()
+{
+    m_cRefs = 1;
+}
+
+CFnDocFeed::~CFnDocFeed()
+{
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP CFnDocFeed::QueryInterface(_In_ REFIID riid, _Out_ LPVOID* ppvObj)
+{
+    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IAImmFnDocFeed))
+    {
+        *ppvObj = this;
+        AddRef();
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP_(ULONG) CFnDocFeed::AddRef()
+{
+    return ::InterlockedIncrement(&m_cRefs);
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP_(ULONG) CFnDocFeed::Release()
+{
+    if (::InterlockedDecrement(&m_cRefs) == 0)
+    {
+        delete this;
+        return 0;
+    }
+    return m_cRefs;
+}
+
 /**
  * @unimplemented
  */
-STDMETHODIMP CFunctionProvider::QueryInterface(REFIID riid, LPVOID* ppvObj)
+STDMETHODIMP CFnDocFeed::DocFeed()
 {
     return E_NOTIMPL;
 }
@@ -1096,17 +1205,119 @@ STDMETHODIMP CFunctionProvider::QueryInterface(REFIID 
riid, LPVOID* ppvObj)
 /**
  * @unimplemented
  */
-STDMETHODIMP_(ULONG) CFunctionProvider::AddRef()
+STDMETHODIMP CFnDocFeed::ClearDocFeedBuffer()
 {
-    return 1;
+    return E_NOTIMPL;
 }
 
 /**
  * @unimplemented
  */
-STDMETHODIMP_(ULONG) CFunctionProvider::Release()
+STDMETHODIMP CFnDocFeed::StartReconvert()
 {
-    return 0;
+    return E_NOTIMPL;
+}
+
+/**
+ * @unimplemented
+ */
+STDMETHODIMP CFnDocFeed::StartUndoCompositionString()
+{
+    return E_NOTIMPL;
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP
+CFunctionProviderBase::QueryInterface(
+    _In_ REFIID riid,
+    _Out_ LPVOID* ppvObj)
+{
+    if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, 
IID_ITfFunctionProvider))
+    {
+        *ppvObj = this;
+        AddRef();
+        return S_OK;
+    }
+    return E_NOINTERFACE;
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP_(ULONG) CFunctionProviderBase::AddRef()
+{
+    return ::InterlockedIncrement(&m_cRefs);
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP_(ULONG) CFunctionProviderBase::Release()
+{
+    if (::InterlockedDecrement(&m_cRefs) == 0)
+    {
+        delete this;
+        return 0;
+    }
+    return m_cRefs;
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP CFunctionProviderBase::GetType(_Out_ GUID *guid)
+{
+    *guid = m_guid;
+    return S_OK;
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP CFunctionProviderBase::GetDescription(_Out_ BSTR *desc)
+{
+    *desc = ::SysAllocString(m_bstr);
+    return (*desc ? S_OK : E_OUTOFMEMORY);
+}
+
+class CFunctionProvider : public CFunctionProviderBase
+{
+public:
+    CFunctionProvider(_In_ TfClientId clientId);
+
+    STDMETHODIMP GetFunction(_In_ REFGUID guid, _In_ REFIID riid, _Out_ 
IUnknown **func) override;
+};
+
+/**
+ * @implemented
+ */
+CFunctionProvider::CFunctionProvider(_In_ TfClientId clientId) : 
CFunctionProviderBase(clientId)
+{
+    Init(CLSID_CAImmLayer, L"MSCTFIME::Function Provider");
+}
+
+/**
+ * @implemented
+ */
+STDMETHODIMP
+CFunctionProvider::GetFunction(
+    _In_ REFGUID guid,
+    _In_ REFIID riid,
+    _Out_ IUnknown **func)
+{
+    *func = NULL;
+
+    if (IsEqualGUID(guid, GUID_NULL) &&
+        IsEqualIID(riid, IID_IAImmFnDocFeed))
+    {
+        *func = new CFnDocFeed();
+        if (*func)
+            return S_OK;
+    }
+
+    return E_NOINTERFACE;
 }
 
 /* FIXME */
diff --git a/sdk/include/reactos/cicero/cictf.h 
b/sdk/include/reactos/cicero/cictf.h
index e11cebc3154..afc96cdfc14 100644
--- a/sdk/include/reactos/cicero/cictf.h
+++ b/sdk/include/reactos/cicero/cictf.h
@@ -29,3 +29,16 @@ struct ITfThreadMgr_P : ITfThreadMgr
 };
 
 DEFINE_GUID(IID_ITfKeystrokeMgr_P, 0x53FA1BEC, 0x5BE1, 0x458E, 0xAE, 0x70, 
0xA9, 0xF1, 0xDC, 0x84, 0x3E, 0x81);
+
+// FIXME: ITfKeystrokeMgr_P
+
+DEFINE_GUID(IID_IAImmFnDocFeed, 0x6E098993, 0x9577, 0x499A, 0xA8, 0x30, 0x52, 
0x34, 0x4F, 0x3E, 0x20, 0x0D);
+DEFINE_GUID(CLSID_CAImmLayer,   0xB676DB87, 0x64DC, 0x4651, 0x99, 0xEC, 0x91, 
0x07, 0x0E, 0xA4, 0x87, 0x90);
+
+struct IAImmFnDocFeed : IUnknown
+{
+    STDMETHOD(DocFeed)() = 0;
+    STDMETHOD(ClearDocFeedBuffer)() = 0;
+    STDMETHOD(StartReconvert)() = 0;
+    STDMETHOD(StartUndoCompositionString)() = 0;
+};

Reply via email to