public Presenter( ILogSourcesManager sourcesManager, Preprocessing.ILogSourcesPreprocessingManager preprocessingManager, IInvokeSynchronization invoker, IHeartBeatTimer heartbeat, IPresentersFacade presentersFacade, StatusReports.IPresenter statusReports ) { this.preprocessingManager = preprocessingManager; this.presentersFacade = presentersFacade; this.statusReports = statusReports; this.updateInvokeHelper = new AsyncInvokeHelper(invoker, Update) { ForceAsyncInvocation = true }; sourcesManager.OnLogSourceStatsChanged += (sender, e) => { bool?logSourceNeedsFixing = null; if ((e.Flags & LogProviderStatsFlag.FirstMessageWithTimeConstraintViolation) != 0 || (e.Flags & LogProviderStatsFlag.Error) != 0) { var badMsg = ((ILogSource)sender).Provider.Stats.FirstMessageWithTimeConstraintViolation; var failedWithBoundaryDates = ((ILogSource)sender).Provider.Stats.Error is BadBoundaryDatesException; logSourceNeedsFixing = badMsg != null || failedWithBoundaryDates; } if (logSourceNeedsFixing != null) { bool updated; if (logSourceNeedsFixing.Value) { updated = logSourcesRequiringReordering.Add((ILogSource)sender); } else { updated = logSourcesRequiringReordering.Remove((ILogSource)sender); } if (updated) { updateFlag.Invalidate(); } } }; sourcesManager.OnLogSourceRemoved += (sender, e) => { updateFlag.Invalidate(); }; heartbeat.OnTimer += (sender, e) => { if (e.IsNormalUpdate && updateFlag.Validate()) { Update(); } }; }
public PresentationModel( ILogSourcesManager logSources, IInvokeSynchronization modelInvoke, IModelThreads modelThreads, IFiltersList hlFilters, IBookmarks bookmarks, Settings.IGlobalSettingsAccessor settings ) { this.logSources = logSources; this.modelThreads = modelThreads; this.hlFilters = hlFilters; this.bookmarks = bookmarks; this.settings = settings; updateSourcesInvoker = new AsyncInvokeHelper(modelInvoke, UpdateSources); logSources.OnLogSourceColorChanged += (s, e) => { if (OnLogSourceColorChanged != null) { OnLogSourceColorChanged(s, e); } }; logSources.OnLogSourceAdded += (s, e) => { updateSourcesInvoker.Invoke(); }; logSources.OnLogSourceRemoved += (s, e) => { updateSourcesInvoker.Invoke(); }; logSources.OnLogSourceStatsChanged += (s, e) => { if ((e.Flags & LogProviderStatsFlag.PositionsRange) != 0) { if ((e.Flags & LogProviderStatsFlag.AvailableTimeUpdatedIncrementallyFlag) == 0) { updateSourcesInvoker.Invoke(); } else if (OnSourceMessagesChanged != null) { OnSourceMessagesChanged(this, EventArgs.Empty); } } }; }
public TelemetryCollector( Persistence.IStorageManager storage, ITelemetryUploader telemetryUploader, IInvokeSynchronization synchronization, MultiInstance.IInstancesCounter instancesCounter, IShutdown shutdown, ILogSourcesManager logSourcesManager, IMemBufferTraceAccess traceAccess ) { this.telemetryUploader = telemetryUploader; this.synchronization = synchronization; this.traceAccess = traceAccess; this.telemetryStorageEntry = storage.GetEntry("telemetry"); this.sessionStartedMillis = Environment.TickCount; this.currentSessionId = telemetryUploader.IsTelemetryConfigured ? ("session" + Guid.NewGuid().ToString("n")) : null; this.transactionInvoker = new AsyncInvokeHelper(synchronization, (Action)(() => DoSessionsRegistryTransaction(TransactionFlag.Default)), new object[0]); shutdown.Cleanup += (s, e) => shutdown.AddCleanupTask(DisposeAsync()); if (currentSessionId != null) { CreateCurrentSessionSection(); InitStaticTelemetryProperties(); logSourcesManager.OnLogSourceAdded += (s, e) => { ++totalNfOfLogs; var nfOfSimultaneousLogs = logSourcesManager.Items.Count(); maxNfOfSimultaneousLogs = Math.Max(maxNfOfSimultaneousLogs, nfOfSimultaneousLogs); }; } if (telemetryUploader.IsTelemetryConfigured && instancesCounter.IsPrimaryInstance) { this.workerCancellation = new CancellationTokenSource(); this.workerCancellationTask = new TaskCompletionSource <int>(); this.worker = TaskUtils.StartInThreadPoolTaskScheduler(Worker); } }
public PresentationModel( ILogSourcesManager logSources, ISynchronizationContext sync ) { this.logSources = logSources; this.synchronizationContext = sync; updateSourcesInvoker = new AsyncInvokeHelper(sync, UpdateSources); logSources.OnLogSourceColorChanged += (s, e) => { OnLogSourceColorChanged?.Invoke(s, e); }; logSources.OnLogSourceAdded += (s, e) => { updateSourcesInvoker.Invoke(); }; logSources.OnLogSourceRemoved += (s, e) => { updateSourcesInvoker.Invoke(); }; logSources.OnLogSourceStatsChanged += (s, e) => { if ((e.Flags & LogProviderStatsFlag.PositionsRange) != 0) { if ((e.Flags & LogProviderStatsFlag.AvailableTimeUpdatedIncrementallyFlag) != 0) { FireMessagesChanged(s, isIncrementalChange: true); } else if (IsExposableLogSource(e.Value) && !IsExposableLogSource(e.OldValue)) { updateSourcesInvoker.Invoke(); } else { FireMessagesChanged(s, isIncrementalChange: false); } } }; }
public TelemetryCollector( Persistence.IStorageManager storage, ITelemetryUploader telemetryUploader, ISynchronizationContext synchronization, MultiInstance.IInstancesCounter instancesCounter, IShutdown shutdown, IMemBufferTraceAccess traceAccess, ITraceSourceFactory traceSourceFactory ) { this.trace = traceSourceFactory.CreateTraceSource("Telemetry"); this.telemetryUploader = telemetryUploader; this.synchronization = synchronization; this.traceAccess = traceAccess; this.telemetryStorageEntry = storage.GetEntry("telemetry"); this.sessionStartedMillis = Environment.TickCount; this.currentSessionId = telemetryUploader.IsTelemetryConfigured ? ("session" + Guid.NewGuid().ToString("n")) : null; this.transactionInvoker = new AsyncInvokeHelper(synchronization, () => DoSessionsRegistryTransaction(TransactionFlag.Default)); shutdown.Cleanup += (s, e) => shutdown.AddCleanupTask(DisposeAsync()); if (currentSessionId != null) { CreateCurrentSessionSection(); InitStaticTelemetryProperties(); } if (telemetryUploader.IsTelemetryConfigured && instancesCounter.IsPrimaryInstance) { this.workerCancellation = new CancellationTokenSource(); this.workerCancellationTask = new TaskCompletionSource <int>(); this.worker = TaskUtils.StartInThreadPoolTaskScheduler(Worker); } }
public Presenter( ILogSourcesManager logSources, IView view, IManager logSourcesPreprocessings, SourcePropertiesWindow.IPresenter propertiesWindowPresenter, LogViewer.IPresenterInternal logViewerPresenter, IAlertPopup alerts, IFileDialogs fileDialogs, IClipboardAccess clipboard, IShellOpen shellOpen, SaveJointLogInteractionPresenter.IPresenter saveJointLogInteractionPresenter, IColorTheme theme, IChangeNotification changeNotification, ISynchronizationContext uiSynchronizationContext ) { this.logSources = logSources; this.view = view; this.propertiesWindowPresenter = propertiesWindowPresenter; this.logSourcesPreprocessings = logSourcesPreprocessings; this.alerts = alerts; this.fileDialogs = fileDialogs; this.clipboard = clipboard; this.shellOpen = shellOpen; this.saveJointLogInteractionPresenter = saveJointLogInteractionPresenter; this.changeNotification = changeNotification; void updateItems() { itemsRevision++; changeNotification.Post(); } var invokeUpdateHelper = new AsyncInvokeHelper(uiSynchronizationContext, updateItems); logSources.OnLogSourceVisiblityChanged += (s, e) => updateItems(); logSources.OnLogSourceAnnotationChanged += (s, e) => updateItems(); logSources.OnLogSourceColorChanged += (s, e) => updateItems(); logSourcesPreprocessings.PreprocessingChangedAsync += (s, e) => invokeUpdateHelper.Invoke(); logSources.OnLogSourceStatsChanged += (s, e) => { if ((e.Flags & (LogProviderStatsFlag.Error | LogProviderStatsFlag.CachedMessagesCount | LogProviderStatsFlag.State | LogProviderStatsFlag.BytesCount | LogProviderStatsFlag.BackgroundAcivityStatus)) != 0) { invokeUpdateHelper.Invoke(); } }; this.getRoot = Selectors.Create( () => logSources.Items, () => logSourcesPreprocessings.Items, () => theme.ThreadColors, () => expandedKeys, () => selectedKeys, () => itemsRevision, (sources, preprocessings, themeColors, expanded, selected, rev) => new RootViewItem { Items = ImmutableArray.CreateRange( EnumItemsData(sources, preprocessings, themeColors, expanded, selected, logSourcesPreprocessings)) } ); this.getSelectedSources = Selectors.Create( getRoot, root => ImmutableArray.CreateRange( ViewItem.Flatten(root).Where(i => i.IsSelected).SelectMany(i => { if (i is LogSourceViewItem singleSource) { return new[] { singleSource.LogSource } } ; if (i is SourcesContainerViewItem container) { return(container.LogSources.Select(x => x.LogSource)); } return(Enumerable.Empty <ILogSource>()); }) .Distinct() ) ); this.getSelectedPreprocessings = Selectors.Create( getRoot, root => ImmutableArray.CreateRange( ViewItem.Flatten(root).OfType <PreprocessingViewItem>().Select(p => p.Preprocessing) ) ); this.getFocusedMessageItem = Selectors.Create( () => logViewerPresenter.FocusedMessage, getRoot, (msg, root) => { var ls = msg?.GetLogSource(); return((IViewItem)ViewItem.Flatten(root).FirstOrDefault( i => (i as LogSourceViewItem)?.LogSource == ls )); } ); view.SetViewModel(this); }