Example #1
0
        private static void Main()
        {
            Logger.Trace("Запуск стартера");

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var installationFolder = AppDomain.CurrentDomain.BaseDirectory;
            UpdatesChecker.PlaceInstalledUpdates = Path.Combine(installationFolder,
                ConfigurationManager.AppSettings["InstalledUpdatesFolderName"]);
            UpdatesChecker.PlaceTempUpdates = Path.Combine(installationFolder,
                ConfigurationManager.AppSettings["TempPacketUpdatesFolderName"]);
            UpdatesChecker.PlaceUpdates = Path.Combine(installationFolder,
                ConfigurationManager.AppSettings["UpdatesFolder"]);
            var tempUnpackUpdatesFolder = Path.Combine(installationFolder,
                ConfigurationManager.AppSettings["TempUnpackedUpdatesFolderName"]);

            var startExe = ConfigurationManager.AppSettings["StartExe"];
            var checkUpdateIntervalStr = ConfigurationManager.AppSettings["WaitUpdateIntervalMs"];
            int checkUpdateInterval;
            if (!int.TryParse(checkUpdateIntervalStr, out checkUpdateInterval))
                checkUpdateInterval = 1000;

            ClearTempFiles();

            while (!_exitFromApp)
            {
                if (IsCupRunning())
                {
                    if (!_exitFromApp)
                        RunVersion(startExe);

                    return;
                }

                if (UpdatesChecker.IsAvailablePacketsUpdate())
                {
                    if (!IsUppyRunning())
                    {
                        OpenFormWait();
                    }

                    Logger.Trace("Обнаружены обновления");
                    var listUpdates = UpdatesChecker.DownloadUpdates();
                    Logger.Trace("Обновления загружены");

                    foreach (var filePacketUpdate in listUpdates)
                    {
                        Logger.Trace("Очистка временной папки");
                        ClearTempUpdateDirectory(tempUnpackUpdatesFolder);
                        Logger.Trace("Распаковка файла-пакета обновления: " + Path.GetFileName(filePacketUpdate));
                        var updater = new Updater.Updater(tempUnpackUpdatesFolder);
                        Logger.Trace("Загрузка определения пакета.");
                        updater.UnpackPacket(filePacketUpdate, tempUnpackUpdatesFolder);
                        updater.LoadPacketDefiniton();
                        updater.InstallationFolder = installationFolder;
                        if (updater.IsUpdateApplied())
                        {
                            var updateApplied = false;
                            while (!updateApplied)
                            {
                                if (IsUppyRunning())
                                {
                                    Logger.Trace("ЦУП запущен. Запрос пользователю на закрытие ЦУП");
                                    var result = ResultAskUser.Update;
                                    if (!_exitFromApp)
                                    {
                                        var form = new AlertForUpdateForm(updater.Definition.UpdateMessage);
                                        form.ShowDialog();
                                        result = form.Result;
                                        Logger.Trace(
                                            "ЦУП был запущен. Ответ на запрос выполнения обновления: " + result);
                                    }

                                    switch (result)
                                    {
                                        case ResultAskUser.Update:
                                            updater.ProgramRunning = true;
                                            OpenFormWait();
                                            Logger.Trace("Завершаем процессы ЦУП");
                                            KillUppyProcesses();
                                            _exitFromApp = false;
                                            Logger.Trace("Выполнение действий перед обновлением");
                                            updater.ExecActionsBefore();
                                            Logger.Trace("Обновление файлов");
                                            updater.UpdateFiles();
                                            Logger.Trace("Выполнение действий после установки обновления");
                                            updater.ExecActionsAfter();
                                            Logger.Trace("Очистка временной папки");
                                            ClearTempUpdateDirectory(tempUnpackUpdatesFolder);
                                            Logger.Trace("Пометка обновления как установленное");
                                            UpdatesChecker.MarkUpdateApplied(filePacketUpdate);
                                            _exitFromApp = false;
                                            updateApplied = true;
                                            break;

                                        case ResultAskUser.Ignore:
                                        case ResultAskUser.Delay:
                                            Logger.Trace("Откладываем обновление на 1 минуту.");
                                            int countDelay = 60;
                                            while (!_exitFromApp && (countDelay-- > 0))
                                            {
                                                Thread.Sleep(1000);
                                            }

                                            break;
                                        default:
                                            throw new ArgumentOutOfRangeException();
                                    }
                                }
                                else
                                {
                                    updater.ProgramRunning = false;
                                    Logger.Trace("Выполнение действий перед обновлением");
                                    updater.ExecActionsBefore();
                                    Logger.Trace("Обновление файлов");
                                    updater.UpdateFiles();
                                    Logger.Trace("Выполнение действий после установки обновления");
                                    updater.ExecActionsAfter();
                                    Logger.Trace("Пометка обновления как установленное");
                                    UpdatesChecker.MarkUpdateApplied(filePacketUpdate);
                                    Logger.Trace("Очистка временной папки");
                                    ClearTempUpdateDirectory(tempUnpackUpdatesFolder);
                                    updateApplied = true;
                                }
                            }
                        }
                        else
                        {
                            Logger.Trace("Обновление не применяется к текущей версии.");

                            UpdatesChecker.MarkUpdateApplied(filePacketUpdate);
                            ClearTempUpdateDirectory(tempUnpackUpdatesFolder);
                        }
                    }

                    if (!_exitFromApp && !IsUppyRunning())
                        RunVersion(startExe);
                }
                else
                {
                    if (!_exitFromApp && !IsUppyRunning())
                        RunVersion(startExe);
                }

                Thread.Sleep(checkUpdateInterval); // wait update
            }

            Logger.Trace("Конец работы");
        }