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.
475 lines
9.9 KiB
475 lines
9.9 KiB
//
|
|
//
|
|
// Sapilayr TIP Misc function impl.
|
|
//
|
|
//
|
|
#include "private.h"
|
|
#include "sapilayr.h"
|
|
#include "nui.h"
|
|
#include "miscfunc.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CGetSAPIObject
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// ctor / dtor
|
|
//
|
|
|
|
CGetSAPIObject::CGetSAPIObject(CSapiIMX *psi)
|
|
{
|
|
m_psi = psi;
|
|
m_psi->AddRef();
|
|
m_psi->GetFocusIC(&m_cpIC); // AddRef in the call
|
|
m_cRef = 1;
|
|
}
|
|
|
|
CGetSAPIObject::~CGetSAPIObject()
|
|
{
|
|
if (m_psi)
|
|
m_psi->Release();
|
|
}
|
|
|
|
//
|
|
// IUnknown
|
|
//
|
|
STDMETHODIMP CGetSAPIObject::QueryInterface(REFGUID riid, LPVOID *ppvObj)
|
|
{
|
|
Assert(ppvObj);
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfFnGetSAPIObject))
|
|
{
|
|
*ppvObj = SAFECAST(this, CGetSAPIObject *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CGetSAPIObject::AddRef(void)
|
|
{
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CGetSAPIObject::Release(void)
|
|
{
|
|
long cr;
|
|
cr = InterlockedDecrement(&m_cRef);
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
return cr;
|
|
}
|
|
|
|
//
|
|
// ITfFunction
|
|
//
|
|
STDMETHODIMP CGetSAPIObject::GetDisplayName(BSTR *pbstrName)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if (pbstrName)
|
|
{
|
|
*pbstrName = SysAllocString(L"Get SAPI objects");
|
|
if (!*pbstrName)
|
|
hr = E_OUTOFMEMORY;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//
|
|
// ITfFnGetSAPIObject
|
|
//
|
|
|
|
static const struct {
|
|
TfSapiObject sObj;
|
|
const GUID *riid;
|
|
BOOL fInit;
|
|
} SapiInterfaceTbl[] =
|
|
{
|
|
{GETIF_RESMGR , &IID_ISpResourceManager, TRUE },
|
|
|
|
{GETIF_RECOCONTEXT , &IID_ISpRecoContext, TRUE},
|
|
|
|
{GETIF_RECOGNIZER , &IID_ISpRecognizer, TRUE},
|
|
{GETIF_VOICE , &IID_ISpVoice, TRUE},
|
|
{GETIF_DICTGRAM , &IID_ISpRecoGrammar, TRUE},
|
|
{GETIF_RECOGNIZERNOINIT , &IID_ISpRecognizer, FALSE},
|
|
|
|
};
|
|
|
|
STDMETHODIMP CGetSAPIObject::Get(TfSapiObject sObj, IUnknown **ppunk)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
//
|
|
// sObj is an index to SapiInterfaceTbl[]
|
|
//
|
|
Assert(GETIF_RESMGR == 0);
|
|
|
|
if (ppunk)
|
|
*ppunk = NULL;
|
|
|
|
if(sObj < ARRAYSIZE(SapiInterfaceTbl))
|
|
{
|
|
CSpTask *psptask = NULL;
|
|
if (S_OK == m_psi->GetSpeechTask(&psptask, SapiInterfaceTbl[sObj].fInit))
|
|
{
|
|
hr = psptask->GetSAPIInterface(*(SapiInterfaceTbl[sObj].riid), (void **)ppunk);
|
|
}
|
|
SafeRelease(psptask);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
//
|
|
// IsSupported() (internal)
|
|
// returns S_OK when the passed in IID is supported,
|
|
// otherwise returns S_FALSE
|
|
//
|
|
//
|
|
HRESULT CGetSAPIObject::IsSupported(REFIID riid, TfSapiObject *psObj)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
Assert(psObj);
|
|
|
|
for (int i = 0; i < ARRAYSIZE(SapiInterfaceTbl); i++)
|
|
{
|
|
Assert(i == SapiInterfaceTbl[i].sObj);
|
|
|
|
if (IsEqualGUID(*SapiInterfaceTbl[i].riid, riid))
|
|
{
|
|
*psObj = SapiInterfaceTbl[i].sObj;
|
|
hr = S_OK;
|
|
|
|
break;
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CFnBalloon
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// IUnknown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CFnBalloon::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfFnBalloon))
|
|
{
|
|
*ppvObj = SAFECAST(this, CFnBalloon *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDAPI_(ULONG) CFnBalloon::AddRef()
|
|
{
|
|
return InterlockedIncrement(&_cRef);
|
|
}
|
|
|
|
STDAPI_(ULONG) CFnBalloon::Release()
|
|
{
|
|
long cr;
|
|
|
|
cr = InterlockedDecrement(&_cRef);
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CFnBalloon::CFnBalloon(CSapiIMX *psi) : CFunction(psi)
|
|
{
|
|
_cRef = 1;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CFnBalloon::~CFnBalloon()
|
|
{
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CFnBalloon::GetDisplayName(BSTR *pbstrName)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if (pbstrName)
|
|
{
|
|
*pbstrName = SysAllocString(L"Speech Conversion");
|
|
if (!*pbstrName)
|
|
hr = E_OUTOFMEMORY;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CFnBalloon::UpdateBalloon
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CFnBalloon::UpdateBalloon(TfLBBalloonStyle style, const WCHAR *pch, ULONG cch)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
if (!m_pImx->GetSpeechUIServer())
|
|
return hr;
|
|
|
|
m_pImx->GetSpeechUIServer()->UpdateBalloon(style, pch, cch);
|
|
return hr;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CFnAbort
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// IUnknown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CFnAbort::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfFnAbort))
|
|
{
|
|
*ppvObj = SAFECAST(this, CFnAbort *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDAPI_(ULONG) CFnAbort::AddRef()
|
|
{
|
|
return InterlockedIncrement(&_cRef);
|
|
}
|
|
|
|
STDAPI_(ULONG) CFnAbort::Release()
|
|
{
|
|
long cr;
|
|
|
|
cr = InterlockedDecrement(&_cRef);
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CFnAbort::CFnAbort(CSapiIMX *psi) : CFunction(psi)
|
|
{
|
|
_cRef = 1;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CFnAbort::~CFnAbort()
|
|
{
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CFnAbort::GetDisplayName(BSTR *pbstrName)
|
|
{
|
|
HRESULT hr = E_INVALIDARG;
|
|
|
|
if (pbstrName)
|
|
{
|
|
*pbstrName = SysAllocString(L"Speech Abort Pending Conversion");
|
|
if (!*pbstrName)
|
|
hr = E_OUTOFMEMORY;
|
|
else
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CFnAbort::Abort
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CFnAbort::Abort(ITfContext *pctxt)
|
|
{
|
|
HRESULT hr;
|
|
|
|
Assert(m_pImx);
|
|
Assert(pctxt);
|
|
|
|
// put up the hour glass
|
|
HCURSOR hCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
|
|
|
|
hr = m_pImx->_RequestEditSession(ESCB_ABORT,TF_ES_READWRITE | TF_ES_SYNC, NULL, pctxt);
|
|
|
|
if (hCur)
|
|
SetCursor(hCur);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CFnConfigure::Show
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
STDMETHODIMP CFnConfigure::Show(HWND hwndParent, LANGID langid, REFGUID rguidProfile)
|
|
{
|
|
m_psi->_InvokeSpeakerOptions( TRUE );
|
|
|
|
return S_OK;
|
|
};
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CFnPropertyUIStatus implementation
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//
|
|
// IUnknown
|
|
//
|
|
STDMETHODIMP CFnPropertyUIStatus::QueryInterface(REFGUID riid, LPVOID *ppvObj)
|
|
{
|
|
Assert(ppvObj);
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfFnPropertyUIStatus))
|
|
{
|
|
*ppvObj = SAFECAST(this, CFnPropertyUIStatus *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CFnPropertyUIStatus::AddRef(void)
|
|
{
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) CFnPropertyUIStatus::Release(void)
|
|
{
|
|
long cr;
|
|
cr = InterlockedDecrement(&m_cRef);
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
return cr;
|
|
}
|
|
|
|
STDMETHODIMP CFnPropertyUIStatus::GetStatus(REFGUID refguidProp, DWORD *pdw)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
|
|
if (pdw)
|
|
{
|
|
*pdw = 0;
|
|
}
|
|
else
|
|
{
|
|
hr = E_INVALIDARG;
|
|
}
|
|
|
|
if (SUCCEEDED(hr) &&
|
|
IsEqualGUID(refguidProp, GUID_PROP_SAPIRESULTOBJECT))
|
|
{
|
|
*pdw |= m_psi->_SerializeEnabled() ?
|
|
TF_PROPUI_STATUS_SAVETOFILE : 0;
|
|
hr = S_OK;
|
|
}
|
|
return hr;
|
|
}
|