Пример #1
0
        public void DoCheckFiles()
        {
            int count           = 0;
            int oldFilePersent  = -1;
            int oldTotalPersent = -1;

            foreach (ListFile file in _temp)
            {
                if (Status == Status.CANCEL)
                {
                    GoEnd(WordEnum.CANCEL_BY_USER, true);
                    return;
                }

                String path = CurrentProperty.Path;

                String fileName    = path + file.FileName.Replace("/", "\\");
                String zipFileName = fileName + ".zip";

                FileInfo info    = new FileInfo(fileName);
                FileInfo zipInfo = new FileInfo(zipFileName);

                MainForm.Instance.UpdateStatusLabel(WordEnum.CHECKING_S1, info.Name);

                try
                {
                    if (!info.Exists && file.Type != ListFileType.DELETE)
                    {
                        goto DownloadFile;
                    }

                    if (FileUtils.IsFileOpen(info))
                    {
                        GoEnd(WordEnum.FILE_S1_IS_OPENED_UPDATE_CANCEL, true, info.Name);
                        return;
                    }

                    if (FileUtils.IsFileOpen(zipInfo))
                    {
                        GoEnd(WordEnum.FILE_S1_IS_OPENED_UPDATE_CANCEL, true, zipInfo.Name);
                        return;
                    }

                    if (file.Type != ListFileType.DELETE)
                    {
                        String checkSum = DTHasher.GetMD5Hash(fileName);

                        if (!checkSum.Equals(file.md5Checksum)) //файл не совпадает
                        {
                            goto DownloadFile;
                        }
                    }
                    else
                    {
                        goto DeleteFile;
                    }

                    goto UpdateLabel;
                }
                catch (Exception e)
                {
                    _log.Info("Exception: " + e, e);

                    if (file.Type != ListFileType.DELETE)
                    {
                        goto DownloadFile;
                    }
                }

                //удаления файла
DeleteFile:
                {
                    if (info.Exists)
                    {
                        MainForm.Instance.UpdateStatusLabel(WordEnum.DELETE_S1, info.Name);

                        info.Delete();
                    }

                    goto UpdateLabel;
                }

                //загрузка файла
DownloadFile:
                {
                    Uri url = new Uri(CurrentProperty.listURL() + file.FileName + ".zip");

                    if (info.Directory != null)
                    {
                        if (!info.Directory.Exists)
                        {
                            info.Directory.Create();
                        }
                    }

                    try
                    {
                        MainForm.Instance.UpdateStatusLabel(WordEnum.DOWNLOADING_S1, info.Name);

                        WebRequest request = WebRequest.Create(url);
                        using (WebResponse response = request.GetResponse())
                        {
                            int allSize     = (int)response.ContentLength;
                            int currentRead = 0;

                            using (Stream remoteStream = response.GetResponseStream())
                            {
                                using (Stream localStream = new FileStream(zipFileName, FileMode.Create, FileAccess.Write, FileShare.None))
                                {
                                    byte[] buffer = new byte[BUFFER_SIZE];

                                    int readSize;
                                    while ((readSize = remoteStream.Read(buffer, 0, buffer.Length)) > 0)
                                    {
                                        if (Status == Status.CANCEL)
                                        {
                                            GoEnd(WordEnum.CANCEL_BY_USER, false);
                                            return;
                                        }

                                        localStream.Write(buffer, 0, readSize);
                                        currentRead += readSize;

                                        var persent = (int)((100F * currentRead) / allSize);

                                        if (persent != oldFilePersent)
                                        {
                                            oldFilePersent = persent;
                                            MainForm.Instance.UpdateProgressBar(persent, false);
                                        }
                                    }
                                }
                            }
                        }

                        UnpackFile(file);
                    }
                    catch (WebException e)
                    {
                        GoEnd(e.Message, true, true);
                        return;
                    }
                    catch (Exception e)
                    {
                        if (_log.IsDebugEnabled)
                        {
                            _log.Debug("Exception: " + e.Message, e);
                        }
                        new ExceptionForm(e);
                        GoEnd(null, true);
                        return;
                    }
                }

                //обновления главной формы
UpdateLabel:
                {
                    count++;

                    int persent = (int)((100F * count) / _temp.Count);
                    if (oldTotalPersent != persent)
                    {
                        oldTotalPersent = persent;
                        MainForm.Instance.UpdateProgressBar(persent, true);
                    }
                }

                //Thread.Sleep(SLEEP_TIME);
            }

            GoEnd(WordEnum.UPDATE_DONE, true);
        }
Пример #2
0
        /// <summary>
        /// Прочитать информацию об аварии из бинарника вида AVR*.bin
        /// Переопределяет название аварии из бинарника
        /// Переопределяет время аварии
        /// Переопределяет FileHash
        /// Переопределяет BinFileInfo
        /// </summary>
        /// <param name="sourceFile">Путь к бинарнику</param>
        /// <returns>Результат операции</returns>
        public bool ReadInfoFromBinaryFile(FileInfo sourceFile)
        {
            //Log.Global.Info("Попытка чтения информации об аварии из файла: " + sourceFile.FullName);
            bool result = true;

            sourceFile.Refresh();
            if (sourceFile.Exists)
            {
                //Log.Global.Info("Файл лога аварии существует");
                using (var reader = new AdvancedBinaryReader(new FileStream(sourceFile.FullName, FileMode.Open, FileAccess.Read), false))
                {
                    long pagesCount = reader.BaseStream.Length / 2048;
                    //Log.Global.Info("Количество страниц в файле = " + pagesCount);
                    bool startPageFound = false;
                    //int startPageIndex = 0;
                    bool firstNonstartPageFound = false;
                    for (long i = 0; i < pagesCount; ++i)
                    {
                        reader.BaseStream.Seek(i * 2048, SeekOrigin.Begin);
                        byte firstPageByte = reader.ReadByte();            // считаем первый байт
                        if (firstPageByte == 0x55)                         // заголовок найден!
                        {
                            //Log.Global.Info("Заголовочная страница найдена, её номер = " + i);
                            startPageFound  = true;
                            HeaderPageIndex = i;                             // запомнить индекс страницы-заголовка аварии (но в реальности страниц может быть много!)
                            // следующие 6 байт - дата (dd|MM|yy|HH|mm|ss)
                            byte day   = reader.ReadByte();
                            byte month = reader.ReadByte();
                            byte year  = reader.ReadByte();

                            byte hour   = reader.ReadByte();
                            byte minute = reader.ReadByte();
                            byte second = reader.ReadByte();
                            try {
                                AccuredAt = new DateTime(2000 + year, month, day, hour, minute, second);                                 // соберем байты в удобный вид
                            }
                            catch {
                                //Log.Global.Info("Не удалось распарсить дату и время аварии из байт: " + year + " " + month + " " + day + " " + hour + " " + minute + " " + second);
                                AccuredAt = DateTime.MinValue;
                            }
                            //Log.Global.Info("Дата аварии = " + AccuredAt.ToString("yyyy.MM.dd HH:mm:ss"));
                            _faultNumberFromHeader = reader.ReadByte();        // прочитаем номер аварии (байт №8)
                            _metersCount           = reader.ReadByte();        // прочитаем число измерителей (байт №9)
                        }
                        else if (firstPageByte < 0x55)                         // Первую незаголовочную страницу нужно прочитать для получения настроек измерителя:
                        {
                            if (startPageFound)
                            {
                                firstNonstartPageFound = true;
                            }
                            //Log.Global.Info("Незаголовочная страница, её индекс=" + i + " RpdMeters.Count=" + RpdMeters.Count);
                            reader.BaseStream.Seek(i * 2048, SeekOrigin.Begin);

                            var pageRaw = new byte[2048];
                            reader.Read(pageRaw, 0, 2048);                             //считываем страницу
                            var currentPage = new FaultArchivePage(pageRaw, this);

                            // Считываем настройки всех измерителей:
                            for (int j = 0; j < _metersCount; ++j)
                            {
                                var neededMeter = (RpdMeter)RpdMeters[j];
                                if (!neededMeter.SettingsReaded)
                                {
                                    neededMeter.ReadSettings(currentPage);
                                }
                            }
                        }


                        if (startPageFound && firstNonstartPageFound)
                        {
                            break;
                        }
                    }



                    if (startPageFound && firstNonstartPageFound)
                    {
                        //reader.BaseStream.Seek(startPageIndex * 2048, SeekOrigin.Begin);
                        // После чтения информации по измерителям РПД необходимо вернуться в начало и прочитать текущие данные:
                        var rpdCurrentData = new List <RpdChannelCurrentData>();
                        int rpdChannelCurrentDataOffset = 9;
                        // В этом цикле считываем текущие данные каналов РПД, заодно на выходе получая позицию текущих данных ПСН
                        for (int i = 0; i < _metersCount; ++i)
                        {
                            rpdChannelCurrentDataOffset += MeterHeaderCurrentDataRecordLength;

                            foreach (RpdChannel ch in RpdMeters[i].Channels)
                            {
                                //Log.Global.Info("Channel=" + ch.Name + ".IsEnabled = " + ch.IsEnabled);
                                if (ch.IsEnabled)
                                {
                                    rpdChannelCurrentDataOffset += ChannelCurrentDataRecordLength;
                                    //Log.Global.Info("rpdChannelCurrentDataOffset = " + rpdChannelCurrentDataOffset);
                                    // Если настройки были прочитаны:
                                    // Нельзя выносить на верхний уровень, т.к. тогда не правильно отработает смещение rpdChannelCurrentDataOffset
                                    var neededMeter = (RpdMeter)RpdMeters[i];
                                    if (neededMeter.Settings != null && neededMeter.SettingsReaded)
                                    {
                                        //Log.Global.Info(neededMeter.Name + " настроки были прочитаны");
                                        reader.BaseStream.Seek(HeaderPageIndex * 2048 + rpdChannelCurrentDataOffset, SeekOrigin.Begin);

                                        var chT = neededMeter.Settings.Calibrations.Channels[ch.Number - 1];
                                        var b1  = reader.ReadByte();                                        // По суте первый байт не нужен, но нужно сдвинуть текущее положение в файле на 1 байт
                                        var b2  = reader.ReadByte();
                                        var b3  = reader.ReadByte();
                                        //Log.Global.Info("b1 = " + b1);
                                        //Log.Global.Info("b2 = " + b2);
                                        //Log.Global.Info("b3 = " + b3);
                                        double channelCurrentValue = b2 + b3 * 256.0;
                                        //Log.Global.Info("ChCurrValue = " + channelCurrentValue);
                                        double modifiedCurValue = (channelCurrentValue - chT.Zero) * chT.Kkor * chT.Kper * 1.0;
                                        //Log.Global.Info("ResultValue = " + modifiedCurValue);
                                        rpdCurrentData.Add(new RpdChannelCurrentData(ch, modifiedCurValue));
                                    }
                                }
                            }
                        }
                        int psnCurrentDataOffset = rpdChannelCurrentDataOffset;                         // На самом деле № позиции текущих данных ПСН определяется так: сумма числа разрешённых каналов рпд по каждому измерителю:
                        //Log.Global.Info("Смещение текущих данных магистрали ПСН: psnCurrentDataOffset=" + psnCurrentDataOffset);

                        var psnReasonRaw = new byte[FaultReason.PsnGaugesCount * FaultReason.PsnReplyMaxLength];
                        reader.BaseStream.Seek(HeaderPageIndex * 2048 + psnCurrentDataOffset, SeekOrigin.Begin);
                        reader.Read(psnReasonRaw, 0, psnReasonRaw.Length);
                        // TODO: whre to get PsnChannelSimple
                        //Reason = new FaultReason(rpdCurrentData, PsnPagesParser.GetPsnCurrentData(psnReasonRaw, _deviceConfig));
                        reader.Close();
                    }
                    else
                    {
                        reader.Close();
                        throw new Exception("Ошибка, не удалось найти начальную страницу или первую страницу с данными");
                    }
                    //reader.Close();


                    FileHash    = DTHasher.GetMD5Hash(sourceFile.FullName, string.Empty);
                    BinFilePath = sourceFile;
                    //this.Name = sourceFile.Name; // Имя исходного файла всегда корявое,
                    UpdateName();
                    //Log.Global.Info("Информация об аварии {" + Name + "} успешно прочитана");
                    //Log.Global.Info(BinFilePath.FullName);
                    //Log.Global.Info(Reason.ToString);
                }
            }
            else
            {
                result = false;
                //Log.Global.Info("Файл лога аварии не существует! result = " + result);
            }

            return(result);
        }
Пример #3
0
        public void CheckNextFile()
        {
            if (Status == Status.CANCEL)
            {
                GoEnd(WordEnum.CANCEL_BY_USER, true);
                return;
            }

            ListFile file = FirstFile();

            if (file == null)
            {
                GoEnd(WordEnum.UPDATE_DONE, true);
                return;
            }

            int currentCount = _maxSize - _temp.Count;
            var persent      = (int)((100F * (currentCount)) / _maxSize);

            AssemblyPage.Instance().UpdateProgressBar(persent, true);

            string path     = Directory.GetCurrentDirectory();
            string fileName = path + file.FileName.Replace("/", "\\");

            var info = new FileInfo(fileName);

            string word = LanguageHolder.Instance()[WordEnum.CHECKING_S1];

            AssemblyPage.Instance().UpdateStatusLabel(String.Format(word, info.Name.Replace(".zip", "")), true);

            /* if (FileUtils.IsFileOpen(info))
             * {
             *   GoEnd(WordEnum.FILE_S1_IS_OPENED_UPDATE_CANCEL, true, info.Name.Replace(".zip", ""));
             *   return;
             * }*/

            String checkSum;

            try
            {
                checkSum = DTHasher.GetMD5Hash(fileName);
            }
            catch (Exception)
            {
                try
                {
                    info.Delete();
                }
                catch
                {}
                GoEnd(WordEnum.FILE_S1_IS_PROBLEMATIC_UPDATE_CANCEL_PLEASE_RECHECK, true, info.Name.Replace(".zip", ""));
                return;
            }

            if (checkSum == null)
            {
                GoEnd(WordEnum.PROBLEM_WITH_SERVER, true);
                return;
            }

            if (!info.Exists)
            {
                DownloadFile(file);                      //грузим
            }
            else if (!checkSum.Equals(file.md5Checksum)) //файл не совпадает
            {
                DownloadFile(file);                      //грузим
            }
            else
            {
                _temp.Remove(file);

                CheckNextFile(); //идем дальше
            }
        }