/// <summary> /// See interface docs. /// </summary> public void Initialise(IWebSiteProvider provider) { if (provider == null) { throw new ArgumentNullException("provider"); } Provider = provider; _SharedConfiguration = Factory.Singleton.Resolve <ISharedConfiguration>().Singleton; _FeedManager = Factory.Singleton.Resolve <IFeedManager>().Singleton; _EmptyAircraftList = Factory.Singleton.Resolve <ISimpleAircraftList>(); }
/// <summary> /// See interface docs. /// </summary> private void Initialise() { if (!_Initialised) { _Initialised = true; _SharedConfiguration = Factory.ResolveSingleton <ISharedConfiguration>(); _FeedManager = Factory.ResolveSingleton <IFeedManager>(); _EmptyAircraftList = Factory.Resolve <ISimpleAircraftList>(); _FileSystemProvider = Factory.Resolve <IFileSystemProvider>(); _Clock = Factory.Resolve <IClock>(); } }
/// <summary> /// Sends the appropriate AircraftList.json content in response to the request passed across. /// </summary> /// <param name="args"></param> /// <param name="aircraftList"></param> /// <param name="isFlightSimulator"></param> /// <returns>Always returns true - this just helps to make the caller's code a little more compact.</returns> private bool HandleAircraftListJson(RequestReceivedEventArgs args, IAircraftList aircraftList, bool isFlightSimulator) { if (_Builder == null) { _Builder = new AircraftListJsonBuilder(Provider); } if (aircraftList == null) { args.Response.StatusCode = HttpStatusCode.InternalServerError; } else { var buildArgs = ConstructBuildArgs(args, aircraftList, isFlightSimulator); var json = _Builder.Build(buildArgs); Responder.SendJson(args.Response, json, args.QueryString["callback"]); args.Classification = ContentClassification.Json; } return(true); }
/// <summary> /// Creates an object that holds all of the aircraft list arguments that were extracted from the request. /// </summary> /// <param name="args"></param> /// <param name="feedId"></param> /// <param name="aircraftList"></param> /// <param name="isFlightSimulator"></param> /// <returns></returns> private AircraftListJsonBuilderArgs ConstructBuildArgs(RequestReceivedEventArgs args, int feedId, IAircraftList aircraftList, bool isFlightSimulator) { var result = new AircraftListJsonBuilderArgs() { AircraftList = aircraftList, BrowserLatitude = QueryNDouble(args, "lat"), BrowserLongitude = QueryNDouble(args, "lng"), Filter = isFlightSimulator ? null : ConstructFilter(args), IsFlightSimulatorList = isFlightSimulator, IsInternetClient = args.IsInternetRequest, PreviousDataVersion = QueryLong(args, "ldv", -1), ServerTimeTicks = QueryLong(args, "stm", -1), ResendTrails = QueryString(args, "refreshTrails", false) == "1", SelectedAircraftId = QueryInt(args, "selAc", -1), SourceFeedId = feedId, }; var trFmt = QueryString(args, "trFmt", true); if (!String.IsNullOrEmpty(trFmt)) { switch (trFmt) { case "F": result.TrailType = TrailType.Full; break; case "FA": result.TrailType = TrailType.FullAltitude; break; case "FS": result.TrailType = TrailType.FullSpeed; break; case "S": result.TrailType = TrailType.Short; break; case "SA": result.TrailType = TrailType.ShortAltitude; break; case "SS": result.TrailType = TrailType.ShortSpeed; break; } } for (int sortColumnCount = 0; sortColumnCount < 2; ++sortColumnCount) { var sortColumn = QueryString(args, String.Format("sortBy{0}", sortColumnCount + 1), true); var sortOrder = QueryString(args, String.Format("sortOrder{0}", sortColumnCount + 1), true); if (String.IsNullOrEmpty(sortColumn) || String.IsNullOrEmpty(sortOrder)) { break; } result.SortBy.Add(new KeyValuePair <string, bool>(sortColumn, sortOrder == "ASC")); } if (result.SortBy.Count == 0) { result.SortBy.Add(new KeyValuePair <string, bool>(AircraftComparerColumn.FirstSeen, false)); } if ((args.Request.HttpMethod ?? "").ToUpper() == "POST") { ExtractPreviousAircraftIdsFromPostBody(args.Request, result.PreviousAircraft); } else { ExtractPreviousAircraftIdsFromHeader(args.Request, result.PreviousAircraft); } return(result); }
/// <summary> /// Sends the appropriate AircraftList.json content in response to the request passed across. /// </summary> /// <param name="args"></param> /// <param name="feedId"></param> /// <param name="aircraftList"></param> /// <param name="isFlightSimulator"></param> /// <returns>Always returns true - this just helps to make the caller's code a little more compact.</returns> private bool HandleAircraftListJson(RequestReceivedEventArgs args, int feedId, IAircraftList aircraftList, bool isFlightSimulator) { if (_Builder == null) { _Builder = Factory.Singleton.Resolve <IAircraftListJsonBuilder>(); _Builder.Initialise(Provider); } var buildArgs = ConstructBuildArgs(args, feedId, aircraftList, isFlightSimulator); var json = _Builder.Build(buildArgs); if (buildArgs.ServerTimeTicks > -1 && buildArgs.ServerTimeTicks <= _ConfigurationChangedTick) { json.ServerConfigChanged = true; } Responder.SendJson(args.Request, args.Response, json, args.QueryString["callback"], null); args.Classification = ContentClassification.Json; return(true); }
/// <summary> /// Returns a fully-formed <see cref="AircraftListJson"/> from the aircraft list passed across. /// </summary> /// <param name="args"></param> /// <returns></returns> public AircraftListJson Build(AircraftListJsonBuilderArgs args) { if (args == null) { throw new ArgumentNullException("args"); } RefreshConfigurationSettings(); var feedId = args.SourceFeedId == -1 ? _DefaultAircraftListFeedId : args.SourceFeedId; IAircraftList aircraftList = null; if (args.IsFlightSimulatorList) { aircraftList = args.AircraftList; } else { var selectedFeed = _FeedManager.GetByUniqueId(feedId, ignoreInvisibleFeeds: true); if (selectedFeed == null) { feedId = _DefaultAircraftListFeedId; selectedFeed = _FeedManager.GetByUniqueId(feedId, ignoreInvisibleFeeds: true); } aircraftList = selectedFeed == null ? null : selectedFeed.AircraftList; } if (aircraftList == null) { aircraftList = _EmptyAircraftList; feedId = args.SourceFeedId; } var result = new AircraftListJson() { FlagHeight = 20, FlagWidth = 85, ShowFlags = _ShowFlags && !args.IsFlightSimulatorList, ShowPictures = _ShowPictures && (!args.IsInternetClient || _ShowPicturesToInternetClients) && !args.IsFlightSimulatorList, ShowSilhouettes = _ShowSilhouettes && !args.IsFlightSimulatorList, ShortTrailLengthSeconds = _ShortTrailLength, Source = (int)aircraftList.Source, SourceFeedId = feedId, }; if (!args.FeedsNotRequired) { foreach (var feed in _FeedManager.VisibleFeeds) { result.Feeds.Add(new FeedJson() { UniqueId = feed.UniqueId, Name = feed.Name, HasPolarPlot = feed.AircraftList != null && feed.AircraftList.PolarPlotter != null }); } } long timestamp, dataVersion; var aircraft = aircraftList.TakeSnapshot(out timestamp, out dataVersion); result.AvailableAircraft = aircraft.Count; if (args.IgnoreUnchanged) { aircraft = aircraft.Where(r => r.DataVersion > args.PreviousDataVersion).ToList(); } result.LastDataVersion = dataVersion.ToString(); result.ServerTime = JavascriptHelper.ToJavascriptTicks(timestamp); Dictionary <int, double?> distances = new Dictionary <int, double?>(); aircraft = FilterAircraft(aircraft, args, distances); SortAircraft(aircraft, args, distances); CopyAircraft(result, aircraft, args, distances); return(result); }
/// <summary> /// Creates an object that holds all of the aircraft list arguments that were extracted from the request. /// </summary> /// <param name="args"></param> /// <param name="aircraftList"></param> /// <param name="isFlightSimulator"></param> /// <returns></returns> private AircraftListJsonBuilderArgs ConstructBuildArgs(RequestReceivedEventArgs args, IAircraftList aircraftList, bool isFlightSimulator) { var result = new AircraftListJsonBuilderArgs() { AircraftList = aircraftList, BrowserLatitude = QueryNDouble(args, "lat"), BrowserLongitude = QueryNDouble(args, "lng"), Filter = isFlightSimulator ? null : ConstructFilter(args), IsFlightSimulatorList = isFlightSimulator, IsInternetClient = args.IsInternetRequest, PreviousDataVersion = QueryLong(args, "ldv", -1), ResendTrails = QueryString(args, "refreshTrails", false) == "1", ShowShortTrail = QueryString(args, "trFmt", true) == "S", }; for (int sortColumnCount = 0; sortColumnCount < 2; ++sortColumnCount) { var sortColumn = QueryString(args, String.Format("sortBy{0}", sortColumnCount + 1), true); var sortOrder = QueryString(args, String.Format("sortOrder{0}", sortColumnCount + 1), true); if (String.IsNullOrEmpty(sortColumn) || String.IsNullOrEmpty(sortOrder)) { break; } result.SortBy.Add(new KeyValuePair <string, bool>(sortColumn, sortOrder == "ASC")); } if (result.SortBy.Count == 0) { result.SortBy.Add(new KeyValuePair <string, bool>(AircraftComparerColumn.FirstSeen, false)); } var previousAircraftIds = args.Request.Headers["X-VirtualRadarServer-AircraftIds"]; if (!String.IsNullOrEmpty(previousAircraftIds)) { var decodedPreviousAircraftIds = HttpUtility.UrlDecode(previousAircraftIds); foreach (var chunk in decodedPreviousAircraftIds.Split(',')) { int id; if (int.TryParse(chunk, out id)) { result.PreviousAircraft.Add(id); } } } return(result); }
/// <summary> /// Creates an object that holds all of the aircraft list arguments that were extracted from the request. /// </summary> /// <param name="args"></param> /// <param name="aircraftList"></param> /// <param name="isFlightSimulator"></param> /// <returns></returns> private AircraftListJsonBuilderArgs ConstructBuildArgs(RequestReceivedEventArgs args, IAircraftList aircraftList, bool isFlightSimulator) { var result = new AircraftListJsonBuilderArgs() { AircraftList = aircraftList, BrowserLatitude = QueryNDouble(args, "lat"), BrowserLongitude = QueryNDouble(args, "lng"), Filter = isFlightSimulator ? null : ConstructFilter(args), IsFlightSimulatorList = isFlightSimulator, IsInternetClient = args.IsInternetRequest, PreviousDataVersion = QueryLong(args, "ldv", -1), ResendTrails = QueryString(args, "refreshTrails", false) == "1", ShowShortTrail = QueryString(args, "trFmt", true) == "S", }; for(int sortColumnCount = 0;sortColumnCount < 2;++sortColumnCount) { var sortColumn = QueryString(args, String.Format("sortBy{0}", sortColumnCount + 1), true); var sortOrder = QueryString(args, String.Format("sortOrder{0}", sortColumnCount + 1), true); if(String.IsNullOrEmpty(sortColumn) || String.IsNullOrEmpty(sortOrder)) break; result.SortBy.Add(new KeyValuePair<string,bool>(sortColumn, sortOrder == "ASC")); } if(result.SortBy.Count == 0) result.SortBy.Add(new KeyValuePair<string,bool>(AircraftComparerColumn.FirstSeen, false)); var previousAircraftIds = args.Request.Headers["X-VirtualRadarServer-AircraftIds"]; if(!String.IsNullOrEmpty(previousAircraftIds)) { var decodedPreviousAircraftIds = HttpUtility.UrlDecode(previousAircraftIds); foreach(var chunk in decodedPreviousAircraftIds.Split(',')) { int id; if(int.TryParse(chunk, out id)) result.PreviousAircraft.Add(id); } } return result; }
/// <summary> /// Sends the appropriate AircraftList.json content in response to the request passed across. /// </summary> /// <param name="args"></param> /// <param name="aircraftList"></param> /// <param name="isFlightSimulator"></param> /// <returns>Always returns true - this just helps to make the caller's code a little more compact.</returns> private bool HandleAircraftListJson(RequestReceivedEventArgs args, IAircraftList aircraftList, bool isFlightSimulator) { if(_Builder == null) _Builder = new AircraftListJsonBuilder(Provider); if(aircraftList == null) args.Response.StatusCode = HttpStatusCode.InternalServerError; else { var buildArgs = ConstructBuildArgs(args, aircraftList, isFlightSimulator); var json = _Builder.Build(buildArgs); Responder.SendJson(args.Response, json, args.QueryString["callback"]); args.Classification = ContentClassification.Json; } return true; }