private FirstRunResult BuildPagesIndex(byte[] dataBytes) { var result = new List <IPsnPageIndexRecord>(); var resultGoodBeforeTimebreak = new List <IPsnPageIndexRecord>(); var resultGoodAfterTimebreak = new List <IPsnPageIndexRecord>(); var resultGoodCurrent = resultGoodBeforeTimebreak; int msToAdd; try { msToAdd = int.Parse(File.ReadAllText(Path.Combine(Environment.CurrentDirectory, "Ms.txt"))); } catch { msToAdd = 0; } IPsnPageIndexRecord prevGoodPageWithTime = null; var pagesCount = dataBytes.Length / (uint)_extractor.PsnPageSize; for (int i = 0; i < pagesCount; ++i) { int absPosInData = i * _extractor.PsnPageSize; var header = _extractor.GetHeaderFromRealDevice(dataBytes, absPosInData); //var pageIndex = new PsnPageIndexRecord(absolutePositionInStream, header.PageInfo, header.CreatedAt, header.PageNumber, i); var page = new PsnPageIndexRecord(absPosInData, header.PageInfo, header.CreatedAt + TimeSpan.FromMilliseconds(msToAdd * i), header.PageNumber, i); result.Add(page); // Выполнение условия переформирования лога по месту перехода с отрицательной дельтой времени: if (page.PageInfo == PsnPageInfo.NormalPage) { if (page.PageTime.HasValue) { if (page.PageTime.Value < prevGoodPageWithTime?.PageTime.Value) { resultGoodCurrent = resultGoodAfterTimebreak; } prevGoodPageWithTime = page; // Предыдущая страница ВСЕГДА валидная и имеет валидную временную метку } resultGoodCurrent.Add(page); } } resultGoodAfterTimebreak.AddRange(resultGoodBeforeTimebreak); resultGoodBeforeTimebreak.Clear(); return(new FirstRunResult { FullIndex = result, TimeSortedGoodPages = resultGoodAfterTimebreak }); }
public StreamOnlyGoodPsnPagesIndexRecord(IPsnPageIndexRecord psnPageIndexRecord, int goodPagesCountBefore) { PsnPageIndexRecord = psnPageIndexRecord; GoodPagesCountBefore = goodPagesCountBefore; }
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); }); } }); }
public StreamOnlyGoodPsnPagesGoodIndexRecord(int pageIndexInAllPages, IPsnPageIndexRecord psnPageIndexRecord) { PageIndexInAllPages = pageIndexInAllPages; PsnPageIndexRecord = psnPageIndexRecord; }