Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

262 lines
5.7 KiB

//
// computil.cpp
//
#include "private.h"
#include "gcomp.h"
#include "helpers.h"
extern "C" HRESULT WINAPI TF_GetGlobalCompartment(ITfCompartmentMgr **pCompMgr);
//+---------------------------------------------------------------------------
//
// GetCompartment
//
//----------------------------------------------------------------------------
HRESULT GetGlobalCompartment(REFGUID rguidComp, ITfCompartment **ppComp)
{
HRESULT hr = E_FAIL;
ITfCompartmentMgr *pCompMgr = NULL;
*ppComp = NULL;
if (FAILED(hr = TF_GetGlobalCompartment(&pCompMgr)))
{
Assert(0);
goto Exit;
}
if (SUCCEEDED(hr) && pCompMgr)
{
hr = pCompMgr->GetCompartment(rguidComp, ppComp);
pCompMgr->Release();
}
else
hr = E_FAIL;
Exit:
return hr;
}
//+---------------------------------------------------------------------------
//
// SetCompartmentDWORD
//
//----------------------------------------------------------------------------
HRESULT SetGlobalCompartmentDWORD(REFGUID rguidComp, DWORD dw)
{
HRESULT hr;
ITfCompartment *pComp;
VARIANT var;
if (SUCCEEDED(hr = GetGlobalCompartment(rguidComp, &pComp)))
{
var.vt = VT_I4;
var.lVal = dw;
hr = pComp->SetValue(0, &var);
pComp->Release();
}
return hr;
}
//+---------------------------------------------------------------------------
//
// GetGlobalCompartmentDWORD
//
//----------------------------------------------------------------------------
HRESULT GetGlobalCompartmentDWORD(REFGUID rguidComp, DWORD *pdw)
{
HRESULT hr;
ITfCompartment *pComp;
VARIANT var;
*pdw = 0;
if (SUCCEEDED(hr = GetGlobalCompartment(rguidComp, &pComp)))
{
if ((hr = pComp->GetValue(&var)) == S_OK)
{
Assert(var.vt == VT_I4);
*pdw = var.lVal;
}
pComp->Release();
}
return hr;
}
//////////////////////////////////////////////////////////////////////////////
//
// CGlobalCompartmentEventSink
//
//////////////////////////////////////////////////////////////////////////////
//+---------------------------------------------------------------------------
//
// IUnknown
//
//----------------------------------------------------------------------------
STDAPI CGlobalCompartmentEventSink::QueryInterface(REFIID riid, void **ppvObj)
{
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) ||
IsEqualIID(riid, IID_ITfCompartmentEventSink))
{
*ppvObj = SAFECAST(this, ITfCompartmentEventSink *);
}
if (*ppvObj)
{
AddRef();
return S_OK;
}
Assert(0);
return E_NOINTERFACE;
}
STDAPI_(ULONG) CGlobalCompartmentEventSink::AddRef()
{
return ++_cRef;
}
STDAPI_(ULONG) CGlobalCompartmentEventSink::Release()
{
long cr;
cr = --_cRef;
Assert(cr >= 0);
if (cr == 0)
{
delete this;
}
return cr;
}
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CGlobalCompartmentEventSink::CGlobalCompartmentEventSink(CESCALLBACK pfnCallback, void *pv)
{
Dbg_MemSetThisName(TEXT("CGlobalCompartmentEventSink"));
_cRef = 1;
_pfnCallback = pfnCallback;
_pv = pv;
}
//+---------------------------------------------------------------------------
//
// OnChange
//
//----------------------------------------------------------------------------
STDAPI CGlobalCompartmentEventSink::OnChange(REFGUID rguid)
{
return _pfnCallback(_pv, rguid);
}
//+---------------------------------------------------------------------------
//
// CGlobalCompartmentEventSink::Advise
//
//----------------------------------------------------------------------------
HRESULT CGlobalCompartmentEventSink::_Advise(REFGUID rguidComp)
{
HRESULT hr;
ITfSource *pSource = NULL;
int nCnt;
CESMAP *pcesmap;
nCnt = _rgcesmap.Count();
if (!_rgcesmap.Insert(nCnt, 1))
return E_OUTOFMEMORY;
pcesmap = _rgcesmap.GetPtr(nCnt);
memset(pcesmap, 0, sizeof(CESMAP));
hr = E_FAIL;
if (FAILED(hr = GetGlobalCompartment(rguidComp, &pcesmap->pComp)))
{
Assert(0);
goto Exit;
}
if (FAILED(hr = pcesmap->pComp->QueryInterface(IID_ITfSource, (void **)&pSource)))
{
Assert(0);
goto Exit;
}
if (FAILED(hr = pSource->AdviseSink(IID_ITfCompartmentEventSink, (ITfCompartmentEventSink *)this, &pcesmap->dwCookie)))
{
Assert(0);
goto Exit;
}
hr = S_OK;
Exit:
if (FAILED(hr))
{
Assert(0);
SafeReleaseClear(pcesmap->pComp);
_rgcesmap.Remove(nCnt, 1);
}
SafeRelease(pSource);
return hr;
}
//+---------------------------------------------------------------------------
//
// CGlobalCompartmentEventSink::Unadvise
//
//----------------------------------------------------------------------------
HRESULT CGlobalCompartmentEventSink::_Unadvise()
{
HRESULT hr;
int nCnt;
CESMAP *pcesmap;
hr = E_FAIL;
nCnt = _rgcesmap.Count();
pcesmap = _rgcesmap.GetPtr(0);
while (nCnt)
{
ITfSource *pSource = NULL;
if (FAILED(pcesmap->pComp->QueryInterface(IID_ITfSource, (void **)&pSource)))
goto Next;
if (FAILED(pSource->UnadviseSink(pcesmap->dwCookie)))
goto Next;
Next:
SafeReleaseClear(pcesmap->pComp);
SafeRelease(pSource);
nCnt--;
pcesmap++;
}
_rgcesmap.Clear();
hr = S_OK;
return hr;
}