}
}
}
public void sendrecv(DcerpcMessage msg) throws DcerpcException, IOException {
byte[] stub, frag;
NdrBuffer buf, fbuf;
boolean isLast, isDirect;
DcerpcException de;
if (state == 0) {
bind();
}
isDirect = true;
stub = jcifs.smb.BufferCache.getBuffer();
try {
int off, tot, n;
buf = new NdrBuffer(stub, 0);
msg.flags = DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG;
msg.call_id = call_id++;
msg.encode(buf);
if (securityProvider != null) {
buf.setIndex(0);
securityProvider.wrap(buf);
}
tot = buf.getLength() - 24;
off = 0;
while (off < tot) {
n = tot - off;
if ((24 + n) > max_xmit) {
msg.flags &= ~DCERPC_LAST_FRAG;
n = max_xmit - 24;
} else {
msg.flags |= DCERPC_LAST_FRAG;
isDirect = false;
msg.alloc_hint = n;
}
msg.length = 24 + n;
if (off > 0)
msg.flags &= ~DCERPC_FIRST_FRAG;
if ((msg.flags & (DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG)) != (DCERPC_FIRST_FRAG | DCERPC_LAST_FRAG)) {
buf.start = off;
buf.reset();
msg.encode_header(buf);
buf.enc_ndr_long(msg.alloc_hint);
buf.enc_ndr_short(0); /* context id */
buf.enc_ndr_short(msg.getOpnum());
}
doSendFragment(stub, off, msg.length, isDirect);
off += n;
}
doReceiveFragment(stub, isDirect);
buf.reset();
buf.setIndex(8);
buf.setLength(buf.dec_ndr_short());
if (securityProvider != null)
securityProvider.unwrap(buf);
buf.setIndex(0);
msg.decode_header(buf);
off = 24;
if (msg.ptype == 2 && msg.isFlagSet(DCERPC_LAST_FRAG) == false)
off = msg.length;
frag = null;
fbuf = null;
while (msg.isFlagSet(DCERPC_LAST_FRAG) == false) {
int stub_frag_len;
if (frag == null) {
frag = new byte[max_recv];
fbuf = new NdrBuffer(frag, 0);
}
doReceiveFragment(frag, isDirect);
fbuf.reset();
fbuf.setIndex(8);
fbuf.setLength(fbuf.dec_ndr_short());
if (securityProvider != null)
securityProvider.unwrap(fbuf);
fbuf.reset();
msg.decode_header(fbuf);
stub_frag_len = msg.length - 24;
if ((off + stub_frag_len) > stub.length) {
// shouldn't happen if alloc_hint is correct or greater
byte[] tmp = new byte[off + stub_frag_len];
System.arraycopy(stub, 0, tmp, 0, off);
stub = tmp;
}
System.arraycopy(frag, 24, stub, off, stub_frag_len);
off += stub_frag_len;
}
buf = new NdrBuffer(stub, 0);
msg.decode(buf);
} finally {
jcifs.smb.BufferCache.releaseBuffer(stub);
}