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.UnsupportedEncodingException;
022:
023: class NodeStatusResponse extends NameServicePacket {
024:
025: private NbtAddress queryAddress;
026:
027: private int numberOfNames;
028: private byte[] macAddress;
029: private byte[] stats;
030:
031: NbtAddress[] addressArray;
032:
033: /* It is a little awkward but prudent to pass the quering address
034: * so that it may be included in the list of results. IOW we do
035: * not want to create a new NbtAddress object for this particular
036: * address from which the query is constructed, we want to populate
037: * the data of the existing address that should be one of several
038: * returned by the node status.
039: */
040:
041: NodeStatusResponse(NbtAddress queryAddress) {
042: this .queryAddress = queryAddress;
043: recordName = new Name();
044: macAddress = new byte[6];
045: }
046:
047: int writeBodyWireFormat(byte[] dst, int dstIndex) {
048: return 0;
049: }
050:
051: int readBodyWireFormat(byte[] src, int srcIndex) {
052: return readResourceRecordWireFormat(src, srcIndex);
053: }
054:
055: int writeRDataWireFormat(byte[] dst, int dstIndex) {
056: return 0;
057: }
058:
059: int readRDataWireFormat(byte[] src, int srcIndex) {
060: int start = srcIndex;
061: numberOfNames = src[srcIndex] & 0xFF;
062: int namesLength = numberOfNames * 18;
063: int statsLength = rDataLength - namesLength - 1;
064: numberOfNames = src[srcIndex++] & 0xFF;
065: // gotta read the mac first so we can populate addressArray with it
066: System.arraycopy(src, srcIndex + namesLength, macAddress, 0, 6);
067: srcIndex += readNodeNameArray(src, srcIndex);
068: stats = new byte[statsLength];
069: System.arraycopy(src, srcIndex, stats, 0, statsLength);
070: srcIndex += statsLength;
071: return srcIndex - start;
072: }
073:
074: private int readNodeNameArray(byte[] src, int srcIndex) {
075: int start = srcIndex;
076:
077: addressArray = new NbtAddress[numberOfNames];
078:
079: String n;
080: int hexCode;
081: String scope = queryAddress.hostName.scope;
082: boolean groupName;
083: int ownerNodeType;
084: boolean isBeingDeleted;
085: boolean isInConflict;
086: boolean isActive;
087: boolean isPermanent;
088: int j;
089: boolean addrFound = false;
090:
091: try {
092: for (int i = 0; i < numberOfNames; srcIndex += 18, i++) {
093: for (j = srcIndex + 14; src[j] == 0x20; j--)
094: ;
095: n = new String(src, srcIndex, j - srcIndex + 1,
096: Name.OEM_ENCODING);
097: hexCode = src[srcIndex + 15] & 0xFF;
098: groupName = ((src[srcIndex + 16] & 0x80) == 0x80) ? true
099: : false;
100: ownerNodeType = (src[srcIndex + 16] & 0x60) >> 5;
101: isBeingDeleted = ((src[srcIndex + 16] & 0x10) == 0x10) ? true
102: : false;
103: isInConflict = ((src[srcIndex + 16] & 0x08) == 0x08) ? true
104: : false;
105: isActive = ((src[srcIndex + 16] & 0x04) == 0x04) ? true
106: : false;
107: isPermanent = ((src[srcIndex + 16] & 0x02) == 0x02) ? true
108: : false;
109:
110: /* The NbtAddress object used to query this node will be in the list
111: * returned by the Node Status. A new NbtAddress object should not be
112: * created for it because the original is potentially being actively
113: * referenced by other objects. We must populate the existing object's
114: * data explicitly (and carefully).
115: */
116: if (!addrFound
117: && queryAddress.hostName.hexCode == hexCode
118: && (queryAddress.hostName == NbtAddress.UNKNOWN_NAME || queryAddress.hostName.name
119: .equals(n))) {
120:
121: if (queryAddress.hostName == NbtAddress.UNKNOWN_NAME) {
122: queryAddress.hostName = new Name(n, hexCode,
123: scope);
124: }
125: queryAddress.groupName = groupName;
126: queryAddress.nodeType = ownerNodeType;
127: queryAddress.isBeingDeleted = isBeingDeleted;
128: queryAddress.isInConflict = isInConflict;
129: queryAddress.isActive = isActive;
130: queryAddress.isPermanent = isPermanent;
131: queryAddress.macAddress = macAddress;
132: queryAddress.isDataFromNodeStatus = true;
133: addrFound = true;
134: addressArray[i] = queryAddress;
135: } else {
136: addressArray[i] = new NbtAddress(new Name(n,
137: hexCode, scope), queryAddress.address,
138: groupName, ownerNodeType, isBeingDeleted,
139: isInConflict, isActive, isPermanent,
140: macAddress);
141: }
142: }
143: } catch (UnsupportedEncodingException uee) {
144: }
145: return srcIndex - start;
146: }
147:
148: public String toString() {
149: return new String("NodeStatusResponse[" + super .toString()
150: + "]");
151: }
152: }
|