コード例 #1
0
        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
            });
        }
コード例 #2
0
 public StreamOnlyGoodPsnPagesIndexRecord(IPsnPageIndexRecord psnPageIndexRecord, int goodPagesCountBefore)
 {
     PsnPageIndexRecord   = psnPageIndexRecord;
     GoodPagesCountBefore = goodPagesCountBefore;
 }
コード例 #3
0
        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);
                    });
                }
            });
        }
コード例 #4
0
 public StreamOnlyGoodPsnPagesGoodIndexRecord(int pageIndexInAllPages, IPsnPageIndexRecord psnPageIndexRecord)
 {
     PageIndexInAllPages = pageIndexInAllPages;
     PsnPageIndexRecord  = psnPageIndexRecord;
 }