nativeeventthread.java

来自「jdic,显著提高swing性能的插件」· Java 代码 · 共 370 行

JAVA
370
字号
/* * Copyright (C) 2004 Sun Microsystems, Inc. All rights reserved. Use is * subject to license terms. *  * This program is free software; you can redistribute it and/or modify * it under the terms of the Lesser 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ package org.jdesktop.jdic.browser;import java.util.Vector;import java.awt.*;import javax.swing.SwingUtilities;import java.security.*;import java.io.*;import org.jdesktop.jdic.browser.internal.WebBrowserUtil;import org.jdesktop.jdic.init.JdicManager;/** * An internal class for dealing with the communication between WebBrowser  * & native browser. * * @see WebBrowser *  * @author Kyle Yuan * @version 0.1, 03/07/17 */ class NativeEventThread extends Thread{    private Vector webBrowsers = new Vector();    // Event queue for events sent from Java to the native browser.    private Vector nativeEvents = new Vector();    private Process nativeBrowser;    boolean eventRetBool;    String eventRetString;    MsgClient messenger = new MsgClient();    NativeEventThread() {        super("EventThread");    }    void attachWebBrowser(WebBrowser webBrowser) {        int instanceNum = webBrowser.getInstanceNum();        if (instanceNum >= webBrowsers.size()) {            webBrowsers.setSize(instanceNum + 1);        }        webBrowsers.set(instanceNum, webBrowser);    }    public void run() {        // create native browser process        try {            if (WebBrowserUtil.getEmbedBinaryName() == null) {                 setBrowsersInitFailReason("The embedded browser binary is " +                        "not set.");                WebBrowserUtil.trace("The embedded browser binary is not set, " +                        "system exit.");                return;            }                 String jvmVendor = System.getProperty("java.vm.vendor");            if (WebBrowserUtil.getEmbedBinaryName().endsWith("IeEmbed.exe")                     && jvmVendor.startsWith("Sun"))                WebBrowserUtil.nativeSetEnv();            final String cmd = JdicManager.getManager().getBinaryPath()+                File.separator+WebBrowserUtil.getEmbedBinaryName();                            WebBrowserUtil.trace("Executing " + cmd);            AccessController.doPrivileged(                new PrivilegedExceptionAction() {                    public Object run() throws IOException {                        nativeBrowser = Runtime.getRuntime().exec(                                new String[]{cmd, "-port=" + messenger.getPort()});                        new StreamGobbler(nativeBrowser.getErrorStream()).start();                        new StreamGobbler(nativeBrowser.getInputStream()).start();                        return null;                    }                }            );        } catch (PrivilegedActionException e) {            setBrowsersInitFailReason("Can't find the native embedded browser.");            System.out.println("Can't execute the native embedded browser. " +                    "Error message: " + e.getCause().getMessage());            return;        }             // create socket client and connect to socket server        try {            AccessController.doPrivileged(                new PrivilegedExceptionAction() {                    public Object run() throws Exception {                        messenger.connect();                        return null;                    }                }            );        } catch (PrivilegedActionException e) {                      System.out.println("Can't connect to the native embedded " +                    "browser. Error message: " + e.getCause().getMessage());            setBrowsersInitFailReason("Can't connect to the native embedded " +                    "browser.");            return;        }         // main event loop        while (true) {            try {                Thread.sleep(1);            } catch (Exception e) {            }            try {                int exitValue = nativeBrowser.exitValue();                WebBrowserUtil.trace("Native embedded browser died.");                return;            } catch (IllegalThreadStateException e) {            }            try {                processEvents();            } catch (Exception e) {                WebBrowserUtil.trace("Exception occured when processEvent: "                         + e.getMessage());                return;            }            try {                messenger.portListening();                processIncomingMessage(messenger.getMessage());            } catch (Exception e) {                WebBrowserUtil.trace("Exception occured when portListening: "                         + e.getMessage());                return;            }        }    }    private WebBrowser getWebBrowserFromInstance(int instance) {        try {            return (WebBrowser) webBrowsers.get(instance);        } catch (Exception e) {            return null;        }    }    private void notifyWebBrowser(int instance) {        WebBrowser browser = getWebBrowserFromInstance(instance);        if (null != browser) {            synchronized(browser) {                browser.notify();            }        }    }    /*     * Processes events sent from Java to the native browser.     */    private void processEvents() {        int size = nativeEvents.size();        for (int i = 0; i < size; ++i) {            NativeEventData nativeEvent = (NativeEventData) nativeEvents.get(i);            if (processEvent(nativeEvent)) {                nativeEvents.removeElementAt(i);                break;            }        }    }    private boolean processEvent(NativeEventData nativeEvent) {        WebBrowser browser = getWebBrowserFromInstance(nativeEvent.instance);        if (null == browser) {            return true;        }        if (! browser.isInitialized() &&            (nativeEvent.type != NativeEventData.EVENT_INIT &&             nativeEvent.type != NativeEventData.EVENT_CREATEWINDOW)) {            return false;        }        WebBrowserUtil.trace("Got event: type = " + nativeEvent.type +                 " instance = " + nativeEvent.instance);        String msg = nativeEvent.instance + "," + nativeEvent.type + ",";        switch (nativeEvent.type) {            case NativeEventData.EVENT_INIT:            case NativeEventData.EVENT_DESTROYWINDOW:            case NativeEventData.EVENT_GOBACK:            case NativeEventData.EVENT_GOFORWARD:            case NativeEventData.EVENT_REFRESH:            case NativeEventData.EVENT_STOP:            case NativeEventData.EVENT_GETURL:            case NativeEventData.EVENT_FOCUSGAINED:            case NativeEventData.EVENT_FOCUSLOST:            case NativeEventData.EVENT_GETCONTENT:                messenger.sendMessage(msg);                break;            case NativeEventData.EVENT_SHUTDOWN:                messenger.sendMessage(msg);                break;            case NativeEventData.EVENT_CREATEWINDOW:                int nativeWindow = browser.getNativeWindow();                if (0 == nativeWindow) {                    WebBrowserUtil.trace("Can't get the JAWT window handler. " +                            "Make sure the environment variable JAVA_HOME " +                            "is set.");                }                else {                    msg += nativeWindow;                    messenger.sendMessage(msg);                }                break;            case NativeEventData.EVENT_SET_BOUNDS:                msg += nativeEvent.rectValue.x + "," +                       nativeEvent.rectValue.y + "," +                       nativeEvent.rectValue.width + "," +                       nativeEvent.rectValue.height;                messenger.sendMessage(msg);                break;            case NativeEventData.EVENT_NAVIGATE:            case NativeEventData.EVENT_NAVIGATE_POST:            case NativeEventData.EVENT_NAVIGATE_POSTDATA:            case NativeEventData.EVENT_SETCONTENT:            case NativeEventData.EVENT_EXECUTESCRIPT:                                msg += nativeEvent.stringValue;                messenger.sendMessage(msg);                break;        }        return true;    }    static NativeEventData parseIncomingMessage(String msg) {        if (null == msg || 0 == msg.length()) {            return null;        }        int eventType = -1;        String stringValue = null;        int pos1 = msg.indexOf(",", 0);        int instance = Integer.parseInt(msg.substring(0, pos1));        int pos2 = msg.indexOf(",", pos1 + 1);        if (pos2 < 0) {            eventType = Integer.parseInt(msg.substring(pos1 + 1));        }        else {            eventType = Integer.parseInt(msg.substring(pos1 + 1, pos2));            if (pos2 + 1 < msg.length())                stringValue = msg.substring(pos2 + 1);        }        return new NativeEventData(instance, eventType, stringValue);    }    /*     * Process an event received from the native browser      */        private void processIncomingMessage(String msg) {        NativeEventData eventData = parseIncomingMessage(msg);        if (eventData == null)             return;        WebBrowserUtil.trace("Got event from browser " + eventData.instance                 + ", " + eventData.type + ", " + eventData.stringValue);        if (WebBrowserEvent.WEBBROWSER_INIT_FAILED == eventData.type) {            setBrowsersInitFailReason(eventData.stringValue);            return;        }        if (eventData.instance < 0) {            return;        }        if (WebBrowserEvent.WEBBROWSER_RETURN_URL == eventData.type ||            WebBrowserEvent.WEBBROWSER_GETCONTENT == eventData.type ||            WebBrowserEvent.WEBBROWSER_EXECUTESCRIPT == eventData.type ||            WebBrowserEvent.WEBBROWSER_DESTROYWINDOW_SUCC == eventData.type ) {            eventRetString = eventData.stringValue;            notifyWebBrowser(eventData.instance);            return;        }        // anonymous inner class can only access final local variable        final WebBrowser browser = getWebBrowserFromInstance(eventData.instance);        if (null == browser) {            return;        }                if (WebBrowserEvent.WEBBROWSER_INIT_WINDOW_SUCC == eventData.type) {            browser.setInitialized(true);            browser.setInitFailureMessage("");            return;        }        final WebBrowserEvent event = new WebBrowserEvent(browser,                 eventData.type, eventData.stringValue);        // For thread-safety reason, invokes the dispatchWebBrowserEvent method         // of WebBrowser.         Runnable dispatchEvent = new Runnable() {            public void run() {                browser.dispatchWebBrowserEvent(event);            }        };        try {            SwingUtilities.invokeLater(dispatchEvent);        } catch (Exception e) {            WebBrowserUtil.trace("Exception occured when invokeLater. " +                    "Error message: " + e.getMessage());        }    }    synchronized void fireNativeEvent(int instance, int type) {        nativeEvents.addElement(new NativeEventData(instance, type));    }    synchronized void fireNativeEvent(int instance, int type,             Rectangle rectValue) {        nativeEvents.addElement(new NativeEventData(instance, type, rectValue));    }    synchronized void fireNativeEvent(int instance, int type,             String stringValue) {        nativeEvents.addElement(                new NativeEventData(instance, type, stringValue));    }    void setBrowsersInitFailReason(String msg) {        ((WebBrowser)webBrowsers.elementAt(0)).setInitFailureMessage(msg);    }    class StreamGobbler extends Thread {        InputStream is;                StreamGobbler(InputStream is) {            this.is = is;        }        public void run() {            try {                InputStreamReader isr = new InputStreamReader(is);                BufferedReader br = new BufferedReader(isr);                String line = null;                while ((line = br.readLine()) != null) {                    System.out.println("+++ Ctrace: " + line);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }} // end of class NativeEventThread

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?