home *** CD-ROM | disk | FTP | other *** search
- package edu.stanford.ejalbert;
-
- import java.io.File;
- import java.io.IOException;
- import java.lang.reflect.Constructor;
- import java.lang.reflect.Field;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
-
- public class BrowserLauncher {
- private static int jvm;
- private static Object browser;
- private static boolean loadedWithoutErrors = true;
- private static Class mrjFileUtilsClass;
- private static Class mrjOSTypeClass;
- private static Class aeDescClass;
- private static Constructor aeTargetConstructor;
- private static Constructor appleEventConstructor;
- private static Constructor aeDescConstructor;
- private static Method findFolder;
- private static Method getFileCreator;
- private static Method getFileType;
- private static Method openURL;
- private static Method makeOSType;
- private static Method putParameter;
- private static Method sendNoReply;
- private static Object kSystemFolderType;
- private static Integer keyDirectObject;
- private static Integer kAutoGenerateReturnID;
- private static Integer kAnyTransactionID;
- private static Object linkage;
- private static final String JDirect_MacOSX = "/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/HIToolbox";
- private static final int MRJ_2_0 = 0;
- private static final int MRJ_2_1 = 1;
- private static final int MRJ_3_0 = 3;
- private static final int MRJ_3_1 = 4;
- private static final int WINDOWS_NT = 5;
- private static final int WINDOWS_9x = 6;
- private static final int OTHER = -1;
- private static final String FINDER_TYPE = "FNDR";
- private static final String FINDER_CREATOR = "MACS";
- private static final String GURL_EVENT = "GURL";
- private static final String FIRST_WINDOWS_PARAMETER = "/c";
- private static final String SECOND_WINDOWS_PARAMETER = "start";
- private static final String THIRD_WINDOWS_PARAMETER = "\"\"";
- private static final String NETSCAPE_REMOTE_PARAMETER = "-remote";
- private static final String NETSCAPE_OPEN_PARAMETER_START = "'openURL(";
- private static final String NETSCAPE_OPEN_PARAMETER_END = ")'";
- private static String errorMessage;
- // $FF: synthetic field
- static Class class$0;
- // $FF: synthetic field
- static Class class$1;
- // $FF: synthetic field
- static Class class$2;
- // $FF: synthetic field
- static Class class$3;
- // $FF: synthetic field
- static Class class$4;
-
- static {
- String osName = System.getProperty("os.name");
- if (osName.startsWith("Mac OS")) {
- String mrjVersion = System.getProperty("mrj.version");
- String majorMRJVersion = mrjVersion.substring(0, 3);
-
- try {
- double version = Double.valueOf(majorMRJVersion);
- if (version == (double)2.0F) {
- jvm = 0;
- } else if (version >= 2.1 && version < (double)3.0F) {
- jvm = 1;
- } else if (version == (double)3.0F) {
- jvm = 3;
- } else if (version >= 3.1) {
- jvm = 4;
- } else {
- loadedWithoutErrors = false;
- errorMessage = "Unsupported MRJ version: " + version;
- }
- } catch (NumberFormatException var5) {
- loadedWithoutErrors = false;
- errorMessage = "Invalid MRJ version: " + mrjVersion;
- }
- } else if (osName.startsWith("Windows")) {
- if (osName.indexOf("9") != -1) {
- jvm = 6;
- } else {
- jvm = 5;
- }
- } else {
- jvm = -1;
- }
-
- if (loadedWithoutErrors) {
- loadedWithoutErrors = loadClasses();
- }
-
- }
-
- private BrowserLauncher() {
- }
-
- private static boolean loadClasses() {
- switch (jvm) {
- case 0:
- try {
- Class aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
- Class osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
- Class appleEventClass = Class.forName("com.apple.MacOS.AppleEvent");
- Class aeClass = Class.forName("com.apple.MacOS.ae");
- aeDescClass = Class.forName("com.apple.MacOS.AEDesc");
- aeTargetConstructor = aeTargetClass.getDeclaredConstructor(Integer.TYPE);
- appleEventConstructor = appleEventClass.getDeclaredConstructor(Integer.TYPE, Integer.TYPE, aeTargetClass, Integer.TYPE, Integer.TYPE);
- Class var35 = aeDescClass;
- Class[] var37 = new Class[1];
- Class var42 = class$1;
- if (var42 == null) {
- try {
- var42 = Class.forName("java.lang.String");
- } catch (ClassNotFoundException var25) {
- throw new NoClassDefFoundError(((Throwable)var25).getMessage());
- }
-
- class$1 = var42;
- }
-
- var37[0] = var42;
- aeDescConstructor = var35.getDeclaredConstructor(var37);
- Class[] var40 = new Class[1];
- Class var45 = class$1;
- if (var45 == null) {
- try {
- var45 = Class.forName("java.lang.String");
- } catch (ClassNotFoundException var24) {
- throw new NoClassDefFoundError(((Throwable)var24).getMessage());
- }
-
- class$1 = var45;
- }
-
- var40[0] = var45;
- makeOSType = osUtilsClass.getDeclaredMethod("makeOSType", var40);
- putParameter = appleEventClass.getDeclaredMethod("putParameter", Integer.TYPE, aeDescClass);
- sendNoReply = appleEventClass.getDeclaredMethod("sendNoReply");
- Field keyDirectObjectField = aeClass.getDeclaredField("keyDirectObject");
- keyDirectObject = (Integer)keyDirectObjectField.get((Object)null);
- Field autoGenerateReturnIDField = appleEventClass.getDeclaredField("kAutoGenerateReturnID");
- kAutoGenerateReturnID = (Integer)autoGenerateReturnIDField.get((Object)null);
- Field anyTransactionIDField = appleEventClass.getDeclaredField("kAnyTransactionID");
- kAnyTransactionID = (Integer)anyTransactionIDField.get((Object)null);
- break;
- } catch (ClassNotFoundException cnfe) {
- errorMessage = cnfe.getMessage();
- return false;
- } catch (NoSuchMethodException nsme) {
- errorMessage = nsme.getMessage();
- return false;
- } catch (NoSuchFieldException nsfe) {
- errorMessage = nsfe.getMessage();
- return false;
- } catch (IllegalAccessException iae) {
- errorMessage = iae.getMessage();
- return false;
- }
- case 1:
- try {
- mrjFileUtilsClass = Class.forName("com.apple.mrj.MRJFileUtils");
- mrjOSTypeClass = Class.forName("com.apple.mrj.MRJOSType");
- Field systemFolderField = mrjFileUtilsClass.getDeclaredField("kSystemFolderType");
- kSystemFolderType = systemFolderField.get((Object)null);
- findFolder = mrjFileUtilsClass.getDeclaredMethod("findFolder", mrjOSTypeClass);
- Class var33 = mrjFileUtilsClass;
- Class[] var38 = new Class[1];
- Class var43 = class$2;
- if (var43 == null) {
- try {
- var43 = Class.forName("java.io.File");
- } catch (ClassNotFoundException var18) {
- throw new NoClassDefFoundError(((Throwable)var18).getMessage());
- }
-
- class$2 = var43;
- }
-
- var38[0] = var43;
- getFileCreator = var33.getDeclaredMethod("getFileCreator", var38);
- var33 = mrjFileUtilsClass;
- var38 = new Class[1];
- var43 = class$2;
- if (var43 == null) {
- try {
- var43 = Class.forName("java.io.File");
- } catch (ClassNotFoundException var17) {
- throw new NoClassDefFoundError(((Throwable)var17).getMessage());
- }
-
- class$2 = var43;
- }
-
- var38[0] = var43;
- getFileType = var33.getDeclaredMethod("getFileType", var38);
- } catch (ClassNotFoundException cnfe) {
- errorMessage = cnfe.getMessage();
- return false;
- } catch (NoSuchFieldException nsfe) {
- errorMessage = nsfe.getMessage();
- return false;
- } catch (NoSuchMethodException nsme) {
- errorMessage = nsme.getMessage();
- return false;
- } catch (SecurityException se) {
- errorMessage = se.getMessage();
- return false;
- } catch (IllegalAccessException iae) {
- errorMessage = iae.getMessage();
- return false;
- }
- case 2:
- default:
- break;
- case 3:
- try {
- Class linker = Class.forName("com.apple.mrj.jdirect.Linker");
- Class[] var10001 = new Class[1];
- Class var10004 = class$3;
- if (var10004 == null) {
- try {
- var10004 = Class.forName("java.lang.Class");
- } catch (ClassNotFoundException var11) {
- throw new NoClassDefFoundError(((Throwable)var11).getMessage());
- }
-
- class$3 = var10004;
- }
-
- var10001[0] = var10004;
- Constructor constructor = linker.getConstructor(var10001);
- Object[] var36 = new Object[1];
- var10004 = class$4;
- if (var10004 == null) {
- try {
- var10004 = Class.forName("edu.stanford.ejalbert.BrowserLauncher");
- } catch (ClassNotFoundException var10) {
- throw new NoClassDefFoundError(((Throwable)var10).getMessage());
- }
-
- class$4 = var10004;
- }
-
- var36[0] = var10004;
- linkage = constructor.newInstance(var36);
- break;
- } catch (ClassNotFoundException cnfe) {
- errorMessage = cnfe.getMessage();
- return false;
- } catch (NoSuchMethodException nsme) {
- errorMessage = nsme.getMessage();
- return false;
- } catch (InvocationTargetException ite) {
- errorMessage = ite.getMessage();
- return false;
- } catch (InstantiationException ie) {
- errorMessage = ie.getMessage();
- return false;
- } catch (IllegalAccessException iae) {
- errorMessage = iae.getMessage();
- return false;
- }
- case 4:
- try {
- mrjFileUtilsClass = Class.forName("com.apple.mrj.MRJFileUtils");
- Class var10000 = mrjFileUtilsClass;
- Class[] var10002 = new Class[1];
- Class var10005 = class$1;
- if (var10005 == null) {
- try {
- var10005 = Class.forName("java.lang.String");
- } catch (ClassNotFoundException var7) {
- throw new NoClassDefFoundError(((Throwable)var7).getMessage());
- }
-
- class$1 = var10005;
- }
-
- var10002[0] = var10005;
- openURL = var10000.getDeclaredMethod("openURL", var10002);
- } catch (ClassNotFoundException cnfe) {
- errorMessage = cnfe.getMessage();
- return false;
- } catch (NoSuchMethodException nsme) {
- errorMessage = nsme.getMessage();
- return false;
- }
- }
-
- return true;
- }
-
- private static Object locateBrowser() {
- if (browser != null) {
- return browser;
- } else {
- switch (jvm) {
- case -1:
- case 2:
- default:
- browser = "netscape";
- break;
- case 0:
- try {
- Integer finderCreatorCode = (Integer)makeOSType.invoke((Object)null, "MACS");
- Object aeTarget = aeTargetConstructor.newInstance(finderCreatorCode);
- Integer gurlType = (Integer)makeOSType.invoke((Object)null, "GURL");
- Object appleEvent = appleEventConstructor.newInstance(gurlType, gurlType, aeTarget, kAutoGenerateReturnID, kAnyTransactionID);
- return appleEvent;
- } catch (IllegalAccessException iae) {
- browser = null;
- errorMessage = iae.getMessage();
- return browser;
- } catch (InstantiationException ie) {
- browser = null;
- errorMessage = ie.getMessage();
- return browser;
- } catch (InvocationTargetException ite) {
- browser = null;
- errorMessage = ite.getMessage();
- return browser;
- }
- case 1:
- File systemFolder;
- try {
- systemFolder = (File)findFolder.invoke((Object)null, kSystemFolderType);
- } catch (IllegalArgumentException iare) {
- browser = null;
- errorMessage = iare.getMessage();
- return browser;
- } catch (IllegalAccessException iae) {
- browser = null;
- errorMessage = iae.getMessage();
- return browser;
- } catch (InvocationTargetException ite) {
- browser = null;
- errorMessage = ite.getTargetException().getClass() + ": " + ite.getTargetException().getMessage();
- return browser;
- }
-
- String[] systemFolderFiles = systemFolder.list();
-
- for(int i = 0; i < systemFolderFiles.length; ++i) {
- try {
- File file = new File(systemFolder, systemFolderFiles[i]);
- if (file.isFile()) {
- Object fileType = getFileType.invoke((Object)null, file);
- if ("FNDR".equals(fileType.toString())) {
- Object fileCreator = getFileCreator.invoke((Object)null, file);
- if ("MACS".equals(fileCreator.toString())) {
- browser = file.toString();
- return browser;
- }
- }
- }
- } catch (IllegalArgumentException iare) {
- errorMessage = iare.getMessage();
- return null;
- } catch (IllegalAccessException iae) {
- browser = null;
- errorMessage = iae.getMessage();
- return browser;
- } catch (InvocationTargetException ite) {
- browser = null;
- errorMessage = ite.getTargetException().getClass() + ": " + ite.getTargetException().getMessage();
- return browser;
- }
- }
-
- browser = null;
- break;
- case 3:
- case 4:
- browser = "";
- break;
- case 5:
- browser = "cmd.exe";
- break;
- case 6:
- browser = "command.com";
- }
-
- return browser;
- }
- }
-
- public static void openURL(String url) throws IOException {
- if (!loadedWithoutErrors) {
- throw new IOException("Exception in finding browser: " + errorMessage);
- } else {
- Object browser = locateBrowser();
- if (browser == null) {
- throw new IOException("Unable to locate browser: " + errorMessage);
- } else {
- switch (jvm) {
- case -1:
- Process process = Runtime.getRuntime().exec(new String[]{(String)browser, "-remote", "'openURL(" + url + ")'"});
-
- try {
- int exitCode = process.waitFor();
- if (exitCode != 0) {
- Runtime.getRuntime().exec(new String[]{(String)browser, url});
- }
- break;
- } catch (InterruptedException ie) {
- throw new IOException("InterruptedException while launching browser: " + ie.getMessage());
- }
- case 0:
- Object aeDesc = null;
-
- try {
- aeDesc = aeDescConstructor.newInstance(url);
- putParameter.invoke(browser, keyDirectObject, aeDesc);
- sendNoReply.invoke(browser);
- break;
- } catch (InvocationTargetException ite) {
- throw new IOException("InvocationTargetException while creating AEDesc: " + ite.getMessage());
- } catch (IllegalAccessException iae) {
- throw new IOException("IllegalAccessException while building AppleEvent: " + iae.getMessage());
- } catch (InstantiationException ie) {
- throw new IOException("InstantiationException while creating AEDesc: " + ie.getMessage());
- } finally {
- aeDesc = null;
- browser = null;
- }
- case 1:
- Runtime.getRuntime().exec(new String[]{(String)browser, url});
- break;
- case 2:
- default:
- Runtime.getRuntime().exec(new String[]{(String)browser, url});
- break;
- case 3:
- int[] instance = new int[1];
- int result = ICStart(instance, 0);
- if (result != 0) {
- throw new IOException("Unable to create an Internet Config instance: " + result);
- }
-
- int[] selectionStart = new int[1];
- byte[] urlBytes = url.getBytes();
- int[] selectionEnd = new int[]{urlBytes.length};
- result = ICLaunchURL(instance[0], new byte[1], urlBytes, urlBytes.length, selectionStart, selectionEnd);
- if (result != 0) {
- throw new IOException("Unable to launch URL: " + result);
- }
-
- ICStop(instance);
- break;
- case 4:
- try {
- openURL.invoke((Object)null, url);
- break;
- } catch (InvocationTargetException ite) {
- throw new IOException("InvocationTargetException while calling openURL: " + ite.getMessage());
- } catch (IllegalAccessException iae) {
- throw new IOException("IllegalAccessException while calling openURL: " + iae.getMessage());
- }
- case 5:
- case 6:
- Process process = Runtime.getRuntime().exec(new String[]{(String)browser, "/c", "start", "\"\"", '"' + url + '"'});
-
- try {
- process.waitFor();
- process.exitValue();
- } catch (InterruptedException ie) {
- throw new IOException("InterruptedException while launching browser: " + ie.getMessage());
- }
- }
-
- }
- }
- }
-
- private static native int ICStart(int[] var0, int var1);
-
- private static native int ICStop(int[] var0);
-
- private static native int ICLaunchURL(int var0, byte[] var1, byte[] var2, int var3, int[] var4, int[] var5);
- }
-