com.jcraft.weirdx.XJSExtension.java Source code

Java tutorial

Introduction

Here is the source code for com.jcraft.weirdx.XJSExtension.java

Source

/* -*-mode:java; c-basic-offset:2; -*- */
/* WeirdX - Guess.
 *
 * Copyright (C) 2000 Christian Werner<Christian.Werner@t-online.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
/* 
 * Authors:  Christian Werner<Christian.Werner@t-online.de>
 *
 * 08-Mar-2000: This file is written by Christian Werner.
 * 02-Aug-2000: ymnk extracts initialization code for XJS from WeirdX class
 *              and add it to this class.
 */

package com.jcraft.weirdx;

import java.io.IOException;
import java.lang.reflect.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.jcraft.weirdx.res.XResource;

final class XJSExtension extends Extension {
    private static Log LOG = LogFactory.getLog(XJSExtension.class);

    private static Object jswin = null;
    private static Method jseval = null;
    private static Method jscall = null;

    static int ctyp;
    static int etyp;

    XJSExtension() {
        try {
            Method getw = null;
            Class<?> c = Class.forName("netscape.javascript.JSObject");
            Method ms[] = c.getMethods();
            for (int i = 0; i < ms.length; i++) {
                if (ms[i].getName().compareTo("getWindow") == 0) {
                    getw = ms[i];
                } else if (ms[i].getName().compareTo("call") == 0) {
                    jscall = ms[i];
                } else if (ms[i].getName().compareTo("eval") == 0) {
                    jseval = ms[i];
                }
            }
            Object a[] = new Object[1];
            a[0] = WeirdX.weirdx;
            jswin = getw.invoke(c, a);
        } catch (Exception ee) {
        }

        eventcount = 0;
        errorcount = 0;
        ctyp = XResource.newType();
        etyp = XResource.newType();
        name = "WeirdX-JavaScript";
    }

    void swap(Event e) {
    }

    void dispatch(Client c) throws IOException {
        int len, i, k, m;
        InputOutput io = c.client;
        String result = null;

        switch (c.data) {
        case 0:
            io.readPad(28);
            io.writeByte(1);
            io.writeByte(jswin != null ? 1 : 0);
            io.writeShort(c.seq);
            io.writePad(28);
            return;
        case 1:
            len = c.length * 4 - 32;
            io.readPad(28);
            if (len > 0) {
                io.readByte(c.bbuffer, 0, len);
                for (i = 0; i < len; i++) {
                    if (c.bbuffer[i] == 0)
                        break;
                    c.cbuffer[i] = (char) (c.bbuffer[i] & 0xFF);
                }
                String str = new String(c.cbuffer, 0, i);
                try {
                    Object a[] = new Object[1];
                    a[0] = str;
                    Object r = jseval.invoke(jswin, a);
                    if (r instanceof String)
                        result = (String) r;
                    else
                        result = r.toString();
                } catch (InvocationTargetException ite) {
                    result = "" + ite.getTargetException();
                } catch (Exception e) {
                    result = "" + e;
                }
            } else {
                result = "";
            }
            break;
        case 2:
            len = c.length * 4 - 32;
            int nargs = io.readInt();
            io.readPad(24);
            String args[] = new String[nargs];
            if (len > 0) {
                io.readByte(c.bbuffer, 0, len);
                for (i = 0; i < len; i++) {
                    if (c.bbuffer[i] == 0)
                        break;
                    c.cbuffer[i] = (char) (c.bbuffer[i] & 0xFF);
                }
                String proc = new String(c.cbuffer, 0, i);
                ++i;
                for (k = 0; k < nargs; k++) {
                    for (m = 0; i < len; i++) {
                        if (c.bbuffer[i] == 0)
                            break;
                        c.cbuffer[m] = (char) (c.bbuffer[i] & 0xFF);
                        m++;
                    }
                    args[k] = new String(c.cbuffer, 0, m);
                }
                try {
                    Object[] a = new Object[2];
                    a[0] = proc;
                    a[1] = args;
                    Object r = jscall.invoke(jswin, a);
                    if (r instanceof String)
                        result = (String) r;
                    else
                        result = r.toString();
                } catch (InvocationTargetException ite) {
                    result = "" + ite.getTargetException();
                } catch (Exception e) {
                    result = "" + e;
                }
            } else {
                result = "";
            }
            break;
        default:
            LOG.error("XJS: unknown code=" + c.data);
        }
        if (result != null) {
            io.writeByte(1);
            io.writePad(1);
            io.writeShort(c.seq);
            len = ((result.length() + 4) >> 2) << 2;
            io.writeInt(len / 4);
            io.writeInt(len);
            io.writePad(20);
            for (i = 0; i < result.length(); i++) {
                io.writeByte((byte) result.charAt(i));
            }
            for (; i < len; i++) {
                io.writeByte(0);
            }
        }
    }
}