home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / awt / image / InputStreamImageSource.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  7.1 KB  |  429 lines

  1. package sun.awt.image;
  2.  
  3. import java.awt.image.ImageConsumer;
  4. import java.awt.image.ImageProducer;
  5. import java.io.BufferedInputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8.  
  9. public abstract class InputStreamImageSource implements ImageProducer, ImageFetchable {
  10.    PixelStore pixelstore;
  11.    ImageConsumerQueue consumers;
  12.    ImageDecoder decoder;
  13.    ImageDecoder decoders;
  14.    boolean awaitingFetch = false;
  15.  
  16.    abstract boolean checkSecurity(Object var1, boolean var2);
  17.  
  18.    int countConsumers(ImageConsumerQueue var1) {
  19.       int var2;
  20.       for(var2 = 0; var1 != null; var1 = var1.next) {
  21.          ++var2;
  22.       }
  23.  
  24.       return var2;
  25.    }
  26.  
  27.    synchronized int countConsumers() {
  28.       ImageDecoder var1 = this.decoders;
  29.  
  30.       int var2;
  31.       for(var2 = this.countConsumers(this.consumers); var1 != null; var1 = var1.next) {
  32.          var2 += this.countConsumers(var1.queue);
  33.       }
  34.  
  35.       return var2;
  36.    }
  37.  
  38.    public void addConsumer(ImageConsumer var1) {
  39.       this.addConsumer(var1, false);
  40.    }
  41.  
  42.    synchronized void printQueue(ImageConsumerQueue var1, String var2) {
  43.       while(var1 != null) {
  44.          System.out.println(var2 + var1);
  45.          var1 = var1.next;
  46.       }
  47.  
  48.    }
  49.  
  50.    synchronized void printQueues(String var1) {
  51.       System.out.println(var1 + "[ -----------");
  52.       this.printQueue(this.consumers, "  ");
  53.  
  54.       for(ImageDecoder var2 = this.decoders; var2 != null; var2 = var2.next) {
  55.          System.out.println("    " + var2);
  56.          this.printQueue(var2.queue, "      ");
  57.       }
  58.  
  59.       System.out.println("----------- ]" + var1);
  60.    }
  61.  
  62.    synchronized void addConsumer(ImageConsumer var1, boolean var2) {
  63.       this.checkSecurity((Object)null, false);
  64.  
  65.       for(ImageDecoder var3 = this.decoders; var3 != null; var3 = var3.next) {
  66.          if (var3.isConsumer(var1)) {
  67.             return;
  68.          }
  69.       }
  70.  
  71.       ImageConsumerQueue var4;
  72.       for(var4 = this.consumers; var4 != null && var4.consumer != var1; var4 = var4.next) {
  73.       }
  74.  
  75.       if (var4 == null) {
  76.          var4 = new ImageConsumerQueue(this, var1);
  77.          var4.next = this.consumers;
  78.          this.consumers = var4;
  79.       } else {
  80.          if (!var4.secure) {
  81.             Object var5 = null;
  82.             SecurityManager var6 = System.getSecurityManager();
  83.             if (var6 != null) {
  84.                var5 = var6.getSecurityContext();
  85.             }
  86.  
  87.             if (var4.securityContext == null) {
  88.                var4.securityContext = var5;
  89.             } else if (var4.securityContext != var5) {
  90.                this.errorConsumer(var4);
  91.                throw new SecurityException("Applets are trading image data!");
  92.             }
  93.          }
  94.  
  95.          var4.interested = true;
  96.       }
  97.  
  98.       if (var2 && this.decoder == null) {
  99.          this.startProduction();
  100.       }
  101.  
  102.    }
  103.  
  104.    public synchronized boolean isConsumer(ImageConsumer var1) {
  105.       for(ImageDecoder var2 = this.decoders; var2 != null; var2 = var2.next) {
  106.          if (var2.isConsumer(var1)) {
  107.             return true;
  108.          }
  109.       }
  110.  
  111.       return ImageConsumerQueue.isConsumer(this.consumers, var1);
  112.    }
  113.  
  114.    private void errorAllConsumers(ImageConsumerQueue var1) {
  115.       for(; var1 != null; var1 = var1.next) {
  116.          if (var1.interested) {
  117.             this.errorConsumer(var1);
  118.          }
  119.       }
  120.  
  121.    }
  122.  
  123.    private void errorConsumer(ImageConsumerQueue var1) {
  124.       var1.consumer.imageComplete(1);
  125.       this.removeConsumer(var1.consumer);
  126.    }
  127.  
  128.    public synchronized void removeConsumer(ImageConsumer var1) {
  129.       for(ImageDecoder var2 = this.decoders; var2 != null; var2 = var2.next) {
  130.          var2.removeConsumer(var1);
  131.       }
  132.  
  133.       this.consumers = ImageConsumerQueue.removeConsumer(this.consumers, var1, false);
  134.       if (this.consumers == null) {
  135.          this.stopProduction();
  136.       }
  137.  
  138.    }
  139.  
  140.    public void startProduction(ImageConsumer var1) {
  141.       this.addConsumer(var1, true);
  142.    }
  143.  
  144.    private synchronized void startProduction() {
  145.       if (!this.awaitingFetch) {
  146.          ImageFetcher.add(this);
  147.          this.awaitingFetch = true;
  148.       }
  149.  
  150.    }
  151.  
  152.    private synchronized void stopProduction() {
  153.       if (this.awaitingFetch && ImageFetcher.remove(this)) {
  154.          this.awaitingFetch = false;
  155.       }
  156.  
  157.    }
  158.  
  159.    public void requestTopDownLeftRightResend(ImageConsumer var1) {
  160.       for(ImageDecoder var2 = this.decoders; var2 != null; var2 = var2.next) {
  161.          if (var2.isConsumer(var1)) {
  162.             var2.replayConsumer(var1);
  163.          }
  164.       }
  165.  
  166.    }
  167.  
  168.    protected abstract ImageDecoder getDecoder();
  169.  
  170.    protected ImageDecoder decoderForType(InputStream var1, String var2) {
  171.       return null;
  172.    }
  173.  
  174.    protected ImageDecoder getDecoder(InputStream var1) {
  175.       if (!((InputStream)var1).markSupported()) {
  176.          var1 = new BufferedInputStream((InputStream)var1);
  177.       }
  178.  
  179.       try {
  180.          ((InputStream)var1).mark(6);
  181.          int var2 = ((InputStream)var1).read();
  182.          int var3 = ((InputStream)var1).read();
  183.          int var4 = ((InputStream)var1).read();
  184.          int var5 = ((InputStream)var1).read();
  185.          ((InputStream)var1).read();
  186.          ((InputStream)var1).read();
  187.          ((InputStream)var1).reset();
  188.          ((InputStream)var1).mark(-1);
  189.          if (var2 == 71 && var3 == 73 && var4 == 70 && var5 == 56) {
  190.             return new GifImageDecoder(this, (InputStream)var1);
  191.          }
  192.  
  193.          if (var2 == 255 && var3 == 216 && var4 == 255) {
  194.             return new JPEGImageDecoder(this, (InputStream)var1);
  195.          }
  196.  
  197.          if (var2 == 35 && var3 == 100 && var4 == 101 && var5 == 102) {
  198.             return new XbmImageDecoder(this, (InputStream)var1);
  199.          }
  200.       } catch (IOException var6) {
  201.       }
  202.  
  203.       return null;
  204.    }
  205.  
  206.    public void doFetch() {
  207.       do {
  208.          synchronized(this){}
  209.  
  210.          try {
  211.             if (this.consumers == null) {
  212.                this.awaitingFetch = false;
  213.                return;
  214.             }
  215.          } catch (Throwable var16) {
  216.             throw var16;
  217.          }
  218.       } while(this.updateFromStore());
  219.  
  220.       ImageDecoder var1 = this.getDecoder();
  221.       if (var1 == null) {
  222.          this.badDecoder();
  223.       } else {
  224.          this.setDecoder(var1);
  225.  
  226.          try {
  227.             var1.produceImage();
  228.          } catch (IOException var13) {
  229.             ((Throwable)var13).printStackTrace();
  230.          } catch (ImageFormatException var14) {
  231.             ((Throwable)var14).printStackTrace();
  232.          } finally {
  233.             this.removeDecoder(var1);
  234.             this.errorAllConsumers(var1.queue);
  235.          }
  236.  
  237.       }
  238.    }
  239.  
  240.    private boolean updateFromStore() {
  241.       synchronized(this){}
  242.  
  243.       PixelStore var1;
  244.       ImageConsumerQueue var2;
  245.       try {
  246.          var1 = this.pixelstore;
  247.          if (var1 == null) {
  248.             boolean var18 = false;
  249.             return var18;
  250.          }
  251.  
  252.          var2 = this.consumers;
  253.       } catch (Throwable var17) {
  254.          throw var17;
  255.       }
  256.  
  257.       while(var2 != null) {
  258.          synchronized(this){}
  259.  
  260.          boolean var3;
  261.          try {
  262.             if (!var2.interested) {
  263.                var2 = var2.next;
  264.                continue;
  265.             }
  266.  
  267.             var3 = this.checkSecurity(var2.securityContext, true);
  268.          } catch (Throwable var16) {
  269.             throw var16;
  270.          }
  271.  
  272.          if (var3 && !var1.replay(this, var2.consumer)) {
  273.             return false;
  274.          }
  275.  
  276.          synchronized(this){}
  277.  
  278.          try {
  279.             if (var2.interested) {
  280.                this.errorConsumer(var2);
  281.             }
  282.  
  283.             var2 = var2.next;
  284.          } catch (Throwable var15) {
  285.             throw var15;
  286.          }
  287.       }
  288.  
  289.       return true;
  290.    }
  291.  
  292.    private void badDecoder() {
  293.       synchronized(this){}
  294.  
  295.       ImageConsumerQueue var1;
  296.       try {
  297.          var1 = this.consumers;
  298.          this.consumers = null;
  299.          this.awaitingFetch = false;
  300.       } catch (Throwable var4) {
  301.          throw var4;
  302.       }
  303.  
  304.       this.errorAllConsumers(var1);
  305.    }
  306.  
  307.    private void setDecoder(ImageDecoder var1) {
  308.       synchronized(this){}
  309.  
  310.       ImageConsumerQueue var2;
  311.       try {
  312.          var1.next = this.decoders;
  313.          this.decoders = var1;
  314.          this.decoder = var1;
  315.          var2 = this.consumers;
  316.          var1.queue = var2;
  317.          this.consumers = null;
  318.          this.awaitingFetch = false;
  319.       } catch (Throwable var5) {
  320.          throw var5;
  321.       }
  322.  
  323.       for(; var2 != null; var2 = var2.next) {
  324.          if (var2.interested && !this.checkSecurity(var2.securityContext, true)) {
  325.             this.errorConsumer(var2);
  326.          }
  327.       }
  328.  
  329.    }
  330.  
  331.    private synchronized void removeDecoder(ImageDecoder var1) {
  332.       this.doneDecoding(var1);
  333.       ImageDecoder var2 = null;
  334.  
  335.       for(ImageDecoder var3 = this.decoders; var3 != null; var3 = var3.next) {
  336.          if (var3 == var1) {
  337.             if (var2 == null) {
  338.                this.decoders = var3.next;
  339.                return;
  340.             }
  341.  
  342.             var2.next = var3.next;
  343.             return;
  344.          }
  345.  
  346.          var2 = var3;
  347.       }
  348.  
  349.    }
  350.  
  351.    synchronized void doneDecoding(ImageDecoder var1) {
  352.       if (this.decoder == var1) {
  353.          this.decoder = null;
  354.          if (this.consumers != null) {
  355.             this.startProduction();
  356.          }
  357.       }
  358.  
  359.    }
  360.  
  361.    void latchConsumers(ImageDecoder var1) {
  362.       synchronized(this){}
  363.  
  364.       ImageConsumerQueue var2;
  365.       try {
  366.          if (var1 != this.decoder) {
  367.             return;
  368.          }
  369.  
  370.          var2 = this.consumers;
  371.       } catch (Throwable var25) {
  372.          throw var25;
  373.       }
  374.  
  375.       while(var2 != null) {
  376.          synchronized(this){}
  377.  
  378.          try {
  379.             if (!var2.interested) {
  380.                var2 = var2.next;
  381.                continue;
  382.             }
  383.          } catch (Throwable var24) {
  384.             throw var24;
  385.          }
  386.  
  387.          if (!var1.catchupConsumer(this, var2.consumer)) {
  388.             synchronized(this){}
  389.  
  390.             try {
  391.                this.doneDecoding(var1);
  392.             } catch (Throwable var22) {
  393.                throw var22;
  394.             }
  395.  
  396.             return;
  397.          }
  398.  
  399.          synchronized(this){}
  400.  
  401.          try {
  402.             ImageConsumerQueue var5 = var2.next;
  403.             if (var2.interested) {
  404.                this.consumers = ImageConsumerQueue.removeConsumer(this.consumers, var2.consumer, true);
  405.                var2.next = var1.queue;
  406.                var1.queue = var2;
  407.             }
  408.  
  409.             var2 = var5;
  410.          } catch (Throwable var23) {
  411.             throw var23;
  412.          }
  413.       }
  414.  
  415.    }
  416.  
  417.    synchronized void flush() {
  418.       this.pixelstore = null;
  419.       this.decoder = null;
  420.    }
  421.  
  422.    synchronized void setPixelStore(ImageDecoder var1, PixelStore var2) {
  423.       if (var1 == this.decoder) {
  424.          this.pixelstore = var2;
  425.       }
  426.  
  427.    }
  428. }
  429.