diff --git a/Aaru.Localization/UI.Designer.cs b/Aaru.Localization/UI.Designer.cs index ecfecf032..c64f91823 100644 --- a/Aaru.Localization/UI.Designer.cs +++ b/Aaru.Localization/UI.Designer.cs @@ -167,6 +167,24 @@ namespace Aaru.Localization { } } + /// + /// Looks up a localized string similar to Archive format identified by {0} ({1}).. + /// + public static string Archive_format_identified_by_0_1 { + get { + return ResourceManager.GetString("Archive_format_identified_by_0_1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Archive format not identified.. + /// + public static string Archive_format_not_identified { + get { + return ResourceManager.GetString("Archive_format_not_identified", resourceCulture); + } + } + /// /// Looks up a localized string similar to Identifies an archive file and shows information about it.. /// @@ -3817,6 +3835,15 @@ namespace Aaru.Localization { } } + /// + /// Looks up a localized string similar to Identifying archive format.... + /// + public static string Identifying_archive_format { + get { + return ResourceManager.GetString("Identifying_archive_format", resourceCulture); + } + } + /// /// Looks up a localized string similar to Identifying file filter.... /// @@ -5159,6 +5186,15 @@ namespace Aaru.Localization { } } + /// + /// Looks up a localized string similar to Obtaining archive information.... + /// + public static string Obtaining_archive_information { + get { + return ResourceManager.GetString("Obtaining_archive_information", resourceCulture); + } + } + /// /// Looks up a localized string similar to Opening device.... /// @@ -8347,6 +8383,15 @@ namespace Aaru.Localization { } } + /// + /// Looks up a localized string similar to Unable to get information about archive.... + /// + public static string Unable_to_get_information_about_archive { + get { + return ResourceManager.GetString("Unable_to_get_information_about_archive", resourceCulture); + } + } + /// /// Looks up a localized string similar to Unable to mount volume, error {0}. /// diff --git a/Aaru.Localization/UI.resx b/Aaru.Localization/UI.resx index 647c2f741..60cf6ac1e 100644 --- a/Aaru.Localization/UI.resx +++ b/Aaru.Localization/UI.resx @@ -3014,4 +3014,19 @@ Do you want to continue? Registering plugins... + + Identifying archive format... + + + Archive format not identified. + + + Archive format identified by {0} ({1}). + + + Obtaining archive information... + + + Unable to get information about archive... + \ No newline at end of file diff --git a/Aaru/Commands/Archive/Info.cs b/Aaru/Commands/Archive/Info.cs index 1fb3f6649..2757ba701 100644 --- a/Aaru/Commands/Archive/Info.cs +++ b/Aaru/Commands/Archive/Info.cs @@ -34,7 +34,10 @@ using System; using System.CommandLine; using System.CommandLine.NamingConventionBinder; +using System.Text; +using Aaru.CommonTypes; using Aaru.CommonTypes.Enums; +using Aaru.CommonTypes.Interfaces; using Aaru.Console; using Aaru.Core; using Aaru.Localization; @@ -55,10 +58,16 @@ sealed class ArchiveInfoCommand : Command Name = "archive-path" }); + Add(new Option(new[] + { + "--encoding", "-e" + }, () => null, UI.Name_of_character_encoding_to_use)); + + Handler = CommandHandler.Create(GetType().GetMethod(nameof(Invoke)) ?? throw new NullReferenceException()); } - public static int Invoke(bool debug, bool verbose, string imagePath) + public static int Invoke(bool debug, bool verbose, string archivePath, string encoding) { MainClass.PrintCopyright(); @@ -91,11 +100,93 @@ sealed class ArchiveInfoCommand : Command Statistics.AddCommand("archive-info"); - AaruConsole.DebugWriteLine(MODULE_NAME, "--debug={0}", debug); - AaruConsole.DebugWriteLine(MODULE_NAME, "--input={0}", imagePath); - AaruConsole.DebugWriteLine(MODULE_NAME, "--verbose={0}", verbose); + AaruConsole.DebugWriteLine(MODULE_NAME, "--debug={0}", debug); + AaruConsole.DebugWriteLine(MODULE_NAME, "--input={0}", archivePath); + AaruConsole.DebugWriteLine(MODULE_NAME, "--verbose={0}", verbose); + AaruConsole.DebugWriteLine(MODULE_NAME, "--encoding={0}", encoding); - /* TODO: This is just a stub for now */ + IFilter inputFilter = null; + + Core.Spectre.ProgressSingleSpinner(ctx => + { + ctx.AddTask(UI.Identifying_file_filter).IsIndeterminate(); + inputFilter = PluginRegister.Singleton.GetFilter(archivePath); + }); + + if(inputFilter == null) + { + AaruConsole.ErrorWriteLine(UI.Cannot_open_specified_file); + + return (int)ErrorNumber.CannotOpenFile; + } + + Encoding encodingClass = null; + + if(encoding != null) + { + try + { + encodingClass = Claunia.Encoding.Encoding.GetEncoding(encoding); + + if(verbose) + AaruConsole.VerboseWriteLine(UI.encoding_for_0, encodingClass.EncodingName); + } + catch(ArgumentException) + { + AaruConsole.ErrorWriteLine(UI.Specified_encoding_is_not_supported); + + return (int)ErrorNumber.EncodingUnknown; + } + } + + try + { + IArchive archiveFormat = null; + + Core.Spectre.ProgressSingleSpinner(ctx => + { + ctx.AddTask(UI.Identifying_archive_format).IsIndeterminate(); + archiveFormat = ArchiveFormat.Detect(inputFilter); + }); + + if(archiveFormat == null) + { + AaruConsole.WriteLine(UI.Archive_format_not_identified); + + return (int)ErrorNumber.UnrecognizedFormat; + } + + AaruConsole.WriteLine(UI.Archive_format_identified_by_0_1, archiveFormat.Name, archiveFormat.Id); + AaruConsole.WriteLine(); + + try + { + Core.Spectre.ProgressSingleSpinner(ctx => + { + ctx.AddTask(UI.Obtaining_archive_information).IsIndeterminate(); + ArchiveInfo.PrintArchiveInfo(archiveFormat, inputFilter, encodingClass); + }); + + // TODO: Implement + //Statistics.AddArchiveFormat(archiveFormat.Format); + Statistics.AddFilter(inputFilter.Name); + } + catch(Exception ex) + { + AaruConsole.ErrorWriteLine(UI.Unable_to_get_information_about_archive); + AaruConsole.ErrorWriteLine(Localization.Core.Error_0, ex.Message); + AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Core.Stack_trace_0, ex.StackTrace); + + return (int)ErrorNumber.CannotOpenFormat; + } + } + catch(Exception ex) + { + AaruConsole.ErrorWriteLine(string.Format(UI.Error_reading_file_0, ex.Message)); + AaruConsole.DebugWriteLine(MODULE_NAME, ex.StackTrace); + + return (int)ErrorNumber.UnexpectedException; + } return (int)ErrorNumber.NoError; }