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 { }); }
/// <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(); } }