private QueryDeparturesResult QueryDepartures(string uri, string xml) { XElement itdRequestElement = XDocument.Parse(xml).Element("itdRequest"); if (itdRequestElement == null) throw new Exception("cannot find <itdRequest />"); XElement itdDepartureMonitorRequestElement = itdRequestElement.Element("itdDepartureMonitorRequest"); if (itdDepartureMonitorRequestElement == null) throw new Exception("cannot find <itdDepartureMonitorRequest />"); XElement itdOdvElement = itdDepartureMonitorRequestElement.Element("itdOdv"); if (itdOdvElement == null) throw new Exception("cannot find <itdOdv />"); if (!"dm".Equals(this.GetAttributeValue(itdOdvElement, "usage", "cannot find attribute usage of itdOdv"))) throw new Exception("cannot find <itdOdv usage=\"dm\" />"); string defaultPlace = this.ProcessItdOdvPlace(itdOdvElement); XElement itdOdvNameElement = itdOdvElement.Element("itdOdvName"); if (itdOdvNameElement == null) throw new Exception("cannot find <itdOdvName />"); string itdOdvNameState = this.GetAttributeValue(itdOdvNameElement, "state", "cannot find attribute state of itdOdvName"); if ("identified".Equals(itdOdvNameState)) { QueryDeparturesResult departuresResult = new QueryDeparturesResult(); Location location = this.ProcessOdvNameElem(itdOdvNameElement.Element("odvNameElem"), defaultPlace); // add departure departuresResult.StationDepartures.Add(new StationDepartures(location, new List<Departure>(), new List<LineDestination>())); XElement itdOdvAssignedStopsElement = itdOdvElement.Element("itdOdvAssignedStops"); if (itdOdvAssignedStopsElement != null) { foreach (XElement element in itdOdvAssignedStopsElement.Elements("itdOdvAssignedStop")) { Location assignedLocation = this.ProcessItdOdvAssignedStop(element); if (this.FindStationDepartures(departuresResult.StationDepartures, assignedLocation.Id) == null) departuresResult.StationDepartures.Add(new StationDepartures(assignedLocation, new List<Departure>(), new List<LineDestination>())); } } DateTime? predictedTime = new DateTime?(); XElement servingLinesElement = itdDepartureMonitorRequestElement.Element("itdServingLines"); if (servingLinesElement != null) { foreach (XElement itdServingLineElement in servingLinesElement.Elements("itdServingLine")) { string assignedStopIDAttr = this.GetAttributeValueOrNull(itdServingLineElement, "assignedStopID"); int assignedStopID = assignedStopIDAttr != null ? int.Parse(assignedStopIDAttr) : 0; string destination = this.NormalizeLocationName(this.GetAttributeValueOrNull(itdServingLineElement, "direction")); string destIDAttr = this.GetAttributeValueOrNull(itdServingLineElement, "destID"); int destinationId = destIDAttr == null || destIDAttr.Length <= 0 ? 0 : int.Parse(destIDAttr); LineDestination lineDestination = new LineDestination(this.ProcessItdServingLine(itdServingLineElement), destinationId, destination); StationDepartures stationDepartures = assignedStopID != 0 ? this.FindStationDepartures(departuresResult.StationDepartures, assignedStopID) : departuresResult.StationDepartures[0]; if (stationDepartures == null) stationDepartures = new StationDepartures(new Location(LocationType.STATION, assignedStopID), new List<Departure>(), new List<LineDestination>()); if (!stationDepartures.Lines.Contains(lineDestination)) stationDepartures.Lines.Add(lineDestination); } } XElement departureListElement = itdDepartureMonitorRequestElement.Element("itdDepartureList"); if (departureListElement != null) { foreach (XElement itdDepartureElement in departureListElement.Elements("itdDeparture")) { int id = int.Parse(this.GetAttributeValue(itdDepartureElement, "stopID", "cannot find attribute stopID of itdDeparture")); StationDepartures stationDepartures = this.FindStationDepartures(departuresResult.StationDepartures, id); if (stationDepartures == null) { string mapNameAttr = this.GetAttributeValueOrNull(itdDepartureElement, "mapName"); if (mapNameAttr == null || !"WGS84".Equals(mapNameAttr)) throw new Exception("unknown mapName: " + mapNameAttr); int lon = int.Parse(this.GetAttributeValue(itdDepartureElement, "x", "cannot find attribute x of itdDeparture")); int lat = int.Parse(this.GetAttributeValue(itdDepartureElement, "y", "cannot find attribute y of itdDeparture")); stationDepartures = new StationDepartures(new Location(LocationType.STATION, id, lat, lon), new List<Departure>(), new List<LineDestination>()); } string position = AbstractEfaProvider.NormalizePlatform(this.GetAttributeValueOrNull(itdDepartureElement, "platform"), this.GetAttributeValueOrNull(itdDepartureElement, "platformName")); int countdown = int.Parse(this.GetAttributeValue(itdDepartureElement, "countdown", "cannot find attribute countdown of itdDeparture")); XElement itdDateTime1 = itdDepartureElement.Element("itdDateTime"); if (itdDateTime1 == null) throw new Exception("cannot find <itdDateTime />"); DateTime? plannedTime = new DateTime?(this.ProcessItdDateTime(itdDateTime1)); XElement itdRTDateTime = itdDepartureElement.Element("itdRTDateTime"); if (itdRTDateTime != null) predictedTime = new DateTime?(this.ProcessItdDateTime(itdRTDateTime)); XElement itdServingLineElement = ((XContainer)itdDepartureElement).Element("itdServingLine"); if (itdServingLineElement == null) throw new Exception("cannot find <itdServingLine />"); bool flag = "1".Equals(this.GetAttributeValueOrNull(itdServingLineElement, "realtime")); string destination = this.NormalizeLocationName(this.GetAttributeValue(itdServingLineElement, "direction", "cannot find attribute direction of itdServingLine")); int destinationId = int.Parse(this.GetAttributeValue(itdServingLineElement, "destID", "cannot find attribute destID of itdServingLine")); string line = this.ProcessItdServingLine(itdServingLineElement); if (flag && !predictedTime.HasValue) predictedTime = plannedTime; Departure departure = new Departure(plannedTime, predictedTime, countdown, line, (string)null, position, destinationId, destination, (string)null); stationDepartures.Departures.Add(departure); } } return departuresResult; } else if ("notidentified".Equals(itdOdvNameState)) return new QueryDeparturesResult(QueryDeparturesResult.DepartureResultStatuses.INVALID_STATION); else throw new Exception("unknown nameState '" + itdOdvNameState + "' on " + uri); }
public QueryDeparturesResult(QueryDeparturesResult.DepartureResultStatuses status) { this.Status = status; this.StationDepartures = new List<StationDepartures>(); }
private void OnSearchDeparturesCompleted(QueryDeparturesResult result) { if (result.Status == QueryDeparturesResult.DepartureResultStatuses.OK && result.StationDepartures.Count > 0) { List<DepartureResultViewModel> list = new List<DepartureResultViewModel>(); foreach (Departure departure in result.StationDepartures[0].Departures) { DepartureResultViewModel departureViewModel = new DepartureResultViewModel() { Line = departure.Line, Station = departure.Destination, InMin = departure.Countdown, PlannedDepartureTime = new DateTime?(departure.DepartureTime) }; if (!list.Contains(departureViewModel)) list.Add(departureViewModel); } IOrderedEnumerable<DepartureResultViewModel> orderedDepartures = Enumerable .OrderBy<DepartureResultViewModel, int> ( (IEnumerable<DepartureResultViewModel>)list, (Func<DepartureResultViewModel, int>)(c => c.InMin) ); AsyncHelper.RunOnMainThread((System.Action)(() => { this.IsDownloadingDepartures = false; if (Enumerable.Count<DepartureResultViewModel>((IEnumerable<DepartureResultViewModel>)orderedDepartures) <= 0) { this.HasDepartures = false; } else { foreach (DepartureResultViewModel item_1 in (IEnumerable<DepartureResultViewModel>)orderedDepartures) this.Departures.Add(item_1); } })); } else { if (result.Status == QueryDeparturesResult.DepartureResultStatuses.INVALID_STATION) return; int num = (int)result.Status; } }