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.
 
 
 
 
 
 

721 lines
16 KiB

/****************************************************************************
IMC.H
Owner: cslim
Copyright (c) 1997-1999 Microsoft Corporation
IME Context abstraction class
History:
20-JUL-1999 cslim Created
*****************************************************************************/
#if !defined(_IMC_H__INCLUDED_)
#define _IMC_H__INCLUDED_
#include "gdata.h"
// No GCS_COMPCLAUSE
#define GCS_COMP_KOR (GCS_COMPSTR|GCS_COMPATTR)
class CIMECtx
{
// Ctor and Dtor
public:
CIMECtx(HIMC hIMC);
~CIMECtx();
// CIMECtx Methods
public:
CIMEData* GetGData();
LPIMEDATA GetGDataRaw();
CHangulAutomata* GetAutomata();
HIMC GetHIMC();
HWND GetAppWnd();
HWND GetUIWnd();
VOID SetUIWnd(HWND hUIWnd);
HIMCC GetHCandInfo();
LPCANDIDATEINFO GetPCandInfo();
HIMCC GetHCompStr();
HIMCC GetHMsgBuf();
BOOL IsOpen();
VOID SetOpen(BOOL fOpen);
VOID SetStatusWndPos(POINT &pt);
VOID GetStatusWndPos(POINT* pPt);
DWORD SetConversionMode(DWORD dwConvMode);
DWORD GetConversionMode();
DWORD SetSentenceMode(DWORD dwSentMode);
DWORD GetSentenceMode();
LOGFONT* GetLogFont();
// Initial status
VOID SetInitStatus(DWORD dwInitState);
VOID GetInitStatus(LPDWORD pdwInitState);
// Composition string
VOID SetCompositionStr(WCHAR wch);
WCHAR GetCompositionStr();
WCHAR GetCompBufStr();
VOID SetCompBufStr(WCHAR wch);
VOID SetCompBufStr(CHAR chHigh, CHAR chLow);
VOID ClearCompositionStrBuffer();
VOID SetResultStr(WCHAR* pwSz);
VOID SetResultStr(WCHAR wch1, WCHAR wch2=0);
VOID AppendResultStr(WCHAR wch);
VOID FinalizeCurCompositionChar();
VOID ResetComposition();
VOID StoreComposition();
BOOL IsCompositionString();
DWORD GetCompBufLen();
VOID SetStartComposition(BOOL fStart);
VOID SetEndComposition(BOOL fEnd);
//LPCOMPOSITIONSTRING GetCompositionStrBuffer() { DbgAssert(m_pCompStr!=NULL); return m_pCompStr; }
// Cand string
VOID ResetCandidate();
VOID AppendCandidateStr(WCHAR wcCand, LPWSTR wszMeaning);
WCHAR GetCandidateStr(INT iIdx);
LPWSTR GetCandidateMeaningStr(INT iIdx);
INT GetCandidateCount();
VOID StoreCandidate();
enum MSG_CAND { MSG_NONE = 0, MSG_OPENCAND, MSG_CLOSECAND, MSG_CHANGECAND };
VOID SetCandidateMsg(UINT uiMsg);
VOID SetCandStrSelection(DWORD dwSel);
// Composition form
VOID GetCompositionForm(LPCOMPOSITIONFORM* ppCompForm);
VOID SetCompositionFormStyle(DWORD dwStyle);
DWORD GetCompositionFormStyle();
VOID SetCompositionFormPos(POINT pt);
VOID GetCompositionForm(POINT* pPt);
VOID GetCompositionForm(RECT* pRc);
// Cand Form
DWORD GetCandidateFormIndex(INT iIdxCand);
VOID SetCandidateFormIndex(INT iIdx, INT iIdxCand = 0);
DWORD GetCandidateFormStyle(INT iIdxCand = 0);
VOID SetCandidateFormStyle(DWORD dwStyle, INT iIdxCand = 0);
VOID GetCandidateForm(RECT* pRc, INT iIdxCand = 0);
VOID SetCandidateFormArea(RECT* pRc, INT iIdxCand = 0);
VOID GetCandidateFormPos(POINT* pPt, INT iIdxCand = 0);
VOID SetCandidateFormPos(POINT pt, INT iIdxCand = 0);
/////////////////////////////////////////////////
// MSG buffer structure support
VOID SetTransMessage(LPTRANSMSGLIST pMessage);
VOID ResetMessage();
INT GetMessageCount();
BOOL FinalizeMessage();
VOID FlushCandMessage();
BOOL GenerateMessage();
INT AddMessage(UINT uiMessage, WPARAM wParam = 0, LPARAM lParam = 0);
VOID AddKeyDownMessage(WPARAM wParam = 0, LPARAM lParam = 0);
/////////////////////////////////////////////////
// Unicode environment
BOOL IsUnicodeEnv(VOID);
VOID SetUnicode(BOOL fUnicode);
VOID NonUnicodeConversion(WCHAR* pwStr, INT* pcchStr, CHAR* pwOStr, BYTE* pbAtr, INT* pcchAtr, BYTE* pbOAtr, DWORD* pdwCls, INT* pcchCls, DWORD* pdwOCls);
VOID SetProcessKeyStatus(BOOL fSet);
BOOL IsProcessKeyStatus(VOID);
// new and delete operator overloading
void* operator new(size_t size);
void operator delete(void *lp);
// Implementation
private:
VOID InitCompStrStruct();
/////////////////////////////////////////////////
// Private status
VOID ResetGCS();
DWORD GetGCS();
VOID DelGCS(DWORD dwGCS);
VOID AddGCS(DWORD dwGCS);
DWORD ValidateGCS();
void ClearCandMeaningArray();
// Implementation
protected:
CIMEData* m_pCIMEData;
// Internal data
private:
// IME Context handle and pointer
HIMC m_hIMC;
LPINPUTCONTEXT m_pIMC;
// hangul Automata. Created once and will be shared between all apps.
CHangulAutomata* m_rgpHangulAutomata[NUM_OF_IME_KL];
// Unicode flag
BOOL m_fUnicode; // TRUE=UNICODE env. FALSE=NON UNICODE env
// Composition string support
LPCOMPOSITIONSTRING m_pCompStr;
// Candidate list support
LPCANDIDATEINFO m_pCandInfo;
INT m_iciCandidate;
LPWSTR m_pCandStr;
LPWSTR* m_rgpCandMeaningStr;
// Msg generation support
BOOL m_fEndComposition; // don't call AddMes( WM_IME_ENDCOMPOSITION) now
BOOL m_fStartComposition; // don't call AddMes( WM_IME_STARTCOMPOSITION) now
// BOOL m_fStartCompMsgSent;
UINT m_uiSendCand;
BOOL m_fKeyProcessing; // TRUE while ImeProcessKey()
// REVIEW: see KKIME ui.cpp SetOpenStatusWindow( TRUE );
BOOL m_fOpenStatusWindow; // open status window status
// for WM_IME_COMPOSITION flag
DWORD m_dwGCS;
/////////////////////////////////////////////////
// Composition string buffer
WCHAR m_wcComp; // Comp string always 1 char long
WCHAR m_wzResult[nMaxResultStrLen + 2]; // Result string maximum 2 chars + one null + one extra wchar
// ANSI Composition string
UCHAR m_szComp[nMaxCompStrLen*2 + 2]; // 2: one null + extra byte
UCHAR m_szResult[nMaxResultStrLen*2 + 4]; // 2: one null + extra bytes
/////////////////////////////////////////////////
// MSG buffer structure support
UINT m_uiMsgCount;
LPTRANSMSG m_pMessage;
LPTRANSMSGLIST m_pTransMessage; // for ToAsciiEx
// WM_IME_KEYDOWN support
BOOL m_fKeyDown;
WPARAM m_wParamKeyDown;
LPARAM m_lParamKeyDown;
/////////////////////////////////////////////////
// Private status
DWORD m_dwCandInfoSize;
DWORD m_dwMessageSize;
};
typedef CIMECtx* PCIMECtx;
//////////////////////////////////////////////////////////////////////////////
// Inline functions
__inline
CIMEData* CIMECtx::GetGData()
{
return m_pCIMEData;
}
__inline
LPIMEDATA CIMECtx::GetGDataRaw()
{
if (m_pCIMEData)
return m_pCIMEData->GetGDataRaw();
else
return NULL;
}
__inline
CHangulAutomata* CIMECtx::GetAutomata()
{
AST_EX(m_pCIMEData != NULL);
if (m_pCIMEData)
return m_rgpHangulAutomata[m_pCIMEData->GetCurrentBeolsik()];
else
return m_rgpHangulAutomata[0];
}
__inline
HIMC CIMECtx::GetHIMC()
{
return m_hIMC;
}
__inline
HWND CIMECtx::GetAppWnd() // m_hIMC->hWnd
{
AST_EX(m_pIMC != NULL);
if (m_pIMC == NULL)
return (HWND)0;
return m_pIMC->hWnd;
}
__inline
HIMCC CIMECtx::GetHCandInfo()
{
AST_EX(m_pIMC != NULL);
AST_EX(m_pIMC->hCandInfo != (HIMCC)0);
if (m_pIMC == NULL)
return NULL;
return m_pIMC->hCandInfo;
}
__inline
LPCANDIDATEINFO CIMECtx::GetPCandInfo()
{
return m_pCandInfo;
}
__inline
HIMCC CIMECtx::GetHCompStr()
{
AST_EX(m_pIMC != NULL);
AST_EX(m_pIMC->hCompStr != (HIMCC)0);
if (m_pIMC == NULL)
return NULL;
return m_pIMC->hCompStr;
}
__inline
HIMCC CIMECtx::GetHMsgBuf()
{
AST_EX(m_pIMC != NULL);
AST_EX(m_pIMC->hMsgBuf != (HIMCC)0);
if (m_pIMC == NULL)
return NULL;
return m_pIMC->hMsgBuf;
}
__inline
VOID CIMECtx::SetOpen(BOOL fOpen)
{
m_pIMC->fOpen = fOpen;
}
__inline
BOOL CIMECtx::IsOpen()
{
// sometime IMM sets 0xffffffff as TRUE
if (m_pIMC == NULL)
return fFalse;
return (m_pIMC->fOpen ? fTrue : fFalse);
}
__inline
VOID CIMECtx::SetStatusWndPos(POINT &pt)
{
m_pIMC->ptStatusWndPos = pt;
}
__inline
VOID CIMECtx::GetStatusWndPos(POINT* pPt)
{
*pPt = m_pIMC->ptStatusWndPos;
}
__inline
DWORD CIMECtx::SetConversionMode(DWORD dwConvMode)
{
DWORD dwPrevConv = m_pIMC->fdwConversion;
m_pIMC->fdwConversion = dwConvMode;
return dwPrevConv; // return previous conversion mode
}
__inline
DWORD CIMECtx::GetConversionMode()
{
return m_pIMC->fdwConversion;
}
__inline
DWORD CIMECtx::SetSentenceMode(DWORD dwSentMode)
{
DWORD dwPrevSent = m_pIMC->fdwSentence;
m_pIMC->fdwSentence = dwSentMode;
return dwPrevSent; // return previous sentence mode
}
__inline
DWORD CIMECtx::GetSentenceMode()
{
return m_pIMC->fdwSentence;
}
__inline
LOGFONT* CIMECtx::GetLogFont()
{
return (&(m_pIMC->lfFont.A));
}
// Composition form
__inline
VOID CIMECtx::GetCompositionForm(LPCOMPOSITIONFORM *ppCompForm)
{
*ppCompForm = &m_pIMC->cfCompForm;
}
__inline
VOID CIMECtx::SetCompositionFormStyle(DWORD dwStyle)
{
m_pIMC->cfCompForm.dwStyle = dwStyle;
}
__inline
DWORD CIMECtx::GetCompositionFormStyle()
{
return m_pIMC->cfCompForm.dwStyle;
}
__inline
VOID CIMECtx::SetCompositionFormPos(POINT pt)
{
m_pIMC->cfCompForm.ptCurrentPos = pt;
}
__inline
VOID CIMECtx::GetCompositionForm(POINT* pPt)
{
pPt->x = m_pIMC->cfCompForm.ptCurrentPos.x;
pPt->y = m_pIMC->cfCompForm.ptCurrentPos.y;
}
__inline
VOID CIMECtx::GetCompositionForm(RECT* pRc)
{
CopyRect(pRc, &m_pIMC->cfCompForm.rcArea);
}
__inline
VOID CIMECtx::SetInitStatus(DWORD dwInitState)
{
m_pIMC->fdwInit = dwInitState;
}
__inline
VOID CIMECtx::GetInitStatus(LPDWORD pdwInitState)
{
*pdwInitState = m_pIMC->fdwInit;
}
__inline
VOID CIMECtx::SetCompositionStr(WCHAR wch)
{
DbgAssert(wch != 0);
m_wcComp = wch;
AddGCS(GCS_COMPSTR);
}
__inline
WCHAR CIMECtx::GetCompositionStr()
{
return m_wcComp;
}
// WARNING: This function will set raw data to comp buffer directly.
// Pls. very careful to use this function. It could break everything.
__inline
VOID CIMECtx::SetCompBufStr(WCHAR wch)
{
DbgAssert(IsUnicodeEnv() == fTrue);
m_pCompStr->dwCompStrLen = m_pCompStr->dwCompAttrLen = 1;
*((LPBYTE)m_pCompStr + m_pCompStr->dwCompAttrOffset) = ATTR_INPUT;
*(LPWSTR)((LPBYTE)m_pCompStr + m_pCompStr->dwCompStrOffset) = wch;
}
// For ANSI conversion
__inline
VOID CIMECtx::SetCompBufStr(CHAR chHigh, CHAR chLow)
{
DbgAssert(IsUnicodeEnv() == fFalse);
m_pCompStr->dwCompStrLen = 2;
m_pCompStr->dwCompAttrLen = 1;
*((LPBYTE)m_pCompStr + m_pCompStr->dwCompAttrOffset) = ATTR_INPUT;
*(LPSTR)((LPBYTE)m_pCompStr + m_pCompStr->dwCompStrOffset) = chHigh;
*(LPSTR)((LPBYTE)m_pCompStr + m_pCompStr->dwCompStrOffset + 1) = chLow;
}
// WARNING: This function will set raw data to comp buffer directly.
// Pls. very careful to use this function. It could break everything.
__inline
VOID CIMECtx::ClearCompositionStrBuffer()
{
Dbg(DBGID_Key, TEXT("ClearCompositionStrBuffer():"));
if (m_pCompStr)
{
m_pCompStr->dwCompStrLen = m_pCompStr->dwCompAttrLen = 0;
*(LPWSTR)((LPBYTE)m_pCompStr + m_pCompStr->dwCompStrOffset) = L'\0';
*((LPBYTE)m_pCompStr + m_pCompStr->dwCompAttrOffset) = 0;
}
}
__inline
VOID CIMECtx::SetResultStr(LPWSTR pwSz)
{
DbgAssert(pwSz != NULL);
m_wzResult[0] = *pwSz++;
m_wzResult[1] = *pwSz;
AddGCS(GCS_RESULTSTR);
}
__inline
VOID CIMECtx::SetResultStr(WCHAR wch1, WCHAR wch2)
{
DbgAssert(wch1 != 0);
Dbg(DBGID_Key, "CIMECtx::SetResultStr - wch1 = 0x%04X, wch2 = 0x%04X", wch1, wch2);
m_wzResult[0] = wch1;
m_wzResult[1] = wch2;
AddGCS(GCS_RESULTSTR);
}
__inline
VOID CIMECtx::AppendResultStr(WCHAR wch)
{
DbgAssert(wch != 0);
if (m_wzResult[0] == L'\0')
m_wzResult[0] = wch;
else
m_wzResult[1] = wch;
AddGCS(GCS_RESULTSTR);
}
__inline
VOID CIMECtx::FinalizeCurCompositionChar()
{
if (GetAutomata() != NULL)
{
GetAutomata()->MakeComplete();
SetResultStr(GetAutomata()->GetCompleteChar());
}
SetEndComposition(fTrue);
if (!IsProcessKeyStatus())
StoreComposition();
}
__inline
VOID CIMECtx::ResetComposition()
{
m_wcComp = L'\0';
ZeroMemory(m_wzResult, sizeof(m_wzResult));
}
__inline
BOOL CIMECtx::IsCompositionString()
{
return (m_wcComp ? fTrue : fFalse);
}
__inline
DWORD CIMECtx::GetCompBufLen()
{
if (GetHCompStr() != NULL)
return (m_pCompStr->dwCompStrLen);
else
return 0;
}
__inline
VOID CIMECtx::SetStartComposition(BOOL fStart)
{
m_fStartComposition = fStart;
}
__inline
VOID CIMECtx::SetEndComposition(BOOL fEnd)
{
m_fEndComposition = fEnd;
}
__inline
VOID CIMECtx::ResetCandidate()
{
ClearCandMeaningArray();
m_iciCandidate = 0;
}
__inline
INT CIMECtx::GetCandidateCount()
{
return m_iciCandidate;
}
__inline
VOID CIMECtx::SetCandidateMsg(UINT uiMsg)
{
m_uiSendCand = uiMsg;
}
__inline
VOID CIMECtx::SetCandStrSelection(DWORD dwSel)
{
LPCANDIDATELIST lpCandList;
if (m_pCandInfo == NULL || m_pCandInfo->dwCount == 0)
{
DbgAssert(0);
return;
}
lpCandList = (LPCANDIDATELIST)((LPBYTE)m_pCandInfo + sizeof(CANDIDATEINFO));
lpCandList->dwPageStart = (dwSel / lpCandList->dwPageSize) * lpCandList->dwPageSize;
lpCandList->dwSelection = dwSel;
}
/////////////////////////////////////////////////
// Candidate form
__inline
DWORD CIMECtx::GetCandidateFormIndex(INT iIdxCand)
{
return m_pIMC->cfCandForm[iIdxCand].dwIndex;
}
__inline
VOID CIMECtx::SetCandidateFormIndex(INT iIdx, INT iIdxCand)
{
m_pIMC->cfCandForm[iIdxCand].dwIndex = (DWORD)iIdx;
}
__inline
VOID CIMECtx::SetCandidateFormStyle(DWORD dwStyle, INT iIdxCand)
{
m_pIMC->cfCandForm[iIdxCand].dwStyle = dwStyle;
}
__inline
DWORD CIMECtx::GetCandidateFormStyle(INT iIdxCand)
{
return m_pIMC->cfCandForm[iIdxCand].dwStyle;
}
__inline
VOID CIMECtx::GetCandidateForm(RECT* pRc, INT iIdxCand)
{
CopyRect( pRc, &m_pIMC->cfCandForm[iIdxCand].rcArea );
}
__inline
VOID CIMECtx::SetCandidateFormArea(RECT* pRc, INT iIdxCand)
{
CopyRect( &m_pIMC->cfCandForm[iIdxCand].rcArea, pRc );
}
__inline
VOID CIMECtx::GetCandidateFormPos(POINT* pPt, INT iIdxCand)
{
pPt->x = m_pIMC->cfCandForm[iIdxCand].ptCurrentPos.x;
pPt->y = m_pIMC->cfCandForm[iIdxCand].ptCurrentPos.y;
}
__inline
VOID CIMECtx::SetCandidateFormPos(POINT pt, INT iIdxCand)
{
m_pIMC->cfCandForm[iIdxCand].ptCurrentPos = pt;
}
/////////////////////////////////////////////////
// MSG buffer structure support
__inline
VOID CIMECtx::SetTransMessage(LPTRANSMSGLIST pMessage)
{
m_pTransMessage = pMessage;
}
__inline
VOID CIMECtx::ResetMessage()
{
m_uiMsgCount = 0;
m_pTransMessage = NULL; // trans message now NULL
m_fEndComposition = fFalse;
m_fStartComposition = fFalse;
m_uiSendCand = 0;
m_fKeyDown = fFalse;
}
__inline
INT CIMECtx::GetMessageCount()
{
return m_uiMsgCount;
}
__inline
VOID CIMECtx::AddKeyDownMessage(WPARAM wParam, LPARAM lParam)
{
m_fKeyDown = fTrue;
m_wParamKeyDown = wParam;
m_lParamKeyDown = lParam;
}
/////////////////////////////////////////////////
// Unicode environment
__inline
BOOL CIMECtx::IsUnicodeEnv(VOID)
{
return m_fUnicode;
}
/////////////////////////////////////////////////
// Private status
__inline
VOID CIMECtx::ResetGCS(VOID)
{
m_dwGCS = 0;
}
__inline
DWORD CIMECtx::GetGCS(VOID)
{
return m_dwGCS;
}
__inline
VOID CIMECtx::DelGCS(DWORD dwGCS)
{
m_dwGCS &= ~dwGCS;
}
__inline
VOID CIMECtx::AddGCS(DWORD dwGCS)
{
m_dwGCS |= dwGCS;
}
__inline
DWORD CIMECtx::ValidateGCS(VOID)
{
if (m_wcComp == 0)
DelGCS(GCS_COMP_KOR);
if (m_wzResult[0] == 0)
DelGCS(GCS_RESULT);
return m_dwGCS;
}
__inline
VOID CIMECtx::SetUnicode(BOOL fUnicode)
{
m_fUnicode = fUnicode;
}
__inline
VOID CIMECtx::SetProcessKeyStatus(BOOL fSet)
{
m_fKeyProcessing = fSet;
}
__inline
BOOL CIMECtx::IsProcessKeyStatus(VOID)
{
return m_fKeyProcessing;
}
__inline
void* CIMECtx::operator new(size_t size)
{
return (void*)GlobalAllocPtr(GHND, size);
}
__inline
void CIMECtx::operator delete(void* pv)
{
if (pv)
GlobalFreePtr(pv);
}
#endif // _IMC_H__INCLUDED_