Use Type for writable media image plugin list.

This commit is contained in:
2022-12-17 19:50:32 +00:00
parent 067370bc62
commit d59cbb56e1
8 changed files with 76 additions and 43 deletions

View File

@@ -145,9 +145,9 @@ public sealed class PluginsViewModel : ViewModelBase
Author = writableFloppyImage.Author 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; continue;
WritableImages.Add(new PluginModel WritableImages.Add(new PluginModel

View File

@@ -202,14 +202,17 @@ public sealed class ImageConvertViewModel : ViewModelBase
PluginBase plugins = GetPluginBase.Instance; PluginBase plugins = GetPluginBase.Instance;
foreach(IWritableImage plugin in plugins.WritableImages.Values. foreach(Type pluginType in plugins.WritableImages.Values)
Where(p => p.SupportedMediaTypes.Contains(inputFormat.Info.MediaType)). {
Select(baseWritableImage => baseWritableImage as IWritableImage). if(Activator.CreateInstance(pluginType) is not IWritableImage plugin)
Where(plugin => plugin is not null)) continue;
if(plugin.SupportedMediaTypes.Contains(inputFormat.Info.MediaType))
PluginsList.Add(new ImagePluginModel PluginsList.Add(new ImagePluginModel
{ {
Plugin = plugin Plugin = plugin
}); });
}
AaruMetadataFromImageVisible = inputFormat.AaruMetadata != null; AaruMetadataFromImageVisible = inputFormat.AaruMetadata != null;
ResumeFileFromImageVisible = inputFormat.DumpHardware?.Any() == true; ResumeFileFromImageVisible = inputFormat.DumpHardware?.Any() == true;

View File

@@ -168,12 +168,17 @@ public sealed class MediaDumpViewModel : ViewModelBase
PluginBase plugins = GetPluginBase.Instance; PluginBase plugins = GetPluginBase.Instance;
foreach(IWritableImage plugin in foreach(Type pluginType in plugins.WritableImages.Values)
plugins.WritableImages.Values.Where(p => p.SupportedMediaTypes.Contains(mediaType))) {
if(Activator.CreateInstance(pluginType) is not IWritableImage plugin)
continue;
if(plugin.SupportedMediaTypes.Contains(mediaType))
PluginsList.Add(new ImagePluginModel PluginsList.Add(new ImagePluginModel
{ {
Plugin = plugin Plugin = plugin
}); });
}
Encodings.AddRange(Encoding.GetEncodings().Select(info => new EncodingModel Encodings.AddRange(Encoding.GetEncodings().Select(info => new EncodingModel
{ {

View File

@@ -145,11 +145,16 @@ sealed class FormatsCommand : Command
table.AddColumn(UI.Title_Media_image_format); table.AddColumn(UI.Title_Media_image_format);
foreach(KeyValuePair<string, IBaseWritableImage> kvp in plugins.WritableImages) foreach(KeyValuePair<string, Type> kvp in plugins.WritableImages)
{
if(Activator.CreateInstance(kvp.Value) is not IBaseWritableImage plugin)
continue;
if(verbose) if(verbose)
table.AddRow(kvp.Value.Id.ToString(), Markup.Escape(kvp.Value.Name)); table.AddRow(plugin.Id.ToString(), Markup.Escape(plugin.Name));
else else
table.AddRow(Markup.Escape(kvp.Value.Name)); table.AddRow(Markup.Escape(plugin.Name));
}
AnsiConsole.Write(table); AnsiConsole.Write(table);

View File

@@ -520,19 +520,24 @@ sealed class ConvertImageCommand : Command
// Try extension // Try extension
if(string.IsNullOrEmpty(format)) if(string.IsNullOrEmpty(format))
candidates.AddRange(plugins.WritableImages.Values.Where(t => candidates.AddRange(from pluginType in plugins.WritableImages.Values
t.KnownExtensions. select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin
Contains(Path.GetExtension(outputPath)))); where plugin is not null
where plugin.KnownExtensions.Contains(Path.GetExtension(outputPath)) select plugin);
// Try Id // Try Id
else if(Guid.TryParse(format, out Guid outId)) 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 // Try name
else else
candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, candidates.AddRange(from pluginType in plugins.WritableImages.Values
StringComparison. select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin
InvariantCultureIgnoreCase))); where plugin is not null
where plugin.Name.Equals(format, StringComparison.InvariantCultureIgnoreCase)
select plugin);
switch(candidates.Count) switch(candidates.Count)
{ {

View File

@@ -88,17 +88,20 @@ sealed class ListOptionsCommand : Command
AaruConsole.WriteLine(UI.Read_Write_media_images_options); AaruConsole.WriteLine(UI.Read_Write_media_images_options);
foreach(KeyValuePair<string, IBaseWritableImage> kvp in plugins.WritableImages) foreach(KeyValuePair<string, Type> kvp in plugins.WritableImages)
{ {
if(Activator.CreateInstance(kvp.Value) is not IBaseWritableImage plugin)
continue;
List<(string name, Type type, string description, object @default)> options = List<(string name, Type type, string description, object @default)> options =
kvp.Value.SupportedOptions.ToList(); plugin.SupportedOptions.ToList();
if(options.Count == 0) if(options.Count == 0)
continue; continue;
var table = new Table 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); table.AddColumn(UI.Title_Name);

View File

@@ -370,17 +370,24 @@ sealed class DumpMediaCommand : Command
// Try extension // Try extension
if(string.IsNullOrEmpty(format)) 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 // Try Id
else if(Guid.TryParse(format, out Guid outId)) 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 // Try name
else else
candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, candidates.AddRange(from pluginType in plugins.WritableImages.Values
StringComparison. select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin
InvariantCultureIgnoreCase))); where plugin is not null
where plugin.Name.Equals(format, StringComparison.InvariantCultureIgnoreCase)
select plugin);
switch(candidates.Count) switch(candidates.Count)
{ {
@@ -607,19 +614,24 @@ sealed class DumpMediaCommand : Command
// Try extension // Try extension
if(string.IsNullOrEmpty(format)) if(string.IsNullOrEmpty(format))
candidates.AddRange(plugins.WritableImages.Values.Where(t => candidates.AddRange(from pluginType in plugins.WritableImages.Values
t.KnownExtensions. select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin
Contains(Path.GetExtension(outputPath)))); where plugin is not null
where plugin.KnownExtensions.Contains(Path.GetExtension(outputPath)) select plugin);
// Try Id // Try Id
else if(Guid.TryParse(format, out Guid outId)) 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 // Try name
else else
candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, candidates.AddRange(from pluginType in plugins.WritableImages.Values
StringComparison. select Activator.CreateInstance(pluginType) as IBaseWritableImage into plugin
InvariantCultureIgnoreCase))); where plugin is not null
where plugin.Name.Equals(format, StringComparison.InvariantCultureIgnoreCase)
select plugin);
IBaseWritableImage outputFormat = candidates[0]; IBaseWritableImage outputFormat = candidates[0];