jcifs.smb.TransactNamedPipeInputStream Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jcifs-krb5-jdk7 Show documentation
Show all versions of jcifs-krb5-jdk7 Show documentation
JCIFS is an Open Source client library that implements the CIFS/SMB networking protocol in 100% Java
/* jcifs smb client library in Java
* Copyright (C) 2000 "Michael B. Allen"
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package jcifs.smb;
import java.io.InputStream;
import java.io.IOException;
import java.net.UnknownHostException;
import java.net.MalformedURLException;
class TransactNamedPipeInputStream extends SmbFileInputStream {
private static final int INIT_PIPE_SIZE = 4096;
private byte[] pipe_buf = new byte[INIT_PIPE_SIZE];
private int beg_idx, nxt_idx, used;
private boolean dcePipe;
Object lock;
TransactNamedPipeInputStream( SmbNamedPipe pipe ) throws SmbException,
MalformedURLException, UnknownHostException {
super( pipe, ( pipe.pipeType & 0xFFFF00FF ) | SmbFile.O_EXCL );
this.dcePipe = ( pipe.pipeType & SmbNamedPipe.PIPE_TYPE_DCE_TRANSACT ) != SmbNamedPipe.PIPE_TYPE_DCE_TRANSACT;
lock = new Object();
}
public int read() throws IOException {
int result = -1;
synchronized( lock ) {
try {
while( used == 0 ) {
lock.wait();
}
} catch( InterruptedException ie ) {
throw new IOException( ie.getMessage() );
}
result = pipe_buf[beg_idx] & 0xFF;
beg_idx = ( beg_idx + 1 ) % pipe_buf.length;
}
return result;
}
public int read( byte[] b ) throws IOException {
return read( b, 0, b.length );
}
public int read( byte[] b, int off, int len ) throws IOException {
int result = -1;
int i;
if( len <= 0 ) {
return 0;
}
synchronized( lock ) {
try {
while( used == 0 ) {
lock.wait();
}
} catch( InterruptedException ie ) {
throw new IOException( ie.getMessage() );
}
i = pipe_buf.length - beg_idx;
result = len > used ? used : len;
if( used > i && result > i ) {
System.arraycopy( pipe_buf, beg_idx, b, off, i );
off += i;
System.arraycopy( pipe_buf, 0, b, off, result - i );
} else {
System.arraycopy( pipe_buf, beg_idx, b, off, result );
}
used -= result;
beg_idx = ( beg_idx + result ) % pipe_buf.length;
}
return result;
}
public int available() throws IOException {
if( file.log.level >= 3 )
file.log.println( "Named Pipe available() does not apply to TRANSACT Named Pipes" );
return 0;
}
int receive( byte[] b, int off, int len ) {
int i;
if( len > ( pipe_buf.length - used )) {
byte[] tmp;
int new_size;
new_size = pipe_buf.length * 2;
if( len > ( new_size - used )) {
new_size = len + used;
}
tmp = pipe_buf;
pipe_buf = new byte[new_size];
i = tmp.length - beg_idx;
if( used > i ) { /* 2 chunks */
System.arraycopy( tmp, beg_idx, pipe_buf, 0, i );
System.arraycopy( tmp, 0, pipe_buf, i, used - i );
} else {
System.arraycopy( tmp, beg_idx, pipe_buf, 0, used );
}
beg_idx = 0;
nxt_idx = used;
tmp = null;
}
i = pipe_buf.length - nxt_idx;
if( len > i ) {
System.arraycopy( b, off, pipe_buf, nxt_idx, i );
off += i;
System.arraycopy( b, off, pipe_buf, 0, len - i );
} else {
System.arraycopy( b, off, pipe_buf, nxt_idx, len );
}
nxt_idx = ( nxt_idx + len ) % pipe_buf.length;
used += len;
return len;
}
public int dce_read( byte[] b, int off, int len ) throws IOException {
return super.read(b, off, len);
}
}