KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > knowgate > jcifs > smb > SmbComTransaction


1 /* jcifs smb client library in Java
2  * Copyright (C) 2000 "Michael B. Allen" <jcifs at samba dot org>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  */

18
19 package com.knowgate.jcifs.smb;
20
21 import java.util.Enumeration JavaDoc;
22 import com.knowgate.jcifs.Config;
23 import com.knowgate.misc.Gadgets;
24
25 abstract class SmbComTransaction extends ServerMessageBlock implements Enumeration JavaDoc {
26
27     private static final int DEFAULT_MAX_DATA_COUNT =
28             Config.getInt( "jcifs.smb.client.transaction_buf_size",
29                     SmbComTransaction.TRANSACTION_BUF_SIZE ) - 512;
30
31     // relative to headerStart
32
private static final int PRIMARY_SETUP_OFFSET = 61;
33     private static final int SECONDARY_PARAMETER_OFFSET = 51;
34
35     private static final int DISCONNECT_TID = 0x01;
36     private static final int ONE_WAY_TRANSACTION = 0x02;
37
38     private static final int PADDING_SIZE = 2;
39
40     private int flags = 0x00;
41     private int parameterCount;
42     private int parameterOffset;
43     private int parameterDisplacement;
44     private int dataCount;
45     private int dataOffset;
46     private int dataDisplacement;
47     private int fid;
48     private int pad = 0;
49     private int pad1 = 0;
50     private boolean hasMore = true;
51     private boolean isPrimary = true;
52     private int bufParameterOffset;
53     private int bufDataOffset;
54
55     static final int TRANSACTION_BUF_SIZE = 0xFFFF;
56
57     static final byte TRANS2_FIND_FIRST2 = (byte)0x01;
58     static final byte TRANS2_FIND_NEXT2 = (byte)0x02;
59     static final byte TRANS2_QUERY_FS_INFORMATION = (byte)0x03;
60     static final byte TRANS2_QUERY_PATH_INFORMATION = (byte)0x05;
61     static final byte TRANS2_GET_DFS_REFERRAL = (byte)0x10;
62     static final byte TRANS2_SET_FILE_INFORMATION = (byte)0x08;
63
64     static final int NET_SHARE_ENUM = 0x0000;
65     static final int NET_SERVER_ENUM2 = 0x0068;
66     static final int NET_SERVER_ENUM3 = 0x00D7;
67
68     static final byte TRANS_PEEK_NAMED_PIPE = (byte)0x23;
69     static final byte TRANS_WAIT_NAMED_PIPE = (byte)0x53;
70     static final byte TRANS_CALL_NAMED_PIPE = (byte)0x54;
71     static final byte TRANS_TRANSACT_NAMED_PIPE = (byte)0x26;
72
73     int totalParameterCount;
74     int totalDataCount;
75     int maxParameterCount;
76     int maxDataCount = DEFAULT_MAX_DATA_COUNT;
77     byte maxSetupCount;
78     int timeout = 0;
79     int setupCount = 1;
80     byte subCommand;
81     String JavaDoc name = "";
82     int maxBufferSize; // set in SmbTransport.sendTransaction() before nextElement called
83

84     byte[] txn_buf;
85
86     SmbComTransaction() {
87         maxParameterCount = 1024;
88     }
89
90     void reset() {
91         isPrimary = hasMore = true;
92     }
93     void reset( int key, String JavaDoc lastName ) {
94         reset();
95     }
96     public boolean hasMoreElements() {
97         return hasMore;
98     }
99     public Object JavaDoc nextElement() {
100         if( isPrimary ) {
101             isPrimary = false;
102
103             parameterOffset = PRIMARY_SETUP_OFFSET + ( setupCount * 2 ) + 2;
104             if( command == SMB_COM_TRANSACTION && isResponse() == false ) {
105                 parameterOffset += stringWireLength( name, parameterOffset );
106             }
107             pad = parameterOffset % PADDING_SIZE;
108             pad = pad == 0 ? 0 : PADDING_SIZE - pad;
109             parameterOffset += pad;
110
111             totalParameterCount = writeParametersWireFormat( txn_buf, bufParameterOffset );
112             bufDataOffset = totalParameterCount; // data comes right after data
113

114             int available = maxBufferSize - parameterOffset;
115             parameterCount = Math.min( totalParameterCount, available );
116             available -= parameterCount;
117
118             dataOffset = parameterOffset + parameterCount;
119             pad1 = dataOffset % PADDING_SIZE;
120             pad1 = pad1 == 0 ? 0 : PADDING_SIZE - pad1;
121             dataOffset += pad1;
122
123             totalDataCount = writeDataWireFormat( txn_buf, bufDataOffset );
124
125             dataCount = Math.min( totalDataCount, available );
126         } else {
127             command = SMB_COM_TRANSACTION_SECONDARY;
128             // totalParameterCount and totalDataCount are set ok from primary
129

130             parameterOffset = SECONDARY_PARAMETER_OFFSET;
131             if(( totalParameterCount - parameterDisplacement ) > 0 ) {
132                 pad = parameterOffset % PADDING_SIZE;
133                 pad = pad == 0 ? 0 : PADDING_SIZE - pad;
134                 parameterOffset += pad;
135             }
136
137             // caclulate parameterDisplacement before calculating new parameterCount
138
parameterDisplacement += parameterCount;
139
140             int available = maxBufferSize - parameterOffset - pad;
141             parameterCount = Math.min( totalParameterCount - parameterDisplacement, available);
142             available -= parameterCount;
143
144             dataOffset = parameterOffset + parameterCount;
145             pad1 = dataOffset % PADDING_SIZE;
146             pad1 = pad1 == 0 ? 0 : PADDING_SIZE - pad1;
147             dataOffset += pad1;
148
149             dataDisplacement += dataCount;
150
151             available -= pad1;
152             dataCount = Math.min( totalDataCount - dataDisplacement, available );
153         }
154         if(( parameterDisplacement + parameterCount ) >= totalParameterCount &&
155                     ( dataDisplacement + dataCount ) >= totalDataCount ) {
156             hasMore = false;
157         }
158         return this;
159     }
160     int writeParameterWordsWireFormat( byte[] dst, int dstIndex ) {
161         int start = dstIndex;
162
163         writeInt2( totalParameterCount, dst, dstIndex );
164         dstIndex += 2;
165         writeInt2( totalDataCount, dst, dstIndex );
166         dstIndex += 2;
167         if( command != SMB_COM_TRANSACTION_SECONDARY ) {
168             writeInt2( maxParameterCount, dst, dstIndex );
169             dstIndex += 2;
170             writeInt2( maxDataCount, dst, dstIndex );
171             dstIndex += 2;
172             dst[dstIndex++] = maxSetupCount;
173             dst[dstIndex++] = (byte)0x00; // Reserved1
174
writeInt2( flags, dst, dstIndex );
175             dstIndex += 2;
176             writeInt4( timeout, dst, dstIndex );
177             dstIndex += 4;
178             dst[dstIndex++] = (byte)0x00; // Reserved2
179
dst[dstIndex++] = (byte)0x00;
180         }
181         writeInt2( parameterCount, dst, dstIndex );
182         dstIndex += 2;
183         writeInt2(( parameterCount == 0 ? 0 : parameterOffset ), dst, dstIndex );
184         dstIndex += 2;
185         if( command == SMB_COM_TRANSACTION_SECONDARY ) {
186             writeInt2( parameterDisplacement, dst, dstIndex );
187             dstIndex += 2;
188         }
189         writeInt2( dataCount, dst, dstIndex );
190         dstIndex += 2;
191         writeInt2(( dataCount == 0 ? 0 : dataOffset ), dst, dstIndex );
192         dstIndex += 2;
193         if( command == SMB_COM_TRANSACTION_SECONDARY ) {
194             writeInt2( dataDisplacement, dst, dstIndex );
195             dstIndex += 2;
196         } else {
197             dst[dstIndex++] = (byte)setupCount;
198             dst[dstIndex++] = (byte)0x00; // Reserved3
199
dstIndex += writeSetupWireFormat( dst, dstIndex );
200         }
201
202         return dstIndex - start;
203     }
204     int writeBytesWireFormat( byte[] dst, int dstIndex ) {
205         int start = dstIndex;
206         int p = pad;
207
208         if( command == SMB_COM_TRANSACTION && isResponse() == false ) {
209             dstIndex += writeString( name, dst, dstIndex );
210         }
211
212         if( parameterCount > 0 ) {
213             while( p-- > 0 ) {
214                 dst[dstIndex++] = (byte)0x00; // Pad
215
}
216
217             System.arraycopy( txn_buf, bufParameterOffset, dst, dstIndex, parameterCount );
218             dstIndex += parameterCount;
219         }
220
221         if( dataCount > 0 ) {
222             p = pad1;
223             while( p-- > 0 ) {
224                 dst[dstIndex++] = (byte)0x00; // Pad1
225
}
226             System.arraycopy( txn_buf, bufDataOffset, dst, dstIndex, dataCount );
227             bufDataOffset += dataCount;
228             dstIndex += dataCount;
229         }
230
231         return dstIndex - start;
232     }
233     int readParameterWordsWireFormat( byte[] buffer, int bufferIndex ) {
234         return 0;
235     }
236     int readBytesWireFormat( byte[] buffer, int bufferIndex ) {
237         return 0;
238     }
239
240     abstract int writeSetupWireFormat( byte[] dst, int dstIndex );
241     abstract int writeParametersWireFormat( byte[] dst, int dstIndex );
242     abstract int writeDataWireFormat( byte[] dst, int dstIndex );
243     abstract int readSetupWireFormat( byte[] buffer, int bufferIndex, int len );
244     abstract int readParametersWireFormat( byte[] buffer, int bufferIndex, int len );
245     abstract int readDataWireFormat( byte[] buffer, int bufferIndex, int len );
246
247     public String JavaDoc toString() {
248         return new String JavaDoc( super.toString() +
249             ",totalParameterCount=" + totalParameterCount +
250             ",totalDataCount=" + totalDataCount +
251             ",maxParameterCount=" + maxParameterCount +
252             ",maxDataCount=" + maxDataCount +
253             ",maxSetupCount=" + (int)maxSetupCount +
254             ",flags=0x" + Gadgets.toHexString( flags, 2 ) +
255             ",timeout=" + timeout +
256             ",parameterCount=" + parameterCount +
257             ",parameterOffset=" + parameterOffset +
258             ",parameterDisplacement=" + parameterDisplacement +
259             ",dataCount=" + dataCount +
260             ",dataOffset=" + dataOffset +
261             ",dataDisplacement=" + dataDisplacement +
262             ",setupCount=" + setupCount +
263             ",pad=" + pad +
264             ",pad1=" + pad1 );
265     }
266 }
267
Popular Tags