private static void HandleServerList(XElement node) { ServerConnectionInfoCollection servers = new ServerConnectionInfoCollection(); var serverNodes = node.Descendants().Where(n => n.Name.LocalName == "DACPServerInfo"); foreach (var serverNode in serverNodes) { ServerConnectionInfo info = new ServerConnectionInfo(); Guid id = Guid.Empty; var serverNodeDataNodes = serverNode.Descendants(); foreach (var serverNodeDataNode in serverNodeDataNodes) { var key = serverNodeDataNode.Name.LocalName; var value = serverNodeDataNode.Value; switch (key) { case "ID": id = Guid.Parse(value); break; case "ServiceID": info.ServiceID = value; break; case "HostName": // Look for a specified port int port = 3689; string[] hostParts = value.Split(':'); if (hostParts.Length > 1) { port = int.Parse(hostParts[1]); } info.LastPort = port; // Determine whether this is an IP address or a hostname IPAddress ip; if (IPAddress.TryParse(hostParts[0], out ip)) { info.LastIPAddress = ip.ToString(); } info.LastHostname = hostParts[0]; break; case "LibraryName": info.Name = value; break; case "PIN": int pin = int.Parse(value); info.PairingCode = string.Format("{0:0000}{0:0000}{0:0000}{0:0000}", pin); break; } } // Check to see whether we have all the necessary parts if (string.IsNullOrEmpty(info.ServiceID) || string.IsNullOrEmpty(info.LastHostname) || string.IsNullOrEmpty(info.PairingCode)) { continue; } // Store the old GUID for later _discoveredServerIDs[id] = info.ServiceID; // Make sure we don't have any duplicates var oldInfo = servers.FirstOrDefault(s => s.ServiceID == info.ServiceID); if (oldInfo != null) { servers.Remove(oldInfo); } // Add the server to the list servers.Add(info); } if (servers.Count > 0) { XmlSerializer xml = new XmlSerializer(typeof(ServerConnectionInfoCollection)); string serversXML = xml.SerializeToString(servers); SaveValue("PairedServerList", serversXML); } }