ltabb 8ed5afe62c Free the lizard
git-svn-id: svn://10.0.0.236/trunk@10 18797224-902f-48f8-a5cc-f745e15eee43
1998-03-28 02:44:41 +00:00

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;
}