private static BuildEraFileResult BuildEraFile(BuildEraFileParameters args)
        {
            var result = BuildEraFileResult.Error;

            using (var builder = new KSoft.Phoenix.Resource.EraFileBuilder(args.ListingPath))
            {
                builder.Options        = args.EraOptions;
                builder.BuilderOptions = args.EraBuilderOptions;
                builder.VerboseOutput  = args.VerboseOutput;

                do
                {
                    if (!builder.Read())
                    {
                        result = BuildEraFileResult.ReadFailed;
                        break;
                    }

                    if (!builder.Build(args.AssetsPath, args.EraName, args.OutputPath))
                    {
                        result = BuildEraFileResult.BuildFailed;
                        break;
                    }

                    result = BuildEraFileResult.Success;
                } while (false);
            }

            return(result);
        }
        private void ProcessEraListing(string eraListing)
        {
            if (!System.IO.Directory.Exists(Properties.Settings.Default.EraBuildOutputPath))
            {
                MessagesText = "Cannot expand ERA file(s)\n" +
                               "Specify a valid expand output path";
                return;
            }

            ClearMessages();
            IsProcessing = true;

            var args = new BuildEraFileParameters(Flags.Test(MiscFlags.UseVerboseOutput));

            if (Properties.Settings.Default.GameVersion == GameVersionType.DefinitiveEdition)
            {
                args.EraOptions.Set(KSoft.Phoenix.Resource.EraFileUtilOptions.x64);
            }
            if (Flags.Test(MiscFlags.SkipVerification))
            {
                args.EraOptions.Set(KSoft.Phoenix.Resource.EraFileUtilOptions.SkipVerification);
            }
            args.EraBuilderOptions.Set(KSoft.Phoenix.Resource.EraFileBuilderOptions.Encrypt);

            if (Flags.Test(MiscFlags.AlwaysUseXmlOverXmb))
            {
                args.EraBuilderOptions.Set(KSoft.Phoenix.Resource.EraFileBuilderOptions.AlwaysUseXmlOverXmb);
            }

            args.AssetsPath  = System.IO.Path.GetDirectoryName(eraListing);
            args.OutputPath  = Properties.Settings.Default.EraBuildOutputPath;
            args.ListingPath = eraListing;
            args.EraName     = System.IO.Path.GetFileNameWithoutExtension(eraListing);

            StatusText = string.Format("Building {0}.era",
                                       args.EraName);

            var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
            var task      = Task.Run(() =>
            {
                return(BuildEraFile(args));
            });

            task.ContinueWith(t =>
            {
                string message_text   = "";
                string verbose_output = args.GetVerboseOutput();

                if (t.IsFaulted || t.Result != BuildEraFileResult.Success)
                {
                    bool verbose = Flags.Test(MiscFlags.UseVerboseOutput);

                    string error_type;
                    string error_hint;
                    if (t.IsFaulted)
                    {
                        error_type = "EXCEPTION";

                        var e      = t.Exception.GetOnlyExceptionOrAll();
                        error_hint = verbose
                                                        ? e.ToVerboseString()
                                                        : e.ToBasicString();
                    }
                    else
                    {
                        error_type = "FAILED";
                        switch (t.Result)
                        {
                        case BuildEraFileResult.Error:
                            error_hint = "NO HINT";
                            break;

                        case BuildEraFileResult.ReadFailed:
                            error_hint = "Failed reading or initializing .ERADEF data";
                            break;

                        case BuildEraFileResult.BuildFailed:
                            error_hint = "Failed building archive (invalid files?). See PhxGui.log for possible details";
                            break;

                        default:
                            error_hint = "UNKNOWN";
                            break;
                        }
                    }
                    message_text += string.Format("Build {0} {1}{2}{3}",
                                                  error_type,
                                                  args.ListingPath, Environment.NewLine, error_hint);
                }

                if (!string.IsNullOrEmpty(verbose_output))
                {
                    message_text = string.Format("VerboseOutput:{0}{1}{2}" + "{3}{4}",
                                                 Environment.NewLine,
                                                 args.VerboseOutput.GetStringBuilder(), Environment.NewLine,
                                                 message_text, Environment.NewLine);
                }
                if (!string.IsNullOrEmpty(message_text))
                {
                    MessagesText += message_text;
                }

                FinishProcessing();
            }, scheduler);
        }