示例#1
0
     public NewVersionDialog(string text, UpdateResult result, UpdaterFlags flags)
     {
         this.Build();
         UpdLabel.WidthChars = 67;
         UpdLabel.Markup     = text;
         infoLabel.Visible   = (result.InfoLink != String.Empty);
         infoLabel.Markup    = String.Format("<b><a href=\" " + result.InfoLink + "\" title=\"Перейти на сайт компании\">Посмотреть полное описание обновления.</a></b>");
         infoLabel.AddEvents((int)EventMask.ButtonPressMask);
         infoLabel.ButtonPressEvent += delegate {
             System.Diagnostics.Process.Start(result.InfoLink);
         };
         if (flags.HasFlag(UpdaterFlags.UpdateRequired))
         {
             this.DeleteEvent += delegate {
                 Environment.Exit(0);
             }
         }
         ;
         buttonSkip.Visible = !flags.HasFlag(UpdaterFlags.UpdateRequired);
         if (flags.HasFlag(UpdaterFlags.UpdateRequired) || !result.HasUpdate)
         {
             buttonCancel.Label = "Закрыть";
         }
         if (!result.HasUpdate)
         {
             buttonSkip.Visible = buttonOk.Visible = false;
         }
     }
 }
示例#2
0
        static void ThreadWorks(UpdaterFlags flags)
        {
            string checkVersion = String.Empty, checkResult = String.Empty;
            bool   showAnyway     = FlagsHelper.IsSet(flags, UpdaterFlags.ShowAnyway);
            bool   updateRequired = FlagsHelper.IsSet(flags, UpdaterFlags.UpdateRequired);
            bool   isMainThread   = !FlagsHelper.IsSet(flags, UpdaterFlags.StartInThread);
            Uri    address        = new Uri("http://saas.qsolution.ru:2048/Updater");

            try {
                logger.Info("Получаем данные от сервера");
                string parameters = String.Format("product.{0};edition.{1};serial.{2};major.{3};minor.{4};build.{5};revision.{6}",
                                                  MainSupport.ProjectVerion.Product,
                                                  MainSupport.ProjectVerion.Edition,
                                                  MainSupport.BaseParameters.SerialNumber,
                                                  MainSupport.ProjectVerion.Version.Major,
                                                  MainSupport.ProjectVerion.Version.Minor,
                                                  MainSupport.ProjectVerion.Version.Build,
                                                  MainSupport.ProjectVerion.Version.Revision);
                IUpdateService service = new WebChannelFactory <IUpdateService> (new WebHttpBinding {
                    AllowCookies = true
                }, address)
                                         .CreateChannel();
                updateResult = service.checkForUpdate(parameters);
                if (MachineConfig.ConfigSource.Configs ["Updater"] != null)
                {
                    checkVersion = MachineConfig.ConfigSource.Configs ["Updater"].Get("NewVersion", String.Empty);
                    checkResult  = MachineConfig.ConfigSource.Configs ["Updater"].Get("Check", String.Empty);
                }
                if (showAnyway || (updateResult.HasUpdate &&
                                   (checkResult == "True" || checkResult == String.Empty || checkVersion != updateResult.NewVersion)))
                {
                    if (isMainThread)
                    {
                        ShowDialog(updateRequired);
                    }
                    else
                    {
                        Application.Invoke(delegate {
                            ShowDialog(updateRequired);
                        });
                    }
                }
            } catch (Exception ex) {
                logger.Error(ex, "Ошибка доступа к серверу обновления.");
                if (showAnyway)
                {
                    ShowErrorDialog("Не удалось подключиться к серверу обновлений.\nПожалуйста, повторите попытку позже.");
                }
                if (updateRequired)
                {
                    Environment.Exit(1);
                }
            }
        }
示例#3
0
 public void ShowAppNewVersionDialog(UpdateResult result, UpdaterFlags flags)
 {
     if (flags.HasFlag(UpdaterFlags.StartInThread))
     {
         Application.Invoke(delegate
         {
             ShowDialog(result, flags);
         });
     }
     else
     {
         ShowDialog(result, flags);
     }
 }
示例#4
0
        /// <summary>
        /// Запускает процесс обновления в отдельном потоке.
        /// </summary>
        /// <param name="flags">Флаги апдейтера</param>
        /// <param name="container">Контейнер Autofac нужен для содания скопа</param>
        public void StartCheckUpdateThread(UpdaterFlags flags, IContainer container)
        {
            //Важно здесь создаем новый скоп, так как общий снаружи может закрыться.
            var threadScope = container.BeginLifetimeScope();

            Task.Run(() => ThreadWorks(flags, threadScope))
            .ContinueWith((tsk) => {
                if (tsk.IsFaulted)
                {
                    logger.Error(tsk.Exception, "Ошибка при выполении запроса обновления в фоновом потоке.");
                }
                threadScope.Dispose();
                logger.Debug("Скоп потока убит.");
            });
        }
示例#5
0
 static public void StartCheckUpdateThread(UpdaterFlags flags)
 {
     if (FlagsHelper.IsSet(flags, UpdaterFlags.StartInThread))
     {
         Thread loadThread = new Thread(() => ThreadWorks(flags));
         loadThread.Start();
         if (FlagsHelper.IsSet(flags, UpdaterFlags.UpdateRequired))
         {
             loadThread.Join();
         }
     }
     else
     {
         ThreadWorks(flags);
     }
 }
示例#6
0
        void ThreadWorks(UpdaterFlags flags, ILifetimeScope threadScope)
        {
            string  checkVersion = String.Empty, checkResult = String.Empty;
            var     application       = threadScope.Resolve <IApplicationInfo>();
            dynamic parametersService = ResolutionExtensions.ResolveOptional <ParametersService>(threadScope);
            var     updateService     = threadScope.Resolve <IUpdateService>();
            var     skip = threadScope.Resolve <ISkipVersionState>();
            var     uI   = threadScope.Resolve <IUpdaterUI>();

            try {
                logger.Info("Запрашиваем информацию о новых версиях с сервера");
                string parameters = String.Format("product.{0};edition.{1};serial.{2};major.{3};minor.{4};build.{5};revision.{6}",
                                                  application.ProductName,
                                                  application.Modification,
                                                  parametersService?.serial_number,
                                                  application.Version.Major,
                                                  application.Version.Minor,
                                                  application.Version.Build,
                                                  application.Version.Revision);

                var updateResult = updateService.checkForUpdate(parameters);
                if (flags.HasFlag(UpdaterFlags.ShowAnyway) || (updateResult.HasUpdate && !skip.IsSkipedVersion(updateResult.NewVersion)))
                {
                    uI.ShowAppNewVersionDialog(updateResult, flags);
                }
            }
            catch (Exception ex) {
                logger.Error(ex, "Ошибка доступа к серверу обновления.");
                if (flags.HasFlag(UpdaterFlags.ShowAnyway))
                {
                    uI.InteractiveMessage.ShowMessage(Dialog.ImportanceLevel.Error, "Не удалось подключиться к серверу обновлений.\nПожалуйста, повторите попытку позже.");
                }
                if (flags.HasFlag(UpdaterFlags.UpdateRequired))
                {
                    Environment.Exit(1);
                }
            }
        }
示例#7
0
        private void ShowDialog(UpdateResult result, UpdaterFlags flags)
        {
            string message = String.Empty;

            if (result.HasUpdate && !flags.HasFlag(UpdaterFlags.UpdateRequired))
            {
                message = String.Format("<b>Доступна новая версия программы!</b>\n" +
                                        "Доступная версия: {0} (У вас установлена версия {1})\n" +
                                        "Вы хотите скачать и установить новую версию?\n\n" +
                                        (result.UpdateDescription != String.Empty ? "<b>Информация об обновлении:</b>\n{2}" : "{2}"),
                                        result.NewVersion.VersionToShortString(),
                                        application.Version.VersionToShortString(),
                                        result.UpdateDescription);
            }
            else if (result.HasUpdate && flags.HasFlag(UpdaterFlags.UpdateRequired))
            {
                message = String.Format("<b>Доступна новая версия программы!</b>\n" +
                                        "Доступная версия: {0} (У вас установлена версия {1})\n" +
                                        "<b>Для продолжения работы вам необходимо установить данное обновление.</b>\n\n" +
                                        (result.UpdateDescription != String.Empty ? "<b>Информация об обновлении:</b>\n{2}" : "{2}"),
                                        result.NewVersion.VersionToShortString(),
                                        application.Version.VersionToShortString(),
                                        result.UpdateDescription);
            }
            else if (!result.HasUpdate && !flags.HasFlag(UpdaterFlags.UpdateRequired))
            {
                message = String.Format("<b>Ваша версия программного продукта: {0}</b>\n\n" +
                                        "На данный момент это самая последняя версия.\n" +
                                        "Обновление не требуется.",
                                        application.Version.VersionToShortString());
            }
            else if (!result.HasUpdate && flags.HasFlag(UpdaterFlags.UpdateRequired))
            {
                InteractiveMessage.ShowMessage(ImportanceLevel.Error, "Необходимое обновление программы не найдено.\n" + checkBaseVersion.TextMessage);
                Environment.Exit(1);
            }

            NewVersionDialog updaterDialog  = new NewVersionDialog(message, result, flags);
            ResponseType     resultOfDialog = (ResponseType)updaterDialog.Run();

            updaterDialog.Destroy();

            if (resultOfDialog == ResponseType.Ok)
            {
                Window updateWindow = new Window("Подождите...");
                string tempPath     = Path.Combine(Path.GetTempPath(),
                                                   String.Format(@"QSInstaller-{0}.exe", Guid.NewGuid().ToString().Substring(0, 8)));

                bool        loadingComplete = false;
                ProgressBar updateProgress;
                updateProgress      = new ProgressBar();
                updateProgress.Text = "Новая версия скачивается, подождите...";
                VBox vbox = new VBox();
                vbox.PackStart(updateProgress, true, true, 0);
                WebClient webClient = new WebClient();
                webClient.DownloadFileCompleted += (sender, e) => Application.Invoke(delegate {
                    loadingComplete = true;
                    var isMapped    = updateWindow.IsMapped;
                    updateWindow.Destroy();
                    if (isMapped && e.Error == null && !e.Cancelled)
                    {
                        logger.Info("Скачивание обновления завершено. Запускаем установку...");
                        Process File            = new Process();
                        File.StartInfo.FileName = tempPath;
                        try
                        {
                            File.Start();
                            Environment.Exit(0);
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex, "Не удалось запустить скачанный установщик.");
                            InteractiveMessage.ShowMessage(ImportanceLevel.Error, "Не удалось запустить скачанный файл.");
                        }
                    }
                    else if (e.Error != null)
                    {
                        logger.Error(e.Error, "Не удалось скачать файл обновления.");
                        InteractiveMessage.ShowMessage(ImportanceLevel.Error, "Не удалось скачать файл.");
                    }
                });
                webClient.DownloadProgressChanged += (sender, e) => Application.Invoke(delegate {
                    updateProgress.Fraction = e.ProgressPercentage / 100.0;
                });
                updateWindow.SetSizeRequest(300, 25);
                updateWindow.Resizable = false;
                updateWindow.SetPosition(WindowPosition.Center);
                if (flags.HasFlag(UpdaterFlags.UpdateRequired))
                {
                    updateWindow.DeleteEvent += delegate {
                        Environment.Exit(0);
                    }
                }
                ;
                updateWindow.Add(vbox);

                updateWindow.ShowAll();
                logger.Info("Скачивание обновления началось.");
                logger.Debug("Скачиваем из {0} в {1}", result.FileLink, tempPath);

                webClient.DownloadFileAsync(new Uri(result.FileLink), tempPath);
                // Ждем окончания загрузки файла не возвращая управление, иначе в процессе скачивания продолжется работа, а это не надо во всех случаях
                while (!loadingComplete)
                {
                    if (Gtk.Application.EventsPending())
                    {
                        Gtk.Application.RunIteration();
                    }
                    else
                    {
                        Thread.Sleep(50);
                    }
                }
            }
            else if (flags.HasFlag(UpdaterFlags.UpdateRequired))
            {
                Environment.Exit(0);
            }
            else if (result.HasUpdate && resultOfDialog == ResponseType.No)
            {
                skip.SaveSkipVersion(result.NewVersion);
            }
        }
    }
示例#8
0
 public void StartCheckUpdate(UpdaterFlags flags, ILifetimeScope autofacScope)
 {
     ThreadWorks(flags, autofacScope);
 }