Exemple #1
0
        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);
            }
        }