home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / rmi / transport / tcp / MultiplexOutputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  2.5 KB  |  174 lines

  1. package sun.rmi.transport.tcp;
  2.  
  3. import java.io.IOException;
  4. import java.io.OutputStream;
  5.  
  6. final class MultiplexOutputStream extends OutputStream {
  7.    private ConnectionMultiplexer manager;
  8.    private MultiplexConnectionInfo info;
  9.    private byte[] buffer;
  10.    private int pos;
  11.    private int requested;
  12.    private boolean disconnected = false;
  13.    private Object lock = new Object();
  14.  
  15.    MultiplexOutputStream(ConnectionMultiplexer var1, MultiplexConnectionInfo var2, int var3) {
  16.       this.manager = var1;
  17.       this.info = var2;
  18.       this.buffer = new byte[var3];
  19.       this.pos = 0;
  20.    }
  21.  
  22.    public synchronized void write(int var1) throws IOException {
  23.       while(this.pos >= this.buffer.length) {
  24.          this.push();
  25.       }
  26.  
  27.       this.buffer[this.pos++] = (byte)var1;
  28.    }
  29.  
  30.    public synchronized void write(byte[] var1, int var2, int var3) throws IOException {
  31.       if (var3 > 0) {
  32.          int var4 = this.buffer.length - this.pos;
  33.          if (var3 <= var4) {
  34.             System.arraycopy(var1, var2, this.buffer, this.pos, var3);
  35.             this.pos += var3;
  36.          } else {
  37.             this.flush();
  38.  
  39.             while(true) {
  40.                Object var6 = this.lock;
  41.                synchronized(var6){}
  42.  
  43.                int var5;
  44.                try {
  45.                   while((var5 = this.requested) < 1 && !this.disconnected) {
  46.                      try {
  47.                         this.lock.wait();
  48.                      } catch (InterruptedException var20) {
  49.                      }
  50.                   }
  51.  
  52.                   if (this.disconnected) {
  53.                      throw new IOException("Connection closed");
  54.                   }
  55.                } catch (Throwable var22) {
  56.                   throw var22;
  57.                }
  58.  
  59.                if (var5 >= var3) {
  60.                   this.manager.sendTransmit(this.info, var1, var2, var3);
  61.                   var6 = this.lock;
  62.                   synchronized(var6){}
  63.  
  64.                   try {
  65.                      this.requested -= var3;
  66.                   } catch (Throwable var19) {
  67.                      throw var19;
  68.                   }
  69.  
  70.                   return;
  71.                }
  72.  
  73.                this.manager.sendTransmit(this.info, var1, var2, var5);
  74.                var2 += var5;
  75.                var3 -= var5;
  76.                var6 = this.lock;
  77.                synchronized(var6){}
  78.  
  79.                try {
  80.                   this.requested -= var5;
  81.                } catch (Throwable var21) {
  82.                   throw var21;
  83.                }
  84.             }
  85.          }
  86.       }
  87.    }
  88.  
  89.    public synchronized void flush() throws IOException {
  90.       while(this.pos > 0) {
  91.          this.push();
  92.       }
  93.  
  94.    }
  95.  
  96.    public void close() throws IOException {
  97.       this.manager.sendClose(this.info);
  98.    }
  99.  
  100.    void request(int var1) {
  101.       Object var2 = this.lock;
  102.       synchronized(var2){}
  103.  
  104.       try {
  105.          this.requested += var1;
  106.          this.lock.notifyAll();
  107.       } catch (Throwable var4) {
  108.          throw var4;
  109.       }
  110.  
  111.    }
  112.  
  113.    void disconnect() {
  114.       Object var1 = this.lock;
  115.       synchronized(var1){}
  116.  
  117.       try {
  118.          this.disconnected = true;
  119.          this.lock.notifyAll();
  120.       } catch (Throwable var3) {
  121.          throw var3;
  122.       }
  123.  
  124.    }
  125.  
  126.    private void push() throws IOException {
  127.       Object var2 = this.lock;
  128.       synchronized(var2){}
  129.  
  130.       int var1;
  131.       try {
  132.          while((var1 = this.requested) < 1 && !this.disconnected) {
  133.             try {
  134.                this.lock.wait();
  135.             } catch (InterruptedException var17) {
  136.             }
  137.          }
  138.  
  139.          if (this.disconnected) {
  140.             throw new IOException("Connection closed");
  141.          }
  142.       } catch (Throwable var18) {
  143.          throw var18;
  144.       }
  145.  
  146.       if (var1 < this.pos) {
  147.          this.manager.sendTransmit(this.info, this.buffer, 0, var1);
  148.          System.arraycopy(this.buffer, var1, this.buffer, 0, this.pos - var1);
  149.          this.pos -= var1;
  150.          var2 = this.lock;
  151.          synchronized(var2){}
  152.  
  153.          try {
  154.             this.requested -= var1;
  155.          } catch (Throwable var15) {
  156.             throw var15;
  157.          }
  158.  
  159.       } else {
  160.          this.manager.sendTransmit(this.info, this.buffer, 0, this.pos);
  161.          var2 = this.lock;
  162.          synchronized(var2){}
  163.  
  164.          try {
  165.             this.requested -= this.pos;
  166.          } catch (Throwable var16) {
  167.             throw var16;
  168.          }
  169.  
  170.          this.pos = 0;
  171.       }
  172.    }
  173. }
  174.