Aric Stewart : msctf: Define ITfCompartment.
Alexandre Julliard
julliard at winehq.org
Mon Jun 22 09:04:16 CDT 2009
Module: wine
Branch: master
Commit: e842f250ee475047138894aafe66977d8911e485
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e842f250ee475047138894aafe66977d8911e485
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Jun 22 12:02:08 2009 +0900
msctf: Define ITfCompartment.
---
dlls/msctf/compartmentmgr.c | 101 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 101 insertions(+), 0 deletions(-)
diff --git a/dlls/msctf/compartmentmgr.c b/dlls/msctf/compartmentmgr.c
index 5342568..7e23b86 100644
--- a/dlls/msctf/compartmentmgr.c
+++ b/dlls/msctf/compartmentmgr.c
@@ -67,7 +67,17 @@ typedef struct tagCompartmentEnumGuid {
struct list *cursor;
} CompartmentEnumGuid;
+typedef struct tagCompartment {
+ const ITfCompartmentVtbl *Vtbl;
+ LONG refCount;
+
+ /* Only VT_I4, VT_UNKNOWN and VT_BSTR data types are allowed */
+ VARIANT variant;
+ CompartmentValue *valueData;
+} Compartment;
+
static HRESULT CompartmentEnumGuid_Constructor(struct list* values, IEnumGUID **ppOut);
+static HRESULT Compartment_Constructor(CompartmentValue *value, ITfCompartment **ppOut);
HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *iface)
{
@@ -367,3 +377,94 @@ static HRESULT CompartmentEnumGuid_Constructor(struct list *values, IEnumGUID **
*ppOut = (IEnumGUID*)This;
return S_OK;
}
+
+/**************************************************
+ * ITfCompartment
+ **************************************************/
+static void Compartment_Destructor(Compartment *This)
+{
+ TRACE("destroying %p\n", This);
+ VariantClear(&This->variant);
+ HeapFree(GetProcessHeap(),0,This);
+}
+
+static HRESULT WINAPI Compartment_QueryInterface(ITfCompartment *iface, REFIID iid, LPVOID *ppvOut)
+{
+ Compartment *This = (Compartment *)iface;
+ *ppvOut = NULL;
+
+ if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfCompartment))
+ {
+ *ppvOut = This;
+ }
+
+ if (*ppvOut)
+ {
+ IUnknown_AddRef(iface);
+ return S_OK;
+ }
+
+ WARN("unsupported interface: %s\n", debugstr_guid(iid));
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI Compartment_AddRef(ITfCompartment *iface)
+{
+ Compartment *This = (Compartment*)iface;
+ return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI Compartment_Release(ITfCompartment *iface)
+{
+ Compartment *This = (Compartment *)iface;
+ ULONG ret;
+
+ ret = InterlockedDecrement(&This->refCount);
+ if (ret == 0)
+ Compartment_Destructor(This);
+ return ret;
+}
+
+static HRESULT WINAPI Compartment_SetValue(ITfCompartment *iface,
+ TfClientId tid, const VARIANT *pvarValue)
+{
+ Compartment *This = (Compartment *)iface;
+ FIXME("STUB:(%p)\n",This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI Compartment_GetValue(ITfCompartment *iface,
+ VARIANT *pvarValue)
+{
+ Compartment *This = (Compartment *)iface;
+ FIXME("STUB:(%p)\n",This);
+ return E_NOTIMPL;
+}
+
+static const ITfCompartmentVtbl ITfCompartment_Vtbl ={
+ Compartment_QueryInterface,
+ Compartment_AddRef,
+ Compartment_Release,
+
+ Compartment_SetValue,
+ Compartment_GetValue
+};
+
+static HRESULT Compartment_Constructor(CompartmentValue *valueData, ITfCompartment **ppOut)
+{
+ Compartment *This;
+
+ This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(Compartment));
+ if (This == NULL)
+ return E_OUTOFMEMORY;
+
+ This->Vtbl= &ITfCompartment_Vtbl;
+ This->refCount = 1;
+
+ This->valueData = valueData;
+ VariantInit(&This->variant);
+
+ TRACE("returning %p\n", This);
+ *ppOut = (ITfCompartment*)This;
+ return S_OK;
+}
More information about the wine-cvs
mailing list