home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 June / pcx11_9706.iso / shutils / internet / browser / p32e40b5.exe / nav40.z / java40.jar / netscape / applet / EmbeddedObject.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-05-23  |  10.0 KB  |  526 lines

  1. package netscape.applet;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.net.URL;
  5. import netscape.application.CommandEvent;
  6. import netscape.application.FormElement;
  7. import netscape.application.FoundationPanel;
  8. import netscape.application.Target;
  9. import netscape.security.AppletSecurityException;
  10. import netscape.util.Hashtable;
  11. import netscape.util.InconsistencyException;
  12.  
  13. class EmbeddedObject implements Target {
  14.    IntTable beans;
  15.    int parentContext;
  16.    int frameContext;
  17.    int contextID;
  18.    int objectID;
  19.    URL documentURL;
  20.    URL codebaseURL;
  21.    URL archiveURL;
  22.    int width;
  23.    int height;
  24.    String programName;
  25.    String className;
  26.    Hashtable attribs;
  27.    Hashtable params;
  28.    static final int OBJECT_TYPE_BEAN = 0;
  29.    static final int OBJECT_TYPE_PROG_EXPLICIT = 1;
  30.    static final int OBJECT_TYPE_PROG_DEFAULT = 2;
  31.    static final int OBJECT_TYPE_PROG_JAVASCRIPT = 3;
  32.    int objectType;
  33.    EmbeddedBeanTracker beanTracker;
  34.    EmbeddedProgramTracker programTracker;
  35.    Object actualObject;
  36.    EmbeddedObjectFrame frame;
  37.    FoundationPanel panel;
  38.    Task task;
  39.    EmbeddedProgramTaskOwner taskOwner;
  40.    static final int OBJECT_CREATED = 0;
  41.    static final int OBJECT_INITIALIZED = 1;
  42.    static final int OBJECT_STARTED = 2;
  43.    static final int OBJECT_STOPPED = 3;
  44.    static final int OBJECT_DESTROYED = 4;
  45.    int state;
  46.    static EmbeddedBeanOwner defaultBeanOwner = new DefaultEmbeddedOwner();
  47.    static EmbeddedProgramOwner defaultProgramOwner;
  48.    EmbeddedBeanOwner beanOwner;
  49.  
  50.    int width() {
  51.       return this.width;
  52.    }
  53.  
  54.    int height() {
  55.       return this.height;
  56.    }
  57.  
  58.    URL documentURL() {
  59.       return this.documentURL;
  60.    }
  61.  
  62.    URL codebaseURL() {
  63.       return this.codebaseURL;
  64.    }
  65.  
  66.    URL archiveURL() {
  67.       return this.archiveURL;
  68.    }
  69.  
  70.    Hashtable attributes() {
  71.       return this.attribs;
  72.    }
  73.  
  74.    Hashtable parameters() {
  75.       return this.params;
  76.    }
  77.  
  78.    Object getActualObject() {
  79.       return this.objectType != 0 ? this.task.application() : this.actualObject;
  80.    }
  81.  
  82.    String getText() {
  83.       return this.actualObject instanceof FormElement ? ((FormElement)this.actualObject).formElementText() : null;
  84.    }
  85.  
  86.    IntTable beans() {
  87.       return this.beans;
  88.    }
  89.  
  90.    static EmbeddedObject registerBean(EmbeddedObject var0) {
  91.       EmbeddedObject var1 = var0.taskOwner.getProgramForBean(var0);
  92.       var1.beans.put(var0.objectID, var0);
  93.       return var1;
  94.    }
  95.  
  96.    static EmbeddedObject unregisterBean(EmbeddedObject var0) {
  97.       EmbeddedObject var1 = var0.taskOwner.getProgramForBean(var0);
  98.       var1.beans.remove(var0.objectID);
  99.       return var1;
  100.    }
  101.  
  102.    static void initObject(int var0, int var1, int var2, int var3, String[] var4, int var5, boolean var6) {
  103.       URL var16;
  104.       try {
  105.          var16 = new URL(var4[0]);
  106.       } catch (MalformedURLException var27) {
  107.          EmbeddedObjectNatives.pMochaOnLoad(var1, -1);
  108.          return;
  109.       }
  110.  
  111.       Hashtable var15 = new Hashtable();
  112.       Hashtable var14 = new Hashtable();
  113.       var14.put("document", var4[0]);
  114.  
  115.       for(int var7 = 1; var7 < var4.length; ++var7) {
  116.          String var11 = var4[var7];
  117.          int var8 = var11.indexOf(61);
  118.          if (var8 >= 0) {
  119.             if (var7 < var5) {
  120.                String var20 = var11.substring(0, var8).toLowerCase();
  121.                var14.put(var20, var11.substring(var8 + 1));
  122.                if (var20.equals("name")) {
  123.                   var14.put("id", var11.substring(var8 + 1));
  124.                }
  125.             } else {
  126.                var15.put(var11.substring(0, var8).toLowerCase(), var11.substring(var8 + 1));
  127.             }
  128.          }
  129.       }
  130.  
  131.       URL var17 = computeCodebase(var16, var14);
  132.       URL var18 = computeArchive(var17, var14, var15);
  133.  
  134.       int var9;
  135.       try {
  136.          var9 = Integer.parseInt((String)var14.get("width"));
  137.       } catch (NumberFormatException var26) {
  138.          var9 = 50;
  139.       }
  140.  
  141.       int var10;
  142.       try {
  143.          var10 = Integer.parseInt((String)var14.get("height"));
  144.       } catch (NumberFormatException var25) {
  145.          var10 = 50;
  146.       }
  147.  
  148.       String var13 = (String)var14.get("code");
  149.       if (var13 == null) {
  150.          throw new Error("CLASSID was not specified for OBJECT tag.");
  151.       } else {
  152.          String var12 = (String)var15.get("program name");
  153.          if (var12 == null) {
  154.             var12 = var4[0] + "_" + var2;
  155.          }
  156.  
  157.          Task var19 = Task.taskNamed(var17, var12);
  158.          if (var19 == null) {
  159.             Hashtable var21;
  160.             Hashtable var22;
  161.             byte var23;
  162.             int var24;
  163.             String var28;
  164.             if (var6) {
  165.                var28 = var13;
  166.                var21 = var14;
  167.                var22 = var15;
  168.                var23 = 1;
  169.                var24 = var3;
  170.             } else {
  171.                var28 = "netscape.application.Application";
  172.                var21 = new Hashtable();
  173.                var22 = new Hashtable();
  174.                var23 = 2;
  175.                var24 = 0;
  176.             }
  177.  
  178.             new EmbeddedObject(var0, var1, var2, var24, var16, var17, var18, 0, 0, var12, var28, var21, var22, var23);
  179.             if (var6) {
  180.                return;
  181.             }
  182.          }
  183.  
  184.          if (var6) {
  185.             new EmbeddedObject(var0, var1, var2, var3, var16, var17, var18, 0, 0, var12, (String)null, var14, var15, 1);
  186.          } else {
  187.             new EmbeddedObject(var0, var1, var2, var3, var16, var17, var18, var9, var10, var12, var13, var14, var15, 0);
  188.          }
  189.       }
  190.    }
  191.  
  192.    static URL computeCodebase(URL var0, Hashtable var1) {
  193.       String var2 = (String)var1.get("document");
  194.       String var3 = (String)var1.get("codebase");
  195.       if (var3 == null) {
  196.          int var4 = var2.lastIndexOf(47) + 1;
  197.          var3 = var2.substring(0, var4);
  198.       } else {
  199.          if (!var3.endsWith("/")) {
  200.             var3 = var3 + "/";
  201.          }
  202.  
  203.          try {
  204.             URL var8 = new URL(var0, var3);
  205.             var3 = var8.toString();
  206.             int var5 = var3.lastIndexOf(47) + 1;
  207.             if (var5 != var3.length() - 1) {
  208.                var3 = var3.substring(0, var5);
  209.             }
  210.          } catch (MalformedURLException var7) {
  211.          }
  212.  
  213.          if (!var2.startsWith("file:") && var3.startsWith("file:")) {
  214.             throw new AppletSecurityException("EmbeddedObject: Can't use file:// URL in CODEBASE spec", var3);
  215.          }
  216.       }
  217.  
  218.       URL var9 = var0;
  219.  
  220.       try {
  221.          var9 = new URL(var3);
  222.          var1.put("codebase", var3);
  223.       } catch (MalformedURLException var6) {
  224.       }
  225.  
  226.       return var9;
  227.    }
  228.  
  229.    static URL computeArchive(URL var0, Hashtable var1, Hashtable var2) {
  230.       String var3 = (String)var1.get("codebase");
  231.       String var4 = (String)var2.get("archive");
  232.       if (var4 == null) {
  233.          int var5 = var3.lastIndexOf(47) + 1;
  234.          var4 = var3.substring(0, var5);
  235.       } else {
  236.          try {
  237.             int var9 = var4.indexOf(44);
  238.             if (var9 != -1) {
  239.                var4 = var4.substring(0, var9);
  240.             }
  241.  
  242.             URL var6 = new URL(var0, var4);
  243.             var4 = var6.toString();
  244.          } catch (MalformedURLException var8) {
  245.          }
  246.  
  247.          if (!var3.startsWith("file:") && var4.startsWith("file:")) {
  248.             throw new AppletSecurityException("EmbeddedObject: Can't use file:// URL in ARHIVE spec", var4);
  249.          }
  250.       }
  251.  
  252.       URL var10 = var0;
  253.  
  254.       try {
  255.          var10 = new URL(var4);
  256.          var2.put("archive", var4);
  257.       } catch (MalformedURLException var7) {
  258.       }
  259.  
  260.       return var10;
  261.    }
  262.  
  263.    static void startObject(int var0, int var1, int var2) {
  264.       EmbeddedObject var3 = EmbeddedProgramTaskOwner.findBeanOrProgram(var0, var1);
  265.       if (var3 != null) {
  266.          var3.frameContext = var2;
  267.          var3.frameContext = var2;
  268.          var3.task.addEvent(new CommandEvent(var3, "start", (Object)null));
  269.       }
  270.    }
  271.  
  272.    static void stopObject(int var0, int var1, int var2) {
  273.       EmbeddedObject var3 = EmbeddedProgramTaskOwner.findBeanOrProgram(var0, var1);
  274.       if (var3 != null) {
  275.          var3.frameContext = var2;
  276.          var3.stopObject();
  277.       }
  278.    }
  279.  
  280.    void stopObject() {
  281.       this.task.addEvent(new CommandEvent(this, "stop", (Object)null));
  282.    }
  283.  
  284.    static void destroyObject(int var0, int var1) {
  285.       EmbeddedObject var2 = EmbeddedProgramTaskOwner.findBean(var0, var1);
  286.       if (var2 != null) {
  287.          var2.destroyObject();
  288.       }
  289.  
  290.    }
  291.  
  292.    void destroyObject() {
  293.       EmbeddedObject var1 = unregisterBean(this);
  294.       this.task.addEvent(new CommandEvent(this, "destroy", (Object)null));
  295.       if (var1.beans.count() == 0) {
  296.          if (var1.taskOwner.count() > 1) {
  297.             var1.taskOwner.removeProgram(var1);
  298.             var1.task.addEvent(new CommandEvent(var1, "destroy", (Object)null));
  299.             return;
  300.          }
  301.  
  302.          if (var1.taskOwner.programOwner.programCanShutdown(this.programTracker)) {
  303.             var1.taskOwner.removeProgram(var1);
  304.             Task.unregisterTask(var1.task);
  305.             var1.task.addEvent(new CommandEvent(var1, "destroy", (Object)null));
  306.          }
  307.       }
  308.  
  309.    }
  310.  
  311.    void createApplication() {
  312.       if (this.className == null) {
  313.          this.task = Task.taskNamed(this.codebaseURL, this.programName);
  314.          this.taskOwner = (EmbeddedProgramTaskOwner)this.task.taskOwner();
  315.          this.className = this.taskOwner.getCurrentProgram().className;
  316.          this.taskOwner.addProgram(this);
  317.          this.task.addEvent(new CommandEvent(this, "init", (Object)null));
  318.          if (this.objectType != 3) {
  319.             this.task.addEvent(new CommandEvent(this, "callMochaOnLoad", (Object)null));
  320.          }
  321.       } else {
  322.          this.taskOwner = new EmbeddedProgramTaskOwner(this);
  323.          this.task = new Task(this.programName, this.className, this.codebaseURL, this.archiveURL, this.taskOwner);
  324.          this.task.start();
  325.          this.task.addEvent(new CommandEvent(this, "init", (Object)null));
  326.       }
  327.  
  328.       this.beans = new IntTable();
  329.    }
  330.  
  331.    EmbeddedObject(int var1, int var2, int var3, int var4, URL var5, URL var6, URL var7, int var8, int var9, String var10, String var11, Hashtable var12, Hashtable var13, int var14) {
  332.       if (var14 == 0) {
  333.          this.beanTracker = new EmbeddedBeanTracker(this);
  334.       } else {
  335.          this.programTracker = new EmbeddedProgramTracker(this);
  336.       }
  337.  
  338.       this.parentContext = var1;
  339.       this.frameContext = var2;
  340.       this.contextID = var3;
  341.       this.objectID = var4;
  342.       this.documentURL = var5;
  343.       this.codebaseURL = var6;
  344.       this.archiveURL = var7;
  345.       this.width = var8;
  346.       this.height = var9;
  347.       this.programName = var10;
  348.       this.className = var11;
  349.       this.attribs = var12;
  350.       this.params = var13;
  351.       this.objectType = var14;
  352.       if (var14 != 0) {
  353.          this.createApplication();
  354.       } else {
  355.          this.task = Task.taskNamed(var6, var10);
  356.          this.taskOwner = (EmbeddedProgramTaskOwner)this.task.taskOwner();
  357.          this.frame = new EmbeddedObjectFrame(this);
  358.          this.frame.pack();
  359.          this.frame.show();
  360.          registerBean(this);
  361.          this.task.addEvent(new CommandEvent(this, "init", (Object)null));
  362.       }
  363.    }
  364.  
  365.    EmbeddedObject(URL var1, String var2, String var3, String var4) {
  366.       this.programTracker = new EmbeddedProgramTracker(this);
  367.       this.codebaseURL = var1;
  368.       this.documentURL = var1;
  369.       this.archiveURL = var1;
  370.       this.programName = var2;
  371.       this.className = var3;
  372.       this.attribs = new Hashtable();
  373.       this.params = new Hashtable();
  374.       if (var4 != null) {
  375.          this.params.put("embedded owner", var4);
  376.       }
  377.  
  378.       this.objectType = 3;
  379.       this.createApplication();
  380.    }
  381.  
  382.    synchronized void setState(int var1) {
  383.       switch (var1) {
  384.          case 1:
  385.             if (this.state != 0) {
  386.                throw new InconsistencyException("Invalid state change.");
  387.             }
  388.             break;
  389.          case 2:
  390.             if (this.state != 1 && this.state != 3) {
  391.                throw new InconsistencyException("Invalid state change.");
  392.             }
  393.             break;
  394.          case 3:
  395.             if (this.state != 2) {
  396.                throw new InconsistencyException("Invalid state change.");
  397.             }
  398.             break;
  399.          case 4:
  400.             if (this.objectType == 0) {
  401.                if (this.state != 3) {
  402.                   throw new InconsistencyException("Invalid state change.");
  403.                }
  404.             } else if (this.state == 4) {
  405.                throw new InconsistencyException("Invalid state change.");
  406.             }
  407.       }
  408.  
  409.       this.state = var1;
  410.    }
  411.  
  412.    public void performCommand(String var1, Object var2) {
  413.       if ("init".equals(var1)) {
  414.          this.init();
  415.       } else if ("start".equals(var1)) {
  416.          this.start();
  417.       } else if ("stop".equals(var1)) {
  418.          this.stop();
  419.       } else if ("destroy".equals(var1)) {
  420.          this.destroy();
  421.       } else if ("callMochaOnLoad".equals(var1)) {
  422.          EmbeddedObjectNatives.pMochaOnLoad(this.frameContext, 0);
  423.       } else {
  424.          throw new InconsistencyException("unknown command: " + var1);
  425.       }
  426.    }
  427.  
  428.    void init() {
  429.       this.setState(1);
  430.       if (this.objectType != 0) {
  431.          if (this.taskOwner.programOwner != null) {
  432.             return;
  433.          }
  434.  
  435.          this.taskOwner.programOwner = defaultProgramOwner;
  436.          this.taskOwner.beanOwner = defaultBeanOwner;
  437.       } else {
  438.          this.beanOwner = this.taskOwner.beanOwner;
  439.       }
  440.  
  441.       String var1 = (String)this.params.get("embedded owner");
  442.       if (var1 != null) {
  443.          Class var3;
  444.          try {
  445.             var3 = this.task.loadClass(var1);
  446.          } catch (ClassNotFoundException var7) {
  447.             throw new InconsistencyException("Unable to load class: " + var1);
  448.          }
  449.  
  450.          Object var2;
  451.          try {
  452.             var2 = var3.newInstance();
  453.          } catch (InstantiationException var5) {
  454.             throw new InconsistencyException("Bag things...");
  455.          } catch (IllegalAccessException var6) {
  456.             throw new InconsistencyException("Bag things...");
  457.          }
  458.  
  459.          if (this.objectType != 0) {
  460.             boolean var4 = false;
  461.             if (var2 instanceof EmbeddedProgramOwner) {
  462.                this.taskOwner.programOwner = (EmbeddedProgramOwner)var2;
  463.                var4 = true;
  464.             }
  465.  
  466.             if (var2 instanceof EmbeddedBeanOwner) {
  467.                this.taskOwner.beanOwner = (EmbeddedBeanOwner)var2;
  468.                var4 = true;
  469.             }
  470.  
  471.             if (!var4) {
  472.                System.err.println("Error: " + var1 + " does not implement EmbeddedBeanOwner or EmbeddedProgramOwner interfaces.");
  473.                System.err.println("       Using default owners. ");
  474.             }
  475.          } else if (var2 instanceof EmbeddedBeanOwner) {
  476.             this.beanOwner = (EmbeddedBeanOwner)var2;
  477.          } else {
  478.             System.err.println("Error: " + var1 + " does not implement EmbeddedBeanOwner interface.");
  479.             System.err.println("       Using default owner. ");
  480.          }
  481.       }
  482.  
  483.       if (this.objectType == 0) {
  484.          this.beanOwner.embeddedBeanDidInit(this.beanTracker);
  485.       }
  486.  
  487.       if (this.objectType == 1 || this.objectType == 0) {
  488.          EmbeddedObjectNatives.pMochaOnLoad(this.frameContext, 0);
  489.       }
  490.  
  491.    }
  492.  
  493.    void start() {
  494.       this.setState(2);
  495.       if (this.objectType == 0) {
  496.          this.beanOwner.embeddedBeanDidStart(this.beanTracker);
  497.       }
  498.  
  499.    }
  500.  
  501.    void stop() {
  502.       this.setState(3);
  503.       if (this.objectType == 0) {
  504.          this.beanOwner.embeddedBeanDidStop(this.beanTracker);
  505.       }
  506.  
  507.    }
  508.  
  509.    void destroy() {
  510.       this.setState(4);
  511.       if (this.objectType == 0) {
  512.          this.beanOwner.embeddedBeanDidDestroy(this.beanTracker);
  513.          this.frame.getComponents();
  514.          this.frame.hide();
  515.          this.frame.dispose();
  516.          this.frame.destroy();
  517.       } else {
  518.          this.task.application().stopRunning();
  519.       }
  520.    }
  521.  
  522.    static {
  523.       defaultProgramOwner = (EmbeddedProgramOwner)defaultBeanOwner;
  524.    }
  525. }
  526.