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;
}