diff --git a/Aaru.CommonTypes b/Aaru.CommonTypes index e0035dbda..fe941cd48 160000 --- a/Aaru.CommonTypes +++ b/Aaru.CommonTypes @@ -1 +1 @@ -Subproject commit e0035dbda64ad8bc2b57ff355513536bfe7b6fa3 +Subproject commit fe941cd4811b11d83db6690e7492555daf9657c6 diff --git a/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs b/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs index b990378a4..684e3ca49 100644 --- a/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs +++ b/Aaru.Gui/ViewModels/Dialogs/PluginsViewModel.cs @@ -145,9 +145,9 @@ public sealed class PluginsViewModel : ViewModelBase Author = writableFloppyImage.Author }); - foreach(IBaseWritableImage baseWritableImage in GetPluginBase.Instance.WritableImages.Values) + foreach(Type baseWritableImageType in GetPluginBase.Instance.WritableImages.Values) { - if(baseWritableImage is not IWritableImage writableImage) + if(Activator.CreateInstance(baseWritableImageType) is not IWritableImage writableImage) continue; WritableImages.Add(new PluginModel diff --git a/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs b/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs index bb7c70afc..81faefee0 100644 --- a/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs @@ -202,14 +202,17 @@ public sealed class ImageConvertViewModel : ViewModelBase PluginBase plugins = GetPluginBase.Instance; - foreach(IWritableImage plugin in plugins.WritableImages.Values. - Where(p => p.SupportedMediaTypes.Contains(inputFormat.Info.MediaType)). - Select(baseWritableImage => baseWritableImage as IWritableImage). - Where(plugin => plugin is not null)) - PluginsList.Add(new ImagePluginModel - { - Plugin = plugin - }); + foreach(Type pluginType in plugins.WritableImages.Values) + { + if(Activator.CreateInstance(pluginType) is not IWritableImage plugin) + continue; + + if(plugin.SupportedMediaTypes.Contains(inputFormat.Info.MediaType)) + PluginsList.Add(new ImagePluginModel + { + Plugin = plugin + }); + } AaruMetadataFromImageVisible = inputFormat.AaruMetadata != null; ResumeFileFromImageVisible = inputFormat.DumpHardware?.Any() == true; diff --git a/Aaru.Gui/ViewModels/Windows/MediaDumpViewModel.cs b/Aaru.Gui/ViewModels/Windows/MediaDumpViewModel.cs index cbcfe72d9..66f165282 100644 --- a/Aaru.Gui/ViewModels/Windows/MediaDumpViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/MediaDumpViewModel.cs @@ -168,12 +168,17 @@ public sealed class MediaDumpViewModel : ViewModelBase PluginBase plugins = GetPluginBase.Instance; - foreach(IWritableImage plugin in - plugins.WritableImages.Values.Where(p => p.SupportedMediaTypes.Contains(mediaType))) - PluginsList.Add(new ImagePluginModel - { - Plugin = plugin - }); + foreach(Type pluginType in plugins.WritableImages.Values) + { + if(Activator.CreateInstance(pluginType) is not IWritableImage plugin) + continue; + + if(plugin.SupportedMediaTypes.Contains(mediaType)) + PluginsList.Add(new ImagePluginModel + { + Plugin = plugin + }); + } Encodings.AddRange(Encoding.GetEncodings().Select(info => new EncodingModel { diff --git a/Aaru/Commands/Formats.cs b/Aaru/Commands/Formats.cs index 618d8d649..447ae6ee2 100644 --- a/Aaru/Commands/Formats.cs +++ b/Aaru/Commands/Formats.cs @@ -145,11 +145,16 @@ sealed class FormatsCommand : Command table.AddColumn(UI.Title_Media_image_format); - foreach(KeyValuePair kvp in plugins.WritableImages) + foreach(KeyValuePair kvp in plugins.WritableImages) + { + if(Activator.CreateInstance(kvp.Value) is not IBaseWritableImage plugin) + continue; + if(verbose) - table.AddRow(kvp.Value.Id.ToString(), Markup.Escape(kvp.Value.Name)); + table.AddRow(plugin.Id.ToString(), Markup.Escape(plugin.Name)); else - table.AddRow(Markup.Escape(kvp.Value.Name)); + table.AddRow(Markup.Escape(plugin.Name)); + } AnsiConsole.Write(table); diff --git a/Aaru/Commands/Image/Convert.cs b/Aaru/Commands/Image/Convert.cs index 3a47304ae..1272acda9 100644 --- a/Aaru/Commands/Image/Convert.cs +++ b/Aaru/Commands/Image/Convert.cs @@ -520,19 +520,24 @@ sealed class ConvertImageCommand : Command // Try extension if(string.IsNullOrEmpty(format)) - candidates.AddRange(plugins.WritableImages.Values.Where(t => - t.KnownExtensions. - Contains(Path.GetExtension(outputPath)))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null + where plugin.KnownExtensions.Contains(Path.GetExtension(outputPath)) select plugin); // Try Id else if(Guid.TryParse(format, out Guid outId)) - candidates.AddRange(plugins.WritableImages.Values.Where(t => t.Id.Equals(outId))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null where plugin.Id.Equals(outId) select plugin); // Try name else - candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, - StringComparison. - InvariantCultureIgnoreCase))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null + where plugin.Name.Equals(format, StringComparison.InvariantCultureIgnoreCase) + select plugin); switch(candidates.Count) { diff --git a/Aaru/Commands/Image/Options.cs b/Aaru/Commands/Image/Options.cs index 67155882a..bb8f70431 100644 --- a/Aaru/Commands/Image/Options.cs +++ b/Aaru/Commands/Image/Options.cs @@ -88,17 +88,20 @@ sealed class ListOptionsCommand : Command AaruConsole.WriteLine(UI.Read_Write_media_images_options); - foreach(KeyValuePair kvp in plugins.WritableImages) + foreach(KeyValuePair kvp in plugins.WritableImages) { + if(Activator.CreateInstance(kvp.Value) is not IBaseWritableImage plugin) + continue; + List<(string name, Type type, string description, object @default)> options = - kvp.Value.SupportedOptions.ToList(); + plugin.SupportedOptions.ToList(); if(options.Count == 0) continue; var table = new Table { - Title = new TableTitle(string.Format(UI.Options_for_0, kvp.Value.Name)) + Title = new TableTitle(string.Format(UI.Options_for_0, plugin.Name)) }; table.AddColumn(UI.Title_Name); diff --git a/Aaru/Commands/Media/Dump.cs b/Aaru/Commands/Media/Dump.cs index c9fc33c07..5650fa5ec 100644 --- a/Aaru/Commands/Media/Dump.cs +++ b/Aaru/Commands/Media/Dump.cs @@ -370,17 +370,24 @@ sealed class DumpMediaCommand : Command // Try extension if(string.IsNullOrEmpty(format)) - candidates.AddRange(plugins.WritableImages.Values.Where(t => t.KnownExtensions.Contains(extension))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null where plugin.KnownExtensions.Contains(extension) + select plugin); // Try Id else if(Guid.TryParse(format, out Guid outId)) - candidates.AddRange(plugins.WritableImages.Values.Where(t => t.Id.Equals(outId))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null where plugin.Id.Equals(outId) select plugin); // Try name else - candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, - StringComparison. - InvariantCultureIgnoreCase))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null + where plugin.Name.Equals(format, StringComparison.InvariantCultureIgnoreCase) + select plugin); switch(candidates.Count) { @@ -569,7 +576,7 @@ sealed class DumpMediaCommand : Command if(File.Exists(cicmXml)) try { - var sr = new StreamReader(cicmXml); + var sr = new StreamReader(cicmXml); // Bypassed by JSON source generator used above #pragma warning disable IL2026 @@ -607,19 +614,24 @@ sealed class DumpMediaCommand : Command // Try extension if(string.IsNullOrEmpty(format)) - candidates.AddRange(plugins.WritableImages.Values.Where(t => - t.KnownExtensions. - Contains(Path.GetExtension(outputPath)))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null + where plugin.KnownExtensions.Contains(Path.GetExtension(outputPath)) select plugin); // Try Id else if(Guid.TryParse(format, out Guid outId)) - candidates.AddRange(plugins.WritableImages.Values.Where(t => t.Id.Equals(outId))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null where plugin.Id.Equals(outId) select plugin); // Try name else - candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, - StringComparison. - InvariantCultureIgnoreCase))); + candidates.AddRange(from pluginType in plugins.WritableImages.Values + select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin + where plugin is not null + where plugin.Name.Equals(format, StringComparison.InvariantCultureIgnoreCase) + select plugin); IBaseWritableImage outputFormat = candidates[0];