diff options
Diffstat (limited to 'private/os2/os2ses/imrqust.c')
-rw-r--r-- | private/os2/os2ses/imrqust.c | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/private/os2/os2ses/imrqust.c b/private/os2/os2ses/imrqust.c new file mode 100644 index 000000000..804c57d5f --- /dev/null +++ b/private/os2/os2ses/imrqust.c @@ -0,0 +1,261 @@ +/*++ + +Copyright (c) 1989 Microsoft Corporation + +Module Name: + + imrqust.c + +Abstract: + + This module contains the Immon requests thread and + the handler for Immon requests. + +Author: + + Akihiko Sasaki (v-akihis) 18-Dec-1992 + +Environment: + + User Mode Only + +Revision History: + +--*/ + +#ifdef DBCS + +// If NLS module for console doesn't present, then NO_CONSOLE_NLS switch should be enable +// difinition. +// If NLS module for User doesn't present, then NO_IME switch should be enable difinition. +//#define NO_CONSOLE_NLS +//#define NO_IME + +#define WIN32_ONLY +#include "os2ses.h" +#include <stdio.h> +#ifndef NO_IME +#include <winnls32.h> +#endif + + +// From immonerr.h +#define IM_NO_ERROR 0 /* IMMonitor No Error Code */ +#define IM_GENERAL_ERROR 3081 /* IMMonitor General Error (Internal) */ +#define IM_INVALID_SEG 3082 /* Cannot access application segment */ +#define IM_INVALID_SESSION 3083 /* Cannot register into Monitor chain */ + +#define IM_IME_NOT_FOUND 3084 /* specified IME is not found */ +#define IM_IME_INV_ENTRY 3085 /* IME doesnot have all IMExxx entries */ +#define IM_NO_DEFAULT_IME 3086 /* there is no default IMEdit */ +#define IM_IME_NOT_INSTALL 3087 /* IME is not installed in this SG */ +#define IM_IME_FAIL_INSTALL 3088 /* fail to install requested IMEdit */ +#define IM_INVALID_LEN 3089 /* Data Length is invalid. (name.....) */ + +#define IM_NOT_ENOUGH_BUFF 3090 /* buffer is not enough to save data */ + +#define IM_INVALID_COMMAND 3091 /* invalid command on IMMxxx calls */ +#define IM_RESERVED_COMMAND 3092 /* command is reserved for system use */ + +#define IM_INVALID_HANDLE 3093 /* invalid handle */ + +#define IM_NO_XVIO_WINDOW 3094 /* there is no XVIO windows */ +#define IM_WINDOW_HIDDEN 3095 /* cannot make window visible */ + +#ifndef NO_IME +USHORT GetEditLen(IMEPRO *); +#endif + +BOOL +ServeImmonRequest(IN PIMMONREQUEST PReq, + OUT PVOID PStatus) +{ + DWORD Rc; + DWORD dwNlsMode; + + Rc = 0; + + switch (PReq->Request) + { + case IMMONStatus: + if (PReq->d.MonStatBlk.cb != sizeof(MONSTATBLK)) + { +#if DBG + KdPrint(("OS2SES(ImmonRequest): invalid parameter\n")); +#endif + Rc = ERROR_INVALID_PARAMETER; + } else + { + switch (PReq->d.MonStatBlk.usInfoLevel) + { + case 0x21: +#ifndef NO_IME + { + IMEPRO ImeInfo; + PUSHORT pInfoBuf, dst; + USHORT BufLen, len; + + + if (!IMPGetIME( NULL, &ImeInfo )) + { +#if DBG + KdPrint(("OS2SES(ImmonRequest): Can not get IME info\n")); +#endif + Rc = IM_IME_NOT_INSTALL; + break; + + } + + BufLen = PReq->d.MonStatBlk.cbInfoBuf; + if ((GetEditLen(&ImeInfo) + 10) > BufLen) + { + BufLen = 2; + Rc = IM_NOT_ENOUGH_BUFF; + } else + { + pInfoBuf = dst = (PUSHORT)Os2SessionCtrlDataBaseAddress; + + len = strlen(ImeInfo.szName) + 1; + *dst++ = len + 2; + RtlMoveMemory(dst, ImeInfo.szName, len); + (PCHAR) dst += len; + + + len = strlen(ImeInfo.szDescription) + 1; + *dst++ = len + 2; + RtlMoveMemory(dst, ImeInfo.szDescription, len); + (PCHAR) dst += len; + + len = strlen(ImeInfo.szOptions) + 1; + *dst++ = len + 2; + RtlMoveMemory(dst, ImeInfo.szOptions, len); + (PCHAR) dst += len; + + *dst++ = 3; + *(PUCHAR) dst = '\0'; + } + } +#endif + break; + case 0x23: + if (PReq->d.MonStatBlk.cbInfoBuf < 2) + { + Rc = ERROR_BUFFER_OVERFLOW; + break; + } +#ifndef NO_CONSOLE_NLS + if (!GetConsoleNlsMode(hConsoleInput,&dwNlsMode)) + { +#if DBG + KdPrint(("OS2SES(ImmonRequest): Can not get CONIN NLS Mode\n")); +#endif + dwNlsMode = 0; + } +#else + dwNlsMode = 0; +#endif + +#ifndef NO_IME + if (dwNlsMode & NLS_IME_DISABLE) + *(PUSHORT)Os2SessionCtrlDataBaseAddress = 0; + else + *(PUSHORT)Os2SessionCtrlDataBaseAddress = 1; +#endif + + break; + default: + Rc = IM_INVALID_COMMAND; + } + } + break; + + case IMMONActive: + +#ifndef NO_CONSOLE_NLS + if (!GetConsoleNlsMode(hConsoleInput,&dwNlsMode)) + { +#if DBG + KdPrint(("OS2SES(ImmonRequest): Can not get CONIN NLS Mode\n")); +#endif + dwNlsMode = 0; + } + + dwNlsMode &= ~NLS_IME_DISABLE; + + if (!SetConsoleNlsMode(hConsoleInput,dwNlsMode)) + { +#if DBG + KdPrint(("OS2SES(ImmonRequest): Can not set CONIN NLS Mode\n")); +#endif + } + +#endif + break; + + case IMMONInactive: +#ifndef NO_CONSOLE_NLS + if (!GetConsoleNlsMode(hConsoleInput,&dwNlsMode)) + { +#if DBG + KdPrint(("OS2SES(ImmonRequest): Can not get CONIN NLS Mode\n")); +#endif + dwNlsMode = 0; + } + + dwNlsMode |= NLS_IME_DISABLE; + + if (!SetConsoleNlsMode(hConsoleInput,dwNlsMode)) + { +#if DBG + KdPrint(("OS2SES(ImmonRequst): Can not set CONIN NLS Mode\n")); +#endif + } + +#endif + break; + + default: + Rc = (DWORD)-1L; //STATUS_INVALID_PARAMETER; +#if DBG + IF_OD2_DEBUG( OS2_EXE) + { + KdPrint(("OS2SES(ImmonRequest): Unknown Immon request = %lC\n", + PReq->Request)); + } +#endif + } + + if ( Rc == 1 ) + { + Rc = GetLastError(); + } + + *(PDWORD) PStatus = Rc; + + return(TRUE); // Continue +} + +#ifndef NO_IME +USHORT +GetEditLen(IMEPRO *ImeInfo) +{ + USHORT Length, Total; + CHAR *Str; + + Str = (PUCHAR) ImeInfo->szName; + for (Length = 1; *Str++; Length++) ; + + Total = Length; + + Str = (PUCHAR) ImeInfo->szDescription; + for (Length = 1; *Str++; Length++) ; + + Total += Length; + + Str = (PUCHAR) ImeInfo->szOptions; + for (Length = 1; *Str++; Length++) ; + + return (Total + Length); +} +#endif +#endif |