home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 February / GAME_2.ISO / utilities / Opera 5.01 / Opera501_final_nonjava.exe / OPERA.JAR / opera / OperaInputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-12-12  |  3.2 KB  |  178 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 = -1;
  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 = -1;
  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 getResponse() {
  28.       return this.protocol_response;
  29.    }
  30.  
  31.    public int available() {
  32.       return this.available;
  33.    }
  34.  
  35.    public int read() throws IOException {
  36.       if (this.available() == 0 && this.eof_state) {
  37.          this.buffer = null;
  38.          return -1;
  39.       } else {
  40.          while(this.available() == 0 && !this.eof_state) {
  41.             this.starving();
  42.  
  43.             try {
  44.                synchronized(this) {
  45.                   this.wait();
  46.                }
  47.             } catch (InterruptedException var6) {
  48.                this.eof_state = true;
  49.                this.available = 0;
  50.                Thread.currentThread().interrupt();
  51.                throw new InterruptedIOException();
  52.             }
  53.          }
  54.  
  55.          synchronized(this) {
  56.             if (this.available() == 0 && this.eof_state) {
  57.                this.connection = null;
  58.                this.buffer = null;
  59.                byte var7 = -1;
  60.                return var7;
  61.             } else {
  62.                --this.available;
  63.                if (this.next_read == 32768) {
  64.                   this.next_read = 0;
  65.                }
  66.  
  67.                int var2 = 255 & this.buffer[this.next_read++];
  68.                return var2;
  69.             }
  70.          }
  71.       }
  72.    }
  73.  
  74.    public void headerLoaded(int var1, int var2) {
  75.       synchronized(this) {
  76.          if (var1 == 0) {
  77.             var1 = -1;
  78.          }
  79.  
  80.          this.content_len = var1;
  81.          this.protocol_response = var2;
  82.          this.notifyAll();
  83.       }
  84.    }
  85.  
  86.    public int getContentLength() {
  87.       return this.content_len;
  88.    }
  89.  
  90.    public void setEOF() {
  91.       synchronized(this) {
  92.          this.eof_state = true;
  93.          this.notifyAll();
  94.       }
  95.    }
  96.  
  97.    public int addInput(byte[] var1) {
  98.       int var2 = 0;
  99.       int var3 = 0;
  100.       synchronized(this) {
  101.          try {
  102.             if (this.eof_state) {
  103.                byte var11 = -1;
  104.                return var11;
  105.             }
  106.  
  107.             if (var1.length > 0) {
  108.                if (this.available < 32768) {
  109.                   int var5 = 'ΦÇÇ' - this.available;
  110.                   if (this.last_avail < 32767) {
  111.                      if (var1.length < 'ΦÇÇ' - this.last_avail) {
  112.                         var2 = var1.length;
  113.                      } else {
  114.                         var2 = 'ΦÇÇ' - this.last_avail - 1;
  115.                      }
  116.  
  117.                      if (var2 > var5) {
  118.                         var2 = var5;
  119.                      }
  120.  
  121.                      System.arraycopy(var1, 0, this.buffer, this.last_avail + 1, var2);
  122.                   }
  123.  
  124.                   var5 -= var2;
  125.                   if (var5 > 0) {
  126.                      if (var1.length - var2 > var5) {
  127.                         var3 = var5;
  128.                      } else {
  129.                         var3 = var1.length - var2;
  130.                      }
  131.  
  132.                      System.arraycopy(var1, var2, this.buffer, 0, var3);
  133.                   }
  134.  
  135.                   this.last_avail = (this.last_avail + var2 + var3) % 'ΦÇÇ';
  136.                }
  137.  
  138.                this.notifyAll();
  139.             }
  140.          } catch (ArrayIndexOutOfBoundsException var7) {
  141.             ((Throwable)var7).printStackTrace(System.err);
  142.          }
  143.  
  144.          this.available += var2 + var3;
  145.          this.total_input += var2 + var3;
  146.          int var10 = var2 + var3;
  147.          return var10;
  148.       }
  149.    }
  150.  
  151.    protected static int addStream(OperaInputStream var0) {
  152.       Hashtable var1 = stream_map;
  153.       synchronized(var1) {
  154.          stream_map.put(new Integer(next_stream_id), var0);
  155.          var0.stream_id = next_stream_id++;
  156.       }
  157.  
  158.       return var0.stream_id;
  159.    }
  160.  
  161.    protected static void removeStream(int var0) {
  162.       Hashtable var1 = stream_map;
  163.       synchronized(var1) {
  164.          stream_map.remove(new Integer(var0));
  165.       }
  166.    }
  167.  
  168.    protected static OperaInputStream getStream(int var0) {
  169.       Hashtable var1 = stream_map;
  170.       synchronized(var1) {
  171.          OperaInputStream var2 = (OperaInputStream)stream_map.get(new Integer(var0));
  172.          return var2;
  173.       }
  174.    }
  175.  
  176.    private native void starving();
  177. }
  178.