home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2007 April / PCpro_2007_04.ISO / files / dsl / jNetTool.exe / edu / stanford / ejalbert / BrowserLauncher.class (.txt)
Encoding:
Java Class File  |  2005-06-05  |  11.3 KB  |  488 lines

  1. package edu.stanford.ejalbert;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.lang.reflect.Constructor;
  6. import java.lang.reflect.Field;
  7. import java.lang.reflect.InvocationTargetException;
  8. import java.lang.reflect.Method;
  9.  
  10. public class BrowserLauncher {
  11.    private static int jvm;
  12.    private static Object browser;
  13.    private static boolean loadedWithoutErrors = true;
  14.    private static Class mrjFileUtilsClass;
  15.    private static Class mrjOSTypeClass;
  16.    private static Class aeDescClass;
  17.    private static Constructor aeTargetConstructor;
  18.    private static Constructor appleEventConstructor;
  19.    private static Constructor aeDescConstructor;
  20.    private static Method findFolder;
  21.    private static Method getFileCreator;
  22.    private static Method getFileType;
  23.    private static Method openURL;
  24.    private static Method makeOSType;
  25.    private static Method putParameter;
  26.    private static Method sendNoReply;
  27.    private static Object kSystemFolderType;
  28.    private static Integer keyDirectObject;
  29.    private static Integer kAutoGenerateReturnID;
  30.    private static Integer kAnyTransactionID;
  31.    private static Object linkage;
  32.    private static final String JDirect_MacOSX = "/System/Library/Frameworks/Carbon.framework/Frameworks/HIToolbox.framework/HIToolbox";
  33.    private static final int MRJ_2_0 = 0;
  34.    private static final int MRJ_2_1 = 1;
  35.    private static final int MRJ_3_0 = 3;
  36.    private static final int MRJ_3_1 = 4;
  37.    private static final int WINDOWS_NT = 5;
  38.    private static final int WINDOWS_9x = 6;
  39.    private static final int OTHER = -1;
  40.    private static final String FINDER_TYPE = "FNDR";
  41.    private static final String FINDER_CREATOR = "MACS";
  42.    private static final String GURL_EVENT = "GURL";
  43.    private static final String FIRST_WINDOWS_PARAMETER = "/c";
  44.    private static final String SECOND_WINDOWS_PARAMETER = "start";
  45.    private static final String THIRD_WINDOWS_PARAMETER = "\"\"";
  46.    private static final String NETSCAPE_REMOTE_PARAMETER = "-remote";
  47.    private static final String NETSCAPE_OPEN_PARAMETER_START = "'openURL(";
  48.    private static final String NETSCAPE_OPEN_PARAMETER_END = ")'";
  49.    private static String errorMessage;
  50.    // $FF: synthetic field
  51.    static Class class$0;
  52.    // $FF: synthetic field
  53.    static Class class$1;
  54.    // $FF: synthetic field
  55.    static Class class$2;
  56.    // $FF: synthetic field
  57.    static Class class$3;
  58.    // $FF: synthetic field
  59.    static Class class$4;
  60.  
  61.    static {
  62.       String osName = System.getProperty("os.name");
  63.       if (osName.startsWith("Mac OS")) {
  64.          String mrjVersion = System.getProperty("mrj.version");
  65.          String majorMRJVersion = mrjVersion.substring(0, 3);
  66.  
  67.          try {
  68.             double version = Double.valueOf(majorMRJVersion);
  69.             if (version == (double)2.0F) {
  70.                jvm = 0;
  71.             } else if (version >= 2.1 && version < (double)3.0F) {
  72.                jvm = 1;
  73.             } else if (version == (double)3.0F) {
  74.                jvm = 3;
  75.             } else if (version >= 3.1) {
  76.                jvm = 4;
  77.             } else {
  78.                loadedWithoutErrors = false;
  79.                errorMessage = "Unsupported MRJ version: " + version;
  80.             }
  81.          } catch (NumberFormatException var5) {
  82.             loadedWithoutErrors = false;
  83.             errorMessage = "Invalid MRJ version: " + mrjVersion;
  84.          }
  85.       } else if (osName.startsWith("Windows")) {
  86.          if (osName.indexOf("9") != -1) {
  87.             jvm = 6;
  88.          } else {
  89.             jvm = 5;
  90.          }
  91.       } else {
  92.          jvm = -1;
  93.       }
  94.  
  95.       if (loadedWithoutErrors) {
  96.          loadedWithoutErrors = loadClasses();
  97.       }
  98.  
  99.    }
  100.  
  101.    private BrowserLauncher() {
  102.    }
  103.  
  104.    private static boolean loadClasses() {
  105.       switch (jvm) {
  106.          case 0:
  107.             try {
  108.                Class aeTargetClass = Class.forName("com.apple.MacOS.AETarget");
  109.                Class osUtilsClass = Class.forName("com.apple.MacOS.OSUtils");
  110.                Class appleEventClass = Class.forName("com.apple.MacOS.AppleEvent");
  111.                Class aeClass = Class.forName("com.apple.MacOS.ae");
  112.                aeDescClass = Class.forName("com.apple.MacOS.AEDesc");
  113.                aeTargetConstructor = aeTargetClass.getDeclaredConstructor(Integer.TYPE);
  114.                appleEventConstructor = appleEventClass.getDeclaredConstructor(Integer.TYPE, Integer.TYPE, aeTargetClass, Integer.TYPE, Integer.TYPE);
  115.                Class var35 = aeDescClass;
  116.                Class[] var37 = new Class[1];
  117.                Class var42 = class$1;
  118.                if (var42 == null) {
  119.                   try {
  120.                      var42 = Class.forName("java.lang.String");
  121.                   } catch (ClassNotFoundException var25) {
  122.                      throw new NoClassDefFoundError(((Throwable)var25).getMessage());
  123.                   }
  124.  
  125.                   class$1 = var42;
  126.                }
  127.  
  128.                var37[0] = var42;
  129.                aeDescConstructor = var35.getDeclaredConstructor(var37);
  130.                Class[] var40 = new Class[1];
  131.                Class var45 = class$1;
  132.                if (var45 == null) {
  133.                   try {
  134.                      var45 = Class.forName("java.lang.String");
  135.                   } catch (ClassNotFoundException var24) {
  136.                      throw new NoClassDefFoundError(((Throwable)var24).getMessage());
  137.                   }
  138.  
  139.                   class$1 = var45;
  140.                }
  141.  
  142.                var40[0] = var45;
  143.                makeOSType = osUtilsClass.getDeclaredMethod("makeOSType", var40);
  144.                putParameter = appleEventClass.getDeclaredMethod("putParameter", Integer.TYPE, aeDescClass);
  145.                sendNoReply = appleEventClass.getDeclaredMethod("sendNoReply");
  146.                Field keyDirectObjectField = aeClass.getDeclaredField("keyDirectObject");
  147.                keyDirectObject = (Integer)keyDirectObjectField.get((Object)null);
  148.                Field autoGenerateReturnIDField = appleEventClass.getDeclaredField("kAutoGenerateReturnID");
  149.                kAutoGenerateReturnID = (Integer)autoGenerateReturnIDField.get((Object)null);
  150.                Field anyTransactionIDField = appleEventClass.getDeclaredField("kAnyTransactionID");
  151.                kAnyTransactionID = (Integer)anyTransactionIDField.get((Object)null);
  152.                break;
  153.             } catch (ClassNotFoundException cnfe) {
  154.                errorMessage = cnfe.getMessage();
  155.                return false;
  156.             } catch (NoSuchMethodException nsme) {
  157.                errorMessage = nsme.getMessage();
  158.                return false;
  159.             } catch (NoSuchFieldException nsfe) {
  160.                errorMessage = nsfe.getMessage();
  161.                return false;
  162.             } catch (IllegalAccessException iae) {
  163.                errorMessage = iae.getMessage();
  164.                return false;
  165.             }
  166.          case 1:
  167.             try {
  168.                mrjFileUtilsClass = Class.forName("com.apple.mrj.MRJFileUtils");
  169.                mrjOSTypeClass = Class.forName("com.apple.mrj.MRJOSType");
  170.                Field systemFolderField = mrjFileUtilsClass.getDeclaredField("kSystemFolderType");
  171.                kSystemFolderType = systemFolderField.get((Object)null);
  172.                findFolder = mrjFileUtilsClass.getDeclaredMethod("findFolder", mrjOSTypeClass);
  173.                Class var33 = mrjFileUtilsClass;
  174.                Class[] var38 = new Class[1];
  175.                Class var43 = class$2;
  176.                if (var43 == null) {
  177.                   try {
  178.                      var43 = Class.forName("java.io.File");
  179.                   } catch (ClassNotFoundException var18) {
  180.                      throw new NoClassDefFoundError(((Throwable)var18).getMessage());
  181.                   }
  182.  
  183.                   class$2 = var43;
  184.                }
  185.  
  186.                var38[0] = var43;
  187.                getFileCreator = var33.getDeclaredMethod("getFileCreator", var38);
  188.                var33 = mrjFileUtilsClass;
  189.                var38 = new Class[1];
  190.                var43 = class$2;
  191.                if (var43 == null) {
  192.                   try {
  193.                      var43 = Class.forName("java.io.File");
  194.                   } catch (ClassNotFoundException var17) {
  195.                      throw new NoClassDefFoundError(((Throwable)var17).getMessage());
  196.                   }
  197.  
  198.                   class$2 = var43;
  199.                }
  200.  
  201.                var38[0] = var43;
  202.                getFileType = var33.getDeclaredMethod("getFileType", var38);
  203.             } catch (ClassNotFoundException cnfe) {
  204.                errorMessage = cnfe.getMessage();
  205.                return false;
  206.             } catch (NoSuchFieldException nsfe) {
  207.                errorMessage = nsfe.getMessage();
  208.                return false;
  209.             } catch (NoSuchMethodException nsme) {
  210.                errorMessage = nsme.getMessage();
  211.                return false;
  212.             } catch (SecurityException se) {
  213.                errorMessage = se.getMessage();
  214.                return false;
  215.             } catch (IllegalAccessException iae) {
  216.                errorMessage = iae.getMessage();
  217.                return false;
  218.             }
  219.          case 2:
  220.          default:
  221.             break;
  222.          case 3:
  223.             try {
  224.                Class linker = Class.forName("com.apple.mrj.jdirect.Linker");
  225.                Class[] var10001 = new Class[1];
  226.                Class var10004 = class$3;
  227.                if (var10004 == null) {
  228.                   try {
  229.                      var10004 = Class.forName("java.lang.Class");
  230.                   } catch (ClassNotFoundException var11) {
  231.                      throw new NoClassDefFoundError(((Throwable)var11).getMessage());
  232.                   }
  233.  
  234.                   class$3 = var10004;
  235.                }
  236.  
  237.                var10001[0] = var10004;
  238.                Constructor constructor = linker.getConstructor(var10001);
  239.                Object[] var36 = new Object[1];
  240.                var10004 = class$4;
  241.                if (var10004 == null) {
  242.                   try {
  243.                      var10004 = Class.forName("edu.stanford.ejalbert.BrowserLauncher");
  244.                   } catch (ClassNotFoundException var10) {
  245.                      throw new NoClassDefFoundError(((Throwable)var10).getMessage());
  246.                   }
  247.  
  248.                   class$4 = var10004;
  249.                }
  250.  
  251.                var36[0] = var10004;
  252.                linkage = constructor.newInstance(var36);
  253.                break;
  254.             } catch (ClassNotFoundException cnfe) {
  255.                errorMessage = cnfe.getMessage();
  256.                return false;
  257.             } catch (NoSuchMethodException nsme) {
  258.                errorMessage = nsme.getMessage();
  259.                return false;
  260.             } catch (InvocationTargetException ite) {
  261.                errorMessage = ite.getMessage();
  262.                return false;
  263.             } catch (InstantiationException ie) {
  264.                errorMessage = ie.getMessage();
  265.                return false;
  266.             } catch (IllegalAccessException iae) {
  267.                errorMessage = iae.getMessage();
  268.                return false;
  269.             }
  270.          case 4:
  271.             try {
  272.                mrjFileUtilsClass = Class.forName("com.apple.mrj.MRJFileUtils");
  273.                Class var10000 = mrjFileUtilsClass;
  274.                Class[] var10002 = new Class[1];
  275.                Class var10005 = class$1;
  276.                if (var10005 == null) {
  277.                   try {
  278.                      var10005 = Class.forName("java.lang.String");
  279.                   } catch (ClassNotFoundException var7) {
  280.                      throw new NoClassDefFoundError(((Throwable)var7).getMessage());
  281.                   }
  282.  
  283.                   class$1 = var10005;
  284.                }
  285.  
  286.                var10002[0] = var10005;
  287.                openURL = var10000.getDeclaredMethod("openURL", var10002);
  288.             } catch (ClassNotFoundException cnfe) {
  289.                errorMessage = cnfe.getMessage();
  290.                return false;
  291.             } catch (NoSuchMethodException nsme) {
  292.                errorMessage = nsme.getMessage();
  293.                return false;
  294.             }
  295.       }
  296.  
  297.       return true;
  298.    }
  299.  
  300.    private static Object locateBrowser() {
  301.       if (browser != null) {
  302.          return browser;
  303.       } else {
  304.          switch (jvm) {
  305.             case -1:
  306.             case 2:
  307.             default:
  308.                browser = "netscape";
  309.                break;
  310.             case 0:
  311.                try {
  312.                   Integer finderCreatorCode = (Integer)makeOSType.invoke((Object)null, "MACS");
  313.                   Object aeTarget = aeTargetConstructor.newInstance(finderCreatorCode);
  314.                   Integer gurlType = (Integer)makeOSType.invoke((Object)null, "GURL");
  315.                   Object appleEvent = appleEventConstructor.newInstance(gurlType, gurlType, aeTarget, kAutoGenerateReturnID, kAnyTransactionID);
  316.                   return appleEvent;
  317.                } catch (IllegalAccessException iae) {
  318.                   browser = null;
  319.                   errorMessage = iae.getMessage();
  320.                   return browser;
  321.                } catch (InstantiationException ie) {
  322.                   browser = null;
  323.                   errorMessage = ie.getMessage();
  324.                   return browser;
  325.                } catch (InvocationTargetException ite) {
  326.                   browser = null;
  327.                   errorMessage = ite.getMessage();
  328.                   return browser;
  329.                }
  330.             case 1:
  331.                File systemFolder;
  332.                try {
  333.                   systemFolder = (File)findFolder.invoke((Object)null, kSystemFolderType);
  334.                } catch (IllegalArgumentException iare) {
  335.                   browser = null;
  336.                   errorMessage = iare.getMessage();
  337.                   return browser;
  338.                } catch (IllegalAccessException iae) {
  339.                   browser = null;
  340.                   errorMessage = iae.getMessage();
  341.                   return browser;
  342.                } catch (InvocationTargetException ite) {
  343.                   browser = null;
  344.                   errorMessage = ite.getTargetException().getClass() + ": " + ite.getTargetException().getMessage();
  345.                   return browser;
  346.                }
  347.  
  348.                String[] systemFolderFiles = systemFolder.list();
  349.  
  350.                for(int i = 0; i < systemFolderFiles.length; ++i) {
  351.                   try {
  352.                      File file = new File(systemFolder, systemFolderFiles[i]);
  353.                      if (file.isFile()) {
  354.                         Object fileType = getFileType.invoke((Object)null, file);
  355.                         if ("FNDR".equals(fileType.toString())) {
  356.                            Object fileCreator = getFileCreator.invoke((Object)null, file);
  357.                            if ("MACS".equals(fileCreator.toString())) {
  358.                               browser = file.toString();
  359.                               return browser;
  360.                            }
  361.                         }
  362.                      }
  363.                   } catch (IllegalArgumentException iare) {
  364.                      errorMessage = iare.getMessage();
  365.                      return null;
  366.                   } catch (IllegalAccessException iae) {
  367.                      browser = null;
  368.                      errorMessage = iae.getMessage();
  369.                      return browser;
  370.                   } catch (InvocationTargetException ite) {
  371.                      browser = null;
  372.                      errorMessage = ite.getTargetException().getClass() + ": " + ite.getTargetException().getMessage();
  373.                      return browser;
  374.                   }
  375.                }
  376.  
  377.                browser = null;
  378.                break;
  379.             case 3:
  380.             case 4:
  381.                browser = "";
  382.                break;
  383.             case 5:
  384.                browser = "cmd.exe";
  385.                break;
  386.             case 6:
  387.                browser = "command.com";
  388.          }
  389.  
  390.          return browser;
  391.       }
  392.    }
  393.  
  394.    public static void openURL(String url) throws IOException {
  395.       if (!loadedWithoutErrors) {
  396.          throw new IOException("Exception in finding browser: " + errorMessage);
  397.       } else {
  398.          Object browser = locateBrowser();
  399.          if (browser == null) {
  400.             throw new IOException("Unable to locate browser: " + errorMessage);
  401.          } else {
  402.             switch (jvm) {
  403.                case -1:
  404.                   Process process = Runtime.getRuntime().exec(new String[]{(String)browser, "-remote", "'openURL(" + url + ")'"});
  405.  
  406.                   try {
  407.                      int exitCode = process.waitFor();
  408.                      if (exitCode != 0) {
  409.                         Runtime.getRuntime().exec(new String[]{(String)browser, url});
  410.                      }
  411.                      break;
  412.                   } catch (InterruptedException ie) {
  413.                      throw new IOException("InterruptedException while launching browser: " + ie.getMessage());
  414.                   }
  415.                case 0:
  416.                   Object aeDesc = null;
  417.  
  418.                   try {
  419.                      aeDesc = aeDescConstructor.newInstance(url);
  420.                      putParameter.invoke(browser, keyDirectObject, aeDesc);
  421.                      sendNoReply.invoke(browser);
  422.                      break;
  423.                   } catch (InvocationTargetException ite) {
  424.                      throw new IOException("InvocationTargetException while creating AEDesc: " + ite.getMessage());
  425.                   } catch (IllegalAccessException iae) {
  426.                      throw new IOException("IllegalAccessException while building AppleEvent: " + iae.getMessage());
  427.                   } catch (InstantiationException ie) {
  428.                      throw new IOException("InstantiationException while creating AEDesc: " + ie.getMessage());
  429.                   } finally {
  430.                      aeDesc = null;
  431.                      browser = null;
  432.                   }
  433.                case 1:
  434.                   Runtime.getRuntime().exec(new String[]{(String)browser, url});
  435.                   break;
  436.                case 2:
  437.                default:
  438.                   Runtime.getRuntime().exec(new String[]{(String)browser, url});
  439.                   break;
  440.                case 3:
  441.                   int[] instance = new int[1];
  442.                   int result = ICStart(instance, 0);
  443.                   if (result != 0) {
  444.                      throw new IOException("Unable to create an Internet Config instance: " + result);
  445.                   }
  446.  
  447.                   int[] selectionStart = new int[1];
  448.                   byte[] urlBytes = url.getBytes();
  449.                   int[] selectionEnd = new int[]{urlBytes.length};
  450.                   result = ICLaunchURL(instance[0], new byte[1], urlBytes, urlBytes.length, selectionStart, selectionEnd);
  451.                   if (result != 0) {
  452.                      throw new IOException("Unable to launch URL: " + result);
  453.                   }
  454.  
  455.                   ICStop(instance);
  456.                   break;
  457.                case 4:
  458.                   try {
  459.                      openURL.invoke((Object)null, url);
  460.                      break;
  461.                   } catch (InvocationTargetException ite) {
  462.                      throw new IOException("InvocationTargetException while calling openURL: " + ite.getMessage());
  463.                   } catch (IllegalAccessException iae) {
  464.                      throw new IOException("IllegalAccessException while calling openURL: " + iae.getMessage());
  465.                   }
  466.                case 5:
  467.                case 6:
  468.                   Process process = Runtime.getRuntime().exec(new String[]{(String)browser, "/c", "start", "\"\"", '"' + url + '"'});
  469.  
  470.                   try {
  471.                      process.waitFor();
  472.                      process.exitValue();
  473.                   } catch (InterruptedException ie) {
  474.                      throw new IOException("InterruptedException while launching browser: " + ie.getMessage());
  475.                   }
  476.             }
  477.  
  478.          }
  479.       }
  480.    }
  481.  
  482.    private static native int ICStart(int[] var0, int var1);
  483.  
  484.    private static native int ICStop(int[] var0);
  485.  
  486.    private static native int ICLaunchURL(int var0, byte[] var1, byte[] var2, int var3, int[] var4, int[] var5);
  487. }
  488.