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