示例#1
0
        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();
        }
示例#2
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);
                    });
                }
            });
        }