/// <summary> /// Called when the online lookup manager has finished fetching aircraft details for some aircraft. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> /// <remarks> /// Note that in principle we might not have asked for any of the aircraft that were fetched, it's all done /// via singleton objects so it could be something else that asked for these. /// </remarks> private void AircraftOnlineLookupManager_AircraftFetched(object sender, AircraftOnlineLookupEventArgs args) { try { foreach (var onlineAircraft in args.AircraftDetails) { CallWithinFetchLock(onlineAircraft.Icao.ToUpper(), (string icao24, AircraftDetail detail, bool isFirstFetch, IAircraft aircraft) => { return(ApplyDatabaseRecord(detail, detail.Aircraft, onlineAircraft, aircraft, isFirstFetch)); }); } } catch (ThreadAbortException) { // Gets rethrown } catch (Exception ex) { var log = Factory.ResolveSingleton <ILog>(); log.WriteLine("Caught exception during application of online lookup aircraft: {0}", ex.ToString()); } }
/// <summary> /// Called when an response is received from the online lookup. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void AircraftOnlineLookup_AircraftFetched(object sender, AircraftOnlineLookupEventArgs args) { var hasChanged = false; lock (_SyncLock) { hasChanged = RemoveOldEntries(); var now = DateTime.UtcNow; var startCount = _LogEntries.Count; foreach (var aircraftDetail in args.AircraftDetails) { _LogEntries.AddLast(new AircraftOnlineLookupLogEntry() { ResponseUtc = now, Icao = aircraftDetail.Icao, Detail = aircraftDetail, }); } foreach (var missingIcao in args.MissingIcaos) { _LogEntries.AddLast(new AircraftOnlineLookupLogEntry() { ResponseUtc = now, Icao = missingIcao, }); } if (_LogEntries.Count != startCount) { hasChanged = true; } } if (hasChanged) { OnResponsesChanged(EventArgs.Empty); } }
/// <summary> /// Called when the online lookup service has finished fetching aircraft details. /// </summary> /// <param name="sender"></param> /// <param name="args"></param> private void AircraftOnlineLookup_AircraftFetched(object sender, AircraftOnlineLookupEventArgs args) { try { var cacheEntries = _CacheEntries; var firstEnabledCache = cacheEntries.FirstOrDefault(r => r.Cache.Enabled); if (firstEnabledCache != null) { if (args.AircraftDetails.Count > 0) { firstEnabledCache.Cache.SaveMany(args.AircraftDetails); } if (args.MissingIcaos.Count > 0) { firstEnabledCache.Cache.RecordManyMissing(args.MissingIcaos); } } OnAircraftFetched(args); } catch (ThreadAbortException) { } catch (Exception ex) { var log = Factory.Singleton.ResolveSingleton <ILog>(); log.WriteLine("Caught exception in AircraftOnlineLookupManager during AircraftFetched: {0}", ex); } }
/// <summary> /// Raises <see cref="AircraftFetched"/>. Note that the class is sealed, hence why this is private /// instead of virtual. /// </summary> /// <param name="args"></param> private void OnAircraftFetched(AircraftOnlineLookupEventArgs args) { EventHelper.Raise(AircraftFetched, this, args); }