/* (C) 2012 Pragmatic Software
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/
*/
package com.googlecode.networklog;
import android.util.Log;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.net.InetAddress;
import java.lang.Runnable;
public class NetworkResolver {
final HashMap<String, String> serviceMap = new HashMap<String, String>();
final HashMap<String, String> protocolMap = new HashMap<String, String>();
final HashMap<String, String> resolvedHostMap = new HashMap<String, String>();
final HashMap<String, Object> resolvingHostMap = new HashMap<String, Object>();
final HashMap<String, ArrayList<NetworkResolverUpdater>> hostUpdatersMap = new HashMap<String, ArrayList<NetworkResolverUpdater>>();
public NetworkResolver() {
serviceMap.put("1", "TCPMUX");
serviceMap.put("5", "JOB");
serviceMap.put("7", "ECHO");
serviceMap.put("11", "SYSTAT");
serviceMap.put("13", "DAYTIME");
serviceMap.put("15", "NETSTAT");
serviceMap.put("17", "QUOTE");
serviceMap.put("18", "MSGSEND");
serviceMap.put("19", "CHARGEN");
serviceMap.put("20", "FTPT");
serviceMap.put("21", "FTP");
serviceMap.put("42", "HOSTNAME");
serviceMap.put("42", "WINS");
serviceMap.put("43", "WHOIS");
serviceMap.put("47", "NIFTP");
serviceMap.put("53", "DNS");
serviceMap.put("56", "RAP");
serviceMap.put("57", "MAIL");
serviceMap.put("67", "BOOTP");
serviceMap.put("68", "BOOTP");
serviceMap.put("69", "TFTP");
serviceMap.put("70", "GOPHER");
serviceMap.put("71", "NETRJS");
serviceMap.put("72", "NETRJS");
serviceMap.put("73", "NETRJS");
serviceMap.put("74", "NETRJS");
serviceMap.put("79", "FINGER");
serviceMap.put("80", "HTTP");
serviceMap.put("107", "RTELNET");
serviceMap.put("109", "POP2");
serviceMap.put("110", "POP3");
serviceMap.put("111", "SUNRPC");
serviceMap.put("113", "AUTH");
serviceMap.put("115", "SFTP");
serviceMap.put("117", "UUCP");
serviceMap.put("118", "SQL");
serviceMap.put("119", "NNTP");
serviceMap.put("123", "NTP");
serviceMap.put("135", "DCE");
serviceMap.put("135", "RPCL");
serviceMap.put("137", "NETBIOSN");
serviceMap.put("138", "NETBIOSD");
serviceMap.put("139", "NETBIOSS");
serviceMap.put("143", "IMAP");
serviceMap.put("152", "BFTP");
serviceMap.put("153", "SGMP");
serviceMap.put("156", "SQL");
serviceMap.put("158", "DMSP");
serviceMap.put("161", "SNMP");
serviceMap.put("162", "SNMPTRAP");
serviceMap.put("177", "XDMCP");
serviceMap.put("179", "BORDER GATEWAY PROTOCOL");
serviceMap.put("194", "IRC");
serviceMap.put("199", "SMUX");
serviceMap.put("201", "APPLETALK");
serviceMap.put("213", "IPX");
serviceMap.put("218", "MPP");
serviceMap.put("220", "IMAP3");
serviceMap.put("259", "ESRO");
serviceMap.put("264", "BGMP");
serviceMap.put("280", "HTTP-MGMT");
serviceMap.put("369", "RPC2PORTMAP");
serviceMap.put("370", "SECURECAST1");
serviceMap.put("389", "LDAP");
serviceMap.put("401", "UPS");
serviceMap.put("427", "SLP");
serviceMap.put("443", "HTTPS");
serviceMap.put("444", "SNPP");
serviceMap.put("445", "SMB");
serviceMap.put("464", "KERBEROS");
serviceMap.put("500", "ISAKMP");
serviceMap.put("517", "TALK");
serviceMap.put("518", "NTALK");
serviceMap.put("520", "EFS");
serviceMap.put("520", "RIP");
serviceMap.put("524", "NCP");
serviceMap.put("525", "TIMED");
serviceMap.put("530", "RPC");
serviceMap.put("531", "AIM");
serviceMap.put("532", "NETNEWS");
serviceMap.put("533", "NETWALL");
serviceMap.put("540", "UUCP");
serviceMap.put("542", "COMMERCE");
serviceMap.put("543", "KLOGIN");
serviceMap.put("544", "KSHELL");
serviceMap.put("546", "DHCPV6C");
serviceMap.put("547", "DHCPV6S");
serviceMap.put("548", "AFP");
serviceMap.put("550", "RWHO");
serviceMap.put("554", "RTSP");
serviceMap.put("556", "REMOTEFS");
serviceMap.put("560", "RMONITOR");
serviceMap.put("561", "MONITOR");
serviceMap.put("563", "NNTPS");
serviceMap.put("587", "SMTP");
serviceMap.put("591", "HTTP2");
serviceMap.put("593", "HTTP-RPC");
serviceMap.put("604", "TUNNEL");
serviceMap.put("623", "ASF-RMCP");
serviceMap.put("631", "IPP");
serviceMap.put("631", "CUPS");
serviceMap.put("635", "RLZ-DBASE");
serviceMap.put("636", "LDAPS");
serviceMap.put("639", "MSDP");
serviceMap.put("646", "LDP");
serviceMap.put("647", "DHCPF");
serviceMap.put("648", "RRP");
serviceMap.put("651", "IEEE-MMS");
serviceMap.put("654", "MMS");
serviceMap.put("657", "RMC");
serviceMap.put("666", "DOOM");
serviceMap.put("674", "ACAP");
serviceMap.put("691", "MSEXCHANGE");
serviceMap.put("694", "HEARTBEAT");
serviceMap.put("695", "MMS-SSL");
serviceMap.put("698", "OLSR");
serviceMap.put("700", "EPP");
serviceMap.put("701", "LMP");
serviceMap.put("702", "IRIS");
serviceMap.put("706", "SILC");
serviceMap.put("711", "MPLS");
serviceMap.put("712", "TBRPF");
serviceMap.put("749", "KERBEROS");
serviceMap.put("750", "KERBEROS4");
serviceMap.put("751", "KERBEROS");
serviceMap.put("752", "KPASSWD");
serviceMap.put("753", "RRH");
serviceMap.put("753", "RRH");
serviceMap.put("753", "USERREG");
serviceMap.put("754", "TELLSEND");
serviceMap.put("754", "KRB5PROP");
serviceMap.put("754", "TELLSEND");
serviceMap.put("760", "KRBUPDATE");
serviceMap.put("782", "CONSERVER");
serviceMap.put("783", "SPAMD");
serviceMap.put("843", "FLASH");
serviceMap.put("847", "DHCPF");
serviceMap.put("848", "GDOI");
serviceMap.put("860", "ISCSI");
serviceMap.put("873", "RSYNC");
serviceMap.put("888", "CDDBP");
serviceMap.put("901", "SWAT");
serviceMap.put("901", "VMWARE");
serviceMap.put("901", "VMWARE");
serviceMap.put("902", "IDEAFARM-DOOR");
serviceMap.put("902", "VMWARE");
serviceMap.put("902", "IDEAFARM-DOOR");
serviceMap.put("902", "VMWARE");
serviceMap.put("903", "VMWARE");
serviceMap.put("904", "VMWARE");
serviceMap.put("911", "NCA");
serviceMap.put("944", "NFS");
serviceMap.put("953", "RNDC");
serviceMap.put("973", "NFS6");
serviceMap.put("989", "FTPSD");
serviceMap.put("990", "FTPSC");
serviceMap.put("991", "NAS");
serviceMap.put("992", "STELNET");
serviceMap.put("993", "IMAPS");
serviceMap.put("995", "POP3S");
protocolMap.put("0", "HOPOPT");
protocolMap.put("1", "ICMP");
protocolMap.put("2", "IGMP");
protocolMap.put("3", "GGP");
protocolMap.put("4", "IPv4");
protocolMap.put("5", "ST");
protocolMap.put("6", "TCP");
protocolMap.put("7", "CBT");
protocolMap.put("8", "EGP");
protocolMap.put("9", "IGP");
protocolMap.put("10", "BBN");
protocolMap.put("11", "NVP2");
protocolMap.put("12", "PUP");
protocolMap.put("13", "ARGUS");
protocolMap.put("14", "EMCON");
protocolMap.put("15", "XNET");
protocolMap.put("16", "CHAOS");
protocolMap.put("17", "UDP");
protocolMap.put("18", "MUX");
protocolMap.put("19", "DCN");
protocolMap.put("20", "HMP");
protocolMap.put("21", "PRM");
protocolMap.put("22", "XNS");
protocolMap.put("27", "RDP");
protocolMap.put("28", "IRTP");
protocolMap.put("29", "ISO");
protocolMap.put("30", "BLT");
protocolMap.put("31", "MFE-NSP");
protocolMap.put("32", "MERIT-INP");
protocolMap.put("33", "DCCP");
protocolMap.put("34", "3PC");
protocolMap.put("35", "IDPR");
protocolMap.put("36", "XTP");
protocolMap.put("37", "DDP");
protocolMap.put("38", "IDPR-CMTP");
protocolMap.put("39", "TP++");
protocolMap.put("40", "IL");
protocolMap.put("41", "IPv6");
protocolMap.put("42", "SDRP");
protocolMap.put("43", "IPv6-Route");
protocolMap.put("44", "IPv6-Frag");
protocolMap.put("45", "IDRP");
protocolMap.put("46", "RSVP");
protocolMap.put("47", "GRE");
protocolMap.put("48", "MHRP");
protocolMap.put("49", "BNA");
protocolMap.put("50", "ESP");
protocolMap.put("51", "AH");
protocolMap.put("52", "I-NLSP");
protocolMap.put("53", "SWIPE");
protocolMap.put("54", "NARP");
protocolMap.put("55", "MOBILE");
protocolMap.put("56", "TLSP");
protocolMap.put("57", "SKIP");
protocolMap.put("58", "IPv6-ICMP");
protocolMap.put("59", "IPv6-NoNxt");
protocolMap.put("60", "IPv6-Opts");
protocolMap.put("62", "CFTP");
protocolMap.put("64", "SAT-EXPAK");
protocolMap.put("65", "KRYPTOLAN");
protocolMap.put("66", "RVD");
protocolMap.put("67", "IPPC");
protocolMap.put("69", "SAT-MON");
protocolMap.put("70", "VISA");
protocolMap.put("71", "IPCV");
protocolMap.put("72", "CPNX");
protocolMap.put("73", "CPHB");
protocolMap.put("74", "WSN");
protocolMap.put("75", "PVP");
protocolMap.put("76", "BR-SAT-MON");
protocolMap.put("77", "SUN-ND");
protocolMap.put("78", "WB-MON");
protocolMap.put("79", "WB-EXPAK");
protocolMap.put("80", "ISO-IP");
protocolMap.put("81", "VMTP");
protocolMap.put("82", "SECURE-VMTP");
protocolMap.put("83", "VINES");
protocolMap.put("84", "TTP");
protocolMap.put("84", "IPTM");
protocolMap.put("85", "NSFNET-IGP");
protocolMap.put("86", "DGP");
protocolMap.put("87", "TCF");
protocolMap.put("88", "EIGRP");
protocolMap.put("89", "OSPF");
protocolMap.put("90", "SPRITE-RPC");
protocolMap.put("91", "LARP");
protocolMap.put("92", "MTP");
protocolMap.put("93", "AX.25");
protocolMap.put("94", "IPIP");
protocolMap.put("95", "MICP");
protocolMap.put("96", "SCC-SP");
protocolMap.put("97", "ETHERIP");
protocolMap.put("98", "ENCAP");
protocolMap.put("100", "GMTP");
protocolMap.put("101", "IFMP");
protocolMap.put("102", "PNNI");
protocolMap.put("103", "PIM");
protocolMap.put("104", "ARIS");
protocolMap.put("105", "SCPS");
protocolMap.put("106", "QNX");
protocolMap.put("107", "A/N");
protocolMap.put("108", "IPComp");
protocolMap.put("109", "SNP");
protocolMap.put("110", "Compaq-Peer");
protocolMap.put("111", "IPX-in-IP");
protocolMap.put("112", "VRRP");
protocolMap.put("113", "PGM");
protocolMap.put("115", "L2TP");
protocolMap.put("116", "DDX");
protocolMap.put("117", "IATP");
protocolMap.put("118", "STP");
protocolMap.put("119", "SRP");
protocolMap.put("120", "UTI");
protocolMap.put("121", "SMP");
protocolMap.put("122", "SM");
protocolMap.put("123", "PTP");
protocolMap.put("125", "FIRE");
protocolMap.put("126", "CRTP");
protocolMap.put("127", "CRUDP");
protocolMap.put("128", "SSCOPMCE");
protocolMap.put("129", "IPLT");
protocolMap.put("130", "SPS");
protocolMap.put("131", "PIPE");
protocolMap.put("132", "SCTP");
protocolMap.put("133", "FC");
protocolMap.put("138", "MANET");
protocolMap.put("139", "HIP");
protocolMap.put("140", "SHIM6");
}
public String getResolvedAddress(final String address) {
return resolvedHostMap.get(address);
}
public String resolveAddress(final String address) {
return resolveAddress(address, null);
}
public String resolveAddress(final String address, final NetworkResolverUpdater updater) {
String resolved;
synchronized(resolvedHostMap) {
resolved = resolvedHostMap.get(address);
}
if(resolved == null && updater != null) {
synchronized(hostUpdatersMap) {
ArrayList<NetworkResolverUpdater> updaters = hostUpdatersMap.get(address);
if(updaters == null) {
updaters = new ArrayList<NetworkResolverUpdater>();
hostUpdatersMap.put(address, updaters);
}
updaters.add(updater);
}
}
Object resolving;
synchronized(resolvingHostMap) {
resolving = resolvingHostMap.get(address);
}
if(resolving != null) {
return null;
}
if(resolved == null) {
synchronized(resolvingHostMap) {
resolvingHostMap.put(address, address);
}
new Thread(new Runnable() {
public void run() {
try {
if(MyLog.enabled && MyLog.level >= 1) {
MyLog.d(1, "Resolving " + address);
}
InetAddress inetAddress = InetAddress.getByName(address);
String resolved = inetAddress.getHostName();
synchronized(resolvedHostMap) {
resolvedHostMap.put(address, resolved);
}
synchronized(resolvingHostMap) {
resolvingHostMap.remove(address);
}
if(MyLog.enabled && MyLog.level >= 1) {
MyLog.d(1, "Resolved " + address + " to " + resolved);
}
synchronized(hostUpdatersMap) {
ArrayList<NetworkResolverUpdater> updaters = hostUpdatersMap.get(address);
if(updaters != null) {
Iterator<NetworkResolverUpdater> iterator = updaters.iterator();
while(iterator.hasNext()) {
NetworkResolverUpdater update = iterator.next();
update.setResolved(resolved);
NetworkLog.handler.postDelayed(update, 500);
}
updaters.clear();
hostUpdatersMap.remove(address);
}
}
} catch(Exception e) {
Log.d("NetworkLog", e.toString(), e);
}
}
}, "NetResolv:" + address).start();
return null;
} else {
return resolved;
}
}
public String resolveService(String service) {
String name = serviceMap.get(service);
if(name == null) {
return service;
}
else {
return name;
}
}
public String resolveProtocol(String protocol) {
String name = protocolMap.get(protocol);
if(name == null) {
return protocol;
}
else {
return name;
}
}
}