private bool PerformAutoUpdate(IDIContext container, IUpdateDescription update)
        {
            logger.Info("Performing auto update");

            var uiManager = container.Resolve <IUIManager>();
            var displayId = uiManager.CreateUIElement(() =>
            {
                var f = new ProgressDisplayForm();
                f.Show();
                return(f);
            });

            try
            {
                var progressDisplay = uiManager.GetUIElement <ProgressDisplayForm>(displayId);
                using (var progressMonitor = new ProgressMonitorAdapter(progressDisplay))
                {
                    var patchFolder = System.IO.Path.Combine(GobchatContext.ApplicationLocation, PatchFolder);

                    (var downloadResult, var filePath) = PerformAutoUpdateDownload(update, patchFolder, progressMonitor);
                    logger.Info($"Download complete: {downloadResult}");
                    if (!downloadResult)
                    {
                        return(false);
                    }

                    (var extractionResult, var unpackedArchive) = PerformAutoUpdateExtraction(filePath, patchFolder, progressMonitor);
                    logger.Info($"Extraction complete {extractionResult}");
                    if (!extractionResult)
                    {
                        return(false);
                    }

                    PerformAutoUpdateInstall(unpackedArchive, progressMonitor);
                }

                return(true);
            }
            finally
            {
                uiManager.DisposeUIElement(displayId);
            }
        }
        public void Initialize(ApplicationStartupHandler handler, IDIContext container)
        {
            var uiSynchronizer = container.Resolve <IUISynchronizer>();
            ProgressDisplayForm progressDisplay = null;

            var cefFolder     = Path.Combine(GobchatContext.ApplicationLocation, "libs", "cef");
            var patcherFolder = Path.Combine(GobchatContext.ApplicationLocation, "patch");
            var installer     = new CefInstaller(cefFolder, patcherFolder);

            if (installer.IsCefAvailable())
            {
                return;
            }

            //TODO message dialog
            {
                logger.Info("CEF missing");
                var dialogResult = MessageBox.Show(
                    Resources.Module_Cef_Dialog_CefMissing_Text,
                    "Gobchat",
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Warning
                    );

                if (dialogResult != DialogResult.Yes)
                {
                    handler.StopStartup = true;
                    return;
                }
            }

            try
            {
                uiSynchronizer.RunSync(() =>
                {
                    progressDisplay = new ProgressDisplayForm();
                    progressDisplay.Show();
                });

                using (var progressMonitor = new ProgressMonitorAdapter(progressDisplay))
                {
                    try
                    {
                        installer.DownloadCef(progressMonitor);
                    }
                    catch (Exception e)
                    {
                        logger.Log(LogLevel.Fatal, e, () => "CEF download failed");
                        throw;
                    }
                    try
                    {
                        installer.ExtractCef(progressMonitor);
                    }
                    catch (Exception e)
                    {
                        logger.Log(LogLevel.Fatal, e, () => "CEF extraction failed");
                        throw;
                    }
                }
            }
            catch (Exception e)
            {
                logger.Fatal("CEF installation failed");
                logger.Fatal(e);

                MessageBox.Show(
                    StringFormat.Format(Resources.Module_Cef_Dialog_InstallFailed_Text, e.Message),
                    Resources.Module_Cef_Dialog_InstallFailed_Title,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error
                    );

                handler.StopStartup = true;
            }
            finally
            {
                uiSynchronizer.RunSync(() => progressDisplay.Dispose());
            }
        }