void IObserver <TData> .OnCompleted() { Status = FeedStatus.NotAvailable; unsubscribeFromSource(); //TODO: Previousely it was async, may cause lags. subscribeToSource(); }
/// <summary> /// Updates the display of a feed detail if anything has changed. /// </summary> /// <param name="feed"></param> /// <param name="feedDetail"></param> /// <param name="forceRefresh"></param> private void UpdateFeedDisplay(FeedStatus feed, FeedDetail feedDetail, bool forceRefresh) { var item = feedDetail.ListViewItem; if (forceRefresh || feed.Name != feedDetail.Name) { item.SubItems[0].Text = feed.Name; feedDetail.Name = feed.Name; } if (forceRefresh || feed.ConnectionStatus != feedDetail.ConnectionStatus) { item.SubItems[1].Text = feed.ConnectionStatusDescription; feedDetail.ConnectionStatus = feed.ConnectionStatus; } if (forceRefresh || feed.TotalMessages != feedDetail.TotalMessages) { item.SubItems[2].Text = feed.TotalMessages.ToString("N0"); feedDetail.TotalMessages = feed.TotalMessages; } if (forceRefresh || feed.TotalBadMessages != feedDetail.TotalBadMessages) { item.SubItems[3].Text = feed.TotalBadMessages.ToString("N0"); feedDetail.TotalBadMessages = feed.TotalBadMessages; } if (forceRefresh || feed.HasAircraftList != feedDetail.HasAircraftList || feed.TotalAircraft != feedDetail.AircraftCount) { item.SubItems[4].Text = feed.HasAircraftList ? feed.TotalAircraft.ToString("N0") : Strings.NotApplicableAbbr; feedDetail.AircraftCount = feed.TotalAircraft; } }
private void unsubscribe() { if (--_count != 0) { return; } Status = FeedStatus.NotSubscribed; unsubscribeFromSource(); }
/// <summary> /// Returns the feed counter for a feed. /// </summary> /// <param name="uniqueId"></param> /// <returns></returns> private FeedStatus GetFeedCounter(int uniqueId) { FeedStatus result = null; _FeedCounterMapSpinLock.Lock(); try { _FeedCounterMap.TryGetValue(uniqueId, out result); } finally { _FeedCounterMapSpinLock.Unlock(); } return(result); }
public void RefreshFromFeedStatus(FeedStatus feedStatus) { Id = feedStatus.FeedId; Name = feedStatus.Name; Merged = feedStatus.IsMergedFeed; Polar = feedStatus.HasPolarPlot; HasAircraftList = feedStatus.HasAircraftList; Connection = feedStatus.ConnectionStatus; ConnDesc = feedStatus.ConnectionStatusDescription; Msgs = feedStatus.TotalMessages; BadMsgs = feedStatus.TotalBadMessages; Tracked = feedStatus.TotalAircraft; }
/// <summary> /// Adds or updates a feed counter in <see cref="_FeedCounterMap"/>. /// </summary> /// <param name="feed"></param> /// <param name="suppressCultureSwitch"></param> private FeedStatus UpdateFeedCounter(IFeed feed, bool suppressCultureSwitch = false) { var cultureSwitcher = suppressCultureSwitch ? null : new CultureSwitcher(); try { FeedStatus feedStatus; _FeedCounterMapSpinLock.Lock(); try { if (!_FeedCounterMap.TryGetValue(feed.UniqueId, out feedStatus)) { feedStatus = new FeedStatus() { FeedId = feed.UniqueId, }; _FeedCounterMap.Add(feedStatus.FeedId, feedStatus); } } finally { _FeedCounterMapSpinLock.Unlock(); } var listener = feed.Listener; var aircraftList = feed.AircraftList; var noValue = listener == null || aircraftList == null; var isMerged = noValue ? false : listener is IMergedFeedListener; var hasPolarPlot = noValue ? false : aircraftList.PolarPlotter != null; var hasAircraftList = noValue ? false : aircraftList.IsTracking; var connectionStatus = noValue ? ConnectionStatus.Disconnected : feed.Listener.ConnectionStatus; var connectionStatusDescription = Describe.ConnectionStatus(connectionStatus); var totalAircraft = noValue ? 0 : aircraftList.Count; var totalBadMessages = noValue ? 0 : listener.TotalBadMessages; var totalMessages = noValue ? 0 : listener.TotalMessages; _FeedStatusHelper.Update(feedStatus, feedStatus.ConnectionStatus, connectionStatus, (r, v) => r.ConnectionStatus = v); _FeedStatusHelper.Update(feedStatus, feedStatus.ConnectionStatusDescription, connectionStatusDescription, (r, v) => r.ConnectionStatusDescription = v); _FeedStatusHelper.Update(feedStatus, feedStatus.HasAircraftList, hasAircraftList, (r, v) => r.HasAircraftList = v); _FeedStatusHelper.Update(feedStatus, feedStatus.HasPolarPlot, hasPolarPlot, (r, v) => r.HasPolarPlot = v); _FeedStatusHelper.Update(feedStatus, feedStatus.IsMergedFeed, isMerged, (r, v) => r.IsMergedFeed = v); _FeedStatusHelper.Update(feedStatus, feedStatus.Name, feed.Name, (r, v) => r.Name = v); _FeedStatusHelper.Update(feedStatus, feedStatus.TotalAircraft, totalAircraft, (r, v) => r.TotalAircraft = v); _FeedStatusHelper.Update(feedStatus, feedStatus.TotalBadMessages, totalBadMessages, (r, v) => r.TotalBadMessages = v); _FeedStatusHelper.Update(feedStatus, feedStatus.TotalMessages, totalMessages, (r, v) => r.TotalMessages = v); return(feedStatus); } finally { if (cultureSwitcher != null) { cultureSwitcher.Dispose(); } } }
void IObserver <TData> .OnError(Exception exception) { if (Interlocked.Increment(ref _subscriptionAttempt) == 1) { Logger.WarnFormat(exception, "Feed lost. Channel '{0}', Context: {1} ({2}) ", _channelName, _context, typeof(TContext)); } else { Logger.DebugFormat("Failed to resubscribe for feed on channel '{0}', Context: {1} ({2}). Attempt #{3} ", _channelName, _context, typeof(TContext), _subscriptionAttempt); } Status = FeedStatus.NotAvailable; unsubscribeFromSource(); //Schedule source observable resubscription _retryTask = _resubscriptionPolicy.InitResubscription(subscribeToSource, exception); // Scheduler.TaskPool.Schedule(subscribeToSource, TimeSpan.FromMilliseconds(_retryPeriod)); }
public static string ToString(FeedStatus status) { switch (status) { case FeedStatus.InProgress: case FeedStatus.Submitted: return("Submitted"); case FeedStatus.Processed: return("Processed"); case FeedStatus.ProcessedWithErrors: case FeedStatus.ProcessedWithWarnings: return("Processed with errors"); } return("n/a"); }
/// <summary> /// Updates the display for a single feed. /// </summary> /// <param name="feed"></param> public void ShowFeed(FeedStatus feed) { if (InvokeRequired) { try { BeginInvoke(new MethodInvoker(() => { ShowFeed(feed); })); } catch (InvalidOperationException) { ; // Required for mono } } else { var feedDetails = GetFeedDetails(); var feedDetail = feedDetails.FirstOrDefault(r => r.UniqueId == feed.FeedId); if (feedDetail != null) { UpdateFeedDisplay(feed, feedDetail, forceRefresh: false); listView.Sort(); } } }
private void subscribeToSource() { lock (_syncRoot) { switch (_subscriptionAttempt) { case 0: Logger.InfoFormat("Subscribing for feed on channel '{0}', Context: {1} ({2}) ", _channelName, _context, typeof(TContext)); break; case 1: Logger.InfoFormat("Resubscribing for feed on channel '{0}', Context: {1} ({2}). Attempt #{3} ", _channelName, _context, typeof(TContext), _subscriptionAttempt); break; default: Logger.DebugFormat("Resubscribing for feed on channel '{0}', Context: {1} ({2}). Attempt #{3} ", _channelName, _context, typeof(TContext), _subscriptionAttempt); break; } Status = FeedStatus.Subscribing; var source = _feedProvider.CreateFeed(_context); var deferred = source as DeferredObservable <TData>; if (deferred == null) { _subscribtion = source.Subscribe(this); if (Status == FeedStatus.Subscribing) { Status = FeedStatus.Available; } return; } deferred.Subscribe(this, () => { if (Status == FeedStatus.Subscribing) { Status = FeedStatus.Available; } }); } }
/// <summary> /// See interface docs. /// </summary> /// <param name="feed"></param> public void ShowFeedConnectionStatus(FeedStatus feed) { feedStatusControl.ShowFeed(feed); }
public void ShowFeedConnectionStatus(FeedStatus feed) { ; }
public FeedStatusModel(FeedStatus feedStatus) : this() { RefreshFromFeedStatus(feedStatus); }
public void Dispose() { _subject.OnCompleted(); unsubscribeFromSource(); Status = FeedStatus.NotSubscribed; }