001    package net.minecraft.client.multiplayer;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import java.util.Hashtable;
006    import javax.naming.directory.Attributes;
007    import javax.naming.directory.InitialDirContext;
008    
009    @SideOnly(Side.CLIENT)
010    public class ServerAddress
011    {
012        private final String ipAddress;
013        private final int serverPort;
014    
015        private ServerAddress(String par1Str, int par2)
016        {
017            this.ipAddress = par1Str;
018            this.serverPort = par2;
019        }
020    
021        public String getIP()
022        {
023            return this.ipAddress;
024        }
025    
026        public int getPort()
027        {
028            return this.serverPort;
029        }
030    
031        public static ServerAddress func_78860_a(String par0Str)
032        {
033            if (par0Str == null)
034            {
035                return null;
036            }
037            else
038            {
039                String[] var1 = par0Str.split(":");
040    
041                if (par0Str.startsWith("["))
042                {
043                    int var2 = par0Str.indexOf("]");
044    
045                    if (var2 > 0)
046                    {
047                        String var3 = par0Str.substring(1, var2);
048                        String var4 = par0Str.substring(var2 + 1).trim();
049    
050                        if (var4.startsWith(":") && var4.length() > 0)
051                        {
052                            var4 = var4.substring(1);
053                            var1 = new String[] {var3, var4};
054                        }
055                        else
056                        {
057                            var1 = new String[] {var3};
058                        }
059                    }
060                }
061    
062                if (var1.length > 2)
063                {
064                    var1 = new String[] {par0Str};
065                }
066    
067                String var5 = var1[0];
068                int var6 = var1.length > 1 ? parseIntWithDefault(var1[1], 25565) : 25565;
069    
070                if (var6 == 25565)
071                {
072                    String[] var7 = getServerAddress(var5);
073                    var5 = var7[0];
074                    var6 = parseIntWithDefault(var7[1], 25565);
075                }
076    
077                return new ServerAddress(var5, var6);
078            }
079        }
080    
081        /**
082         * Returns a server's address and port for the specified hostname, looking up the SRV record if possible
083         */
084        private static String[] getServerAddress(String par0Str)
085        {
086            try
087            {
088                Class.forName("com.sun.jndi.dns.DnsContextFactory");
089                Hashtable var2 = new Hashtable();
090                var2.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
091                var2.put("java.naming.provider.url", "dns:");
092                InitialDirContext var3 = new InitialDirContext(var2);
093                Attributes var4 = var3.getAttributes("_minecraft._tcp." + par0Str, new String[] {"SRV"});
094                String[] var5 = var4.get("srv").get().toString().split(" ", 4);
095                return new String[] {var5[3], var5[2]};
096            }
097            catch (Throwable var6)
098            {
099                return new String[] {par0Str, Integer.toString(25565)};
100            }
101        }
102    
103        private static int parseIntWithDefault(String par0Str, int par1)
104        {
105            try
106            {
107                return Integer.parseInt(par0Str.trim());
108            }
109            catch (Exception var3)
110            {
111                return par1;
112            }
113        }
114    }