public PsnLogRelay( IPsnDataInformation psnDataInformation, IPsnData psnData, IPsnConfiguration psnConfiguration, IPsnProtocolConfiguration psnConfigurationLowLevel, IPsnDataCustomConfigration psnDataCustomConfigration, IThreadNotifier uiNotifier, IWorker <Action> bworker, IStorage <IPsnProtocolConfiguration> psnProtocolStorage, IPsnDataCustomConfigurationsStorage psnDataCustomConfigurationStorage, IKeyValueStorageHolder repoStorageHolder) { _logIntegrity = PsnLogIntegrity.Unknown; _psnDataInformation = psnDataInformation; _psnData = psnData; _psnDataPaged = _psnData.PagesInformation; _psnConfiguration = psnConfiguration; _psnConfigurationLowLevel = psnConfigurationLowLevel; _psnDataCustomConfigration = new PsnDataCustomConfigurationSimple( psnDataCustomConfigration.Id, psnDataCustomConfigration.PsnConfigurationId, psnDataCustomConfigration.CustomLogName); _uiNotifier = uiNotifier; _bworker = bworker; _psnProtocolStorage = psnProtocolStorage; _psnDataCustomConfigurationStorage = psnDataCustomConfigurationStorage; _meters = new ObservableCollection <IPsnMeter>(); // TODO: i get logs for FTP logs also //_unicSignalIdStorage = new KeyValueStringStorageXmlMemCache(Path.Combine(Support.GetAppDataDirectoryPathAndCreateItIfNeeded(), Id.UnicString + ".Id.xml")); _unicSignalIdStorage = repoStorageHolder.GetStorage(Id.UnicString); //_unicSignalIdStorage = new KvStorageDbreezed(Id.UnicString); RebuildMetersUnsafe(); }
public void GetStatisticAsync(Action <Exception, IEnumerable <string> > callback) { _bworker.AddWork(() => { try { //var beginTime = _psnDataInformation.BeginTime.HasValue ? _psnDataInformation.BeginTime.Value : (_psnDataInformation.SaveTime.HasValue ? _psnDataInformation.SaveTime.Value : DateTime.Now); var pagesIndex = _psnDataPaged.GetPagesIndex(); int totalPagesInLog = 0; int badPagesCount = 0; int notDatedPagesCount = 0; int normalPagesCount = 0; var timeBackPairs = new List <Tuple <IPsnPageIndexRecord, IPsnPageIndexRecord> >(); var numberSkipPairs = new List <Tuple <IPsnPageIndexRecord, IPsnPageIndexRecord> >(); IPsnPageIndexRecord prevRecord = null; foreach (var pageInfo in pagesIndex) { totalPagesInLog++; switch (pageInfo.PageInfo) { case PsnPageInfo.BadPage: badPagesCount++; break; case PsnPageInfo.NormalPage: normalPagesCount++; break; } if (!pageInfo.PageTime.HasValue) { notDatedPagesCount++; } if (prevRecord != null) { if (prevRecord.PageInfo == PsnPageInfo.NormalPage && pageInfo.PageInfo == PsnPageInfo.NormalPage) { if (pageInfo.PageNumber - prevRecord.PageNumber != 1 && !(pageInfo.PageNumber == 0 && prevRecord.PageNumber == 255)) { numberSkipPairs.Add(new Tuple <IPsnPageIndexRecord, IPsnPageIndexRecord>(prevRecord, pageInfo)); } if (prevRecord.PageTime.HasValue && pageInfo.PageTime.HasValue) { if (pageInfo.PageTime.Value < prevRecord.PageTime.Value) { timeBackPairs.Add(new Tuple <IPsnPageIndexRecord, IPsnPageIndexRecord>(prevRecord, pageInfo)); } } } } prevRecord = pageInfo; } var result = new List <string> { "Страниц в логе: " + totalPagesInLog, "Страниц, не распознанных как страницы данных ПСН, в логе: " + badPagesCount, "Страниц с данными ПСН: " + normalPagesCount, "Страниц без временной метки (из числа страниц с данными): " + notDatedPagesCount }; var lineTime = "Число обратных временных переходов в логе: " + timeBackPairs.Count + ": "; foreach (var pair in timeBackPairs) { lineTime += " 0x" + pair.Item1.AbsolutePositionInStream.ToString("X") + "-0x" + pair.Item2.AbsolutePositionInStream.ToString("X"); } result.Add(lineTime); var lineBack = "Число скачков номера страницы: " + numberSkipPairs.Count + ": "; foreach (var pair in numberSkipPairs) { lineBack += " 0x" + pair.Item1.AbsolutePositionInStream.ToString("X") + "-0x" + pair.Item2.AbsolutePositionInStream.ToString("X"); } result.Add(lineBack); var isPagesFlowErrorAccured = timeBackPairs.Count > 1 || (timeBackPairs.Count <= 1 && numberSkipPairs.Count != timeBackPairs.Count); if (isPagesFlowErrorAccured) { if (_logIntegrity != PsnLogIntegrity.PagesFlowError) { _logIntegrity = PsnLogIntegrity.PagesFlowError; _uiNotifier.Notify(() => IsSomethingWrongWithLogChanged.SafeInvoke(this, new System.EventArgs())); } } else { if (_logIntegrity != PsnLogIntegrity.Ok) { _logIntegrity = PsnLogIntegrity.Ok; _uiNotifier.Notify(() => IsSomethingWrongWithLogChanged.SafeInvoke(this, new System.EventArgs())); } } _uiNotifier.Notify(() => { callback?.Invoke(null, result); }); } catch (Exception ex) { _uiNotifier.Notify(() => { callback?.Invoke(ex, null); }); } }); }