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 com.knowgate.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 readPacketType(InputStream in, byte[] buffer,
069: int bufferIndex) throws IOException {
070: int n;
071: if ((n = in.read(buffer, bufferIndex, HEADER_LENGTH)) != HEADER_LENGTH) {
072: if (n == -1) {
073: return -1;
074: }
075: throw new IOException(
076: "unexpected EOF reading netbios session header");
077: }
078: int t = buffer[bufferIndex] & 0xFF;
079: return t;
080: }
081:
082: int type, length;
083:
084: int writeWireFormat(byte[] dst, int dstIndex) {
085: length = writeTrailerWireFormat(dst, dstIndex + HEADER_LENGTH);
086: writeHeaderWireFormat(dst, dstIndex);
087: return HEADER_LENGTH + length;
088: }
089:
090: int readWireFormat(InputStream in, byte[] buffer, int bufferIndex)
091: throws IOException {
092: readHeaderWireFormat(in, buffer, bufferIndex);
093: return HEADER_LENGTH
094: + readTrailerWireFormat(in, buffer, bufferIndex);
095: }
096:
097: int writeHeaderWireFormat(byte[] dst, int dstIndex) {
098: dst[dstIndex++] = (byte) type;
099: if (length > 0x0000FFFF) {
100: dst[dstIndex] = (byte) 0x01;
101: }
102: dstIndex++;
103: writeInt2(length, dst, dstIndex);
104: return HEADER_LENGTH;
105: }
106:
107: int readHeaderWireFormat(InputStream in, byte[] buffer,
108: int bufferIndex) throws IOException {
109: type = buffer[bufferIndex++] & 0xFF;
110: length = ((buffer[bufferIndex] & 0x01) << 16)
111: + readInt2(buffer, bufferIndex + 1);
112: return HEADER_LENGTH;
113: }
114:
115: abstract int writeTrailerWireFormat(byte[] dst, int dstIndex);
116:
117: abstract int readTrailerWireFormat(InputStream in, byte[] buffer,
118: int bufferIndex) throws IOException;
119: }
|