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.
|
|
//
// mark.cpp
//
// IUnknown, ITfTextInputProcessor implementation.
//
#include "globals.h"
#include "mark.h"
//+---------------------------------------------------------------------------
//
// CreateInstance
//
//----------------------------------------------------------------------------
/* static */ HRESULT CMarkTextService::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj) { CMarkTextService *pMark; HRESULT hr;
if (ppvObj == NULL) return E_INVALIDARG;
*ppvObj = NULL;
if (NULL != pUnkOuter) return CLASS_E_NOAGGREGATION;
if ((pMark = new CMarkTextService) == NULL) return E_OUTOFMEMORY;
hr = pMark->QueryInterface(riid, ppvObj);
pMark->Release(); // caller still holds ref if hr == S_OK
return hr; }
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CMarkTextService::CMarkTextService() { DllAddRef();
_pThreadMgr = NULL; _tfClientId = TF_CLIENTID_NULL;
_pComposition = NULL;
_fCleaningUp = FALSE;
_gaDisplayAttribute = TF_INVALID_GUIDATOM;
_pLangBarItem = NULL;
_dwThreadMgrEventSinkCookie = TF_INVALID_COOKIE; _dwThreadFocusSinkCookie = TF_INVALID_COOKIE; _dwTextEditSinkCookie = TF_INVALID_COOKIE; _dwGlobalCompartmentEventSinkCookie = TF_INVALID_COOKIE;
_pTextEditSinkContext = NULL;
_hWorkerWnd = NULL;
_cRef = 1; }
//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CMarkTextService::~CMarkTextService() { DllRelease(); }
//+---------------------------------------------------------------------------
//
// QueryInterface
//
//----------------------------------------------------------------------------
STDAPI CMarkTextService::QueryInterface(REFIID riid, void **ppvObj) { if (ppvObj == NULL) return E_INVALIDARG;
*ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfTextInputProcessor)) { *ppvObj = (ITfTextInputProcessor *)this; } else if (IsEqualIID(riid, IID_ITfDisplayAttributeProvider)) { *ppvObj = (ITfDisplayAttributeProvider *)this; } else if (IsEqualIID(riid, IID_ITfCreatePropertyStore)) { *ppvObj = (ITfCreatePropertyStore *)this; } else if (IsEqualIID(riid, IID_ITfThreadMgrEventSink)) { *ppvObj = (ITfThreadMgrEventSink *)this; } else if (IsEqualIID(riid, IID_ITfTextEditSink)) { *ppvObj = (ITfTextEditSink *)this; } else if (IsEqualIID(riid, IID_ITfCleanupContextSink)) { *ppvObj = (ITfCleanupContextSink *)this; } else if (IsEqualIID(riid, IID_ITfCleanupContextDurationSink)) { *ppvObj = (ITfCleanupContextDurationSink *)this; } else if (IsEqualIID(riid, IID_ITfCompartmentEventSink)) { *ppvObj = (ITfCompartmentEventSink *)this; }
if (*ppvObj) { AddRef(); return S_OK; }
return E_NOINTERFACE; }
//+---------------------------------------------------------------------------
//
// AddRef
//
//----------------------------------------------------------------------------
STDAPI_(ULONG) CMarkTextService::AddRef() { return ++_cRef; }
//+---------------------------------------------------------------------------
//
// Release
//
//----------------------------------------------------------------------------
STDAPI_(ULONG) CMarkTextService::Release() { LONG cr = --_cRef;
assert(_cRef >= 0);
if (_cRef == 0) { delete this; }
return cr; }
//+---------------------------------------------------------------------------
//
// Activate
//
//----------------------------------------------------------------------------
STDAPI CMarkTextService::Activate(ITfThreadMgr *pThreadMgr, TfClientId tfClientId) { _pThreadMgr = pThreadMgr; _pThreadMgr->AddRef();
_tfClientId = tfClientId;
if (!_InitLanguageBar()) goto ExitError;
if (!_InitThreadMgrSink()) goto ExitError;
if (!_InitDisplayAttributeGuidAtom()) goto ExitError;
if (!_InitCleanupContextDurationSink()) goto ExitError;
if (!_InitGlobalCompartment()) goto ExitError;
if (!_InitWorkerWnd()) goto ExitError;
if (!_InitKeystrokeSink()) goto ExitError;
return S_OK;
ExitError: Deactivate(); // cleanup any half-finished init
return E_FAIL; }
//+---------------------------------------------------------------------------
//
// Deactivate
//
//----------------------------------------------------------------------------
STDAPI CMarkTextService::Deactivate() { _UninitThreadMgrSink(); _UninitLanguageBar(); _UninitCleanupContextDurationSink(); _UninitGlobalCompartment(); _UninitWorkerWnd(); _UninitKeystrokeSink(); _InitTextEditSink(NULL);
// we MUST release all refs to _pThreadMgr in Deactivate
SafeReleaseClear(_pThreadMgr);
_tfClientId = TF_CLIENTID_NULL;
return S_OK; }
|