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

View File

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

View File

@@ -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
{

View File

@@ -145,11 +145,16 @@ sealed class FormatsCommand : Command
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)
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);

View File

@@ -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)
{

View File

@@ -88,17 +88,20 @@ sealed class ListOptionsCommand : Command
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 =
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);

View File

@@ -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];