diff --git a/Aaru.CommonTypes b/Aaru.CommonTypes index 7e16f47f8..76b70b1c7 160000 --- a/Aaru.CommonTypes +++ b/Aaru.CommonTypes @@ -1 +1 @@ -Subproject commit 7e16f47f860ec4ca3316e5ed803ec7ea79c312a3 +Subproject commit 76b70b1c75cb4bef19d7426f70247123a1ef3c06 diff --git a/Aaru.Core/Filesystems.cs b/Aaru.Core/Filesystems.cs index f71bee9ab..5d96ae157 100644 --- a/Aaru.Core/Filesystems.cs +++ b/Aaru.Core/Filesystems.cs @@ -30,8 +30,8 @@ // Copyright © 2011-2023 Natalia Portillo // ****************************************************************************/ -using System; using System.Collections.Generic; +using System.Linq; using Aaru.CommonTypes; using Aaru.CommonTypes.Interfaces; @@ -53,15 +53,9 @@ public static class Filesystems { PluginRegister plugins = PluginRegister.Singleton; - idPlugins = new List(); - - foreach(Type plugin in plugins.Filesystems.Values) - { - if(Activator.CreateInstance(plugin) is not IFilesystem fs) - continue; - - if(fs.Identify(imagePlugin, partition)) - idPlugins.Add(getGuid ? fs.Id.ToString() : fs.Name.ToLower()); - } + idPlugins = (from plugin in plugins.Filesystems.Values + where plugin is not null + where plugin.Identify(imagePlugin, partition) + select getGuid ? plugin.Id.ToString() : plugin.Name.ToLower()).ToList(); } } \ No newline at end of file diff --git a/Aaru.Core/Sidecar/BlockMedia.cs b/Aaru.Core/Sidecar/BlockMedia.cs index 825944986..eff83c3ac 100644 --- a/Aaru.Core/Sidecar/BlockMedia.cs +++ b/Aaru.Core/Sidecar/BlockMedia.cs @@ -709,14 +709,14 @@ public sealed partial class Sidecar List lstFs = new(); - foreach(Type pluginType in plugins.Filesystems.Values) + foreach(IFilesystem fs in plugins.Filesystems.Values) { try { if(_aborted) return; - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; if(!fs.Identify(image, partition)) @@ -776,14 +776,14 @@ public sealed partial class Sidecar List lstFs = new(); - foreach(Type pluginType in plugins.Filesystems.Values) + foreach(IFilesystem fs in plugins.Filesystems.Values) { try { if(_aborted) return; - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; if(!fs.Identify(image, wholePart)) diff --git a/Aaru.Core/Sidecar/OpticalDisc.cs b/Aaru.Core/Sidecar/OpticalDisc.cs index a22902316..1ba5efa05 100644 --- a/Aaru.Core/Sidecar/OpticalDisc.cs +++ b/Aaru.Core/Sidecar/OpticalDisc.cs @@ -527,7 +527,7 @@ public sealed partial class Sidecar List lstFs = new(); - foreach(Type pluginType in plugins.Filesystems.Values) + foreach(IFilesystem fs in plugins.Filesystems.Values) { try { @@ -538,7 +538,7 @@ public sealed partial class Sidecar return; } - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; if(!fs.Identify(image, partition)) @@ -590,7 +590,7 @@ public sealed partial class Sidecar Sequence = xmlTrk.Sequence.Number }; - foreach(Type pluginType in plugins.Filesystems.Values) + foreach(IFilesystem fs in plugins.Filesystems.Values) { try { @@ -601,7 +601,7 @@ public sealed partial class Sidecar return; } - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; if(!fs.Identify(image, xmlPart)) diff --git a/Aaru.Generators/PluginRegisterGenerator.cs b/Aaru.Generators/PluginRegisterGenerator.cs index c981a3f48..5bfded67b 100644 --- a/Aaru.Generators/PluginRegisterGenerator.cs +++ b/Aaru.Generators/PluginRegisterGenerator.cs @@ -135,16 +135,14 @@ public class PluginRegisterGenerator : ISourceGenerator if(fileSystems?.Count > 0) { - sb.AppendLine(" public List GetAllFilesystemPlugins() => new()"); + sb.AppendLine(" public void RegisterFilesystemPlugins(IServiceCollection services)"); sb.AppendLine(" {"); - foreach(string plugin in fileSystems) - sb.AppendLine($" typeof({plugin}),"); - - sb.AppendLine(" };"); + sb.AppendLine($" services.AddTransient();"); + sb.AppendLine(" }"); } else - sb.AppendLine(" public List GetAllFilesystemPlugins() => null;"); + sb.AppendLine(" public void RegisterFilesystemPlugins(IServiceCollection services) {}"); sb.AppendLine(); diff --git a/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs b/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs index 8af1f01e5..1dd32079c 100644 --- a/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs +++ b/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs @@ -118,17 +118,17 @@ public sealed class PluginsViewModel : ViewModelBase }); } - foreach(Type filesystem in PluginRegister.Singleton.Filesystems.Values) + foreach(IFilesystem filesystem in PluginRegister.Singleton.Filesystems.Values) { - if(Activator.CreateInstance(filesystem) is not IFilesystem fs) + if(filesystem is null) continue; Filesystems.Add(new PluginModel { - Name = fs.Name, - Uuid = fs.Id, - Version = Assembly.GetAssembly(filesystem)?.GetName().Version?.ToString(), - Author = fs.Author + Name = filesystem.Name, + Uuid = filesystem.Id, + Version = Assembly.GetAssembly(filesystem.GetType())?.GetName().Version?.ToString(), + Author = filesystem.Author }); } diff --git a/Aaru.Gui/ViewModels/Windows/MainWindowViewModel.cs b/Aaru.Gui/ViewModels/Windows/MainWindowViewModel.cs index 2f29b49ac..47694c3ef 100644 --- a/Aaru.Gui/ViewModels/Windows/MainWindowViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/MainWindowViewModel.cs @@ -651,9 +651,9 @@ public sealed class MainWindowViewModel : ViewModelBase foreach(string pluginName in idPlugins) { - if(!plugins.Filesystems.TryGetValue(pluginName, out pluginType)) + if(!plugins.Filesystems.TryGetValue(pluginName, out IFilesystem fs)) continue; - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; fs.GetInformation(imageFormat, partition, null, out string information, @@ -726,9 +726,9 @@ public sealed class MainWindowViewModel : ViewModelBase foreach(string pluginName in idPlugins) { - if(!plugins.Filesystems.TryGetValue(pluginName, out pluginType)) + if(!plugins.Filesystems.TryGetValue(pluginName, out IFilesystem fs)) continue; - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; fs.GetInformation(imageFormat, wholePart, null, out string information, diff --git a/Aaru/Commands/Filesystem/Info.cs b/Aaru/Commands/Filesystem/Info.cs index d949d4e0f..ac4d787d1 100644 --- a/Aaru/Commands/Filesystem/Info.cs +++ b/Aaru/Commands/Filesystem/Info.cs @@ -228,7 +228,7 @@ sealed class FilesystemInfoCommand : Command } List idPlugins = null; - Type pluginType; + IFilesystem fs; string information; if(partitions) @@ -309,9 +309,9 @@ sealed class FilesystemInfoCommand : Command foreach(string pluginName in idPlugins) { - if(!plugins.Filesystems.TryGetValue(pluginName, out pluginType)) + if(!plugins.Filesystems.TryGetValue(pluginName, out fs)) continue; - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; AaruConsole.WriteLine($"[bold]{string.Format(UI.As_identified_by_0, fs.Name) @@ -328,9 +328,9 @@ sealed class FilesystemInfoCommand : Command } default: { - plugins.Filesystems.TryGetValue(idPlugins[0], out pluginType); + plugins.Filesystems.TryGetValue(idPlugins[0], out fs); - if(pluginType == null || Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; AaruConsole.WriteLine($"[bold]{string.Format(UI.Identified_by_0, fs.Name)}[/]"); @@ -378,9 +378,9 @@ sealed class FilesystemInfoCommand : Command foreach(string pluginName in idPlugins) { - if(!plugins.Filesystems.TryGetValue(pluginName, out pluginType)) + if(!plugins.Filesystems.TryGetValue(pluginName, out fs)) continue; - if(Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) continue; AaruConsole.WriteLine($"[bold]{string.Format(UI.As_identified_by_0, fs.Name)}[/]"); @@ -396,9 +396,9 @@ sealed class FilesystemInfoCommand : Command } default: { - plugins.Filesystems.TryGetValue(idPlugins[0], out pluginType); + plugins.Filesystems.TryGetValue(idPlugins[0], out fs); - if(pluginType == null || Activator.CreateInstance(pluginType) is not IFilesystem fs) + if(fs is null) break; AaruConsole.WriteLine($"[bold]{string.Format(UI.Identified_by_0, fs.Name)}[/]"); @@ -416,7 +416,7 @@ sealed class FilesystemInfoCommand : Command } catch(Exception ex) { - AaruConsole.ErrorWriteLine(string.Format(UI.Error_reading_file_0, ex.Message)); + AaruConsole.ErrorWriteLine(Markup.Escape(string.Format(UI.Error_reading_file_0, ex.Message))); AaruConsole.DebugWriteLine(MODULE_NAME, ex.StackTrace); return (int)ErrorNumber.UnexpectedException; diff --git a/Aaru/Commands/Formats.cs b/Aaru/Commands/Formats.cs index 807170794..31ec61326 100644 --- a/Aaru/Commands/Formats.cs +++ b/Aaru/Commands/Formats.cs @@ -165,12 +165,15 @@ sealed class FormatsCommand : Command AaruConsole.WriteLine(); + var idOnlyFilesystems = plugins.Filesystems.Where(t => !plugins.ReadOnlyFilesystems.ContainsKey(t.Key)). + Select(t => t.Value). + Where(t => t is not null). + ToList(); + table = new Table { Title = new TableTitle(string.Format(UI.Supported_filesystems_for_identification_and_information_only_0, - plugins.Filesystems.Count(t => !t.Value.GetInterfaces(). - Contains(typeof( - IReadOnlyFilesystem))))) + idOnlyFilesystems.Count)) }; if(verbose) @@ -178,13 +181,9 @@ sealed class FormatsCommand : Command table.AddColumn(UI.Title_Filesystem); - foreach(KeyValuePair kvp in plugins.Filesystems.Where(t => !t.Value.GetInterfaces(). - Contains(typeof( - IReadOnlyFilesystem)))) - { - if(Activator.CreateInstance(kvp.Value) is not IFilesystem fs) - continue; + foreach(IFilesystem fs in idOnlyFilesystems) + { if(verbose) table.AddRow(fs.Id.ToString(), Markup.Escape(fs.Name)); else