Example #1
0
        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);
        }
Example #2
0
 public QueryDeparturesResult(QueryDeparturesResult.DepartureResultStatuses status)
 {
     this.Status = status;
     this.StationDepartures = new List<StationDepartures>();
 }
Example #3
0
        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;
            }
        }