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.
 
 
 
 
 
 

376 lines
13 KiB

/****************************************************************************
IPOINT.CPP
Owner: cslim
Copyright (c) 1997-1999 Microsoft Corporation
IImeIPoint1 interface
History:
24-OCT-2001 cslim Branched for Cicero TIP PAD support
20-JUL-1999 cslim Created
*****************************************************************************/
#include "private.h"
#include "korimx.h"
#include "ipointcic.h"
#include "editssn.h"
#include "imepad.h" // IImeIPoint
#include "debug.h"
/*----------------------------------------------------------------------------
CImeIPoint::CImeIPoint
Ctor
----------------------------------------------------------------------------*/
CIPointCic::CIPointCic(CKorIMX *pImx)
{
Assert(m_pImx != NULL);
m_cRef = 0;
m_pImx = pImx;
m_pic = NULL;
m_dwCharNo = 1;
}
/*----------------------------------------------------------------------------
CImeIPoint::~CIPointCic
Dtor
----------------------------------------------------------------------------*/
CIPointCic::~CIPointCic()
{
SafeReleaseClear(m_pic);
}
/*----------------------------------------------------------------------------
CImeIPoint::QueryInterface
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::QueryInterface(REFIID riid, LPVOID * ppv)
{
if(riid == IID_IUnknown)
{
TraceMsg(DM_TRACE, TEXT("IID_IUnknown\n"));
*ppv = static_cast<IImeIPoint1 *>(this);
}
else
if(riid == IID_IImeIPoint1)
{
TraceMsg(DM_TRACE, TEXT("IID_IImeIPoint1\n"));
*ppv = static_cast<IImeIPoint1 *>(this);
}
else
{
TraceMsg(DM_TRACE, TEXT("Unknown Interface ID\n"));
*ppv = NULL;
return E_NOINTERFACE;
}
// Increase ref counter
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
return S_OK;
}
/*----------------------------------------------------------------------------
CImeIPoint::AddRef
----------------------------------------------------------------------------*/
STDMETHODIMP_(ULONG) CIPointCic::AddRef(VOID)
{
return InterlockedIncrement((LPLONG)&m_cRef);
}
/*----------------------------------------------------------------------------
CImeIPoint::Release
----------------------------------------------------------------------------*/
STDMETHODIMP_(ULONG) CIPointCic::Release(VOID)
{
ULONG res = InterlockedDecrement((LPLONG)&m_cRef);
if (res == 0L)
delete this;
return res;
}
/*----------------------------------------------------------------------------
CImeIPoint::Initialize
----------------------------------------------------------------------------*/
HRESULT CIPointCic::Initialize(ITfContext *pic)
{
SafeReleaseClear(m_pic);
m_pic = pic;
if (m_pic)
{
m_pic->AddRef();
}
return (S_OK);
}
#ifndef DEBUG
#define DumpFEInfo /##/
#else
/*----------------------------------------------------------------------------
DumpFEInfo
Dump LPIMEFAREASTINFO. Debug only
----------------------------------------------------------------------------*/
VOID DumpFEInfo(LPIMEFAREASTINFO lpInfo, INT count)
{
TraceMsg(DM_TRACE, TEXT("DumpFEInfo Start\n"));
TraceMsg(DM_TRACE, TEXT("lpInfo [0x%08x]\n"), lpInfo);
TraceMsg(DM_TRACE, TEXT("lpInfo->dwSize [%d]\n"), lpInfo->dwSize);
TraceMsg(DM_TRACE, TEXT("lpInfo->dwType [0x%08x]\n"), lpInfo->dwType);
LPWSTR lpwstr;
switch(lpInfo->dwType)
{
case IMEFAREASTINFO_TYPE_COMMENT:
TraceMsg(DM_TRACE, TEXT("-->dwType is IMEFAREASTINFO_TYPE_COMMENT\n"));
lpwstr = (LPWSTR)lpInfo->dwData;
for(int i=0;i < count; i++)
{
//DbgW(DBGID_IMEPAD, L"%d [%s]\n", i, lpwstr);
lpwstr = lpwstr + lstrlenW(lpwstr)+1;
}
break;
}
TraceMsg(DM_TRACE, TEXT("DumpFEInfo End\n"));
}
#endif // _DEBUG
/*----------------------------------------------------------------------------
CImeIPoint::InsertImeItem
Multibox input call this method
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::InsertImeItem(IPCANDIDATE* pImeItem, INT iPos, DWORD *lpdwCharId)
{
DWORD dwCharId;
CEditSession2 *pes;
ESSTRUCT ess;
HRESULT hr;
// Check Parameters
Assert(pImeItem != NULL && pImeItem->dwSize > 0);
if (pImeItem == NULL || pImeItem->dwSize <= 0 || m_pImx == NULL || m_pic == NULL)
return S_FALSE;
TraceMsg(DM_TRACE, TEXT("CImeIPoint::InsertImeItem\n"));
TraceMsg(DM_TRACE, TEXT("pImeItem [0x%08x]\n"), pImeItem);
TraceMsg(DM_TRACE, TEXT("pImeItem->dwSize [%d]\n"), pImeItem->dwSize);
TraceMsg(DM_TRACE, TEXT("pImeItem->iSelIndex [%d]\n"), pImeItem->iSelIndex);
TraceMsg(DM_TRACE, TEXT("pImeItem->nCandidate[%d]\n"), pImeItem->nCandidate);
TraceMsg(DM_TRACE, TEXT("pImeItem->dwPrivateDataOffset[%d]\n"), pImeItem->dwPrivateDataOffset);
TraceMsg(DM_TRACE, TEXT("pImeItem->dwPrivateDataSize [%d]\n"), pImeItem->dwPrivateDataSize);
DumpFEInfo((LPIMEFAREASTINFO)((LPBYTE)pImeItem + pImeItem->dwPrivateDataOffset), pImeItem->nCandidate);
TraceMsg(DM_TRACE, TEXT("lpdwCharId [0x%08x] [%d]\n"), lpdwCharId, lpdwCharId ? *lpdwCharId : 0xFFFFF);
// Finalize current comp string
ESStructInit(&ess, ESCB_COMPLETE);
if ((pes = new CEditSession2(m_pic, m_pImx, &ess, CKorIMX::_EditSessionCallback2)))
{
pes->Invoke(ES2_READWRITE | ES2_SYNCASYNC, &hr);
pes->Release();
}
ESStructInit(&ess, ESCB_INSERT_PAD_STRING);
ess.wParam = *(LPWSTR)((PBYTE)pImeItem + pImeItem->dwOffset[0]);
if ((pes = new CEditSession2(m_pic, m_pImx, &ess, CKorIMX::_EditSessionCallback2)))
{
pes->Invoke(ES2_READWRITE | ES2_SYNCASYNC, &hr);
pes->Release();
}
// Increase Char serial number
m_dwCharNo++;
dwCharId = m_dwCharNo;
if (lpdwCharId)
{
dwCharId |= ((*lpdwCharId) & (~ IPCHARID_CHARNO_MASK));
*lpdwCharId = dwCharId;
}
return (S_OK);
}
/*----------------------------------------------------------------------------
CImeIPoint::ReplaceImeItem
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::ReplaceImeItem(
INT iPos, // = IPINS_CURRENT:use current IP position and
// set IP to the end of insert chars.
// = 0-n: The offset of all composition string to set
// IP position, before insert chars.
// and IP back to original position.
INT iTargetLen,
IPCANDIDATE* pImeItem,
DWORD *lpdwCharId)
{
return (E_NOTIMPL);
}
/*----------------------------------------------------------------------------
CImeIPoint::InsertStringEx
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::InsertStringEx(WCHAR* pwSzInsert, INT cchSzInsert, DWORD *lpdwCharId)
{
DWORD dwCharId;
CEditSession2 *pes;
ESSTRUCT ess;
HRESULT hr;
TraceMsg(DM_TRACE, TEXT("CIPointCic::InsertStringEx : *pwSzInsert=0x%04X, cchSzInsert=%d, *lpdwCharId = 0x%04X"), *pwSzInsert, cchSzInsert, *lpdwCharId);
// Check Parameters
Assert(pwSzInsert != NULL && cchSzInsert > 0);
if (pwSzInsert == NULL || cchSzInsert <= 0 || m_pImx == NULL || m_pic == NULL)
return S_FALSE;
// Finalize current comp string
ESStructInit(&ess, ESCB_COMPLETE);
if ((pes = new CEditSession2(m_pic, m_pImx, &ess, CKorIMX::_EditSessionCallback2)))
{
pes->Invoke(ES2_READWRITE | ES2_SYNCASYNC, &hr);
pes->Release();
}
// Add all chars in string as finalized string
for (INT i=0; i<cchSzInsert; i++)
{
ESStructInit(&ess, ESCB_INSERT_PAD_STRING);
ess.wParam = *(pwSzInsert + i);
if ((pes = new CEditSession2(m_pic, m_pImx, &ess, CKorIMX::_EditSessionCallback2)))
{
pes->Invoke(ES2_READWRITE | ES2_SYNCASYNC, &hr);
pes->Release();
}
// Increase Char serial number
m_dwCharNo++;
dwCharId = m_dwCharNo;
if (lpdwCharId)
{
dwCharId |= ((*lpdwCharId) & (~ IPCHARID_CHARNO_MASK));
*lpdwCharId = dwCharId;
}
}
return (S_OK);
}
/*----------------------------------------------------------------------------
CImeIPoint::DeleteCompString
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::DeleteCompString(INT iPos,
INT cchSzDel)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::DeleteCompString\n"));
return (E_NOTIMPL);
}
/*----------------------------------------------------------------------------
CImeIPoint::ReplaceCompString
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::ReplaceCompString(INT iPos,
INT iTargetLen,
WCHAR *pwSzInsert,
INT cchSzInsert,
DWORD *lpdwCharId)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::ReplaceCompString\n"));
return (E_NOTIMPL);
}
/*----------------------------------------------------------------------------
CImeIPoint::ControlIME
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::ControlIME(DWORD dwIMEFuncID, LPARAM lpara)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::ControlIME, dwIMEFuncID=0x%04X, lpara=0x%08lX\n"), dwIMEFuncID, lpara);
// TODO:
return (E_NOTIMPL);
}
/*----------------------------------------------------------------------------
CImeIPoint::GetAllCompositionInfo
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::GetAllCompositionInfo(WCHAR** ppwSzCompStr,
DWORD** ppdwCharID,
INT *pcchCompStr,
INT *piIPPos,
INT *piStartUndetStrPos,
INT *pcchUndetStr,
INT *piEditStart,
INT *piEditLen)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::GetAllCompositionInfo START\n"));
// Return nothing for now.
if(ppwSzCompStr)
{
*ppwSzCompStr = NULL;
}
if(ppdwCharID)
{
*ppdwCharID = NULL;
}
*pcchCompStr = 0;
*piIPPos = 0;
*piStartUndetStrPos = 0;
*pcchUndetStr =0;
*piEditStart = 0;
*piEditLen = 0;
TraceMsg(DM_TRACE, TEXT("CImeIPoint::GetAllCompositionInfo END\n"));
return (S_OK);
}
/*----------------------------------------------------------------------------
CImeIPoint::GetIpCandidate
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::GetIpCandidate(DWORD dwCharId,
IPCANDIDATE **ppImeItem,
INT * piColumn,
INT * piCount)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::GetIpCandidate\n"));
return (E_NOTIMPL);
}
/*----------------------------------------------------------------------------
CImeIPoint::SelectIpCandidate
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::SelectIpCandidate(DWORD dwCharId, INT iselno)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::SetIpCandidate\n"));
return (E_NOTIMPL);
}
/*----------------------------------------------------------------------------
CImeIPoint::UpdateContext
Update IME context and send it to the application
----------------------------------------------------------------------------*/
STDMETHODIMP CIPointCic::UpdateContext(BOOL fGenerateMessage)
{
TraceMsg(DM_TRACE, TEXT("CImeIPoint::UpdateContext\n"));
// TODO:
return (S_OK);
}