home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2003 January / maximum-cd-2003-01.iso / Software / Apps / OperawithJava / ow32enen700b1j.exe / OPERA.JAR / opera / OperaInputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  2002-11-07  |  3.9 KB  |  214 lines

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