private void OnError(string errorMessage)
 {
     if (SettingsManager.Instance.UseGUI)
     {
         // Disable proceed button.
         _differences.SetStateNext(false);
         // Show error message in gui.
         _differences.Status = errorMessage;
     }
     else if (SettingsManager.Instance.ShowProgress)
     {
         _progressScreenViewModel.ShowError(errorMessage);
     }
     else
     {
         // Write erro message to log.
         WriteLog(errorMessage);
     }
 }
        private void StartUpdate()
        {
            WriteLog(Strings.MESSAGE_START_UPDATE);

            // Instantiate gui.
            _differences = new Diff();
            _progress    = new Progress();

            // Continue update.
            SettingsManager.Instance.ContinueUpdate = false;

            // If used, set gui to initial state and register events.
            if (SettingsManager.Instance.UseGUI)
            {
                _differences.Next          += DifferencesNext;
                _differences.Finish        += DifferencesFinish;
                _differences.Cancel        += DifferencesCancel;
                _differences.ProductName    = Strings.LOADING;
                _differences.CurrentVersion = Strings.LOADING;
                _differences.NewVersion     = Strings.LOADING;
                _differences.ChangedFiles   = Strings.LOADING;
                _differences.Show();

                _progress.Cancel += ProgressCancel;
                _progress.Finish += ProgressFinish;
            }
            if (SettingsManager.Instance.ShowProgress)
            {
                _progressScreenViewModel = new ProgressScreenViewModel();
                _progressScreenViewModel.AcknowledgeError += ProgressScreenViewModelAcknowledgeError;
                _progressScreen             = new ProgressScreen();
                _progressScreen.DataContext = _progressScreenViewModel;
                _progressScreenViewModel.ShowProgress();
                _progressScreen.Show();
            }

            // Get VersionManger instance.
            _verManager = VersionsManager.Instance;

            /**
             * Get local information.
             */

            WriteLog(Strings.MESSAGE_AQUIRE_LOCAL_INFORMATION);
            // Get local version information.
            _verManager.GetLocalData();

            // If an error occours during local information gathering discontinue update
            if (!SettingsManager.Instance.ContinueUpdate && SettingsManager.Instance.ErrorPosition == ErrorPosition.Localinformation)
            {
                OnError(Strings.ERROR_GET_LOCAL);
            }

            // If update continues and gui is in use set current version and product name.
            if (SettingsManager.Instance.ContinueUpdate)
            {
                if (SettingsManager.Instance.UseGUI)
                {
                    _differences.CurrentVersion = _verManager.LocalInformation.CurrentVersion.ToString();
                    _differences.ProductName    = _verManager.LocalInformation.ProductName;
                }
            }

            /**
             * Get remote overview.
             */

            // If update continues get overview.
            if (SettingsManager.Instance.ContinueUpdate)
            {
                WriteLog(Strings.MESSAGE_AQUIRE_REMOTE_OVERIEW);
                _verManager.GetOverview();
            }

            // If fetching remote overview failed cancel information gathering and discontinue.
            if (!SettingsManager.Instance.ContinueUpdate && SettingsManager.Instance.ErrorPosition == ErrorPosition.Overview)
            {
                OnError(Strings.ERROR_GET_OVERVIEW);
            }

            // If update continues and gu is in use, set newest avaiable version number.
            if (SettingsManager.Instance.ContinueUpdate)
            {
                if (SettingsManager.Instance.UseGUI)
                {
                    _differences.NewVersion = _verManager.Overview.Versions[_verManager.Overview.Versions.Count - 1].ToString();
                }
            }

            /**
             * Get remote version information.
             */

            // If update continues get all remote versions from newest down to current local version.
            if (SettingsManager.Instance.ContinueUpdate)
            {
                if (VersionsManager.Instance.LocalInformation.CurrentVersion.ToString()
                    != VersionsManager.Instance.Overview.Versions[VersionsManager.Instance.Overview.Versions.Count - 1].ToString())
                {
                    WriteLog(Strings.MESSAGE_AQUIRE_REMOTE_INFORMATION);
                    _verManager.GetVersions(_verManager.Overview.Versions[_verManager.Overview.Versions.Count - 1].ToString());
                }
                else
                {
                    SettingsManager.Instance.NoNewVersions = true;
                    WriteLog(Strings.MESSAGE_NO_NEW_VERSION);
                }
            }

            // If error occours during version fetching cancel information gathering and discontinue.
            if (!SettingsManager.Instance.ContinueUpdate && SettingsManager.Instance.ErrorPosition == ErrorPosition.Remoteinformation)
            {
                OnError(Strings.ERROR_GET_VERSIONS);
            }

            // If update continues and gui is in use set number of files that will be changed during update or inform about no new version.
            if (SettingsManager.Instance.ContinueUpdate)
            {
                if (SettingsManager.Instance.UseGUI)
                {
                    if (SettingsManager.Instance.NoNewVersions)
                    {
                        _differences.ChangedFiles = Strings.NO_NEW_VERSION;
                    }
                    else
                    {
                        _differences.ChangedFiles = _verManager.RemoteVersions[0].Files.Count.ToString();
                    }
                }
            }

            /**
             * Enable next step in update process
             */
            if ((!SettingsManager.Instance.UseGUI && !SettingsManager.Instance.ShowProgress) && SettingsManager.Instance.ContinueUpdate &&
                !SettingsManager.Instance.NoNewVersions)
            {
                _updateResult = _userv.StartUpdate();
                EndUpdate();
            }
            else if (SettingsManager.Instance.ContinueUpdate && !SettingsManager.Instance.NoNewVersions &&
                     SettingsManager.Instance.ShowProgress)
            {
                _updateResult = _userv.StartUpdate();
                EndUpdate();
            }
            else if (SettingsManager.Instance.ContinueUpdate && !SettingsManager.Instance.NoNewVersions &&
                     SettingsManager.Instance.UseGUI)
            {
                _differences.SetStateNext(true);
            }
            else if (SettingsManager.Instance.NoNewVersions)
            {
                _userv.DeleteLocalInformations();
                EndUpdate();
            }
        }