TFTPRequestPacketpublic abstract class TFTPRequestPacket extends TFTPPacket An abstract class derived from TFTPPacket definiing a TFTP Request
packet type. It is subclassed by the
{@link org.apache.commons.net.tftp.TFTPReadRequestPacket}
and
{@link org.apache.commons.net.tftp.TFTPWriteRequestPacket}
classes.
Details regarding the TFTP protocol and the format of TFTP packets can
be found in RFC 783. But the point of these classes is to keep you
from having to worry about the internals. Additionally, only very
few people should have to care about any of the TFTPPacket classes
or derived classes. Almost all users should only be concerned with the
{@link org.apache.commons.net.tftp.TFTPClient} class
{@link org.apache.commons.net.tftp.TFTPClient#receiveFile receiveFile()}
and
{@link org.apache.commons.net.tftp.TFTPClient#sendFile sendFile()}
methods.
|
Fields Summary |
---|
static final String[] | _modeStringsAn array containing the string names of the transfer modes and indexed
by the transfer mode constants. | static final byte[] | _modeBytesA null terminated byte array representation of the ascii names of the
transfer mode constants. This is convenient for creating the TFTP
request packets. | int | _modeThe transfer mode of the request. | String | _filenameThe filename of the request. |
Constructors Summary |
---|
TFTPRequestPacket(InetAddress destination, int port, int type, String filename, int mode)Creates a request packet of a given type to be sent to a host at a
given port with a filename and transfer mode request.
super(type, destination, port);
_filename = filename;
_mode = mode;
| TFTPRequestPacket(int type, DatagramPacket datagram)Creates a request packet of a given type based on a received
datagram. Assumes the datagram is at least length 4, else an
ArrayIndexOutOfBoundsException may be thrown.
super(type, datagram.getAddress(), datagram.getPort());
byte[] data;
int index, length;
String mode;
StringBuffer buffer;
data = datagram.getData();
if (getType() != data[1])
throw new TFTPPacketException("TFTP operator code does not match type.");
buffer = new StringBuffer();
index = 2;
length = datagram.getLength();
while (index < length && data[index] != 0)
{
buffer.append((char)data[index]);
++index;
}
_filename = buffer.toString();
if (index >= length)
throw new TFTPPacketException("Bad filename and mode format.");
buffer.setLength(0);
++index; // need to advance beyond the end of string marker
while (index < length && data[index] != 0)
{
buffer.append((char)data[index]);
++index;
}
mode = buffer.toString().toLowerCase();
length = _modeStrings.length;
for (index = 0; index < length; index++)
{
if (mode.equals(_modeStrings[index]))
{
_mode = index;
break;
}
}
if (index >= length)
{
throw new TFTPPacketException("Unrecognized TFTP transfer mode: " + mode);
// May just want to default to binary mode instead of throwing
// exception.
//_mode = TFTP.OCTET_MODE;
}
|
Methods Summary |
---|
final java.net.DatagramPacket | _newDatagram(java.net.DatagramPacket datagram, byte[] data)This is a method only available within the package for
implementing efficient datagram transport by elminating buffering.
It takes a datagram as an argument, and a byte buffer in which
to store the raw datagram data. Inside the method, the data
is set as the datagram's data and the datagram returned.
int fileLength, modeLength;
fileLength = _filename.length();
modeLength = _modeBytes[_mode].length;
data[0] = 0;
data[1] = (byte)_type;
System.arraycopy(_filename.getBytes(), 0, data, 2, fileLength);
data[fileLength + 2] = 0;
System.arraycopy(_modeBytes[_mode], 0, data, fileLength + 3,
modeLength);
datagram.setAddress(_address);
datagram.setPort(_port);
datagram.setData(data);
datagram.setLength(fileLength + modeLength + 3);
return datagram;
| public final java.lang.String | getFilename()Returns the requested filename.
return _filename;
| public final int | getMode()Returns the transfer mode of the request.
return _mode;
| public final java.net.DatagramPacket | newDatagram()Creates a UDP datagram containing all the TFTP
request packet data in the proper format.
This is a method exposed to the programmer in case he
wants to implement his own TFTP client instead of using
the {@link org.apache.commons.net.tftp.TFTPClient}
class. Under normal circumstances, you should not have a need to call
this method.
int fileLength, modeLength;
byte[] data;
fileLength = _filename.length();
modeLength = _modeBytes[_mode].length;
data = new byte[fileLength + modeLength + 4];
data[0] = 0;
data[1] = (byte)_type;
System.arraycopy(_filename.getBytes(), 0, data, 2, fileLength);
data[fileLength + 2] = 0;
System.arraycopy(_modeBytes[_mode], 0, data, fileLength + 3,
modeLength);
return new DatagramPacket(data, data.length, _address, _port);
|
|