home *** CD-ROM | disk | FTP | other *** search
- package sun.rmi.transport.tcp;
-
- import java.io.IOException;
- import java.io.OutputStream;
-
- final class MultiplexOutputStream extends OutputStream {
- private ConnectionMultiplexer manager;
- private MultiplexConnectionInfo info;
- private byte[] buffer;
- private int pos;
- private int requested;
- private boolean disconnected = false;
- private Object lock = new Object();
-
- MultiplexOutputStream(ConnectionMultiplexer var1, MultiplexConnectionInfo var2, int var3) {
- this.manager = var1;
- this.info = var2;
- this.buffer = new byte[var3];
- this.pos = 0;
- }
-
- public synchronized void write(int var1) throws IOException {
- while(this.pos >= this.buffer.length) {
- this.push();
- }
-
- this.buffer[this.pos++] = (byte)var1;
- }
-
- public synchronized void write(byte[] var1, int var2, int var3) throws IOException {
- if (var3 > 0) {
- int var4 = this.buffer.length - this.pos;
- if (var3 <= var4) {
- System.arraycopy(var1, var2, this.buffer, this.pos, var3);
- this.pos += var3;
- } else {
- this.flush();
-
- while(true) {
- Object var6 = this.lock;
- synchronized(var6){}
-
- int var5;
- try {
- while((var5 = this.requested) < 1 && !this.disconnected) {
- try {
- this.lock.wait();
- } catch (InterruptedException var20) {
- }
- }
-
- if (this.disconnected) {
- throw new IOException("Connection closed");
- }
- } catch (Throwable var22) {
- throw var22;
- }
-
- if (var5 >= var3) {
- this.manager.sendTransmit(this.info, var1, var2, var3);
- var6 = this.lock;
- synchronized(var6){}
-
- try {
- this.requested -= var3;
- } catch (Throwable var19) {
- throw var19;
- }
-
- return;
- }
-
- this.manager.sendTransmit(this.info, var1, var2, var5);
- var2 += var5;
- var3 -= var5;
- var6 = this.lock;
- synchronized(var6){}
-
- try {
- this.requested -= var5;
- } catch (Throwable var21) {
- throw var21;
- }
- }
- }
- }
- }
-
- public synchronized void flush() throws IOException {
- while(this.pos > 0) {
- this.push();
- }
-
- }
-
- public void close() throws IOException {
- this.manager.sendClose(this.info);
- }
-
- void request(int var1) {
- Object var2 = this.lock;
- synchronized(var2){}
-
- try {
- this.requested += var1;
- this.lock.notifyAll();
- } catch (Throwable var4) {
- throw var4;
- }
-
- }
-
- void disconnect() {
- Object var1 = this.lock;
- synchronized(var1){}
-
- try {
- this.disconnected = true;
- this.lock.notifyAll();
- } catch (Throwable var3) {
- throw var3;
- }
-
- }
-
- private void push() throws IOException {
- Object var2 = this.lock;
- synchronized(var2){}
-
- int var1;
- try {
- while((var1 = this.requested) < 1 && !this.disconnected) {
- try {
- this.lock.wait();
- } catch (InterruptedException var17) {
- }
- }
-
- if (this.disconnected) {
- throw new IOException("Connection closed");
- }
- } catch (Throwable var18) {
- throw var18;
- }
-
- if (var1 < this.pos) {
- this.manager.sendTransmit(this.info, this.buffer, 0, var1);
- System.arraycopy(this.buffer, var1, this.buffer, 0, this.pos - var1);
- this.pos -= var1;
- var2 = this.lock;
- synchronized(var2){}
-
- try {
- this.requested -= var1;
- } catch (Throwable var15) {
- throw var15;
- }
-
- } else {
- this.manager.sendTransmit(this.info, this.buffer, 0, this.pos);
- var2 = this.lock;
- synchronized(var2){}
-
- try {
- this.requested -= this.pos;
- } catch (Throwable var16) {
- throw var16;
- }
-
- this.pos = 0;
- }
- }
- }
-