/*
* Copyright 1999-2006 University of Chicago
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.dcache.ftp.client;
import java.util.StringTokenizer;
import java.net.InetAddress;
/**
* Utility class for parsing and converting host-port information from PASV
* and PORT ftp commands.
*/
public class HostPort
{
private int[] datainfo;
protected HostPort()
{
}
/**
* Parses host-port from passive mode reply message.
* Note that the argument is not the whole message, but
* only the content of the brackets:
* h1,h2,h3,h4,p1,p2
*
* @param passiveReplyMessage reply message for the PASV command
*/
public HostPort(String passiveReplyMessage)
{
datainfo = new int[6];
int i = 0;
StringTokenizer tokens = new StringTokenizer(passiveReplyMessage, ",");
while (tokens.hasMoreTokens()) {
datainfo[i] = Integer.parseInt(tokens.nextToken().trim());
i++;
}
}
/**
* Creates the HostPort object from specified ip address
* and port number.
*
* @param addr ip address
* @param port port number
*/
public HostPort(InetAddress addr, int port)
{
this(addr.getHostAddress(), port);
}
/**
* Creates the HostPort object from specified ip address
* and port number.
*
* @param ipAddress ip address
* @param port port number
*/
public HostPort(String ipAddress, int port)
{
datainfo = new int[6];
int i = 0;
StringTokenizer tokens = new StringTokenizer(ipAddress, ".");
while (tokens.hasMoreTokens()) {
datainfo[i] = Integer.parseInt(tokens.nextToken());
i++;
}
if (i != 4) {
throw new IllegalArgumentException("Invalid ip address: " +
ipAddress);
}
datainfo[4] = port / 256;
datainfo[5] = port - datainfo[4] * 256;
}
/**
* Returns the port number
*
* @return port number
*/
public int getPort()
{
return datainfo[4] * 256 + datainfo[5];
}
/**
* Returns the ip address in the form "h1.h2.h3.h4"
*
* @return ip address
*/
public String getHost()
{
return datainfo[0] + "." + datainfo[1] + "." +
datainfo[2] + "." + datainfo[3];
}
/**
* Returns the host-port information in the
* format used by PORT command.
* (h1,h2,h3,h4,p1,p2)
*
* @return host-port information in PORT command
* representation.
*/
public String toFtpCmdArgument()
{
StringBuilder msg = new StringBuilder();
for (int i = 0; i < datainfo.length; i++) {
msg.append(String.valueOf(datainfo[i]));
if (i + 1 != datainfo.length) msg.append(",");
}
return msg.toString();
}
}