summaryrefslogblamecommitdiffstats
path: root/private/os2/os2ses/imrqust.c
blob: 804c57d5f5886aa3722b122c3e5dd7740cbbd5d6 (plain) (tree)




































































































































































































































































                                                                                            
/*++

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