238 lines
7.3 KiB
C++
238 lines
7.3 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
|
|
#include "stdafx.h"
|
|
#include "imewrap.h"
|
|
#include "edtiface.h"//for the callbacks
|
|
/*imewrap.h edtor client wrapper */
|
|
/*Dynamic Library wrapper for loading on call*/
|
|
|
|
|
|
HINSTANCE CIMEDll::s_dllinstance=NULL;
|
|
unsigned int CIMEDll::s_refcount=0;
|
|
|
|
|
|
IMMNOTIFYIME CIMEDll::s_ImmNotifyIME=NULL;
|
|
IMMGETCONTEXT CIMEDll::s_ImmGetContext=NULL;
|
|
IMMRELEASECONTEXT CIMEDll::s_ImmReleaseContext=NULL;
|
|
IMMGETCOMPOSITIONSTRING CIMEDll::s_ImmGetCompositionString=NULL;
|
|
IMMSETCANDIDATEWINDOW CIMEDll::s_ImmSetCandidateWindow=NULL;
|
|
IMMSETCOMPOSITIONWINDOW CIMEDll::s_ImmSetCompositionWindow=NULL;
|
|
IMMSETCOMPOSITIONFONT CIMEDll::s_ImmSetCompositionFont=NULL;
|
|
IMMSETCOMPOSITIONSTRING CIMEDll::s_ImmSetCompositionString=NULL;
|
|
IMMGETCONVERSIONSTATUS CIMEDll::s_ImmGetConversionStatus=NULL;
|
|
IMMSETCONVERSIONSTATUS CIMEDll::s_ImmSetConversionStatus=NULL;
|
|
IMEESCAPE CIMEDll::s_ImmEscape=NULL;
|
|
|
|
#ifdef WIN32
|
|
#define XP_ASSERT(x) assert(x)
|
|
#else
|
|
#define XP_ASSERT(x)
|
|
#endif
|
|
|
|
CIMEDll::CIMEDll()
|
|
{
|
|
HINSTANCE t_instance=LoadLibrary("IMM32.DLL");
|
|
if(!t_instance)
|
|
{
|
|
s_dllinstance=NULL;
|
|
s_ImmNotifyIME=NULL;
|
|
s_ImmGetContext=NULL;
|
|
s_ImmReleaseContext=NULL;
|
|
s_ImmGetCompositionString=NULL;
|
|
s_ImmSetCandidateWindow=NULL;
|
|
s_ImmSetCompositionWindow=NULL;
|
|
s_ImmSetCompositionFont=NULL;
|
|
s_ImmSetCompositionString=NULL;
|
|
s_ImmGetConversionStatus=NULL;
|
|
s_ImmSetConversionStatus=NULL;
|
|
s_ImmEscape=NULL;
|
|
return;//this is OK! this must be an english version of NT3.5
|
|
}
|
|
s_refcount++;
|
|
if (t_instance==s_dllinstance)
|
|
return;
|
|
else
|
|
{
|
|
s_dllinstance=t_instance;
|
|
//retrieve all proc addresses and place them into holders
|
|
s_ImmNotifyIME= (IMMNOTIFYIME)GetProcAddress(s_dllinstance,"ImmNotifyIME");
|
|
XP_ASSERT(s_ImmNotifyIME);
|
|
|
|
s_ImmGetContext= (IMMGETCONTEXT)GetProcAddress(s_dllinstance,"ImmGetContext");
|
|
XP_ASSERT(s_ImmGetContext);
|
|
|
|
s_ImmReleaseContext= (IMMRELEASECONTEXT)GetProcAddress(s_dllinstance,"ImmReleaseContext");
|
|
XP_ASSERT(s_ImmReleaseContext);
|
|
|
|
#ifdef UNICODE_ONLY
|
|
s_ImmGetCompositionString= (IMMGETCOMPOSITIONSTRING)GetProcAddress(s_dllinstance,"ImmGetCompositionStringW");
|
|
#else //ANSI ONLY
|
|
s_ImmGetCompositionString= (IMMGETCOMPOSITIONSTRING)GetProcAddress(s_dllinstance,"ImmGetCompositionStringA");
|
|
#endif //!ANSI_ONLY
|
|
XP_ASSERT(s_ImmGetCompositionString);
|
|
|
|
#ifdef UNICODE_ONLY
|
|
s_ImmSetCompositionFont= (IMMSETCOMPOSITIONFONT)GetProcAddress(s_dllinstance,"ImmSetCompositionFontW");
|
|
#else //ANSI ONLY
|
|
s_ImmSetCompositionFont= (IMMSETCOMPOSITIONFONT)GetProcAddress(s_dllinstance,"ImmSetCompositionFontA");
|
|
#endif //!ANSI_ONLY
|
|
XP_ASSERT(s_ImmSetCompositionFont);
|
|
|
|
s_ImmSetCandidateWindow= (IMMSETCANDIDATEWINDOW)GetProcAddress(s_dllinstance,"ImmSetCandidateWindow");
|
|
XP_ASSERT(s_ImmSetCandidateWindow);
|
|
|
|
s_ImmSetCompositionWindow= (IMMSETCOMPOSITIONWINDOW)GetProcAddress(s_dllinstance,"ImmSetCompositionWindow");
|
|
XP_ASSERT(s_ImmSetCompositionWindow);
|
|
|
|
#ifdef UNICODE_ONLY
|
|
s_ImmSetCompositionString= (IMMSETCOMPOSITIONSTRING)GetProcAddress(s_dllinstance,"ImmSetCompositionStringW");
|
|
#else //ANSI ONLY
|
|
s_ImmSetCompositionString= (IMMSETCOMPOSITIONSTRING)GetProcAddress(s_dllinstance,"ImmSetCompositionStringA");
|
|
#endif //!ANSI_ONLY
|
|
XP_ASSERT(s_ImmSetCompositionString);
|
|
|
|
s_ImmGetConversionStatus= (IMMGETCONVERSIONSTATUS)GetProcAddress(s_dllinstance,"ImmGetConversionStatus");
|
|
XP_ASSERT(s_ImmGetConversionStatus);
|
|
|
|
s_ImmSetConversionStatus= (IMMSETCONVERSIONSTATUS)GetProcAddress(s_dllinstance,"ImmSetConversionStatus");
|
|
XP_ASSERT(s_ImmSetConversionStatus);
|
|
|
|
#ifdef UNICODE_ONLY
|
|
s_ImmEscape= (IMEESCAPE)GetProcAddress(s_dllinstance,"ImmEscapeW");
|
|
#else //ANSI ONLY
|
|
s_ImmEscape= (IMEESCAPE)GetProcAddress(s_dllinstance,"ImmEscapeA");
|
|
#endif //!ANSI_ONLY
|
|
XP_ASSERT(s_ImmEscape);
|
|
|
|
}
|
|
}
|
|
|
|
CIMEDll::~CIMEDll()
|
|
{
|
|
if (s_dllinstance)
|
|
{
|
|
if (!FreeLibrary(s_dllinstance))
|
|
XP_ASSERT(0);
|
|
s_refcount--;
|
|
}
|
|
if (!s_refcount)
|
|
s_dllinstance=NULL;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmNotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue)
|
|
{
|
|
if (s_ImmNotifyIME)
|
|
return (*s_ImmNotifyIME)(hIMC,dwAction,dwIndex,dwValue);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
HIMC
|
|
CIMEDll::ImmGetContext(HWND hWnd)
|
|
{
|
|
if (s_ImmGetContext)
|
|
return (*s_ImmGetContext)(hWnd);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmReleaseContext(HWND hWnd,HIMC hIMC)
|
|
{
|
|
if (s_ImmReleaseContext)
|
|
return (*s_ImmReleaseContext)(hWnd,hIMC);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
LONG
|
|
CIMEDll::ImmGetCompositionString(HIMC hIMC,DWORD dwIndex,LPVOID lpBuf,DWORD dwBufLen)
|
|
{
|
|
if (s_ImmGetCompositionString)
|
|
return (*s_ImmGetCompositionString)(hIMC,dwIndex,lpBuf,dwBufLen);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmSetCompositionFont(HIMC hIMC,LPLOGFONT lpLogFont)
|
|
{
|
|
if (s_ImmSetCompositionFont)
|
|
return (*s_ImmSetCompositionFont)(hIMC,lpLogFont);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmSetCandidateWindow(HIMC hIMC, LPCANDIDATEFORM lpcandidate)
|
|
{
|
|
if (s_ImmSetCandidateWindow)
|
|
return (*s_ImmSetCandidateWindow)(hIMC,lpcandidate);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmSetCompositionWindow(HIMC hIMC,LPCOMPOSITIONFORM lpcomposition)
|
|
{
|
|
if (s_ImmSetCompositionWindow)
|
|
return (*s_ImmSetCompositionWindow)(hIMC,lpcomposition);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmSetCompositionString(HIMC hIMC,DWORD dwIndex,LPVOID lpComp,DWORD dwCompLen,LPVOID lpRead,DWORD dwReadLen)
|
|
{
|
|
if (s_ImmSetCompositionString)
|
|
return (*s_ImmSetCompositionString)(hIMC,dwIndex,lpComp,dwCompLen,lpRead,dwReadLen);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
CIMEDll::ImmSetConversionStatus(HIMC hIMC,DWORD fdwConversion,DWORD fdwSentence)
|
|
{
|
|
if (s_ImmSetConversionStatus)
|
|
return (*s_ImmSetConversionStatus)(hIMC,fdwConversion,fdwSentence);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL
|
|
CIMEDll::ImmGetConversionStatus(HIMC hIMC,LPDWORD lpfdwConversion,LPDWORD lpfdwSentence)
|
|
{
|
|
if (s_ImmGetConversionStatus)
|
|
return (*s_ImmGetConversionStatus)(hIMC,lpfdwConversion,lpfdwSentence);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
LRESULT
|
|
CIMEDll::ImeEscape(HKL hKL,HIMC hIMC,UINT uEscape,LPVOID lpData)
|
|
{
|
|
if (s_ImmEscape)
|
|
return (*s_ImmEscape)(hKL,hIMC,uEscape,lpData);
|
|
else
|
|
return FALSE;
|
|
}
|
|
|