package com.esri.geoevent.solutions.transport.irc.jerklib.events.dcc;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import com.esri.geoevent.solutions.transport.irc.jerklib.events.MessageEvent;
import com.esri.geoevent.solutions.transport.irc.jerklib.events.impl.dcc.DccAcceptEventImpl;
import com.esri.geoevent.solutions.transport.irc.jerklib.events.impl.dcc.DccChatEventImpl;
import com.esri.geoevent.solutions.transport.irc.jerklib.events.impl.dcc.DccResumeEventImpl;
import com.esri.geoevent.solutions.transport.irc.jerklib.events.impl.dcc.DccSendEventImpl;
import com.esri.geoevent.solutions.transport.irc.jerklib.events.impl.dcc.DccUnknownEventImpl;
import com.esri.geoevent.solutions.transport.irc.jerklib.util.InetAddressUtils;
/**
* Factory methods for DCC Events.
*
* @author Andres N. Kievsky
*/
public class DccEventFactory
{
public static boolean isNumeric(String data)
{
try
{
Integer.parseInt(data);
return true;
}
catch (NumberFormatException e){}
try
{
Long.parseLong(data);
return true;
}
catch (NumberFormatException e){}
return false;
}
public static boolean isInteger(String data)
{
try
{
Integer.parseInt(data);
return true;
}
catch (NumberFormatException e){}
return false;
}
public static Integer asInteger(String data)
{
return new Integer(data);
}
public static boolean isLong(String data)
{
try
{
Long.parseLong(data);
return true;
}
catch (NumberFormatException e){}
return false;
}
public static Long asLong(String data)
{
return new Long(data);
}
public static DccEvent dcc(MessageEvent event, String ctcpString)
{
//EventToken dccTokens = new EventToken(ctcpString);
//List<Token> dccTokenList = dccTokens.getWordTokens();
//hack till mr_ank can fix
List<String> dccTokenList = new ArrayList<String>();
// TODO ANK: Reject invalid ports, invalid filenames, IPs like 0.0.0.0.
if(dccTokenList.size() >= 2)
{
String dccType = dccTokenList.get(1);
// DCC SEND filename ip port <fsize>
if("SEND".equals(dccType)
&& (dccTokenList.size() == 5 || dccTokenList.size() == 6)
&& isNumeric(dccTokenList.get(3))
&& isInteger(dccTokenList.get(4)))
{
String filename = dccTokenList.get(2);
InetAddress ip = InetAddressUtils.parseNumericIp(asLong(dccTokenList.get(3)));
int port = asInteger(dccTokenList.get(4));
// File Size is optative.
long fileSize = -1;
if (dccTokenList.size() == 6 && isLong(dccTokenList.get(5)))
{
fileSize = asLong(dccTokenList.get(5));
}
if (ip != null) {
return new DccSendEventImpl(filename, ip, port, fileSize, ctcpString, event.getHostName(), event.getMessage(), event.getNick(), event.getUserName(), event.getRawEventData(), event.getChannel(), event.getSession());
}
}
// DCC RESUME filename port position
else if("RESUME".equals(dccType)
&& dccTokenList.size() == 5
&& isInteger(dccTokenList.get(3))
&& isLong(dccTokenList.get(4)))
{
String filename = dccTokenList.get(2);
int port = asInteger(dccTokenList.get(3));
long position = asLong(dccTokenList.get(4));
return new DccResumeEventImpl(filename, port, position, ctcpString, event.getHostName(), event.getMessage(), event.getNick(), event.getUserName(), event.getRawEventData(), event.getChannel(), event.getSession());
}
// DCC ACCEPT filename port position
else if("ACCEPT".equals(dccType)
&& dccTokenList.size() == 5
&& isInteger(dccTokenList.get(3))
&& isLong(dccTokenList.get(4)))
{
String filename = dccTokenList.get(2);
int port = asInteger(dccTokenList.get(3));
long position = asLong(dccTokenList.get(4));
return new DccAcceptEventImpl(filename, port, position, ctcpString, event.getHostName(), event.getMessage(), event.getNick(), event.getUserName(), event.getRawEventData(), event.getChannel(), event.getSession());
}
// DCC CHAT protocol ip port
else if("CHAT".equals(dccType)
&& dccTokenList.size() == 5
&& isNumeric(dccTokenList.get(3))
&& isInteger(dccTokenList.get(4)))
{
String protocol = dccTokenList.get(2);
InetAddress ip = InetAddressUtils.parseNumericIp(asLong(dccTokenList.get(3)));
int port = asInteger(dccTokenList.get(4));
if (ip != null)
{
return new DccChatEventImpl(protocol, ip, port, ctcpString, event.getHostName(), event.getMessage(), event.getNick(), event.getUserName(), event.getRawEventData(), event.getChannel(), event.getSession());
}
}
}
// Default case: unknown DCC type.
return new DccUnknownEventImpl(ctcpString, event.getHostName(), event.getMessage(), event.getNick(), event.getUserName(), event.getRawEventData(), event.getChannel(), event.getSession());
}
}