Blame util/IMdkit/i18nX.c

Packit Service 1d8f1c
/******************************************************************
Packit Service 1d8f1c
 
Packit Service 1d8f1c
         Copyright (C) 1994-1995 Sun Microsystems, Inc.
Packit Service 1d8f1c
         Copyright (C) 1993-1994 Hewlett-Packard Company
Packit Service 1d8f1c
         Copyright (C) 2014 Peng Huang <shawn.p.huang@gmail.com>
Packit Service 1d8f1c
         Copyright (C) 2014 Red Hat, Inc.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
Permission to use, copy, modify, distribute, and sell this software
Packit Service 1d8f1c
and its documentation for any purpose is hereby granted without fee,
Packit Service 1d8f1c
provided that the above copyright notice appear in all copies and
Packit Service 1d8f1c
that both that copyright notice and this permission notice appear
Packit Service 1d8f1c
in supporting documentation, and that the name of Sun Microsystems, Inc.
Packit Service 1d8f1c
and Hewlett-Packard not be used in advertising or publicity pertaining to
Packit Service 1d8f1c
distribution of the software without specific, written prior permission.
Packit Service 1d8f1c
Sun Microsystems, Inc. and Hewlett-Packard make no representations about
Packit Service 1d8f1c
the suitability of this software for any purpose.  It is provided "as is"
Packit Service 1d8f1c
without express or implied warranty.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
SUN MICROSYSTEMS INC. AND HEWLETT-PACKARD COMPANY DISCLAIMS ALL
Packit Service 1d8f1c
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
Packit Service 1d8f1c
WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit Service 1d8f1c
SUN MICROSYSTEMS, INC. AND HEWLETT-PACKARD COMPANY BE LIABLE FOR ANY
Packit Service 1d8f1c
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
Packit Service 1d8f1c
RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
Packit Service 1d8f1c
CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
Packit Service 1d8f1c
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit Service 1d8f1c
 
Packit Service 1d8f1c
  Author: Hidetoshi Tajima(tajima@Eng.Sun.COM) Sun Microsystems, Inc.
Packit Service 1d8f1c
Packit Service 1d8f1c
    This version tidied and debugged by Steve Underwood May 1999
Packit Service 1d8f1c
 
Packit Service 1d8f1c
******************************************************************/
Packit Service 1d8f1c
Packit Service 1d8f1c
#include <assert.h>
Packit Service 1d8f1c
#include <stddef.h>
Packit Service 1d8f1c
#include <limits.h>
Packit Service 1d8f1c
#include <X11/Xlib.h>
Packit Service 1d8f1c
#include <X11/Xatom.h>
Packit Service 1d8f1c
#include "FrameMgr.h"
Packit Service 1d8f1c
#include "IMdkit.h"
Packit Service 1d8f1c
#include "Xi18n.h"
Packit Service 1d8f1c
#include "Xi18nX.h"
Packit Service 1d8f1c
#include "XimFunc.h"
Packit Service 1d8f1c
Packit Service 1d8f1c
extern Xi18nClient *_Xi18nFindClient (Xi18n, CARD16);
Packit Service 1d8f1c
extern Xi18nClient *_Xi18nNewClient (Xi18n);
Packit Service 1d8f1c
extern void _Xi18nDeleteClient (Xi18n, CARD16);
Packit Service 1d8f1c
extern unsigned long _Xi18nLookupPropertyOffset (Xi18nOffsetCache *, Atom);
Packit Service 1d8f1c
extern void _Xi18nSetPropertyOffset (Xi18nOffsetCache *, Atom, unsigned long);
Packit Service 1d8f1c
static Bool WaitXConnectMessage (Display*, Window,
Packit Service 1d8f1c
                                 XEvent*, XPointer);
Packit Service 1d8f1c
static Bool WaitXIMProtocol (Display*, Window, XEvent*, XPointer);
Packit Service 1d8f1c
Packit Service 1d8f1c
static XClient *NewXClient (Xi18n i18n_core, Window new_client)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Display *dpy = i18n_core->address.dpy;
Packit Service 1d8f1c
    Xi18nClient *client = _Xi18nNewClient (i18n_core);
Packit Service 1d8f1c
    XClient *x_client;
Packit Service 1d8f1c
Packit Service 1d8f1c
    x_client = (XClient *) malloc (sizeof (XClient));
Packit Service 1d8f1c
    x_client->client_win = new_client;
Packit Service 1d8f1c
    x_client->accept_win = XCreateSimpleWindow (dpy,
Packit Service 1d8f1c
                                                DefaultRootWindow(dpy),
Packit Service 1d8f1c
                                                0,
Packit Service 1d8f1c
                                                0,
Packit Service 1d8f1c
                                                1,
Packit Service 1d8f1c
                                                1,
Packit Service 1d8f1c
                                                1,
Packit Service 1d8f1c
                                                0,
Packit Service 1d8f1c
                                                0);
Packit Service 1d8f1c
    client->trans_rec = x_client;
Packit Service 1d8f1c
    return ((XClient *) x_client);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static unsigned char *ReadXIMMessage (XIMS ims,
Packit Service 1d8f1c
                                      XClientMessageEvent *ev,
Packit Service 1d8f1c
                                      int *connect_id)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    Xi18nClient *client = i18n_core->address.clients;
Packit Service 1d8f1c
    XClient *x_client = NULL;
Packit Service 1d8f1c
    FrameMgr fm;
Packit Service 1d8f1c
    extern XimFrameRec packet_header_fr[];
Packit Service 1d8f1c
    unsigned char *p = NULL;
Packit Service 1d8f1c
    unsigned char *p1;
Packit Service 1d8f1c
Packit Service 1d8f1c
    while (client != NULL) {
Packit Service 1d8f1c
        x_client = (XClient *) client->trans_rec;
Packit Service 1d8f1c
        if (x_client->accept_win == ev->window) {
Packit Service 1d8f1c
            *connect_id = client->connect_id;
Packit Service 1d8f1c
            break;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        client = client->next;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
Packit Service 1d8f1c
    assert (client);
Packit Service 1d8f1c
    if (ev->format == 8) {
Packit Service 1d8f1c
        /* ClientMessage only */
Packit Service 1d8f1c
        XimProtoHdr *hdr = (XimProtoHdr *) ev->data.b;
Packit Service 1d8f1c
        unsigned char *rec = (unsigned char *) (hdr + 1);
Packit Service 1d8f1c
        register int total_size;
Packit Service 1d8f1c
        CARD8 major_opcode;
Packit Service 1d8f1c
        CARD8 minor_opcode;
Packit Service 1d8f1c
        CARD16 length;
Packit Service 1d8f1c
        extern int _Xi18nNeedSwap (Xi18n, CARD16);
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (client->byte_order == '?')
Packit Service 1d8f1c
        {
Packit Service 1d8f1c
            if (hdr->major_opcode != XIM_CONNECT)
Packit Service 1d8f1c
                return (unsigned char *) NULL; /* can do nothing */
Packit Service 1d8f1c
            client->byte_order = (CARD8) rec[0];
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        fm = FrameMgrInit (packet_header_fr,
Packit Service 1d8f1c
                           (char *) hdr,
Packit Service 1d8f1c
                           _Xi18nNeedSwap (i18n_core, *connect_id));
Packit Service 1d8f1c
        total_size = FrameMgrGetTotalSize (fm);
Packit Service 1d8f1c
        /* get data */
Packit Service 1d8f1c
        FrameMgrGetToken (fm, major_opcode);
Packit Service 1d8f1c
        FrameMgrGetToken (fm, minor_opcode);
Packit Service 1d8f1c
        FrameMgrGetToken (fm, length);
Packit Service 1d8f1c
        FrameMgrFree (fm);
Packit Service 1d8f1c
Packit Service 1d8f1c
        if ((p = (unsigned char *) malloc (total_size + length * 4)) == NULL)
Packit Service 1d8f1c
            return (unsigned char *) NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
        p1 = p;
Packit Service 1d8f1c
        memmove (p1, &major_opcode, sizeof (CARD8));
Packit Service 1d8f1c
        p1 += sizeof (CARD8);
Packit Service 1d8f1c
        memmove (p1, &minor_opcode, sizeof (CARD8));
Packit Service 1d8f1c
        p1 += sizeof (CARD8);
Packit Service 1d8f1c
        memmove (p1, &length, sizeof (CARD16));
Packit Service 1d8f1c
        p1 += sizeof (CARD16);
Packit Service 1d8f1c
        memmove (p1, rec, length * 4);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else if (ev->format == 32) {
Packit Service 1d8f1c
        /* ClientMessage and WindowProperty */
Packit Service 1d8f1c
        unsigned long length = (unsigned long) ev->data.l[0];
Packit Service 1d8f1c
        Atom atom = (Atom) ev->data.l[1];
Packit Service 1d8f1c
        int return_code;
Packit Service 1d8f1c
        Atom actual_type_ret;
Packit Service 1d8f1c
        int actual_format_ret;
Packit Service 1d8f1c
        unsigned long bytes_after_ret;
Packit Service 1d8f1c
        unsigned char *prop;
Packit Service 1d8f1c
        unsigned long nitems;
Packit Service 1d8f1c
        Xi18nOffsetCache *offset_cache = &client->offset_cache;
Packit Service 1d8f1c
        unsigned long offset;
Packit Service 1d8f1c
        unsigned long end;
Packit Service 1d8f1c
        unsigned long long_begin;
Packit Service 1d8f1c
        unsigned long long_end;
Packit Service 1d8f1c
Packit Service 1d8f1c
        if (length == 0) {
Packit Service 1d8f1c
            fprintf (stderr, "%s: invalid length 0\n", __func__);
Packit Service 1d8f1c
            return NULL;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
Packit Service 1d8f1c
        offset = _Xi18nLookupPropertyOffset (offset_cache, atom);
Packit Service 1d8f1c
        end = offset + length;
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* The property data is retrieved in 32-bit chunks */
Packit Service 1d8f1c
        long_begin = offset / 4;
Packit Service 1d8f1c
        long_end = (end + 3) / 4;
Packit Service 1d8f1c
        assert (x_client);
Packit Service 1d8f1c
        return_code = XGetWindowProperty (i18n_core->address.dpy,
Packit Service 1d8f1c
                                          x_client->accept_win,
Packit Service 1d8f1c
                                          atom,
Packit Service 1d8f1c
                                          long_begin,
Packit Service 1d8f1c
                                          long_end - long_begin,
Packit Service 1d8f1c
                                          True,
Packit Service 1d8f1c
                                          AnyPropertyType,
Packit Service 1d8f1c
                                          &actual_type_ret,
Packit Service 1d8f1c
                                          &actual_format_ret,
Packit Service 1d8f1c
                                          &nitems,
Packit Service 1d8f1c
                                          &bytes_after_ret,
Packit Service 1d8f1c
                                          &prop);
Packit Service 1d8f1c
        if (return_code != Success || actual_format_ret == 0 || nitems == 0) {
Packit Service 1d8f1c
            if (return_code == Success)
Packit Service 1d8f1c
                XFree (prop);
Packit Service 1d8f1c
            fprintf (stderr,
Packit Service 1d8f1c
                    "(XIM-IMdkit) ERROR: XGetWindowProperty failed.\n"
Packit Service 1d8f1c
                    "Protocol data is likely to be inconsistent.\n");
Packit Service 1d8f1c
            _Xi18nSetPropertyOffset (offset_cache, atom, 0);
Packit Service 1d8f1c
            return (unsigned char *) NULL;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        /* Update the offset to read next time as needed */
Packit Service 1d8f1c
        if (bytes_after_ret > 0)
Packit Service 1d8f1c
            _Xi18nSetPropertyOffset (offset_cache, atom, offset + length);
Packit Service 1d8f1c
        else
Packit Service 1d8f1c
            _Xi18nSetPropertyOffset (offset_cache, atom, 0);
Packit Service 1d8f1c
        /* if hit, it might be an error */
Packit Service 1d8f1c
        if ((p = (unsigned char *) malloc (length)) == NULL)
Packit Service 1d8f1c
            return (unsigned char *) NULL;
Packit Service 1d8f1c
Packit Service 1d8f1c
        memcpy (p, prop + (offset % 4), length);
Packit Service 1d8f1c
        XFree (prop);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    return (unsigned char *) p;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static void ReadXConnectMessage (XIMS ims, XClientMessageEvent *ev)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr;
Packit Service 1d8f1c
    XEvent event;
Packit Service 1d8f1c
    Display *dpy = i18n_core->address.dpy;
Packit Service 1d8f1c
    Window new_client = ev->data.l[0];
Packit Service 1d8f1c
    CARD32 major_version = ev->data.l[1];
Packit Service 1d8f1c
    CARD32 minor_version = ev->data.l[2];
Packit Service 1d8f1c
    XClient *x_client = NewXClient (i18n_core, new_client);
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (ev->window != i18n_core->address.im_window)
Packit Service 1d8f1c
        return; /* incorrect connection request */
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    if (major_version != 0  ||  minor_version != 0)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        major_version =
Packit Service 1d8f1c
        minor_version = 0;
Packit Service 1d8f1c
        /* Only supporting only-CM & Property-with-CM method */
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    _XRegisterFilterByType (dpy,
Packit Service 1d8f1c
                            x_client->accept_win,
Packit Service 1d8f1c
                            ClientMessage,
Packit Service 1d8f1c
                            ClientMessage,
Packit Service 1d8f1c
                            WaitXIMProtocol,
Packit Service 1d8f1c
                            (XPointer)ims);
Packit Service 1d8f1c
    event.xclient.type = ClientMessage;
Packit Service 1d8f1c
    event.xclient.display = dpy;
Packit Service 1d8f1c
    event.xclient.window = new_client;
Packit Service 1d8f1c
    event.xclient.message_type = spec->connect_request;
Packit Service 1d8f1c
    event.xclient.format = 32;
Packit Service 1d8f1c
    event.xclient.data.l[0] = x_client->accept_win;
Packit Service 1d8f1c
    event.xclient.data.l[1] = major_version;
Packit Service 1d8f1c
    event.xclient.data.l[2] = minor_version;
Packit Service 1d8f1c
    event.xclient.data.l[3] = XCM_DATA_LIMIT;
Packit Service 1d8f1c
Packit Service 1d8f1c
    XSendEvent (dpy,
Packit Service 1d8f1c
                new_client,
Packit Service 1d8f1c
                False,
Packit Service 1d8f1c
                NoEventMask,
Packit Service 1d8f1c
                &event);
Packit Service 1d8f1c
    XFlush (dpy);
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool Xi18nXBegin (XIMS ims)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    Display *dpy = i18n_core->address.dpy;
Packit Service 1d8f1c
    XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr;
Packit Service 1d8f1c
Packit Service 1d8f1c
    spec->xim_request = XInternAtom (i18n_core->address.dpy,
Packit Service 1d8f1c
                                     _XIM_PROTOCOL,
Packit Service 1d8f1c
                                     False);
Packit Service 1d8f1c
    spec->connect_request = XInternAtom (i18n_core->address.dpy,
Packit Service 1d8f1c
                                         _XIM_XCONNECT,
Packit Service 1d8f1c
                                         False);
Packit Service 1d8f1c
Packit Service 1d8f1c
    _XRegisterFilterByType (dpy,
Packit Service 1d8f1c
                            i18n_core->address.im_window,
Packit Service 1d8f1c
                            ClientMessage,
Packit Service 1d8f1c
                            ClientMessage,
Packit Service 1d8f1c
                            WaitXConnectMessage,
Packit Service 1d8f1c
                            (XPointer)ims);
Packit Service 1d8f1c
    return True;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool Xi18nXEnd(XIMS ims)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    Display *dpy = i18n_core->address.dpy;
Packit Service 1d8f1c
Packit Service 1d8f1c
    _XUnregisterFilter (dpy,
Packit Service 1d8f1c
                        i18n_core->address.im_window,
Packit Service 1d8f1c
                        WaitXConnectMessage,
Packit Service 1d8f1c
                        (XPointer)ims);
Packit Service 1d8f1c
    return True;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static char *MakeNewAtom (CARD16 connect_id, char *atomName)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    static int sequence = 0;
Packit Service 1d8f1c
    sprintf (atomName,
Packit Service 1d8f1c
             "_server%d_%d",
Packit Service 1d8f1c
             connect_id,
Packit Service 1d8f1c
             ((sequence > 20)  ?  (sequence = 0)  :  (0x1f & sequence)));
Packit Service 1d8f1c
    sequence++;
Packit Service 1d8f1c
    return atomName;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool Xi18nXSend (XIMS ims,
Packit Service 1d8f1c
                        CARD16 connect_id,
Packit Service 1d8f1c
                        unsigned char *reply,
Packit Service 1d8f1c
                        long length)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id);
Packit Service 1d8f1c
    XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr;
Packit Service 1d8f1c
    XClient *x_client = (XClient *) client->trans_rec;
Packit Service 1d8f1c
    XEvent event;
Packit Service 1d8f1c
Packit Service 1d8f1c
    event.type = ClientMessage;
Packit Service 1d8f1c
    event.xclient.window = x_client->client_win;
Packit Service 1d8f1c
    event.xclient.message_type = spec->xim_request;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (length > XCM_DATA_LIMIT)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        Atom atom;
Packit Service 1d8f1c
        char atomName[16];
Packit Service 1d8f1c
        Atom actual_type_ret;
Packit Service 1d8f1c
        int actual_format_ret;
Packit Service 1d8f1c
        int return_code;
Packit Service 1d8f1c
        unsigned long nitems_ret;
Packit Service 1d8f1c
        unsigned long bytes_after_ret;
Packit Service 1d8f1c
        unsigned char *win_data;
Packit Service 1d8f1c
Packit Service 1d8f1c
        event.xclient.format = 32;
Packit Service 1d8f1c
        atom = XInternAtom (i18n_core->address.dpy,
Packit Service 1d8f1c
                            MakeNewAtom (connect_id, atomName),
Packit Service 1d8f1c
                            False);
Packit Service 1d8f1c
        return_code = XGetWindowProperty (i18n_core->address.dpy,
Packit Service 1d8f1c
                                          x_client->client_win,
Packit Service 1d8f1c
                                          atom,
Packit Service 1d8f1c
                                          0L,
Packit Service 1d8f1c
                                          10000L,
Packit Service 1d8f1c
                                          False,
Packit Service 1d8f1c
                                          XA_STRING,
Packit Service 1d8f1c
                                          &actual_type_ret,
Packit Service 1d8f1c
                                          &actual_format_ret,
Packit Service 1d8f1c
                                          &nitems_ret,
Packit Service 1d8f1c
                                          &bytes_after_ret,
Packit Service 1d8f1c
                                          &win_data);
Packit Service 1d8f1c
        if (return_code != Success)
Packit Service 1d8f1c
            return False;
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
        if (win_data)
Packit Service 1d8f1c
            XFree ((char *) win_data);
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
        XChangeProperty (i18n_core->address.dpy,
Packit Service 1d8f1c
                         x_client->client_win,
Packit Service 1d8f1c
                         atom,
Packit Service 1d8f1c
                         XA_STRING,
Packit Service 1d8f1c
                         8,
Packit Service 1d8f1c
                         PropModeAppend,
Packit Service 1d8f1c
                         (unsigned char *) reply,
Packit Service 1d8f1c
                         length);
Packit Service 1d8f1c
        event.xclient.data.l[0] = length;
Packit Service 1d8f1c
        event.xclient.data.l[1] = atom;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    else
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        unsigned char buffer[XCM_DATA_LIMIT];
Packit Service 1d8f1c
        int i;
Packit Service 1d8f1c
Packit Service 1d8f1c
        event.xclient.format = 8;
Packit Service 1d8f1c
Packit Service 1d8f1c
        /* Clear unused field with NULL */
Packit Service 1d8f1c
        memmove(buffer, reply, length);
Packit Service 1d8f1c
        for (i = length; i < XCM_DATA_LIMIT; i++)
Packit Service 1d8f1c
            buffer[i] = (char) 0;
Packit Service 1d8f1c
        /*endfor*/
Packit Service 1d8f1c
        length = XCM_DATA_LIMIT;
Packit Service 1d8f1c
        memmove (event.xclient.data.b, buffer, length);
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    XSendEvent (i18n_core->address.dpy,
Packit Service 1d8f1c
                x_client->client_win,
Packit Service 1d8f1c
                False,
Packit Service 1d8f1c
                NoEventMask,
Packit Service 1d8f1c
                &event);
Packit Service 1d8f1c
    XFlush (i18n_core->address.dpy);
Packit Service 1d8f1c
    return True;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool CheckCMEvent (Display *display, XEvent *event, XPointer xi18n_core)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = (Xi18n) ((void *) xi18n_core);
Packit Service 1d8f1c
    XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if ((event->type == ClientMessage)
Packit Service 1d8f1c
        &&
Packit Service 1d8f1c
        (event->xclient.message_type == spec->xim_request))
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        return  True;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    return  False;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool Xi18nXWait (XIMS ims,
Packit Service 1d8f1c
                        CARD16 connect_id,
Packit Service 1d8f1c
                        CARD8 major_opcode,
Packit Service 1d8f1c
                        CARD8 minor_opcode)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    XEvent event;
Packit Service 1d8f1c
    Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id);
Packit Service 1d8f1c
    XClient *x_client = (XClient *) client->trans_rec;
Packit Service 1d8f1c
Packit Service 1d8f1c
    for (;;)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        unsigned char *packet;
Packit Service 1d8f1c
        XimProtoHdr *hdr;
Packit Service 1d8f1c
        int connect_id_ret = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
        XIfEvent (i18n_core->address.dpy,
Packit Service 1d8f1c
                  &event,
Packit Service 1d8f1c
                  CheckCMEvent,
Packit Service 1d8f1c
                  (XPointer) i18n_core);
Packit Service 1d8f1c
        if (event.xclient.window == x_client->accept_win)
Packit Service 1d8f1c
        {
Packit Service 1d8f1c
            if ((packet = ReadXIMMessage (ims,
Packit Service 1d8f1c
                                          (XClientMessageEvent *) & event,
Packit Service 1d8f1c
                                          &connect_id_ret))
Packit Service 1d8f1c
                == (unsigned char*) NULL)
Packit Service 1d8f1c
            {
Packit Service 1d8f1c
                return False;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            /*endif*/
Packit Service 1d8f1c
            hdr = (XimProtoHdr *)packet;
Packit Service 1d8f1c
Packit Service 1d8f1c
            if ((hdr->major_opcode == major_opcode)
Packit Service 1d8f1c
                &&
Packit Service 1d8f1c
                (hdr->minor_opcode == minor_opcode))
Packit Service 1d8f1c
            {
Packit Service 1d8f1c
                XFree (packet);
Packit Service 1d8f1c
                return True;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            else if (hdr->major_opcode == XIM_ERROR)
Packit Service 1d8f1c
            {
Packit Service 1d8f1c
                XFree (packet);
Packit Service 1d8f1c
                return False;
Packit Service 1d8f1c
            }
Packit Service 1d8f1c
            /*endif*/
Packit Service 1d8f1c
            XFree (packet);
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endfor*/
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool Xi18nXDisconnect (XIMS ims, CARD16 connect_id)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    Display *dpy = i18n_core->address.dpy;
Packit Service 1d8f1c
    Xi18nClient *client = _Xi18nFindClient (i18n_core, connect_id);
Packit Service 1d8f1c
    XClient *x_client = (XClient *) client->trans_rec;
Packit Service 1d8f1c
Packit Service 1d8f1c
    XDestroyWindow (dpy, x_client->accept_win);
Packit Service 1d8f1c
    _XUnregisterFilter (dpy,
Packit Service 1d8f1c
                        x_client->accept_win,
Packit Service 1d8f1c
                        WaitXIMProtocol,
Packit Service 1d8f1c
                        (XPointer)ims);
Packit Service 1d8f1c
    XFree (x_client);
Packit Service 1d8f1c
    _Xi18nDeleteClient (i18n_core, connect_id);
Packit Service 1d8f1c
    return True;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
Bool _Xi18nCheckXAddress (Xi18n i18n_core,
Packit Service 1d8f1c
                          TransportSW *transSW,
Packit Service 1d8f1c
                          char *address)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    XSpecRec *spec;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (!(spec = (XSpecRec *) malloc (sizeof (XSpecRec))))
Packit Service 1d8f1c
        return False;
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    
Packit Service 1d8f1c
    i18n_core->address.connect_addr = (XSpecRec *) spec;
Packit Service 1d8f1c
    i18n_core->methods.begin = Xi18nXBegin;
Packit Service 1d8f1c
    i18n_core->methods.end = Xi18nXEnd;
Packit Service 1d8f1c
    i18n_core->methods.send = Xi18nXSend;
Packit Service 1d8f1c
    i18n_core->methods.wait = Xi18nXWait;
Packit Service 1d8f1c
    i18n_core->methods.disconnect = Xi18nXDisconnect;
Packit Service 1d8f1c
    return True;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool WaitXConnectMessage (Display *dpy,
Packit Service 1d8f1c
                                 Window win,
Packit Service 1d8f1c
                                 XEvent *ev,
Packit Service 1d8f1c
                                 XPointer client_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    XIMS ims = (XIMS)client_data;
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (((XClientMessageEvent *) ev)->message_type
Packit Service 1d8f1c
        == spec->connect_request)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        ReadXConnectMessage (ims, (XClientMessageEvent *) ev);
Packit Service 1d8f1c
        return True;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    return False;
Packit Service 1d8f1c
}
Packit Service 1d8f1c
Packit Service 1d8f1c
static Bool WaitXIMProtocol (Display *dpy,
Packit Service 1d8f1c
                             Window win,
Packit Service 1d8f1c
                             XEvent *ev,
Packit Service 1d8f1c
                             XPointer client_data)
Packit Service 1d8f1c
{
Packit Service 1d8f1c
    extern void _Xi18nMessageHandler (XIMS, CARD16, unsigned char *, Bool *);
Packit Service 1d8f1c
    XIMS ims = (XIMS) client_data;
Packit Service 1d8f1c
    Xi18n i18n_core = ims->protocol;
Packit Service 1d8f1c
    XSpecRec *spec = (XSpecRec *) i18n_core->address.connect_addr;
Packit Service 1d8f1c
    Bool delete = True;
Packit Service 1d8f1c
    unsigned char *packet;
Packit Service 1d8f1c
    int connect_id = 0;
Packit Service 1d8f1c
Packit Service 1d8f1c
    if (((XClientMessageEvent *) ev)->message_type
Packit Service 1d8f1c
        == spec->xim_request)
Packit Service 1d8f1c
    {
Packit Service 1d8f1c
        if ((packet = ReadXIMMessage (ims,
Packit Service 1d8f1c
                                      (XClientMessageEvent *) ev,
Packit Service 1d8f1c
                                      &connect_id))
Packit Service 1d8f1c
            == (unsigned char *)  NULL)
Packit Service 1d8f1c
        {
Packit Service 1d8f1c
            return False;
Packit Service 1d8f1c
        }
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
        _Xi18nMessageHandler (ims, connect_id, packet, &delete);
Packit Service 1d8f1c
        if (delete == True)
Packit Service 1d8f1c
            XFree (packet);
Packit Service 1d8f1c
        /*endif*/
Packit Service 1d8f1c
        return True;
Packit Service 1d8f1c
    }
Packit Service 1d8f1c
    /*endif*/
Packit Service 1d8f1c
    return False;
Packit Service 1d8f1c
}