예제 #1
0
 public static async Task <Tuple <WeekSchedule, DataRetrievalMessage> > GetScheduleForStop(string id, DataRetrievalOptions options, CancellationToken cancellationToken)
 {
     return(await CloudOrLocal(() => ApiLayer.GetScheduleForStop(id, cancellationToken), () => FileManager.LoadSchedule(id), options, typeof(OperationCanceledException)));
 }
예제 #2
0
        public static async Task <RouteListing[]> DownloadAll(Action <double, string> statusChangedCallback, CancellationToken cancellationToken, params RouteListing[] routeListings)
        {
            List <RouteListing> errorList = new List <RouteListing>();
            List <BusStop>      allStops  = new List <BusStop>();
            await FileManager.LoadPendingDownloads();

            try
            {
                for (int i = 0; i < routeListings.Length; i++)
                {
                    statusChangedCallback(0.15 * i / routeListings.Length, "Getting stops (" + (i + 1).ToString() + " of " + routeListings.Length.ToString() + ")" + " " + (routeListings[i].Name.All(chr => char.IsDigit(chr)) ? "Route " : "") + routeListings[i].Name);
                    try
                    {
                        var manager = await DownloadManager.Create(routeListings[i], cancellationToken);

                        await FileManager.SaveRoute(manager.Route, manager.StopsPending.Select(item => item.ID).ToArray(), manager.Shapes);

                        foreach (var stop in manager.StopsPending)
                        {
                            if (!allStops.Contains(stop))
                            {
                                allStops.Add(stop);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        errorList.Add(routeListings[i]);
                        ex.ToString();
                    }
                }

                WeekSchedule schedule;
                string[]     routeFilters = DownloadsInProgress.Select(download => download.Listing.Route.ID).ToArray();

                for (int i = 0; i < allStops.Count; i++)
                {
                    statusChangedCallback(0.15 + 0.85 * i / allStops.Count, "Downloading schedules (" + (i + 1).ToString() + " of " + allStops.Count.ToString() + ") " + allStops[i].Name);
                    try
                    {
                        var pend = FileManager.PendingDownloads.Where(item => routeFilters.Contains(item.First())).ToArray();
                        if (pend.Any(item => item.Contains(allStops[i].ID)))
                        {
                            schedule = await ApiLayer.GetScheduleForStop(allStops[i].ID, cancellationToken);

                            schedule.FilterByRoutes(routeFilters);
                            await FileManager.SaveScheduleAsync(schedule, allStops[i]);

                            foreach (var item in pend)
                            {
                                if (item.Contains(allStops[i].ID))
                                {
                                    item.Remove(allStops[i].ID);
                                }
                                if (item.Count == 1)
                                {
                                    FileManager.PendingDownloads.Remove(item);
                                }
                            }
                            await FileManager.SavePendingDownloads();
                        }
                        foreach (var manager in DownloadsInProgress.ToArray())
                        {
                            if (manager.StopsPending.Contains(allStops[i]))
                            {
                                manager.StopsPending.Remove(allStops[i]);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        cancellationToken.ThrowIfCancellationRequested();
                        foreach (var download in DownloadsInProgress.Where(item => item.StopsPending.Contains(allStops[i])))
                        {
                            if (!errorList.Contains(download.Listing))
                            {
                                errorList.Add(download.Listing);
                            }
                        }
                        ex.ToString();
                    }
                }
                statusChangedCallback(1, "Download complete.");
            }
            catch (OperationCanceledException)
            {
                statusChangedCallback(1, "Download cancelled.");
                while (DownloadsInProgress.Count > 0)
                {
                    DownloadsInProgress[0].StopsPending.Clear();
                }
            }
            return(errorList.ToArray());
        }