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.
845 lines
23 KiB
845 lines
23 KiB
//////////////////////////////////////////////////////////////////
|
|
// File : cpadsvrs.cpp
|
|
// Purpose : CImePadServer for Shared Memory version.
|
|
//
|
|
//
|
|
// Date : Fri Apr 16 15:39:33 1999
|
|
// Author : ToshiaK
|
|
//
|
|
// Copyright(c) 1995-1999, Microsoft Corp. All rights reserved
|
|
//////////////////////////////////////////////////////////////////
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
#include <windows.h>
|
|
#ifdef UNDER_CE // stub for CE
|
|
#include "stub_ce.h"
|
|
#endif // UNDER_CE
|
|
#include "imepadsv.h"
|
|
#include "cpadsvrs.h"
|
|
#include "cpadcb.h"
|
|
#include "cpaddbg.h"
|
|
#include "iimecb.h"
|
|
#include "ipoint1.h"
|
|
|
|
// Safe String
|
|
#define STRSAFE_NO_DEPRECATE
|
|
#include "strsafe.h"
|
|
|
|
//----------------------------------------------------------------
|
|
//misc definition
|
|
//----------------------------------------------------------------
|
|
#define Unref(a) UNREFERENCED_PARAMETER(a)
|
|
//990812:ToshiaK For Win64. Use Global Alloc/Free Ptr.
|
|
#include <windowsx.h>
|
|
#define MemAlloc(a) GlobalAllocPtr(GMEM_FIXED, a)
|
|
#define MemFree(a) GlobalFreePtr(a)
|
|
|
|
inline LPVOID
|
|
WinSetUserPtr(HWND hwnd, LPVOID lpVoid)
|
|
{
|
|
#ifdef _WIN64
|
|
return (LPVOID)SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lpVoid);
|
|
#else
|
|
return (LPVOID)SetWindowLong(hwnd, GWL_USERDATA, (LONG)lpVoid);
|
|
#endif
|
|
}
|
|
|
|
inline LPVOID
|
|
WinGetUserPtr(HWND hwnd)
|
|
{
|
|
#ifdef _WIN64
|
|
return (LPVOID)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
|
#else
|
|
return (LPVOID)GetWindowLong(hwnd, GWL_USERDATA);
|
|
#endif
|
|
}
|
|
|
|
static LPWSTR
|
|
StrdupW(LPWSTR lpwstr)
|
|
{
|
|
LPWSTR lpwstrRet;
|
|
if(!lpwstr) {
|
|
return NULL;
|
|
}
|
|
INT len = lstrlenW(lpwstr);
|
|
if(len == 0) {
|
|
return NULL;
|
|
}
|
|
lpwstrRet = (LPWSTR)MemAlloc((len+1) * sizeof(WCHAR));
|
|
if(!lpwstrRet) {
|
|
return NULL;
|
|
}
|
|
CopyMemory(lpwstrRet, lpwstr, sizeof(WCHAR)*len);
|
|
lpwstrRet[len] = (WCHAR)0x0000;
|
|
return lpwstrRet;
|
|
}
|
|
|
|
//----------------------------------------------------------------
|
|
//
|
|
//public method decalre
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CImePadSvrSharemem::CImePadSvrSharemem
|
|
// Type : None
|
|
// Purpose : Constructor of CImePadSvrSharemem class
|
|
// Args : None
|
|
// Return :
|
|
// DATE : Mon May 17 23:04:01 1999
|
|
// Histroy :
|
|
//////////////////////////////////////////////////////////////////
|
|
CImePadSvrSharemem::CImePadSvrSharemem(VOID)
|
|
{
|
|
DBG(("CImePadSvrSharemem::CImePadSvrSharemem() constructor START\n"));
|
|
m_imeLangID = 0; //Save Initialized data.
|
|
m_dwImeInputID = 0; //Save Initialized data.
|
|
m_fShowReqStatus = FALSE; //Save ShowUI()'s bool value.
|
|
m_fLastActiveCtx = FALSE; //Save IMEPADNOTIFY_ACTIVATECONTEXT
|
|
m_hwndIF = NULL; //Internal I/F Window handle.
|
|
m_lpIUnkIImeIPoint = NULL; //IImeIPoint I/F pointer as IUnknown.
|
|
m_lpIUnkIImeCallback = NULL; //IImeCallback I/F pointer as IUnknown.
|
|
m_lpCImePadCallback = NULL; //CImePadCallback instance pointer.
|
|
m_lpIImePadServer = NULL; //IImePadServer I/F pointer.
|
|
m_dwRegAdvise = 0;
|
|
m_hModuleProxyStub = NULL;
|
|
|
|
//Initialize Candidate data
|
|
ZeroMemory(&m_ntfyDataApplyCand, sizeof(m_ntfyDataApplyCand));
|
|
ZeroMemory(&m_ntfyDataQueryCand, sizeof(m_ntfyDataQueryCand));
|
|
ZeroMemory(&m_ntfyDataApplyCandEx, sizeof(m_ntfyDataApplyCandEx));
|
|
|
|
DBG(("CImePadSvrSharemem::CImePadSvrSharemem() constructor END\n"));
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CImePadSvrSharemem::~CImePadSvrSharemem
|
|
// Type : INT
|
|
// Purpose : Destructor of CImePadSvrSharemem Class.
|
|
// Args : None
|
|
// Return :
|
|
// DATE : Mon May 17 23:04:29 1999
|
|
// Histroy :
|
|
//////////////////////////////////////////////////////////////////
|
|
CImePadSvrSharemem::~CImePadSvrSharemem(VOID)
|
|
{
|
|
DBG(("CImePadSvrSharemem::CImePadSvrSharemem() Destructor START\n"));
|
|
this->DestroyIFHWND(TRUE);
|
|
m_imeLangID = 0; //Save Initialized data.
|
|
m_dwImeInputID = 0; //Save Initialized data.
|
|
m_fShowReqStatus = FALSE; //Save ShowUI()'s bool value.
|
|
m_fLastActiveCtx = FALSE; //Save IMEPADNOTIFY_ACTIVATECONTEXT
|
|
m_hwndIF = NULL; //Internal I/F Window handle.
|
|
m_lpIUnkIImeIPoint = NULL; //IImeIPoint I/F pointer as IUnknown.
|
|
m_lpIUnkIImeCallback = NULL; //IImeCallback I/F pointer as IUnknown.
|
|
m_lpIImePadServer = NULL; //IImePadServer I/F pointer.
|
|
|
|
//990813:ToshiaK. Memory leak.
|
|
if(m_lpCImePadCallback) {
|
|
delete m_lpCImePadCallback;
|
|
m_lpCImePadCallback = NULL;
|
|
}
|
|
|
|
if(m_hModuleProxyStub) {
|
|
::FreeLibrary(m_hModuleProxyStub);
|
|
m_hModuleProxyStub = 0;
|
|
}
|
|
DBG(("CImePadSvrSharemem::CImePadSvrSharemem() Destructor END\n"));
|
|
}
|
|
|
|
BOOL
|
|
CImePadSvrSharemem::IsAvailable(VOID)
|
|
{
|
|
LPTSTR lpPath = (LPTSTR)MemAlloc(sizeof(TCHAR)*MAX_PATH);
|
|
if(!lpPath) {
|
|
DBG(("-->Outof Memory ??\n"));
|
|
return FALSE;
|
|
}
|
|
|
|
if(0 == this->CLSID2ModuleName(IID_IImePadServerSHM,
|
|
FALSE,
|
|
lpPath,
|
|
sizeof(TCHAR)*MAX_PATH)) {
|
|
MemFree(lpPath);
|
|
return TRUE;
|
|
}
|
|
MemFree(lpPath);
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
BOOL
|
|
CImePadSvrSharemem::OnIMEPadClose(VOID)
|
|
{
|
|
m_fShowReqStatus = FALSE;
|
|
return 0;
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::Initialize(LANGID imeLangID,
|
|
DWORD dwImeInputID,
|
|
LPVOID lpVoid)
|
|
{
|
|
DBG(("CImePadSvrSharemem::Initialize() START\n"));
|
|
DBG(("--> imeLangID [0x%08x]\n", imeLangID));
|
|
DBG(("--> dwImeInputID[0x%08x]\n", dwImeInputID));
|
|
if(m_lpIImePadServer) {
|
|
DBG(("-->Already Initialized\n"));
|
|
return 0;
|
|
}
|
|
|
|
HRESULT hr;
|
|
|
|
this->CreateIFHWND(); //Create internal Interface Window.
|
|
m_imeLangID = imeLangID;
|
|
m_dwImeInputID = dwImeInputID;
|
|
if(!m_lpCImePadCallback) {
|
|
m_lpCImePadCallback = new CImePadCallback(m_hwndIF, this);
|
|
}
|
|
this->InitOleAPI();
|
|
m_lpIImePadServer = (IImePadServer *)this->CreateObject();
|
|
if(!m_lpIImePadServer) {
|
|
return -1;
|
|
}
|
|
m_lpIImePadServer->Initialize(::GetCurrentProcessId(),
|
|
::GetCurrentThreadId(),
|
|
(DWORD)imeLangID,
|
|
(DWORD)dwImeInputID,
|
|
FALSE, //fUIM;
|
|
m_lpCImePadCallback,
|
|
NULL,
|
|
0,
|
|
0);
|
|
DBG(("CImePadSvrSharemem::Initialize() END\n"));
|
|
return 0;
|
|
Unref(lpVoid);
|
|
Unref(hr);
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::Terminate(LPVOID lpVoid)
|
|
{
|
|
DBG(("CImePadSvrSharemem::::Terminate() START \n"));
|
|
if(!m_lpIImePadServer) {
|
|
return -1;
|
|
}
|
|
m_lpIImePadServer->Terminate(0, 0);
|
|
m_lpIImePadServer = NULL;
|
|
//990813:ToshiaK memory leak;
|
|
if(m_lpCImePadCallback) {
|
|
delete m_lpCImePadCallback;
|
|
m_lpCImePadCallback = NULL;
|
|
}
|
|
DBG(("CImePadSvrSharemem::Terminate() End\n"));
|
|
return 0;
|
|
Unref(lpVoid);
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::ForceDisConnect(VOID)
|
|
{
|
|
DBG(("CImePadSvrSharemem::ForceDisConnect START\n"));
|
|
if(m_lpIImePadServer) {
|
|
m_lpIImePadServer = NULL;
|
|
}
|
|
DBG(("CImePadSvrSharemem::ForceDisConnect END\n"));
|
|
return 0;
|
|
}
|
|
|
|
|
|
INT
|
|
CImePadSvrSharemem::ShowUI(BOOL fShow)
|
|
{
|
|
DBG(("CImePadSvrSharemem::ShowUI() START fShow [%d]\n"));
|
|
m_fShowReqStatus = fShow;
|
|
if(!m_lpIImePadServer) {
|
|
return -1;
|
|
}
|
|
m_lpIImePadServer->ShowUI(fShow);
|
|
DBG(("CImePadSvrSharemem::ShowUI() END\n"));
|
|
return 0;
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::IsVisible(BOOL *pfVisible)
|
|
{
|
|
if(pfVisible) {
|
|
*pfVisible = m_fShowReqStatus;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::ActivateApplet(UINT activateID,
|
|
DWORD_PTR dwActivateParam,
|
|
LPWSTR lpwstr1,
|
|
LPWSTR lpwstr2)
|
|
{
|
|
DBG(("CImePadSvrSharemem::ActivateApplet START\n"));
|
|
DBG(("-->activateID [0x%08x][%s]\n",
|
|
activateID,
|
|
activateID == IMEPADACTID_ACTIVATEBYCATID ? "IMEPADACTID_ACTIVATEBYCATID" :
|
|
activateID == IMEPADACTID_ACTIVATEBYIID ? "IMEPADACTID_ACTIVATEBYIID" :
|
|
activateID == IMEPADACTID_ACTIVATEBYNAME ? "IMEPADACTID_ACTIVATEBYNAME" :
|
|
"Unknown"));
|
|
DBG(("-->dwActivateParam [0x%08x]\n", dwActivateParam));
|
|
DBG(("-->lpwstr1 [0x%08x]\n", lpwstr1));
|
|
DBG(("-->lpwstr2 [0x%08x]\n", lpwstr2));
|
|
|
|
if(!m_lpIImePadServer) {
|
|
DBG(("-->m_lpIImePadServer is NULL\n"));
|
|
DBG(("CImePadSvrSharemem::ActivateApplet END\n"));
|
|
return -1;
|
|
}
|
|
m_lpIImePadServer->ActivateApplet(activateID,
|
|
dwActivateParam,
|
|
lpwstr1,
|
|
lpwstr2);
|
|
DBG(("CImePadSvrSharemem::ActivateApplet END\n"));
|
|
return 0;
|
|
Unref(activateID);
|
|
Unref(dwActivateParam);
|
|
Unref(lpwstr1);
|
|
Unref(lpwstr2);
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::Notify(INT id, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HRESULT hr;
|
|
switch(id) {
|
|
case IMEPADNOTIFY_ACTIVATECONTEXT:
|
|
DBG(("CImePadSvrSharemem::Notify: ActivateContext\n"));
|
|
//990608:KOTAE #1121. if ImePad is not shown in this application,
|
|
//Do not send IMEPADNOTIFY_ACTIVATECONTEXT
|
|
if(!m_fShowReqStatus) {
|
|
return 0;
|
|
}
|
|
m_fLastActiveCtx = (BOOL)wParam;
|
|
::KillTimer(m_hwndIF, TIMERID_NOTIFY_ACTIVATECONTEXT);
|
|
if(m_fLastActiveCtx) {
|
|
::SetTimer(m_hwndIF,
|
|
TIMERID_NOTIFY_ACTIVATECONTEXT,
|
|
TIMERELAPS_ACTIVATE,
|
|
NULL);
|
|
}
|
|
else {
|
|
::SetTimer(m_hwndIF,
|
|
TIMERID_NOTIFY_ACTIVATECONTEXT,
|
|
TIMERELAPS_INACTIVATE,
|
|
NULL);
|
|
}
|
|
break;
|
|
case IMEPADNOTIFY_APPLYCANDIDATE:
|
|
//----------------------------------------------------------------
|
|
// Notify for Candidate Applied
|
|
// WPARAM wParam: dwCharId = (DWORD)wParam;
|
|
// LPARAM lParam: iSelIndex = (INT)lParam;
|
|
//----------------------------------------------------------------
|
|
::KillTimer(m_hwndIF, TIMERID_NOTIFY_APPLYCANDIDATE);
|
|
m_ntfyDataApplyCand.dwCharID = (DWORD)wParam;
|
|
m_ntfyDataApplyCand.dwSelIndex = (DWORD)lParam;
|
|
::SetTimer(m_hwndIF, TIMERID_NOTIFY_APPLYCANDIDATE, TIMERELAPS_NOTIFY, NULL);
|
|
|
|
break;
|
|
case IMEPADNOTIFY_QUERYCANDIDATE:
|
|
//----------------------------------------------------------------
|
|
// Notify for Querying Candidate
|
|
// WPARAM wParam: dwCharId = (DWORD)wParam;
|
|
// LPARAM lParam: 0. not used.
|
|
//----------------------------------------------------------------
|
|
::KillTimer(m_hwndIF, TIMERID_NOTIFY_QUERYCANDIDATE);
|
|
m_ntfyDataQueryCand.dwCharID = (DWORD)wParam;
|
|
::SetTimer(m_hwndIF, TIMERID_NOTIFY_QUERYCANDIDATE, TIMERELAPS_NOTIFY, NULL);
|
|
break;
|
|
case IMEPADNOTIFY_APPLYCANDIDATE_EX:
|
|
//----------------------------------------------------------------
|
|
// Notify for Candidate Applied
|
|
// WPARAM wParam: dwCharId = (DWORD)wParam;
|
|
// LPARAM lParam: lpApplyCandEx = (LPIMEPADAPPLYCANDEX)lParam;
|
|
//----------------------------------------------------------------
|
|
{
|
|
::KillTimer(m_hwndIF, TIMERID_NOTIFY_APPLYCANDIDATEEX);
|
|
m_ntfyDataApplyCandEx.dwCharID = (DWORD)wParam;
|
|
LPIMEPADAPPLYCANDINFO lpApplyCandInfo = (LPIMEPADAPPLYCANDINFO)lParam;
|
|
|
|
if(m_ntfyDataApplyCandEx.lpwstrCreated1) {
|
|
MemFree(m_ntfyDataApplyCandEx.lpwstrCreated1);
|
|
}
|
|
if(m_ntfyDataApplyCandEx.lpwstrCreated2) {
|
|
MemFree(m_ntfyDataApplyCandEx.lpwstrCreated2);
|
|
}
|
|
m_ntfyDataApplyCandEx.lpwstrCreated1 = NULL;
|
|
m_ntfyDataApplyCandEx.lpwstrCreated2 = NULL;
|
|
|
|
if(lpApplyCandInfo) {
|
|
if(lpApplyCandInfo->lpwstrDisplay) {
|
|
m_ntfyDataApplyCandEx.lpwstrCreated1 = StrdupW(lpApplyCandInfo->lpwstrDisplay);
|
|
}
|
|
if(lpApplyCandInfo->lpwstrReading) {
|
|
m_ntfyDataApplyCandEx.lpwstrCreated2 = StrdupW(lpApplyCandInfo->lpwstrReading);
|
|
}
|
|
}
|
|
::SetTimer(m_hwndIF, TIMERID_NOTIFY_APPLYCANDIDATEEX, TIMERELAPS_NOTIFY, NULL);
|
|
}
|
|
break;
|
|
case IMEPADNOTIFY_MODECHANGED:
|
|
break;
|
|
case IMEPADNOTIFY_STARTCOMPOSITION:
|
|
break;
|
|
case IMEPADNOTIFY_COMPOSITION:
|
|
break;
|
|
case IMEPADNOTIFY_ENDCOMPOSITION:
|
|
break;
|
|
case IMEPADNOTIFY_OPENCANDIDATE:
|
|
break;
|
|
case IMEPADNOTIFY_CLOSECANDIDATE:
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
Unref(hr);
|
|
Unref(wParam);
|
|
Unref(lParam);
|
|
}
|
|
|
|
INT
|
|
CImePadSvrSharemem::GetAppletConfigList(DWORD dwMask,
|
|
INT *pCountApplet,
|
|
IMEPADAPPLETCONFIG **ppList)
|
|
{
|
|
DBG(("CImePadSvrSharemem::GetAppletConfigList START\n"));
|
|
if(!m_lpIImePadServer) {
|
|
DBG(("-->m_lpIImePadServer is NULL\n"));
|
|
return -1;
|
|
}
|
|
HRESULT hr;
|
|
hr = m_lpIImePadServer->GetAppletConfigList(dwMask,
|
|
(UINT *)pCountApplet,
|
|
ppList);
|
|
DBG(("CImePadSvrSharemem::GetAppletConfigList END\n"));
|
|
return hr;
|
|
}
|
|
|
|
IUnknown *
|
|
CImePadSvrSharemem::SetIUnkIImeIPoint(IUnknown *pIUnkIImeIPoint)
|
|
{
|
|
return m_lpIUnkIImeIPoint = pIUnkIImeIPoint;
|
|
}
|
|
|
|
IUnknown *
|
|
CImePadSvrSharemem::SetIUnkIImeCallback(IUnknown *pIUnkIImeCallback)
|
|
{
|
|
return m_lpIUnkIImeCallback = pIUnkIImeCallback;
|
|
}
|
|
|
|
IUnknown*
|
|
CImePadSvrSharemem::GetIUnkIImeIPoint(VOID)
|
|
{
|
|
return m_lpIUnkIImeIPoint;
|
|
}
|
|
|
|
IUnknown*
|
|
CImePadSvrSharemem::GetIUnkIImeCallback(VOID)
|
|
{
|
|
return m_lpIUnkIImeCallback;
|
|
}
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
//
|
|
//private static method
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
IImePadServer*
|
|
CImePadSvrSharemem::CreateObject(VOID)
|
|
{
|
|
DBG(("CImePadSvrSharemem::CreateObject START\n"));
|
|
typedef LPVOID (WINAPI * LPFN_CREATEOBJECT)(DWORD dwIntanceID);
|
|
if(m_hModuleProxyStub) {
|
|
DBG(("-->Already Created\n"));
|
|
return m_lpIImePadServer;
|
|
}
|
|
|
|
LPTSTR lpPath = (LPTSTR)MemAlloc(sizeof(TCHAR)*MAX_PATH);
|
|
if(!lpPath) {
|
|
DBG(("-->Outof Memory ??\n"));
|
|
return NULL;
|
|
}
|
|
|
|
if(0 != this->CLSID2ModuleName(IID_IImePadServerSHM,
|
|
FALSE,
|
|
lpPath,
|
|
sizeof(TCHAR)*MAX_PATH)) {
|
|
DBG(("-->Cannot found proxy\n"));
|
|
goto LError;
|
|
}
|
|
m_hModuleProxyStub= ::LoadLibrary(lpPath);
|
|
DBG(("-->lpPath [%s]\n", lpPath));
|
|
#if 0
|
|
#ifdef _DEBUG
|
|
m_hModuleProxyStub = ::LoadLibrary(TEXT("dbgpadsm.dll"));
|
|
#else
|
|
m_hModuleProxyStub = ::LoadLibrary(TEXT("imepadsm.dll"));
|
|
#endif
|
|
#endif
|
|
if(!m_hModuleProxyStub) {
|
|
goto LError;
|
|
}
|
|
|
|
LPFN_CREATEOBJECT lpfn;
|
|
lpfn = (LPFN_CREATEOBJECT)::GetProcAddress(m_hModuleProxyStub, "CreateObject");
|
|
if(!lpfn) {
|
|
DBG(("-->GetProcAddress Error \n"));
|
|
goto LError;
|
|
}
|
|
m_lpIImePadServer = (IImePadServer *)(*lpfn)(0);
|
|
return m_lpIImePadServer;
|
|
|
|
LError:
|
|
if(lpPath) {
|
|
MemFree(lpPath);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
LRESULT CALLBACK
|
|
CImePadSvrSharemem::ClientWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
LPCImePadSvrSharemem lpCImePadSvr = NULL;
|
|
switch(uMsg) {
|
|
#ifdef UNDER_CE
|
|
case WM_CREATE:
|
|
lpCImePadSvr = (LPCImePadSvrSharemem)((LPCREATESTRUCT)lParam)->lpCreateParams;
|
|
WinSetUserPtr(hwnd, (LPVOID)lpCImePadSvr);
|
|
if(lpCImePadSvr) {
|
|
return lpCImePadSvr->RealWndProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
break;
|
|
case WM_DESTROY:
|
|
lpCImePadSvr = (LPCImePadSvrSharemem)WinGetUserPtr(hwnd);
|
|
if(lpCImePadSvr) {
|
|
lpCImePadSvr->RealWndProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
WinSetUserPtr(hwnd, (LPVOID)NULL);
|
|
break;
|
|
#else //!UNDER_CE
|
|
case WM_NCCREATE:
|
|
lpCImePadSvr = (LPCImePadSvrSharemem)((LPCREATESTRUCT)lParam)->lpCreateParams;
|
|
WinSetUserPtr(hwnd, (LPVOID)lpCImePadSvr);
|
|
break;
|
|
case WM_NCDESTROY:
|
|
WinSetUserPtr(hwnd, (LPVOID)NULL);
|
|
break;
|
|
#endif //UNDER_CE
|
|
default:
|
|
lpCImePadSvr = (LPCImePadSvrSharemem)WinGetUserPtr(hwnd);
|
|
if(lpCImePadSvr) {
|
|
return lpCImePadSvr->RealWndProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
break;
|
|
}
|
|
return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
LRESULT
|
|
CImePadSvrSharemem::RealWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
switch(uMsg) {
|
|
case WM_CREATE:
|
|
DBG(("CImePadSvrSharemem::WM_CREATE\n"));
|
|
return 1;
|
|
case WM_TIMER:
|
|
return MsgTimer(hwnd, wParam, lParam);
|
|
case WM_USER_UPDATECONTEXT:
|
|
{
|
|
IImeIPoint1 *lpIImeIPoint = NULL;
|
|
if(!m_lpIUnkIImeIPoint) {
|
|
DBG(("--> m_lpIUnkIImeIPoint is NULL\n"));
|
|
return E_FAIL;
|
|
}
|
|
if(IsBadVtbl((IUnkDummy *)m_lpIUnkIImeIPoint)) {
|
|
return E_FAIL;
|
|
}
|
|
|
|
HRESULT hr = m_lpIUnkIImeIPoint->QueryInterface(IID_IImeIPoint1,
|
|
(VOID **)&lpIImeIPoint);
|
|
if(hr != S_OK) {
|
|
DBG(("QuertyInterface Failed\n"));
|
|
return E_FAIL;
|
|
}
|
|
if(!lpIImeIPoint) {
|
|
DBG(("lpIImeIPoint is NULL\n"));
|
|
return 0;
|
|
}
|
|
//Check current IImeIPoint is same with lParam's IImeIPoint.
|
|
//990715:Fixed KOTAE #1563.
|
|
//In 16bit application wParam's HIWORD is always 0x0000 !!!!!
|
|
//So, Use LParam.
|
|
if((IImeIPoint1 *)lParam == lpIImeIPoint) {
|
|
DBG(("Call UpdateContext\n"));
|
|
lpIImeIPoint->UpdateContext(TRUE);
|
|
}
|
|
else {
|
|
DBG(("lpIImeIPoint is different lParam[0x%08x]\n", lParam));
|
|
}
|
|
lpIImeIPoint->Release();
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
LRESULT
|
|
CImePadSvrSharemem::MsgTimer(HWND hwnd, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
HRESULT hr;
|
|
switch(wParam) {
|
|
case TIMERID_NOTIFY_ACTIVATECONTEXT:
|
|
::KillTimer(hwnd, wParam);
|
|
if(!m_lpIImePadServer) {
|
|
return -1;
|
|
}
|
|
m_lpIImePadServer->Notify(IMEPADNOTIFY_ACTIVATECONTEXT,
|
|
(WPARAM)m_fLastActiveCtx,
|
|
(LPARAM)0);
|
|
break;
|
|
case TIMERID_NOTIFY_APPLYCANDIDATE:
|
|
::KillTimer(hwnd, wParam);
|
|
if(!m_lpIImePadServer) {
|
|
return -1;
|
|
}
|
|
m_lpIImePadServer->NotifyWithData(IMEPADNOTIFY_APPLYCANDIDATE,
|
|
m_ntfyDataApplyCand.dwCharID,
|
|
0,
|
|
0,
|
|
0);
|
|
m_ntfyDataApplyCand.dwCharID = 0;
|
|
break;
|
|
case TIMERID_NOTIFY_QUERYCANDIDATE:
|
|
::KillTimer(hwnd, wParam);
|
|
m_lpIImePadServer->NotifyWithData(IMEPADNOTIFY_QUERYCANDIDATE,
|
|
m_ntfyDataQueryCand.dwCharID,
|
|
m_ntfyDataQueryCand.dwSelIndex,
|
|
0,
|
|
0);
|
|
m_ntfyDataQueryCand.dwCharID = 0;
|
|
m_ntfyDataQueryCand.dwSelIndex = 0;
|
|
break;
|
|
case TIMERID_NOTIFY_APPLYCANDIDATEEX:
|
|
::KillTimer(hwnd, wParam);
|
|
m_lpIImePadServer->NotifyWithData(IMEPADNOTIFY_APPLYCANDIDATE_EX,
|
|
m_ntfyDataApplyCandEx.dwCharID,
|
|
0,
|
|
m_ntfyDataApplyCandEx.lpwstrCreated1,
|
|
m_ntfyDataApplyCandEx.lpwstrCreated2);
|
|
if(m_ntfyDataApplyCandEx.lpwstrCreated1) {
|
|
MemFree(m_ntfyDataApplyCandEx.lpwstrCreated1);
|
|
}
|
|
if(m_ntfyDataApplyCandEx.lpwstrCreated2) {
|
|
MemFree(m_ntfyDataApplyCandEx.lpwstrCreated2);
|
|
}
|
|
m_ntfyDataApplyCandEx.lpwstrCreated1 = NULL;
|
|
m_ntfyDataApplyCandEx.lpwstrCreated2 = NULL;
|
|
|
|
break;
|
|
default:
|
|
::KillTimer(hwnd, wParam);
|
|
break;
|
|
}
|
|
return 0;
|
|
Unref(hr);
|
|
Unref(hwnd);
|
|
Unref(wParam);
|
|
Unref(lParam);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CImePadSvrSharemem::CreateIFHWND
|
|
// Type : HWND
|
|
// Purpose : Create interface size 0 window.
|
|
// Args : None
|
|
// Return :
|
|
// DATE : Mon May 17 23:01:19 1999
|
|
// Histroy :
|
|
//////////////////////////////////////////////////////////////////
|
|
HWND
|
|
CImePadSvrSharemem::CreateIFHWND(VOID)
|
|
{
|
|
DBG(("CImePadSvrSharemem::CreateIFHWND START\n"));
|
|
if(m_hwndIF && ::IsWindow(m_hwndIF)) {
|
|
return m_hwndIF;
|
|
}
|
|
ATOM atom;
|
|
HWND hwnd;
|
|
|
|
#ifndef UNDER_CE // No Ex
|
|
WNDCLASSEX wc;
|
|
#else // UNDER_CE
|
|
WNDCLASS wc;
|
|
#endif // UNDER_CE
|
|
|
|
#ifndef UNDER_CE // No Ex
|
|
wc.cbSize = sizeof(wc);
|
|
#endif // UNDER_CE
|
|
wc.style = 0;
|
|
wc.lpfnWndProc = (WNDPROC)CImePadSvrSharemem::ClientWndProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = m_ghModClient;
|
|
wc.hIcon = (HICON)NULL;
|
|
wc.hCursor = (HCURSOR)NULL;
|
|
wc.hbrBackground = (HBRUSH)NULL;
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = SZ_IMEPADIFCLASS;
|
|
#ifndef UNDER_CE // No Ex
|
|
wc.hIconSm = NULL;
|
|
|
|
atom = ::RegisterClassEx(&wc);
|
|
#else // UNDER_CE
|
|
atom = ::RegisterClass(&wc);
|
|
#endif // UNDER_CE
|
|
hwnd = ::CreateWindowEx(0,
|
|
SZ_IMEPADIFCLASS,
|
|
NULL,
|
|
WS_POPUP | WS_DISABLED,
|
|
0,0,0,0,
|
|
NULL,
|
|
NULL,
|
|
m_ghModClient,
|
|
(LPVOID)this);
|
|
if(!hwnd) {
|
|
DBG(("CreateWindowEx Error %d\n", GetLastError()));
|
|
}
|
|
m_hwndIF = hwnd;
|
|
DBG(("CImePadSvrSharemem::CreateIFHWND END\n"));
|
|
return hwnd;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CImePadSvrSharemem::DestroyIFHWND
|
|
// Type : BOOL
|
|
// Purpose : Destroy interface window.
|
|
// Args :
|
|
// : BOOL fReserved
|
|
// Return :
|
|
// DATE : Mon May 17 23:02:43 1999
|
|
// Histroy :
|
|
//////////////////////////////////////////////////////////////////
|
|
BOOL
|
|
CImePadSvrSharemem::DestroyIFHWND(BOOL fReserved)
|
|
{
|
|
DBG(("CImePadSvrSharemem::DestroyIFHWND() START\n"));
|
|
if(m_hwndIF && ::IsWindow(m_hwndIF)) {
|
|
::DestroyWindow(m_hwndIF);
|
|
m_hwndIF = NULL;
|
|
}
|
|
//Must Unregister class.
|
|
BOOL fRet = ::UnregisterClass(SZ_IMEPADIFCLASS, m_ghModClient);
|
|
if(!fRet) {
|
|
if(::GetLastError() != ERROR_CLASS_DOES_NOT_EXIST) {
|
|
DBG(("UnregisterClass Unknown error [%d]\n", GetLastError()));
|
|
}
|
|
}
|
|
DBG(("CImePadSvrSharemem::DestroyIFHWND() END\n"));
|
|
return TRUE;
|
|
Unref(fReserved);
|
|
}
|
|
|
|
// Security Fix: strsafe.h
|
|
// Add 3rd parameter.
|
|
INT
|
|
CImePadSvrSharemem::CLSID2Str(REFCLSID refclsid, TCHAR *szBuf, size_t cbBuf)
|
|
{
|
|
// Security Fix: strsafe.h
|
|
// Change wsprintf to StringCbPrintf.
|
|
StringCbPrintf(szBuf, cbBuf, TEXT("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}"),
|
|
refclsid.Data1,
|
|
refclsid.Data2,
|
|
refclsid.Data3,
|
|
refclsid.Data4[0],
|
|
refclsid.Data4[1],
|
|
refclsid.Data4[2],
|
|
refclsid.Data4[3],
|
|
refclsid.Data4[4],
|
|
refclsid.Data4[5],
|
|
refclsid.Data4[6],
|
|
refclsid.Data4[7]);
|
|
return 0;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
// Function : CLSID2ModuleName
|
|
// Type : INT
|
|
// Purpose : Get module path from CLSID. only gets InprocServer32
|
|
// : Path.
|
|
// Args :
|
|
// : REFCLSID refclsid
|
|
// : BOOL fLocalSvr;
|
|
// : TCHAR szPath
|
|
// : INT cbSize
|
|
// Return :
|
|
// DATE : Thu Apr 16 02:48:05 1998
|
|
// Author :
|
|
//////////////////////////////////////////////////////////////////
|
|
#define MAX_CLSIDNAME 64
|
|
INT
|
|
CImePadSvrSharemem::CLSID2ModuleName(REFCLSID refclsid, BOOL fLocalSvr, TCHAR *szPath, INT cbSize)
|
|
{
|
|
//DBG(("CImePadSvrSharemem::CLSID2ModuleName START\n"));
|
|
static TCHAR szCLSID[MAX_CLSIDNAME];
|
|
static TCHAR szServerKey[256];
|
|
|
|
// Security Fix: strsafe.h
|
|
// Add 3rd parameter.
|
|
CLSID2Str(refclsid, szCLSID, sizeof(szCLSID));
|
|
DBG(("-->szCLSID [%s]\n", szCLSID));
|
|
|
|
// Security Fix: strsafe.h
|
|
// Change wsprintf to StringCbPrintf.
|
|
if(fLocalSvr) {
|
|
StringCbPrintf(szServerKey, sizeof(szServerKey), TEXT("CLSID\\%s\\LocalServer32"), szCLSID);
|
|
}
|
|
else {
|
|
StringCbPrintf(szServerKey, sizeof(szServerKey), TEXT("CLSID\\%s\\InprocServer32"), szCLSID);
|
|
}
|
|
|
|
DBG(("-->szServerKey[%s]\n", szServerKey));
|
|
INT ret;
|
|
HKEY hKey;
|
|
ret = ::RegOpenKeyEx(HKEY_CLASSES_ROOT,
|
|
szServerKey,
|
|
0,
|
|
KEY_READ, //ALL_ACCESS,
|
|
&hKey);
|
|
if(ret != ERROR_SUCCESS) {
|
|
DBG(("-->RegOpenKeyEx Failed ret=[0x%08x], GLE [0x%08x]\n", ret, GetLastError()));
|
|
return ret;
|
|
}
|
|
ULONG size = cbSize;
|
|
ret = ::RegQueryValueEx(hKey,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
(LPBYTE)szPath, &size);
|
|
if(ret != ERROR_SUCCESS) {
|
|
DBG(("-->RegQueryValueEx Failed\n", ret));
|
|
::RegCloseKey(hKey);
|
|
return ret;
|
|
}
|
|
::RegCloseKey(hKey);
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|