Exemplo n.º 1
0
        /// <summary>
        /// Toggle a reporting task to the complete state
        /// </summary>
        /// <param name="exitCode">The reporter of this corresponding install step</param>
        /// <remarks>If the task reporter is null, it won't throw a NullRefrenceException</remarks>
        private void ToggleComplete(InstallerExitCodes exitCode)
        {
            switch (exitCode)
            {
            case InstallerExitCodes.BackupDataError:
            case InstallerExitCodes.ClearCacheError:
            case InstallerExitCodes.ClearLogsError:
                ToggleComplete(BackupModsReporter);
                break;

            case InstallerExitCodes.CleanModsError:
                ToggleComplete(BackupDataClearCacheClearLogsReporter);
                break;

            case InstallerExitCodes.ExtractionError:
                ToggleComplete(CleanModsReporter);
                break;

            case InstallerExitCodes.UserExtractionError:
                foreach (RelhaxInstallTaskReporter reporter in ExtractionModsReporters)
                {
                    ToggleComplete(reporter);
                }
                break;

            case InstallerExitCodes.RestoreUserdataError:
            case InstallerExitCodes.XmlUnpackError:
                ToggleComplete(ExtractionUserModsReporter);
                break;

            case InstallerExitCodes.PatchError:
                ToggleComplete(RestoreDataXmlUnpackReporter);
                break;

            case InstallerExitCodes.ShortcutsError:
                ToggleComplete(PatchReporter);
                break;

            case InstallerExitCodes.TrimDownloadCacheError:
                ToggleComplete(ShortcutsReporter);
                ToggleComplete(AtlasReporter);
                break;
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Update the advanced progress UI objects
        /// </summary>
        /// <param name="progress">The progress report object</param>
        public void OnReportAdvancedProgress(RelhaxInstallerProgress progress)
        {
            //update the internal exit code only if it's reporting a new phase
            if ((int)progress.InstallStatus > (int)lastExitCode)
            {
                //get the difference of how many steps it has advanced
                //for each step advanced, toggle the status of the previous one
                int difference = (int)progress.InstallStatus - (int)lastExitCode;
                for (int i = 0; i < difference; i++)
                {
                    InstallerExitCodes toToggle = (InstallerExitCodes)((int)lastExitCode + i);
                    ToggleComplete(toToggle);
                }
                lastExitCode = progress.InstallStatus;
            }

            //take care of active displayed tab
            if ((int)progress.InstallStatus > (int)InstallerExitCodes.UserExtractionError)
            {
                if (!MainTabControl.SelectedItem.Equals(PostInstallTab))
                {
                    MainTabControl.SelectedItem = PostInstallTab;
                }
            }
            else if ((int)progress.InstallStatus > (int)InstallerExitCodes.CleanModsError)
            {
                if (!MainTabControl.SelectedItem.Equals(ExtractionTab))
                {
                    MainTabControl.SelectedItem = ExtractionTab;
                }
            }
            else
            {
                if (!MainTabControl.SelectedItem.Equals(PreInstallTab))
                {
                    MainTabControl.SelectedItem = PreInstallTab;
                }
            }

            //report progress
            switch (progress.InstallStatus)
            {
            case InstallerExitCodes.BackupModsError:
                if (BackupModsReporter == null)
                {
                    bool isBackupMod = ModpackSettings.BackupModFolder && !ModpackSettings.ExportMode;
                    if (isBackupMod)
                    {
                        Logging.Error("BackupModFolder is true, not export mode but its task reporter is null!");
                    }
                    break;
                }

                if (BackupModsReporter.ReportState != TaskReportState.Active)
                {
                    BackupModsReporter.ReportState = TaskReportState.Active;
                }

                BackupModsReporter.TaskText = string.Format("{0}\n{1}", Translations.GetTranslatedString("installBackupMods"), progress.EntryFilename);

                if (BackupModsReporter.TaskMinimum != 0)
                {
                    BackupModsReporter.TaskMinimum = 0;
                }
                if (BackupModsReporter.TaskMaximum != progress.ParrentTotal)
                {
                    BackupModsReporter.TaskMaximum = progress.ParrentTotal;
                }
                if (BackupModsReporter.TaskValue != progress.ParrentCurrent)
                {
                    BackupModsReporter.TaskValue = progress.ParrentCurrent;
                }

                if (BackupModsReporter.SubTaskMinimum != 0)
                {
                    BackupModsReporter.SubTaskMinimum = 0;
                }
                if (BackupModsReporter.SubTaskMaximum != progress.ChildTotal)
                {
                    BackupModsReporter.SubTaskMaximum = progress.ChildTotal;
                }
                if (BackupModsReporter.SubTaskValue != progress.ChildCurrent)
                {
                    BackupModsReporter.SubTaskValue = progress.ChildCurrent;
                }
                break;

            case InstallerExitCodes.BackupDataError:
            case InstallerExitCodes.ClearCacheError:
            case InstallerExitCodes.ClearLogsError:
                if (BackupDataClearCacheClearLogsReporter == null)
                {
                    if ((ModpackSettings.SaveUserData || ModpackSettings.ClearCache || ModpackSettings.DeleteLogs) && (!ModpackSettings.ExportMode))
                    {
                        Logging.Error("Backup Data/Clear Cache/Clear Logs reporter is null and export mod is false! SaveUserData={0}, ClearCache={1}, DeleteLogs={2}",
                                      ModpackSettings.SaveUserData, ModpackSettings.ClearCache, ModpackSettings.DeleteLogs);
                    }
                    break;
                }

                if (BackupDataClearCacheClearLogsReporter.ReportState != TaskReportState.Active)
                {
                    BackupDataClearCacheClearLogsReporter.ReportState = TaskReportState.Active;
                }

                if (BackupDataClearCacheClearLogsReporter.TaskMinimum != 0)
                {
                    BackupDataClearCacheClearLogsReporter.TaskMinimum = 0;
                }
                if (BackupDataClearCacheClearLogsReporter.TaskMaximum != 4)
                {
                    BackupDataClearCacheClearLogsReporter.TaskMaximum = 4;
                }

                switch (progress.InstallStatus)
                {
                case InstallerExitCodes.BackupDataError:
                    if (BackupDataClearCacheClearLogsReporter.TaskValue != 1)
                    {
                        BackupDataClearCacheClearLogsReporter.TaskValue = 1;
                    }
                    BackupDataClearCacheClearLogsReporter.TaskText = Translations.GetTranslatedString("installBackupData");
                    break;

                case InstallerExitCodes.ClearCacheError:
                    if (BackupDataClearCacheClearLogsReporter.TaskValue != 2)
                    {
                        BackupDataClearCacheClearLogsReporter.TaskValue = 2;
                    }
                    BackupDataClearCacheClearLogsReporter.TaskText = Translations.GetTranslatedString("installClearCache");
                    break;

                case InstallerExitCodes.ClearLogsError:
                    if (BackupDataClearCacheClearLogsReporter.TaskValue != 3)
                    {
                        BackupDataClearCacheClearLogsReporter.TaskValue = 3;
                    }
                    BackupDataClearCacheClearLogsReporter.TaskText = Translations.GetTranslatedString("installClearLogs");
                    break;
                }
                break;

            case InstallerExitCodes.CleanModsError:
                if (CleanModsReporter == null)
                {
                    if (ModpackSettings.CleanInstallation || ModpackSettings.ExportMode || ModpackSettings.AutoInstall || !string.IsNullOrEmpty(CommandLineSettings.AutoInstallFileName))
                    {
                        Logging.Error("CleanModsReporter is null when it should not be! CleanInstallation={0}, ExportMode={1}, AutoInstall={2}, AutoInstallFileName={3}",
                                      ModpackSettings.CleanInstallation, ModpackSettings.ExportMode, ModpackSettings.AutoInstall, CommandLineSettings.AutoInstallFileName);
                    }
                    break;
                }

                if (CleanModsReporter.ReportState != TaskReportState.Active)
                {
                    CleanModsReporter.ReportState = TaskReportState.Active;
                }

                CleanModsReporter.TaskText = string.Format("{0}\n{1}", Translations.GetTranslatedString("installCleanMods"), progress.Filename);

                if (CleanModsReporter.TaskMinimum != 0)
                {
                    CleanModsReporter.TaskMinimum = 0;
                }
                if (CleanModsReporter.TaskMaximum != progress.ChildTotal)
                {
                    CleanModsReporter.TaskMaximum = progress.ChildTotal;
                }
                if (CleanModsReporter.TaskValue != progress.ChildCurrent)
                {
                    CleanModsReporter.TaskValue = progress.ChildCurrent;
                }
                break;

            case InstallerExitCodes.ExtractionError:
                lastRelhaxInstallerProgressExtraction = progress;
                if (ExtractionModsReporters[progress.ThreadID] == null)
                {
                    Logging.Error("Extraction reporter for thread {0} is null! ID={0}", progress.ThreadID);
                    break;
                }

                if (lastInstallGroup != (int)progress.InstallGroup)
                {
                    lastInstallGroup = (int)progress.InstallGroup;
                    for (int i = 0; i < progress.TotalThreads; i++)
                    {
                        ExtractionModsReporters[i].ReportState = TaskReportState.Inactive;
                    }
                }
                else if (ExtractionModsReporters[progress.ThreadID].ReportState != TaskReportState.Active)
                {
                    ExtractionModsReporters[progress.ThreadID].ReportState = TaskReportState.Active;
                }

                StringBuilder builder = new StringBuilder();

                if (progress.TotalPackagesofAThread == null || progress.CompletedPackagesOfAThread == null)
                {
                    builder.AppendFormat("{0} {1} {2} {3} \n", Translations.GetTranslatedString("installExtractingMods"), Translations.GetTranslatedString("of"),
                                         Translations.GetTranslatedString("installExtractingOfGroup"), progress.InstallGroup);
                }
                else
                {
                    uint comp = progress.CompletedPackagesOfAThread[progress.ThreadID] > 0 ? progress.CompletedPackagesOfAThread[progress.ThreadID] : 1;
                    builder.AppendFormat("{0} {1} {2} {3} {4} {5}\n", Translations.GetTranslatedString("installExtractingMods"), comp,
                                         Translations.GetTranslatedString("of"), progress.TotalPackagesofAThread[progress.ThreadID], Translations.GetTranslatedString("installExtractingOfGroup"),
                                         progress.InstallGroup);
                }

                if (progress.WaitingOnDownloadsOfAThread != null && progress.WaitingOnDownloadsOfAThread[progress.ThreadID])
                {
                    if (ExtractionModsReporters[progress.ThreadID].ReportState == TaskReportState.Inactive)
                    {
                        ExtractionModsReporters[progress.ThreadID].ReportState = TaskReportState.Active;
                    }
                }
                else
                {
                    if (progress.FilenameOfAThread != null)
                    {
                        builder.AppendFormat("{0}\n", Path.GetFileName(progress.FilenameOfAThread[progress.ThreadID]));
                    }

                    if (progress.EntriesProcessedOfAThread != null && progress.EntriesTotalOfAThread != null)
                    {
                        uint compp = progress.EntriesProcessedOfAThread[progress.ThreadID] > 0 ? progress.EntriesProcessedOfAThread[progress.ThreadID] : 1;
                        builder.AppendFormat("{0} {1} {2} {3}\n", Translations.GetTranslatedString("installZipFileEntry"), compp,
                                             Translations.GetTranslatedString("of"), progress.EntriesTotalOfAThread[progress.ThreadID]);

                        if (ExtractionModsReporters[progress.ThreadID].TaskMinimum != 0)
                        {
                            ExtractionModsReporters[progress.ThreadID].TaskMinimum = 0;
                        }
                        if (ExtractionModsReporters[progress.ThreadID].TaskMaximum != (int)progress.EntriesTotalOfAThread[progress.ThreadID])
                        {
                            ExtractionModsReporters[progress.ThreadID].TaskMaximum = (int)progress.EntriesTotalOfAThread[progress.ThreadID];
                        }
                        if (ExtractionModsReporters[progress.ThreadID].TaskValue != (int)progress.EntriesProcessedOfAThread[progress.ThreadID])
                        {
                            ExtractionModsReporters[progress.ThreadID].TaskValue = (int)progress.EntriesProcessedOfAThread[progress.ThreadID];
                        }
                    }

                    if (progress.EntryFilenameOfAThread != null)
                    {
                        builder.AppendFormat("{0}\n", progress.EntryFilenameOfAThread[progress.ThreadID]);
                    }
                }

                if (progress.BytesProcessedOfAThread != null && progress.BytesTotalOfAThread != null)
                {
                    if (ExtractionModsReporters[progress.ThreadID].SubTaskMinimum != 0)
                    {
                        ExtractionModsReporters[progress.ThreadID].SubTaskMinimum = 0;
                    }
                    if (ExtractionModsReporters[progress.ThreadID].SubTaskMaximum != (int)progress.BytesTotalOfAThread[progress.ThreadID])
                    {
                        ExtractionModsReporters[progress.ThreadID].SubTaskMaximum = (int)progress.BytesTotalOfAThread[progress.ThreadID];
                    }
                    if (ExtractionModsReporters[progress.ThreadID].SubTaskValue != (int)progress.BytesProcessedOfAThread[progress.ThreadID])
                    {
                        ExtractionModsReporters[progress.ThreadID].SubTaskValue = (int)progress.BytesProcessedOfAThread[progress.ThreadID];
                    }
                }

                ExtractionModsReporters[progress.ThreadID].TaskText = builder.ToString();
                break;

            case InstallerExitCodes.UserExtractionError:
                if (ExtractionUserModsReporter == null)
                {
                    if (ShouldUserInstallBeCalled)
                    {
                        Logging.Error("ExtractionUserModsReporter is null when user has mods to extract!");
                    }
                    break;
                }

                if (ExtractionUserModsReporter.ReportState != TaskReportState.Active)
                {
                    ExtractionUserModsReporter.ReportState = TaskReportState.Active;
                }

                ExtractionUserModsReporter.TaskText = string.Format("{0}\n{1}\n{2}",
                                                                    Path.GetFileName(progress.Filename),
                                                                    string.Format("{0} {1} {2}", (progress.EntriesProcessed > 0? progress.EntriesProcessed : 1), Translations.GetTranslatedString("of"), progress.EntriesTotal),
                                                                    progress.EntryFilename);
                break;

            case InstallerExitCodes.RestoreUserdataError:
            case InstallerExitCodes.XmlUnpackError:
                if (progress.ParrentTotal == 0)
                {
                    break;
                }
                if (RestoreDataXmlUnpackReporter == null)
                {
                    RestoreDataXmlUnpackReporter = new RelhaxInstallTaskReporter(nameof(RestoreDataXmlUnpackReporter))
                    {
                        IsSubProgressActive = true,
                        TaskTitle           = progress.InstallStatus == InstallerExitCodes.RestoreUserdataError ?
                                              Translations.GetTranslatedString("AdvancedInstallRestoreData") : Translations.GetTranslatedString("AdvancedInstallXmlUnpack"),
                        ReportState      = TaskReportState.Active,
                        TaskMaximum      = 3,
                        TaskMinimum      = 0,
                        LoadedAfterApply = true
                    };
                    PostInstallPanel.Children.Add(RestoreDataXmlUnpackReporter);
                }

                switch (progress.InstallStatus)
                {
                case InstallerExitCodes.RestoreUserdataError:
                    if (RestoreDataXmlUnpackReporter.TaskValue != 1)
                    {
                        RestoreDataXmlUnpackReporter.TaskValue = 1;
                    }
                    RestoreDataXmlUnpackReporter.TaskText = string.Format("{0} {1} {2} {3}\n{4}", Translations.GetTranslatedString("installRestoreUserdata"),
                                                                          ((progress.ParrentCurrent) > 0? progress.ParrentCurrent : 1).ToString(), Translations.GetTranslatedString("of"), progress.ParrentTotal.ToString(), progress.Filename);
                    break;

                case InstallerExitCodes.XmlUnpackError:
                    if (RestoreDataXmlUnpackReporter.TaskValue != 2)
                    {
                        RestoreDataXmlUnpackReporter.TaskValue = 2;
                    }
                    RestoreDataXmlUnpackReporter.TaskText = string.Format("{0} {1} {2} {3}\n{4}", Translations.GetTranslatedString("installXmlUnpack"),
                                                                          ((progress.ParrentCurrent) > 0? progress.ParrentCurrent : 1).ToString(), Translations.GetTranslatedString("of"), progress.ParrentTotal.ToString(), progress.Filename);
                    break;
                }

                if (RestoreDataXmlUnpackReporter.SubTaskMinimum != 0)
                {
                    RestoreDataXmlUnpackReporter.SubTaskMinimum = 0;
                }
                if (RestoreDataXmlUnpackReporter.SubTaskMaximum != progress.ParrentTotal)
                {
                    RestoreDataXmlUnpackReporter.SubTaskMaximum = progress.ParrentTotal;
                }
                if (RestoreDataXmlUnpackReporter.SubTaskValue != progress.ParrentCurrent)
                {
                    RestoreDataXmlUnpackReporter.SubTaskValue = progress.ParrentCurrent;
                }

                break;

            case InstallerExitCodes.PatchError:
                if (progress.ParrentTotal == 0)
                {
                    break;
                }
                if (PatchReporter == null)
                {
                    PatchReporter = new RelhaxInstallTaskReporter(nameof(PatchReporter))
                    {
                        IsSubProgressActive = false,
                        TaskTitle           = Translations.GetTranslatedString("AdvancedInstallPatchFiles"),
                        ReportState         = TaskReportState.Active,
                        LoadedAfterApply    = true
                    };
                    PostInstallPanel.Children.Add(PatchReporter);
                }

                PatchReporter.TaskText = string.Format("{0} {1} {2} {3}\n{4}", Translations.GetTranslatedString("installPatchFiles"), ((progress.ParrentCurrent) > 0? progress.ParrentCurrent : 1).ToString(),
                                                       Translations.GetTranslatedString("of"), progress.ParrentTotal.ToString(), progress.Filename);

                if (PatchReporter.TaskMinimum != 0)
                {
                    PatchReporter.TaskMinimum = 0;
                }
                if (PatchReporter.TaskMaximum != progress.ParrentTotal)
                {
                    PatchReporter.TaskMaximum = progress.ParrentTotal;
                }
                if (PatchReporter.TaskValue != progress.ParrentCurrent)
                {
                    PatchReporter.TaskValue = progress.ParrentCurrent;
                }

                break;

            case InstallerExitCodes.ShortcutsError:
                if (!ModpackSettings.CreateShortcuts)
                {
                    break;
                }
                if (progress.ParrentTotal == 0)
                {
                    break;
                }
                if (ShortcutsReporter == null)
                {
                    ShortcutsReporter = new RelhaxInstallTaskReporter(nameof(ShortcutsReporter))
                    {
                        IsSubProgressActive = false,
                        TaskTitle           = Translations.GetTranslatedString("AdvancedInstallPatchFiles"),
                        ReportState         = TaskReportState.Active,
                        LoadedAfterApply    = true
                    };
                    PostInstallPanel.Children.Add(ShortcutsReporter);
                }

                ShortcutsReporter.TaskText = string.Format("{0} {1} {2} {3}\n{4}", Translations.GetTranslatedString("AdvancedInstallCreateShortcuts"), ((progress.ParrentCurrent) > 0? progress.ParrentCurrent : 1).ToString(),
                                                           Translations.GetTranslatedString("of"), progress.ParrentTotal.ToString(), progress.Filename);

                if (ShortcutsReporter.TaskMinimum != 0)
                {
                    ShortcutsReporter.TaskMinimum = 0;
                }
                if (ShortcutsReporter.TaskMaximum != progress.ParrentTotal)
                {
                    ShortcutsReporter.TaskMaximum = progress.ParrentTotal;
                }
                if (ShortcutsReporter.TaskValue != progress.ParrentCurrent)
                {
                    ShortcutsReporter.TaskValue = progress.ParrentCurrent;
                }

                break;

            case InstallerExitCodes.ContourIconAtlasError:
                if (AtlasReporter == null && progress.ParrentTotal > 0)
                {
                    AtlasReporter = new RelhaxInstallTaskReporter(nameof(AtlasReporter))
                    {
                        IsSubProgressActive = true,
                        TaskTitle           = Translations.GetTranslatedString("AdvancedInstallCreateAtlas"),
                        ReportState         = TaskReportState.Active,
                        LoadedAfterApply    = true
                    };
                    PostInstallPanel.Children.Add(AtlasReporter);
                }

                StringBuilder sb = new StringBuilder();
                sb.AppendFormat("{0} {1} {2} {3}\n", Translations.GetTranslatedString("installContourIconAtlas"), ((progress.ParrentCurrent) > 0? progress.ParrentCurrent : 1).ToString(),
                                Translations.GetTranslatedString("of"), progress.ParrentTotal.ToString());
                sb.AppendFormat("{0} {1} {2} {3}\n", progress.ChildCurrent.ToString(), Translations.GetTranslatedString("of"), progress.ChildTotal.ToString(),
                                Translations.GetTranslatedString("stepsComplete"));

                if (AtlasReporter.TaskMinimum != 0)
                {
                    AtlasReporter.TaskMinimum = 0;
                }
                if (AtlasReporter.TaskMaximum != progress.ParrentTotal)
                {
                    AtlasReporter.TaskMaximum = progress.ParrentTotal;
                }
                if (AtlasReporter.TaskValue != progress.ParrentCurrent)
                {
                    AtlasReporter.TaskValue = progress.ParrentCurrent;
                }

                if (AtlasReporter.SubTaskMinimum != 0)
                {
                    AtlasReporter.SubTaskMinimum = 0;
                }
                if (AtlasReporter.SubTaskMaximum != progress.ChildTotal)
                {
                    AtlasReporter.SubTaskMaximum = progress.ChildTotal;
                }
                if (AtlasReporter.SubTaskValue != progress.ChildCurrent)
                {
                    AtlasReporter.SubTaskValue = progress.ChildCurrent;
                }

                AtlasReporter.TaskText = sb.ToString();
                break;

            case InstallerExitCodes.FontInstallError:
            case InstallerExitCodes.TrimDownloadCacheError:
            case InstallerExitCodes.CleanupError:
                if (FontInstallTrimDownloadCacheCleanupReporter == null)
                {
                    FontInstallTrimDownloadCacheCleanupReporter = new RelhaxInstallTaskReporter(nameof(FontInstallTrimDownloadCacheCleanupReporter))
                    {
                        IsSubProgressActive = false,
                        ReportState         = TaskReportState.Active,
                        LoadedAfterApply    = true
                    };
                    PostInstallPanel.Children.Add(FontInstallTrimDownloadCacheCleanupReporter);
                }

                if (FontInstallTrimDownloadCacheCleanupReporter.TaskMinimum != 0)
                {
                    FontInstallTrimDownloadCacheCleanupReporter.TaskMinimum = 0;
                }
                if (FontInstallTrimDownloadCacheCleanupReporter.TaskMaximum != 4)
                {
                    FontInstallTrimDownloadCacheCleanupReporter.TaskMaximum = 4;
                }

                switch (progress.InstallStatus)
                {
                case InstallerExitCodes.FontInstallError:
                    if (FontInstallTrimDownloadCacheCleanupReporter.TaskValue != 1)
                    {
                        FontInstallTrimDownloadCacheCleanupReporter.TaskValue = 1;
                    }
                    FontInstallTrimDownloadCacheCleanupReporter.TaskText = Translations.GetTranslatedString("AdvancedInstallInstallFonts");
                    break;

                case InstallerExitCodes.TrimDownloadCacheError:
                    if (FontInstallTrimDownloadCacheCleanupReporter.TaskValue != 2)
                    {
                        FontInstallTrimDownloadCacheCleanupReporter.TaskValue = 2;
                    }
                    FontInstallTrimDownloadCacheCleanupReporter.TaskText = Translations.GetTranslatedString("AdvancedInstallTrimDownloadCache");
                    break;

                case InstallerExitCodes.CleanupError:
                    if (FontInstallTrimDownloadCacheCleanupReporter.TaskValue != 3)
                    {
                        FontInstallTrimDownloadCacheCleanupReporter.TaskValue = 3;
                    }
                    FontInstallTrimDownloadCacheCleanupReporter.TaskText = Translations.GetTranslatedString("AdvancedInstallCleanup");
                    break;
                }
                break;
            }
        }