diff --git a/Filters.cs b/Filters.cs deleted file mode 100644 index a9171ce..0000000 --- a/Filters.cs +++ /dev/null @@ -1,116 +0,0 @@ -// /*************************************************************************** -// Aaru Data Preservation Suite -// ---------------------------------------------------------------------------- -// -// Filename : Filters.cs -// Author(s) : Natalia Portillo -// -// Component : Filters. -// -// --[ Description ] ---------------------------------------------------------- -// -// Enumerates all filters and instantiates the correct one. -// -// --[ License ] -------------------------------------------------------------- -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -// -// ---------------------------------------------------------------------------- -// Copyright © 2011-2023 Natalia Portillo -// ****************************************************************************/ - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using Aaru.CommonTypes.Enums; -using Aaru.CommonTypes.Interfaces; -using Aaru.Console; - -namespace Aaru.CommonTypes; - -/// Manages the known filters -public sealed class FiltersList -{ - /// List of known filters - public readonly SortedDictionary Filters; - - /// Fills the list of all known filters - public FiltersList() - { - var assembly = Assembly.Load("Aaru.Filters"); - Filters = new SortedDictionary(); - - foreach(Type type in assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IFilter)))) - { - try - { - var filter = (IFilter)type.GetConstructor(Type.EmptyTypes)?.Invoke(Array.Empty()); - - if(filter != null && !Filters.ContainsKey(filter.Name.ToLower())) - Filters.Add(filter.Name.ToLower(), filter); - } - catch(Exception exception) - { - AaruConsole.ErrorWriteLine(Localization.Exception_0, exception); - } - } - } - - /// Gets the filter that allows to read the specified path - /// Path - /// The filter that allows reading the specified path - public IFilter GetFilter(string path) - { - IFilter noFilter = null; - - foreach(IFilter filter in Filters.Values) - { - try - { - if(filter.Id != new Guid("12345678-AAAA-BBBB-CCCC-123456789000")) - { - if(!filter.Identify(path)) - continue; - - var foundFilter = - (IFilter)filter.GetType().GetConstructor(Type.EmptyTypes)?.Invoke(Array.Empty()); - - if(foundFilter?.Open(path) == ErrorNumber.NoError) - return foundFilter; - } - else - noFilter = filter; - } - catch(IOException) - { - // Ignore and continue - } - } - - if(!noFilter?.Identify(path) == true) - return null; - - noFilter?.Open(path); - - return noFilter; - } -} \ No newline at end of file diff --git a/Interfaces/IPluginRegister.cs b/Interfaces/IPluginRegister.cs index 144d9d8..05618ff 100644 --- a/Interfaces/IPluginRegister.cs +++ b/Interfaces/IPluginRegister.cs @@ -57,9 +57,11 @@ public interface IPluginRegister /// List of filesystem plugins List GetAllFilesystemPlugins(); - /// Gets all filter plugins - /// List of filter plugins - List GetAllFilterPlugins(); + /// + /// Registers all filter plugins in the provided service collection + /// + /// Service collection + void RegisterFilterPlugins(IServiceCollection services); /// Gets all floppy image plugins /// List of floppy image plugins diff --git a/PluginRegister.cs b/PluginRegister.cs index ed15d05..df83b36 100644 --- a/PluginRegister.cs +++ b/PluginRegister.cs @@ -32,7 +32,9 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using Aaru.CommonTypes.Enums; using Aaru.CommonTypes.Interfaces; using Microsoft.Extensions.DependencyInjection; @@ -47,8 +49,7 @@ public class PluginRegister public readonly SortedDictionary ByteAddressableImages; /// List of all filesystem plugins public readonly SortedDictionary Filesystems; - /// List of filter plugins - public readonly SortedDictionary Filters; + /// List of floppy image plugins public readonly SortedDictionary FloppyImages; /// List of all media image plugins @@ -66,7 +67,6 @@ public class PluginRegister PluginRegister() { - Filters = new SortedDictionary(); Filesystems = new SortedDictionary(); ReadOnlyFilesystems = new SortedDictionary(); Partitions = new SortedDictionary(); @@ -78,6 +78,19 @@ public class PluginRegister ByteAddressableImages = new SortedDictionary(); } + /// List of filter plugins + public SortedDictionary Filters + { + get + { + SortedDictionary filters = new(); + foreach(IFilter plugin in _serviceProvider.GetServices()) + filters.Add(plugin.Name.ToLower(), plugin); + + return filters; + } + } + /// List of checksum plugins public SortedDictionary Checksums { @@ -137,11 +150,7 @@ public class PluginRegister Filesystems.Add(plugin.Name.ToLower(), type); } - foreach(Type type in pluginRegister.GetAllFilterPlugins() ?? Enumerable.Empty()) - { - if(Activator.CreateInstance(type) is IFilter plugin && !Filters.ContainsKey(plugin.Name.ToLower())) - Filters.Add(plugin.Name.ToLower(), type); - } + pluginRegister.RegisterFilterPlugins(_services); foreach(Type type in pluginRegister.GetAllFloppyImagePlugins() ?? Enumerable.Empty()) { @@ -196,4 +205,43 @@ public class PluginRegister ByteAddressableImages.Add(plugin.Name.ToLower(), type); } } + + /// Gets the filter that allows to read the specified path + /// Path + /// The filter that allows reading the specified path + public IFilter GetFilter(string path) + { + IFilter noFilter = null; + + foreach(IFilter filter in Filters.Values) + { + try + { + if(filter.Id != new Guid("12345678-AAAA-BBBB-CCCC-123456789000")) + { + if(!filter.Identify(path)) + continue; + + var foundFilter = + (IFilter)filter.GetType().GetConstructor(Type.EmptyTypes)?.Invoke(Array.Empty()); + + if(foundFilter?.Open(path) == ErrorNumber.NoError) + return foundFilter; + } + else + noFilter = filter; + } + catch(IOException) + { + // Ignore and continue + } + } + + if(!noFilter?.Identify(path) == true) + return null; + + noFilter?.Open(path); + + return noFilter; + } } \ No newline at end of file