001: /* jcifs smb client library in Java
002: * Copyright (C) 2000 "Michael B. Allen" <jcifs at samba dot org>
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package jcifs.netbios;
020:
021: import java.io.IOException;
022: import java.io.InputStream;
023:
024: abstract class SessionServicePacket {
025:
026: // session service packet types
027: static final int SESSION_MESSAGE = 0x00;
028: static final int SESSION_REQUEST = 0x81;
029: static final int POSITIVE_SESSION_RESPONSE = 0x82;
030: static final int NEGATIVE_SESSION_RESPONSE = 0x83;
031: static final int SESSION_RETARGET_RESPONSE = 0x84;
032: static final int SESSION_KEEP_ALIVE = 0x85;
033:
034: static final int MAX_MESSAGE_SIZE = 0x0001FFFF;
035: static final int HEADER_LENGTH = 4;
036:
037: static void writeInt2(int val, byte[] dst, int dstIndex) {
038: dst[dstIndex++] = (byte) ((val >> 8) & 0xFF);
039: dst[dstIndex] = (byte) (val & 0xFF);
040: }
041:
042: static void writeInt4(int val, byte[] dst, int dstIndex) {
043: dst[dstIndex++] = (byte) ((val >> 24) & 0xFF);
044: dst[dstIndex++] = (byte) ((val >> 16) & 0xFF);
045: dst[dstIndex++] = (byte) ((val >> 8) & 0xFF);
046: dst[dstIndex] = (byte) (val & 0xFF);
047: }
048:
049: static int readInt2(byte[] src, int srcIndex) {
050: return ((src[srcIndex] & 0xFF) << 8)
051: + (src[srcIndex + 1] & 0xFF);
052: }
053:
054: static int readInt4(byte[] src, int srcIndex) {
055: return ((src[srcIndex] & 0xFF) << 24)
056: + ((src[srcIndex + 1] & 0xFF) << 16)
057: + ((src[srcIndex + 2] & 0xFF) << 8)
058: + (src[srcIndex + 3] & 0xFF);
059: }
060:
061: static int readLength(byte[] src, int srcIndex) {
062: srcIndex++;
063: return ((src[srcIndex++] & 0x01) << 16)
064: + ((src[srcIndex++] & 0xFF) << 8)
065: + (src[srcIndex++] & 0xFF);
066: }
067:
068: static int readn(InputStream in, byte[] b, int off, int len)
069: throws IOException {
070: int i = 0, n;
071:
072: while (i < len) {
073: n = in.read(b, off + i, len - i);
074: if (n <= 0) {
075: break;
076: }
077: i += n;
078: }
079:
080: return i;
081: }
082:
083: static int readPacketType(InputStream in, byte[] buffer,
084: int bufferIndex) throws IOException {
085: int n;
086: if ((n = readn(in, buffer, bufferIndex, HEADER_LENGTH)) != HEADER_LENGTH) {
087: if (n == -1) {
088: return -1;
089: }
090: throw new IOException(
091: "unexpected EOF reading netbios session header");
092: }
093: int t = buffer[bufferIndex] & 0xFF;
094: return t;
095: }
096:
097: int type, length;
098:
099: int writeWireFormat(byte[] dst, int dstIndex) {
100: length = writeTrailerWireFormat(dst, dstIndex + HEADER_LENGTH);
101: writeHeaderWireFormat(dst, dstIndex);
102: return HEADER_LENGTH + length;
103: }
104:
105: int readWireFormat(InputStream in, byte[] buffer, int bufferIndex)
106: throws IOException {
107: readHeaderWireFormat(in, buffer, bufferIndex);
108: return HEADER_LENGTH
109: + readTrailerWireFormat(in, buffer, bufferIndex);
110: }
111:
112: int writeHeaderWireFormat(byte[] dst, int dstIndex) {
113: dst[dstIndex++] = (byte) type;
114: if (length > 0x0000FFFF) {
115: dst[dstIndex] = (byte) 0x01;
116: }
117: dstIndex++;
118: writeInt2(length, dst, dstIndex);
119: return HEADER_LENGTH;
120: }
121:
122: int readHeaderWireFormat(InputStream in, byte[] buffer,
123: int bufferIndex) throws IOException {
124: type = buffer[bufferIndex++] & 0xFF;
125: length = ((buffer[bufferIndex] & 0x01) << 16)
126: + readInt2(buffer, bufferIndex + 1);
127: return HEADER_LENGTH;
128: }
129:
130: abstract int writeTrailerWireFormat(byte[] dst, int dstIndex);
131:
132: abstract int readTrailerWireFormat(InputStream in, byte[] buffer,
133: int bufferIndex) throws IOException;
134: }
|