https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9d495475f027ad64a70d619284db31a7c6d242bc

commit 9d495475f027ad64a70d619284db31a7c6d242bc
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Wed Dec 20 17:51:37 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Wed Dec 20 17:51:37 2023 +0900

    [MSCTFIME][MSCTF][SDK] Add compartment helper functions (#6202)
    
    - Implement GetCompartment,
      SetCompartmentDWORD,
      GetCompartmentDWORD,
      SetCompartmentUnknown, and
      ClearCompartment helper functions.
    - Add TF_DllDetachInOther prototype
      to "msctf.idl".
    CORE-19360
---
 dll/ime/msctfime/msctfime.cpp | 144 +++++++++++++++++++++++++++++++++++++++++-
 dll/win32/msctf/msctf.spec    |   2 +-
 sdk/include/psdk/msctf.idl    |   1 +
 3 files changed, 144 insertions(+), 3 deletions(-)

diff --git a/dll/ime/msctfime/msctfime.cpp b/dll/ime/msctfime/msctfime.cpp
index db9c0fe352b..044a6bc8cb2 100644
--- a/dll/ime/msctfime/msctfime.cpp
+++ b/dll/ime/msctfime/msctfime.cpp
@@ -164,6 +164,146 @@ void TFUninitLib_Thread(PLIBTHREAD pLibThread)
     }
 }
 
+HRESULT
+GetCompartment(
+    IUnknown *pUnknown,
+    REFGUID rguid,
+    ITfCompartment **ppComp,
+    BOOL bThread)
+{
+    ITfThreadMgr *pThreadMgr = NULL;
+    ITfCompartmentMgr *pCompMgr = NULL;
+
+    *ppComp = NULL;
+    HRESULT hr;
+    if (bThread)
+    {
+        hr = pUnknown->QueryInterface(IID_ITfThreadMgr, (void **)&pThreadMgr);
+        if (FAILED(hr))
+            return hr;
+
+        hr = pThreadMgr->GetGlobalCompartment(&pCompMgr);
+    }
+    else
+    {
+        hr = pUnknown->QueryInterface(IID_ITfCompartmentMgr, (void 
**)&pCompMgr);
+    }
+
+    if (SUCCEEDED(hr))
+    {
+        if (pCompMgr)
+            hr = pCompMgr->GetCompartment(rguid, ppComp);
+        else
+            hr = E_FAIL;
+    }
+
+    if (pThreadMgr)
+        pThreadMgr->Release();
+
+    return hr;
+}
+
+HRESULT
+SetCompartmentDWORD(
+    TfEditCookie cookie,
+    IUnknown *pUnknown,
+    REFGUID rguid,
+    VARTYPE type,
+    BOOL bThread)
+{
+    ITfCompartment *pComp = NULL;
+    HRESULT hr = GetCompartment(pUnknown, rguid, &pComp, bThread);
+    if (FAILED(hr))
+        return hr;
+
+    VARIANT vari;
+    V_I4(&vari) = type;
+    V_VT(&vari) = VT_I4;
+    hr = pComp->SetValue(cookie, &vari);
+    pComp->Release();
+
+    return hr;
+}
+
+HRESULT
+GetCompartmentDWORD(
+    IUnknown *pUnknown,
+    REFGUID rguid,
+    ITfCompartment *pComp,
+    BOOL bThread)
+{
+    HRESULT hr = GetCompartment(pUnknown, rguid, &pComp, bThread);
+    if (FAILED(hr))
+        return hr;
+
+    VARIANT vari;
+    hr = pComp->GetValue(&vari);
+    pComp->Release();
+
+    return hr;
+}
+
+HRESULT
+SetCompartmentUnknown(
+    TfEditCookie cookie,
+    IUnknown *pUnknown,
+    REFGUID rguid,
+    IUnknown *pUnknown2)
+{
+    ITfCompartment *pComp = NULL;
+    HRESULT hr = GetCompartment(pUnknown, rguid, &pComp, FALSE);
+    if (FAILED(hr))
+        return hr;
+
+    VARIANT vari;
+    V_UNKNOWN(&vari) = pUnknown2;
+    V_VT(&vari) = VT_UNKNOWN;
+    hr = pComp->SetValue(cookie, &vari);
+    pComp->Release();
+
+    return hr;
+}
+
+HRESULT
+ClearCompartment(
+    TfClientId tid,
+    IUnknown *pUnknown,
+    REFGUID rguid,
+    BOOL bThread)
+{
+    ITfCompartmentMgr *pCompMgr = NULL;
+    ITfThreadMgr *pThreadMgr = NULL;
+
+    HRESULT hr;
+    if (bThread)
+    {
+        hr = pUnknown->QueryInterface(IID_ITfThreadMgr, (void **)&pThreadMgr);
+        if (FAILED(hr))
+            return hr;
+
+        hr = pThreadMgr->GetGlobalCompartment(&pCompMgr);
+    }
+    else
+    {
+        hr = pUnknown->QueryInterface(IID_ITfCompartmentMgr, (void 
**)&pCompMgr);
+    }
+
+    if (SUCCEEDED(hr))
+    {
+        hr = E_FAIL;
+        if (pCompMgr)
+        {
+            hr = pCompMgr->ClearCompartment(tid, rguid);
+            pCompMgr->Release();
+        }
+    }
+
+    if (pThreadMgr)
+        pThreadMgr->Release();
+
+    return hr;
+}
+
 /* FIXME */
 class CicInputContext : public ITfContextOwnerCompositionSink
 {
@@ -2155,7 +2295,7 @@ VOID ProcessDetach(HINSTANCE hinstDLL)
 }
 
 /**
- * @unimplemented
+ * @implemented
  */
 EXTERN_C BOOL WINAPI
 DllMain(
@@ -2182,7 +2322,7 @@ DllMain(
         }
         case DLL_THREAD_DETACH:
         {
-            // FIXME
+            TF_DllDetachInOther();
             CtfImeThreadDetach();
             TLS::InternalDestroyTLS();
             break;
diff --git a/dll/win32/msctf/msctf.spec b/dll/win32/msctf/msctf.spec
index 779ef12c79f..a38e8d7da2b 100644
--- a/dll/win32/msctf/msctf.spec
+++ b/dll/win32/msctf/msctf.spec
@@ -15,7 +15,7 @@
 @ stdcall TF_CreateLangBarItemMgr(ptr)
 @ stdcall TF_CreateLangBarMgr(ptr)
 @ stdcall TF_CreateThreadMgr(ptr)
-@ stub TF_DllDetachInOther
+@ stdcall -stub TF_DllDetachInOther()
 @ stdcall -stub TF_GetGlobalCompartment(ptr)
 @ stub TF_GetInputScope
 @ stub TF_GetLangIcon
diff --git a/sdk/include/psdk/msctf.idl b/sdk/include/psdk/msctf.idl
index ea487273a5b..4a4425f95fb 100644
--- a/sdk/include/psdk/msctf.idl
+++ b/sdk/include/psdk/msctf.idl
@@ -40,6 +40,7 @@ cpp_quote("EXTERN_C HRESULT WINAPI 
TF_CreateLangBarItemMgr(_Out_ ITfLangBarItemM
 cpp_quote("EXTERN_C HANDLE  WINAPI TF_CreateCicLoadMutex(_Out_ LPBOOL 
pfWinLogon);")
 cpp_quote("EXTERN_C HRESULT WINAPI TF_InvalidAssemblyListCache(VOID);")
 cpp_quote("EXTERN_C HRESULT WINAPI TF_InvalidAssemblyListCacheIfExist(VOID);")
+cpp_quote("EXTERN_C HRESULT WINAPI TF_DllDetachInOther(VOID);")
 
 cpp_quote("EXTERN_C const GUID GUID_PROP_TEXTOWNER;")
 cpp_quote("EXTERN_C const GUID GUID_PROP_ATTRIBUTE;")

Reply via email to