home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2001 February / maximum-cd-2001-02.iso / PowerWare / Opera / Opera5_final_java.exe / OPERA.JAR / opera / OperaInputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-08-08  |  3.2 KB  |  217 lines

  1. package opera;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InterruptedIOException;
  6. import java.util.Hashtable;
  7.  
  8. public class OperaInputStream extends InputStream {
  9.    private static final int BUFFER_SIZE = 32768;
  10.    private static Hashtable stream_map = new Hashtable();
  11.    private static int next_stream_id = 0;
  12.    private int protocol_response;
  13.    private byte[] buffer = new byte['ΦÇÇ'];
  14.    private int next_read = 0;
  15.    private int last_avail = -1;
  16.    private int available = 0;
  17.    private int total_input = 0;
  18.    private int content_len = 0;
  19.    private int stream_id = -1;
  20.    private boolean eof_state = false;
  21.    private OperaURLConnection connection = null;
  22.  
  23.    protected OperaInputStream(OperaURLConnection var1) {
  24.       this.connection = var1;
  25.    }
  26.  
  27.    public int addInput(byte[] var1) {
  28.       int var2 = 0;
  29.       int var3 = 0;
  30.       synchronized(this){}
  31.  
  32.       try {
  33.          try {
  34.             if (this.eof_state) {
  35.                byte var12 = -1;
  36.                return var12;
  37.             }
  38.  
  39.             if (var1.length > 0) {
  40.                if (this.available < 32768) {
  41.                   int var7 = 'ΦÇÇ' - this.available;
  42.                   if (this.last_avail < 32767) {
  43.                      if (var1.length < 'ΦÇÇ' - this.last_avail) {
  44.                         var2 = var1.length;
  45.                      } else {
  46.                         var2 = 'ΦÇÇ' - this.last_avail - 1;
  47.                      }
  48.  
  49.                      if (var2 > var7) {
  50.                         var2 = var7;
  51.                      }
  52.  
  53.                      System.arraycopy(var1, 0, this.buffer, this.last_avail + 1, var2);
  54.                   }
  55.  
  56.                   var7 -= var2;
  57.                   if (var7 > 0) {
  58.                      if (var1.length - var2 > var7) {
  59.                         var3 = var7;
  60.                      } else {
  61.                         var3 = var1.length - var2;
  62.                      }
  63.  
  64.                      System.arraycopy(var1, var2, this.buffer, 0, var3);
  65.                   }
  66.  
  67.                   this.last_avail = (this.last_avail + var2 + var3) % 'ΦÇÇ';
  68.                }
  69.  
  70.                this.notifyAll();
  71.             }
  72.          } catch (ArrayIndexOutOfBoundsException var10) {
  73.             ((Throwable)var10).printStackTrace(System.err);
  74.          }
  75.  
  76.          this.available += var2 + var3;
  77.          this.total_input += var2 + var3;
  78.          int var4 = var2 + var3;
  79.          return var4;
  80.       } catch (Throwable var11) {
  81.          throw var11;
  82.       }
  83.    }
  84.  
  85.    protected static int addStream(OperaInputStream var0) {
  86.       Hashtable var1 = stream_map;
  87.       synchronized(var1){}
  88.  
  89.       try {
  90.          stream_map.put(new Integer(next_stream_id), var0);
  91.          var0.stream_id = next_stream_id++;
  92.       } catch (Throwable var3) {
  93.          throw var3;
  94.       }
  95.  
  96.       return var0.stream_id;
  97.    }
  98.  
  99.    public int available() {
  100.       return this.available;
  101.    }
  102.  
  103.    public int getContentLength() {
  104.       return this.content_len;
  105.    }
  106.  
  107.    public int getResponse() {
  108.       return this.protocol_response;
  109.    }
  110.  
  111.    protected static OperaInputStream getStream(int var0) {
  112.       Hashtable var2 = stream_map;
  113.       synchronized(var2){}
  114.  
  115.       OperaInputStream var1;
  116.       try {
  117.          var1 = (OperaInputStream)stream_map.get(new Integer(var0));
  118.       } catch (Throwable var5) {
  119.          throw var5;
  120.       }
  121.  
  122.       return var1;
  123.    }
  124.  
  125.    public void headerLoaded(int var1, int var2) {
  126.       synchronized(this){}
  127.  
  128.       try {
  129.          if (var1 == 0) {
  130.             var1 = -1;
  131.          }
  132.  
  133.          this.content_len = var1;
  134.          this.protocol_response = var2;
  135.          this.notifyAll();
  136.       } catch (Throwable var5) {
  137.          throw var5;
  138.       }
  139.  
  140.    }
  141.  
  142.    public int read() throws IOException {
  143.       if (this.available() == 0 && this.eof_state) {
  144.          this.buffer = null;
  145.          return -1;
  146.       } else {
  147.          while(this.available() == 0 && !this.eof_state) {
  148.             this.starving();
  149.  
  150.             try {
  151.                synchronized(this){}
  152.  
  153.                try {
  154.                   this.wait();
  155.                } catch (Throwable var10) {
  156.                   throw var10;
  157.                }
  158.             } catch (InterruptedException var11) {
  159.                this.eof_state = true;
  160.                this.available = 0;
  161.                Thread.currentThread().interrupt();
  162.                throw new InterruptedIOException();
  163.             }
  164.          }
  165.  
  166.          synchronized(this){}
  167.  
  168.          int var1;
  169.          try {
  170.             if (this.available() != 0 || !this.eof_state) {
  171.                --this.available;
  172.                if (this.next_read == 32768) {
  173.                   this.next_read = 0;
  174.                }
  175.  
  176.                var1 = 255 & this.buffer[this.next_read++];
  177.                return var1;
  178.             }
  179.  
  180.             this.connection = null;
  181.             this.buffer = null;
  182.             var1 = -1;
  183.          } catch (Throwable var12) {
  184.             throw var12;
  185.          }
  186.  
  187.          return var1;
  188.       }
  189.    }
  190.  
  191.    protected static void removeStream(int var0) {
  192.       Hashtable var1 = stream_map;
  193.       synchronized(var1){}
  194.  
  195.       try {
  196.          stream_map.remove(new Integer(var0));
  197.       } catch (Throwable var3) {
  198.          throw var3;
  199.       }
  200.  
  201.    }
  202.  
  203.    public void setEOF() {
  204.       synchronized(this){}
  205.  
  206.       try {
  207.          this.eof_state = true;
  208.          this.notifyAll();
  209.       } catch (Throwable var3) {
  210.          throw var3;
  211.       }
  212.  
  213.    }
  214.  
  215.    private native void starving();
  216. }
  217.