home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 129 / dpcs1198.iso / Internet / Compu / Win95 / MSIE302.LIB / MSIE302.EXE / ieakjava.exe / CLASSR.EXE / com / ms / applet / BrowserAppletFrame.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-01-31  |  14.6 KB  |  643 lines

  1. package com.ms.applet;
  2.  
  3. import com.ms.awt.image.ByteArrayImageSource;
  4. import com.ms.com.ComLib;
  5. import com.ms.net.wininet.URLUtils;
  6. import com.ms.net.wininet.WininetStreamHandlerFactory;
  7. import java.applet.Applet;
  8. import java.applet.AppletContext;
  9. import java.applet.AppletStub;
  10. import java.applet.AudioClip;
  11. import java.awt.Color;
  12. import java.awt.Component;
  13. import java.awt.Container;
  14. import java.awt.Dimension;
  15. import java.awt.Event;
  16. import java.awt.Frame;
  17. import java.awt.Image;
  18. import java.awt.Toolkit;
  19. import java.awt.Window;
  20. import java.awt.image.ImageProducer;
  21. import java.io.BufferedOutputStream;
  22. import java.io.File;
  23. import java.io.FileOutputStream;
  24. import java.io.PrintStream;
  25. import java.net.MalformedURLException;
  26. import java.net.URL;
  27. import java.net.URLConnection;
  28. import java.util.Enumeration;
  29. import java.util.Hashtable;
  30. import java.util.Properties;
  31. import java.util.Vector;
  32. import sun.awt.image.URLImageSource;
  33.  
  34. public class BrowserAppletFrame extends Frame implements AppletStub, Runnable, IJavaObjectLoader2 {
  35.    int hwnd;
  36.    Hashtable atts;
  37.    URL documentURL;
  38.    URL baseURL;
  39.    Applet applet;
  40.    AppletBaseClassLoader loader;
  41.    int status;
  42.    int pdispApplet;
  43.    Thread handler;
  44.    Dimension appletSize = new Dimension(0, 0);
  45.    public static final int APPLET_DISPOSE = 0;
  46.    public static final int APPLET_LOAD = 1;
  47.    public static final int APPLET_INIT = 2;
  48.    public static final int APPLET_START = 3;
  49.    public static final int APPLET_STOP = 4;
  50.    public static final int APPLET_DESTROY = 5;
  51.    static final int WM_USER = 1024;
  52.    static final int HOSTFRAME_SHOWSTATUS = 1025;
  53.    static final int HOSTFRAME_REPAINTSTATUS = 1026;
  54.    static final int HOSTFRAME_SHOWDOCUMENT = 1027;
  55.    static final int HOSTFRAME_SETDOWNLOADSTATE = 1028;
  56.    static final int STATUS_INITED = 256;
  57.    static final int STATUS_STARTED = 257;
  58.    static final int STATUS_STOPPED = 258;
  59.    static final int STATUS_DESTROYED = 259;
  60.    static final int STATUS_OPENING_CLASS = 260;
  61.    static final int STATUS_OPENING_CABINET = 261;
  62.    Event queue;
  63.    static Vector frames = new Vector();
  64.    private static Vector classloaders = new Vector();
  65.    private static int oldloadersCount;
  66.    private static final int CLASSLOADER_KEEP_ALIVE_COUNT = 3;
  67.    private BrowserAppletContext appletContext;
  68.    Hashtable audioHash = new Hashtable();
  69.    Hashtable imgHash = new Hashtable();
  70.    static boolean isFirstTimeInited;
  71.    IJavaObjectLoaderHost jolHost;
  72.  
  73.    public static native int getAppletDispatch(Applet var0);
  74.  
  75.    public static native void releaseAppletDispatch(int var0);
  76.  
  77.    public int deliverJavaObjectDispatch() {
  78.       return this.pdispApplet != 0 && this.status == 3 ? this.pdispApplet : 0;
  79.    }
  80.  
  81.    public void loadParameter(String var1, String var2) {
  82.       if (this.atts == null) {
  83.          this.atts = new Hashtable();
  84.       }
  85.  
  86.       var2 = var2.trim();
  87.       int var4 = 0;
  88.       int var5 = var2.length();
  89.       char[] var6 = new char[var5];
  90.  
  91.       for(int var3 = 0; var3 < var5; ++var3) {
  92.          char var7 = var2.charAt(var3);
  93.          if (var7 >= ' ') {
  94.             var6[var4++] = var7;
  95.          }
  96.       }
  97.  
  98.       var2 = new String(var6, 0, var4);
  99.       this.atts.put(var1.toLowerCase(), var2);
  100.    }
  101.  
  102.    String massageURLSpec(String var1) {
  103.       if (!var1.startsWith("http:")) {
  104.          String var2 = URLUtils.canonicalizeURL(var1, 805306368);
  105.          if (var2 != null) {
  106.             var1 = var2;
  107.          }
  108.       }
  109.  
  110.       if (var1.startsWith("file:")) {
  111.          int var3 = var1.length();
  112.  
  113.          int var5;
  114.          for(var5 = 5; var5 < var3 && var1.charAt(var5) == '/'; ++var5) {
  115.          }
  116.  
  117.          if (var5 < 8) {
  118.             var1 = "file:///" + var1.substring(var5);
  119.          }
  120.       }
  121.  
  122.       if (var1.startsWith("file:///\\\\")) {
  123.          var1 = "file:///\\\\" + var1.substring(10).replace('\\', '/');
  124.       } else {
  125.          var1 = var1.replace('\\', '/');
  126.       }
  127.  
  128.       return var1;
  129.    }
  130.  
  131.    public void init(String var1, int var2, IJavaObjectLoaderHost var3) {
  132.       firstTimeInit();
  133.       this.jolHost = var3;
  134.       this.hwnd = var2;
  135.  
  136.       try {
  137.          ComLib.declareMessagePumpThread();
  138.       } catch (Throwable var10) {
  139.       }
  140.  
  141.       try {
  142.          this.documentURL = new URL(this.massageURLSpec(var1));
  143.       } catch (MalformedURLException var9) {
  144.       }
  145.  
  146.       String var4 = this.getParameter("codebase");
  147.       if (var4 != null) {
  148.          if (!var4.endsWith("/")) {
  149.             var4 = var4 + "/";
  150.          }
  151.  
  152.          try {
  153.             this.baseURL = new URL(this.massageURLSpec(var4));
  154.          } catch (MalformedURLException var8) {
  155.          }
  156.       }
  157.  
  158.       if (this.baseURL == null) {
  159.          this.baseURL = this.documentURL;
  160.       }
  161.  
  162.       ((Component)this).setBackground(Color.lightGray);
  163.  
  164.       try {
  165.          this.appletSize.width = Integer.valueOf(this.getParameter("width"));
  166.       } catch (Exception var7) {
  167.       }
  168.  
  169.       try {
  170.          this.appletSize.height = Integer.valueOf(this.getParameter("height"));
  171.       } catch (Exception var6) {
  172.       }
  173.  
  174.       ((Component)this).resize(this.appletSize);
  175.       String var5 = "applet-" + this.getParameter("code");
  176.       this.handler = new Thread(new AppletThreadGroup("group " + var5), this, "thread " + var5);
  177.       this.handler.start();
  178.    }
  179.  
  180.    public void resizeApplet(int var1, int var2) {
  181.       if (var1 != this.appletSize.width || var2 != this.appletSize.height) {
  182.          this.appletSize.width = var1;
  183.          this.appletSize.height = var2;
  184.          ((Component)this).resize(this.appletSize);
  185.       }
  186.  
  187.    }
  188.  
  189.    public void sendEvent(int var1) {
  190.       this.queueEvent(new Event((Object)null, var1, (Object)null));
  191.    }
  192.  
  193.    protected synchronized void queueEvent(Event var1) {
  194.       if (this.queue == null) {
  195.          var1.target = this.queue;
  196.          this.queue = var1;
  197.          this.notifyAll();
  198.       } else {
  199.          Event var2;
  200.          for(var2 = this.queue; var2.target != null; var2 = (Event)var2.target) {
  201.          }
  202.  
  203.          var2.target = var1;
  204.       }
  205.    }
  206.  
  207.    synchronized Event getNextEvent() throws InterruptedException {
  208.       while(this.queue == null) {
  209.          this.wait();
  210.       }
  211.  
  212.       Event var1 = this.queue;
  213.       this.queue = (Event)this.queue.target;
  214.       var1.target = this;
  215.       return var1;
  216.    }
  217.  
  218.    public void run() {
  219.       frames.addElement(this);
  220.  
  221.       try {
  222.          int var3 = Thread.currentThread().getPriority();
  223.          Thread.currentThread().setPriority(var3 + 1);
  224.          ((Window)this).show();
  225.  
  226.          while(true) {
  227.             Event var4;
  228.             try {
  229.                var4 = this.getNextEvent();
  230.             } catch (InterruptedException var49) {
  231.                return;
  232.             }
  233.  
  234.             try {
  235.                switch (var4.id) {
  236.                   case 0:
  237.                      if (this.status == 1) {
  238.                         this.status = 0;
  239.                         ((Container)this).remove(this.applet);
  240.                         return;
  241.                      }
  242.                      break;
  243.                   case 1:
  244.                      if (this.status != 0) {
  245.                         break;
  246.                      }
  247.  
  248.                      this.loader = this.getClassLoader();
  249.                      String var5 = this.getParameter("code");
  250.                      if (var5.endsWith(".class")) {
  251.                         var5 = var5.substring(0, var5.length() - 6).replace('/', '.');
  252.                      }
  253.  
  254.                      if (var5.endsWith(".java")) {
  255.                         var5 = var5.substring(0, var5.length() - 5).replace('/', '.');
  256.                      }
  257.  
  258.                      try {
  259.                         try {
  260.                            this.setDownloadState(true);
  261.                            this.applet = (Applet)this.loader.loadClass(var5).newInstance();
  262.                         } finally {
  263.                            this.setDownloadState(false);
  264.                         }
  265.  
  266.                         this.pdispApplet = getAppletDispatch(this.applet);
  267.                      } catch (ClassNotFoundException var50) {
  268.                         this.showAppletStatus("load: class " + var5 + " not found");
  269.                         this.showAppletException(var50);
  270.                         break;
  271.                      } catch (InstantiationException var51) {
  272.                         this.showAppletStatus("load: " + var5 + " can't be instantiated");
  273.                         this.showAppletException(var51);
  274.                         break;
  275.                      } catch (IllegalAccessException var52) {
  276.                         this.showAppletStatus("load: " + var5 + " is not public or has no public constructor");
  277.                         this.showAppletException(var52);
  278.                         break;
  279.                      } catch (Exception var53) {
  280.                         this.showAppletStatus("exception: " + var53);
  281.                         this.showAppletException(var53);
  282.                         break;
  283.                      } catch (ThreadDeath var54) {
  284.                         this.showAppletStatus("killed");
  285.                         return;
  286.                      } catch (Error var55) {
  287.                         this.showAppletStatus("error: " + var55);
  288.                         this.showAppletException(var55);
  289.                         break;
  290.                      }
  291.  
  292.                      this.applet.setStub(this);
  293.                      this.applet.hide();
  294.                      ((Container)this).add("Center", this.applet);
  295.                      this.status = 1;
  296.                      this.showAppletStatus(256);
  297.                      ((Container)this).validate();
  298.                      break;
  299.                   case 2:
  300.                      if (this.status == 1) {
  301.                         try {
  302.                            this.setDownloadState(true);
  303.                            this.applet.resize(this.appletSize);
  304.                            this.applet.init();
  305.                            ((Container)this).validate();
  306.                         } finally {
  307.                            this.setDownloadState(false);
  308.                         }
  309.  
  310.                         this.status = 2;
  311.                         this.showAppletStatus(256);
  312.                      }
  313.                      break;
  314.                   case 3:
  315.                      if (this.status == 2) {
  316.                         this.applet.resize(this.appletSize);
  317.                         this.applet.start();
  318.                         ((Container)this).validate();
  319.                         this.applet.show();
  320.                         this.status = 3;
  321.                         this.showAppletStatus(257);
  322.                      }
  323.                      break;
  324.                   case 4:
  325.                      if (this.status == 3) {
  326.                         this.status = 2;
  327.                         this.applet.hide();
  328.                         this.applet.stop();
  329.                         this.showAppletStatus(258);
  330.                      }
  331.                      break;
  332.                   case 5:
  333.                      if (this.status == 2) {
  334.                         this.status = 1;
  335.                         this.applet.destroy();
  336.                         this.showAppletStatus(259);
  337.                      }
  338.                }
  339.             } catch (Exception var56) {
  340.                this.showAppletStatus("exception: " + var56);
  341.                this.showAppletException(var56);
  342.             } catch (ThreadDeath var57) {
  343.                this.showAppletStatus("killed");
  344.                return;
  345.             } catch (Error var58) {
  346.                this.showAppletStatus("error: " + var58);
  347.                this.showAppletException(var58);
  348.             }
  349.          }
  350.       } finally {
  351.          frames.removeElement(this);
  352.          releaseClassLoader(this.getCodeBase());
  353.          releaseAppletDispatch(this.pdispApplet);
  354.          ((Frame)this).dispose();
  355.          this.jolHost = null;
  356.       }
  357.    }
  358.  
  359.    public boolean isActive() {
  360.       return this.status == 3;
  361.    }
  362.  
  363.    protected void showAppletStatus(String var1) {
  364.       this.jolHost.showStatus(var1);
  365.    }
  366.  
  367.    protected void showAppletStatus(int var1) {
  368.       this.jolHost.showSystemStatus(var1, false, (String)null);
  369.    }
  370.  
  371.    protected void showLoaderStatus(int var1, String var2) {
  372.       this.jolHost.showSystemStatus(var1, true, var2);
  373.    }
  374.  
  375.    protected void setDownloadState(boolean var1) {
  376.       this.jolHost.setDownloadState(var1);
  377.    }
  378.  
  379.    protected void showAppletException(Throwable var1) {
  380.       var1.printStackTrace();
  381.    }
  382.  
  383.    AppletBaseClassLoader getClassLoader() throws MalformedURLException {
  384.       String var2 = this.getParameter("cabbase");
  385.       Object var3 = null;
  386.       URL var14;
  387.       if (var2 == null) {
  388.          var14 = this.getCodeBase();
  389.       } else {
  390.          var14 = new URL(this.getCodeBase(), var2);
  391.       }
  392.  
  393.       Vector var4 = classloaders;
  394.       synchronized(var4){}
  395.  
  396.       try {
  397.          int var7 = classloaders.size();
  398.  
  399.          for(int var6 = 0; var6 < var7; ++var6) {
  400.             ClassLoaderEntry var1 = (ClassLoaderEntry)classloaders.elementAt(var6);
  401.             if (var14.equals(var1.codebase)) {
  402.                if (var1.countRefs == 0) {
  403.                   --oldloadersCount;
  404.                }
  405.  
  406.                ++var1.countRefs;
  407.                AppletBaseClassLoader var8 = var1.loader;
  408.                return var8;
  409.             }
  410.          }
  411.  
  412.          Object var15;
  413.          if (var2 == null) {
  414.             var15 = new AppletClassLoader(var14);
  415.          } else {
  416.             var15 = new CabClassLoader(var14, this.getCodeBase());
  417.          }
  418.  
  419.          try {
  420.             ((AppletBaseClassLoader)var15).setSecureState(this.documentURL.getProtocol(), var14.getProtocol());
  421.          } catch (Throwable var11) {
  422.          }
  423.  
  424.          ClassLoaderEntry var13 = new ClassLoaderEntry(var14, (AppletBaseClassLoader)var15);
  425.          classloaders.addElement(var13);
  426.          return var13.loader;
  427.       } catch (Throwable var12) {
  428.          throw var12;
  429.       }
  430.    }
  431.  
  432.    static synchronized void releaseClassLoader(URL var0) {
  433.       int var2 = classloaders.size();
  434.  
  435.       for(int var1 = 0; var1 < var2; ++var1) {
  436.          ClassLoaderEntry var3 = (ClassLoaderEntry)classloaders.elementAt(var1);
  437.          if (var0.equals(var3.codebase)) {
  438.             --var3.countRefs;
  439.             classloaders.removeElementAt(var1);
  440.             classloaders.addElement(var3);
  441.             if (var3.countRefs == 0) {
  442.                ++oldloadersCount;
  443.             }
  444.  
  445.             while(oldloadersCount >= 3) {
  446.                for(int var5 = 0; var5 < var2; ++var5) {
  447.                   ClassLoaderEntry var4 = (ClassLoaderEntry)classloaders.elementAt(var5);
  448.                   if (var4.countRefs == 0) {
  449.                      classloaders.removeElementAt(var5);
  450.                      --oldloadersCount;
  451.                      break;
  452.                   }
  453.                }
  454.             }
  455.  
  456.             return;
  457.          }
  458.       }
  459.  
  460.    }
  461.  
  462.    public URL getDocumentBase() {
  463.       return this.documentURL;
  464.    }
  465.  
  466.    public URL getCodeBase() {
  467.       return this.baseURL;
  468.    }
  469.  
  470.    public String getParameter(String var1) {
  471.       return (String)this.atts.get(var1.toLowerCase());
  472.    }
  473.  
  474.    public AppletContext getAppletContext() {
  475.       if (this.appletContext == null) {
  476.          this.appletContext = new BrowserAppletContext(this);
  477.       }
  478.  
  479.       return this.appletContext;
  480.    }
  481.  
  482.    public void appletResize(int var1, int var2) {
  483.    }
  484.  
  485.    public Applet getApplet(String var1) {
  486.       AppletSecurity var2 = (AppletSecurity)System.getSecurityManager();
  487.       var1 = var1.toLowerCase();
  488.       Enumeration var3 = frames.elements();
  489.  
  490.       while(var3.hasMoreElements()) {
  491.          BrowserAppletFrame var4 = (BrowserAppletFrame)var3.nextElement();
  492.          String var5 = var4.getParameter("name");
  493.          if (var5 != null) {
  494.             var5 = var5.toLowerCase();
  495.          }
  496.  
  497.          if (var1.equals(var5) && var4.getDocumentBase().equals(this.getDocumentBase())) {
  498.             try {
  499.                var2.checkConnect(this.getCodeBase().getHost(), var4.getCodeBase().getHost());
  500.                return var4.applet;
  501.             } catch (SecurityException var6) {
  502.             }
  503.          }
  504.       }
  505.  
  506.       return null;
  507.    }
  508.  
  509.    public Enumeration getApplets() {
  510.       AppletSecurity var1 = (AppletSecurity)System.getSecurityManager();
  511.       Vector var2 = new Vector();
  512.       Enumeration var3 = frames.elements();
  513.  
  514.       while(var3.hasMoreElements()) {
  515.          BrowserAppletFrame var4 = (BrowserAppletFrame)var3.nextElement();
  516.          if (var4.getDocumentBase().equals(this.getDocumentBase())) {
  517.             try {
  518.                var1.checkConnect(this.getCodeBase().getHost(), var4.getCodeBase().getHost());
  519.                var2.addElement(var4.applet);
  520.             } catch (SecurityException var5) {
  521.             }
  522.          }
  523.       }
  524.  
  525.       return var2.elements();
  526.    }
  527.  
  528.    byte[] getDataFileFromLoader(URL var1) {
  529.       String var2 = this.baseURL.toString();
  530.       String var3 = var1.toString();
  531.       Object var4 = null;
  532.       if (var2.length() == var3.length()) {
  533.          return null;
  534.       } else if (var3.startsWith(var2)) {
  535.          String var5 = var3.substring(var2.length());
  536.          return this.loader.getDataItem(var5);
  537.       } else {
  538.          return null;
  539.       }
  540.    }
  541.  
  542.    synchronized AudioClip getAudioClipFromCache(URL var1) {
  543.       System.getSecurityManager().checkConnect(var1.getHost(), var1.getPort());
  544.       Object var2 = (AudioClip)this.audioHash.get(var1);
  545.       if (var2 != null) {
  546.          return (AudioClip)var2;
  547.       } else {
  548.          if (this.loader.isDataStore()) {
  549.             byte[] var3 = this.getDataFileFromLoader(var1);
  550.             if (var3 != null) {
  551.                var2 = new AppletAudioClip(var1, var3);
  552.             }
  553.          }
  554.  
  555.          if (var2 == null) {
  556.             var2 = new AppletAudioClip(var1);
  557.          }
  558.  
  559.          this.audioHash.put(var1, var2);
  560.          return (AudioClip)var2;
  561.       }
  562.    }
  563.  
  564.    synchronized Image getImageFromHash(URL var1) {
  565.       System.getSecurityManager().checkConnect(var1.getHost(), var1.getPort());
  566.       Image var2 = (Image)this.imgHash.get(var1);
  567.       if (var2 != null) {
  568.          return var2;
  569.       } else {
  570.          Object var3 = null;
  571.  
  572.          try {
  573.             try {
  574.                if (this.loader.isDataStore()) {
  575.                   var3 = new ByteArrayImageSource(var1.toString(), this.getDataFileFromLoader(var1));
  576.                }
  577.             } catch (Exception var5) {
  578.             }
  579.  
  580.             if (var3 == null) {
  581.                URLConnection var4 = var1.openConnection();
  582.                var4.setUseCaches(true);
  583.                var3 = new URLImageSource(var1, var4);
  584.             }
  585.  
  586.             if (var3 != null) {
  587.                var2 = Toolkit.getDefaultToolkit().createImage((ImageProducer)var3);
  588.                this.imgHash.put(var1, var2);
  589.             }
  590.          } catch (Exception var6) {
  591.          }
  592.  
  593.          return var2;
  594.       }
  595.    }
  596.  
  597.    static synchronized void firstTimeInit() {
  598.       if (!isFirstTimeInited) {
  599.          isFirstTimeInited = true;
  600.  
  601.          try {
  602.             URL.setURLStreamHandlerFactory(new WininetStreamHandlerFactory());
  603.          } catch (Exception var3) {
  604.          }
  605.  
  606.          if ("true".equalsIgnoreCase(System.getProperty("com.ms.applet.enable.logging"))) {
  607.             try {
  608.                String var0 = System.getProperty("java.home");
  609.                PrintStream var1 = new PrintStream(new BufferedOutputStream(new FileOutputStream(new File(var0, "javalog.txt"))), true);
  610.                System.out = var1;
  611.                System.err = var1;
  612.             } catch (Exception var2) {
  613.             }
  614.          }
  615.  
  616.          Properties var4 = new Properties(System.getProperties());
  617.          ((Hashtable)var4).put("package.restrict.definition.java", "true");
  618.          ((Hashtable)var4).put("package.restrict.definition.sun", "true");
  619.          ((Hashtable)var4).put("package.restrict.definition.com.ms", "true");
  620.          ((Hashtable)var4).put("java.version.applet", "true");
  621.          ((Hashtable)var4).put("java.vendor.applet", "true");
  622.          ((Hashtable)var4).put("java.vendor.url.applet", "true");
  623.          ((Hashtable)var4).put("java.class.version.applet", "true");
  624.          ((Hashtable)var4).put("os.name.applet", "true");
  625.          ((Hashtable)var4).put("os.version.applet", "true");
  626.          ((Hashtable)var4).put("os.arch.applet", "true");
  627.          ((Hashtable)var4).put("file.separator.applet", "true");
  628.          ((Hashtable)var4).put("path.separator.applet", "true");
  629.          ((Hashtable)var4).put("line.separator.applet", "true");
  630.          ((Hashtable)var4).put("browser.applet", "true");
  631.          System.setProperties(var4);
  632.          if (System.getSecurityManager() == null) {
  633.             System.setSecurityManager(new AppletSecurity());
  634.          }
  635.  
  636.       }
  637.    }
  638.  
  639.    public IJavaObjectLoaderHost getLoaderHost() {
  640.       return this.jolHost;
  641.    }
  642. }
  643.