private void HandleZoneXML(string xml)
        {
            var doc = XElement.Parse(xml);

            lock (zones)
            {
                zones.Clear();
                foreach (var zoneXML in doc.Descendants("ZoneGroup"))
                {
                    CreateZone(zoneXML);
                }
            }

            lock (players)
            {
                players.Clear();
                lock (zones)
                {
                    players = zones.SelectMany(z => z.Players).ToList();
                }
            }

            if (TopologyChanged != null)
            {
                TopologyChanged.Invoke();
            }
        }
        private void UpdateTopology(string value)
        {
            var xml = XElement.Parse(value);

            Console.WriteLine(value);

            foreach (var groups in xml.Elements("ZoneGroups"))
            {
                foreach (var zoneNode in groups.Elements("ZoneGroup"))
                {
                    var zone = new SonosZone();
                    foreach (var playerNode in zoneNode.Elements("ZoneGroupMember"))
                    {
                        // We ignore invisible units (bonded, bridges, stereopairs)
                        if (String.Equals((string)playerNode.Attribute("Invisible"), "1"))
                        {
                            continue;
                        }

                        var url     = new Uri((string)playerNode.Attribute("Location"));
                        var baseUrl = string.Format("{0}://{1}", url.Scheme, url.Authority);
                        var player  = new SonosPlayer((string)playerNode.Attribute("UUID"), (string)playerNode.Attribute("ZoneName"), baseUrl);
                        if ((string)zoneNode.Attribute("Coordinator") == player.Uuid)
                        {
                            zone.Coordinator = player;
                        }

                        zone.Members.Add(player);
                    }
                    if (zone.Members.Count > 0)
                    {
                        Zones.Add(zone);
                    }
                }
            }

            TopologyChanged.Invoke(null, new TopologyChangedEventHandlerArgs {
            });
        }
Esempio n. 3
0
        /// <summary>
        /// Ermittelt die Zonen und die Player.
        /// </summary>
        /// <param name="xml"></param>
        private void HandleZoneXML(string xml)
        {
            var doc = XElement.Parse(xml);

            lock (zones)
            {
                /* Test nicht alle Zonen zu löschen sondern entsprechend zu ersetzen.
                 * List<String> abgearbeiteteZone = new List<string>(); //Liste mir den UUID der abgearbeiteten XML  Liste
                 * List<SonosZone> zuloeschendezone = new List<SonosZone>(); //Zonen, die gelöscht werden müssen, weil nicht mehr vorhanden.
                 * //todo: Wie sollen zukünftig die Zone.Player gefüllt werden? Löschen oder Aktualisieren
                 * foreach (var zoneXML in doc.Descendants("ZoneGroup"))
                 * {
                 *
                 *  var zone = new SonosZone((string)zoneXML.Attribute("Coordinator"));//Zone aus der XML
                 *  var pllist = zoneXML.Descendants("ZoneGroupMember").Where(x => x.Attribute("Invisible") == null).ToList();//Alle Player aus der XML Liste als XML
                 *  var playerlist = new List<SonosPlayer>(); //Alle Player aus der XML Liste als Playerliste
                 *  var playerlisttodelete = new List<SonosPlayer>(); //Player, die aus der vorhadenen Zone gelöscht werden sollen
                 *  var aktzone = Zones.FirstOrDefault(x => x.CoordinatorUUID == zone.CoordinatorUUID); //Liest aus ob es die XML Zone schon Gibt
                 *  //Zonen,die neu sind in liste, damit später gelöscht werden kann.
                 *  abgearbeiteteZone.Add(zone.CoordinatorUUID);
                 *  if (aktzone != null)
                 *  {
                 *      //Playerliste durchlaufen.
                 *      if (pllist.Any())
                 *      {
                 *          foreach (var playerXml in pllist)
                 *          {
                 *              var player = new SonosPlayer
                 *              {
                 *                  Name = (string) playerXml.Attribute("ZoneName"),
                 *                  UUID = (string) playerXml.Attribute("UUID"),
                 *                  ControlPoint = ControlPoint,
                 *                  CurrentState = new PlayerState()
                 *              };
                 *              playerlist.Add(player);
                 *          }
                 *          //Listen fertig nun vergleichen
                 *          foreach (SonosPlayer splist in aktzone.Players)
                 *          {
                 *              var founded = playerlist.Find(x => x.UUID == splist.UUID);
                 *              if (founded != null)
                 *              {
                 *                  //player ist in der liste
                 *                  playerlist.Remove(founded);
                 *              }
                 *              else
                 *              {
                 *                  //playerlöschen, die nicht mehr benötigt werden.
                 *                  playerlisttodelete.Add(splist);
                 *              }
                 *          }
                 *          //cordinator löschen
                 *          var cofound= playerlist.Find(x => x.UUID == aktzone.CoordinatorUUID);
                 *          if (cofound != null)
                 *              playerlist.Remove(cofound);
                 *          //nun zufügen
                 *          foreach (SonosPlayer spadd in playerlist)
                 *          {
                 *              aktzone.AddPlayer(spadd);
                 *          }
                 *          //und löschen
                 *          foreach (SonosPlayer spdelete in playerlisttodelete)
                 *          {
                 *              aktzone.Players.Remove(spdelete);
                 *          }
                 *      }
                 *
                 *  }
                 *  else
                 *  {
                 *      //Zone gibt es nicht somit erstellen
                 *      CreateZone(zoneXML);
                 *      //Diese Player müssen woanders gelöscht werden.
                 *  }
                 * }
                 * //prüfen ob es mehr als vorhandene Zones in der liste gibt.
                 * foreach (SonosZone sz in zones)
                 * {
                 *  if (!abgearbeiteteZone.Contains(sz.CoordinatorUUID))
                 *  {
                 *      zuloeschendezone.Add(sz);
                 *  }
                 * }
                 * if (zuloeschendezone.Any())
                 * {
                 *  foreach (SonosZone szd in zuloeschendezone)
                 *  {
                 *      Zones.Remove(szd);
                 *  }
                 * }
                 *
                 * Test nicht alle Zonen zu löschen sondern entsprechend zu ersetzen.*/

                //zones.Clear();
                var zlist = new List <SonosZone>();
                foreach (var zoneXML in doc.Descendants("ZoneGroup"))
                {
                    CreateZone(zoneXML, zlist);
                }
                Zones = zlist;
            }

            lock (players)
            {
                players.Clear();
                lock (zones)
                {
                    players = zones.SelectMany(z => z.Players).ToList();
                    var coplayer = zones.Select(z => z.Coordinator).ToList();
                    foreach (SonosPlayer cop in coplayer)
                    {
                        if (!players.Contains(cop))
                        {
                            players.Add(cop);
                        }
                    }
                }
            }
            if (TopologyChanged != null)
            {
                TopologyChanged.Invoke();
            }
        }