diff --git a/DiscImageChef.CommonTypes.csproj b/DiscImageChef.CommonTypes.csproj index 5bf5d87..82a6cf8 100644 --- a/DiscImageChef.CommonTypes.csproj +++ b/DiscImageChef.CommonTypes.csproj @@ -68,6 +68,7 @@ + diff --git a/Interfaces/IPluginRegister.cs b/Interfaces/IPluginRegister.cs new file mode 100644 index 0000000..4c24661 --- /dev/null +++ b/Interfaces/IPluginRegister.cs @@ -0,0 +1,100 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : IPluginsRegister.cs +// Author(s) : Natalia Portillo +// +// Component : Interfaces. +// +// --[ Description ] ---------------------------------------------------------- +// +// Interface that declares class and methods to call to register plugins. +// +// --[ 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-2018 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; + +namespace DiscImageChef.CommonTypes.Interfaces +{ + public interface IPluginRegister + { + /// + /// Gets all checksum plugins + /// + /// List of checksum plugins + List GetAllChecksumPlugins(); + + /// + /// Gets all filesystem plugins + /// + /// List of filesystem plugins + List GetAllFilesystemPlugins(); + + /// + /// Gets all filter plugins + /// + /// List of filter plugins + List GetAllFilterPlugins(); + + /// + /// Gets all floppy image plugins + /// + /// List of floppy image plugins + List GetAllFloppyImagePlugins(); + + /// + /// Gets all media image plugins + /// + /// List of media image plugins + List GetAllMediaImagePlugins(); + + /// + /// Gets all partition plugins + /// + /// List of partition plugins + List GetAllPartitionPlugins(); + + /// + /// Gets all read-only filesystem plugins + /// + /// List of read-only filesystem plugins + List GetAllReadOnlyFilesystemPlugins(); + + /// + /// Gets all writable floppy image plugins + /// + /// List of writable floppy image plugins + List GetAllWritableFloppyImagePlugins(); + + /// + /// Gets all writable media image plugins + /// + /// List of writable media image plugins + List GetAllWritableImagePlugins(); + } +} \ No newline at end of file diff --git a/PluginBase.cs b/PluginBase.cs index 673eb9d..84c1be3 100644 --- a/PluginBase.cs +++ b/PluginBase.cs @@ -39,9 +39,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using DiscImageChef.CommonTypes.Interfaces; -using DiscImageChef.Console; using DiscImageChef.Partitions; namespace DiscImageChef.CommonTypes @@ -51,6 +49,18 @@ namespace DiscImageChef.CommonTypes /// public class PluginBase { + /// + /// List of checksum plugins + /// + public readonly List Checksums; + /// + /// List of filter plugins + /// + public readonly SortedDictionary Filters; + /// + /// List of floppy image plugins + /// + public readonly SortedDictionary FloppyImages; /// /// List of all media image plugins /// @@ -68,6 +78,10 @@ namespace DiscImageChef.CommonTypes /// public readonly SortedDictionary ReadOnlyFilesystems; /// + /// List of writable floppy image plugins + /// + public readonly SortedDictionary WritableFloppyImages; + /// /// List of writable media image plugins /// public readonly SortedDictionary WritableImages; @@ -77,98 +91,62 @@ namespace DiscImageChef.CommonTypes /// public PluginBase() { - PluginsList = new SortedDictionary(); - ReadOnlyFilesystems = new SortedDictionary(); - PartPluginsList = new SortedDictionary(); - ImagePluginsList = new SortedDictionary(); - WritableImages = new SortedDictionary(); - - // We need to manually load assemblies :( - AppDomain.CurrentDomain.Load("DiscImageChef.DiscImages"); - AppDomain.CurrentDomain.Load("DiscImageChef.Filesystems"); - AppDomain.CurrentDomain.Load("DiscImageChef.Partitions"); - - Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); - foreach(Assembly assembly in assemblies) - { - foreach(Type type in assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IMediaImage))) - .Where(t => t.IsClass)) - try - { - IMediaImage plugin = - (IMediaImage)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); - RegisterImagePlugin(plugin); - } - catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } - - foreach(Type type in assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IPartition))) - .Where(t => t.IsClass)) - try - { - IPartition plugin = (IPartition)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); - RegisterPartPlugin(plugin); - } - catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } - - foreach(Type type in assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IFilesystem))) - .Where(t => t.IsClass)) - try - { - IFilesystem plugin = - (IFilesystem)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); - RegisterPlugin(plugin); - } - catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } - - foreach(Type type in assembly - .GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IReadOnlyFilesystem))) - .Where(t => t.IsClass)) - try - { - IReadOnlyFilesystem plugin = - (IReadOnlyFilesystem)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); - RegisterReadOnlyFilesystem(plugin); - } - catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } - - foreach(Type type in assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IWritableImage))) - .Where(t => t.IsClass)) - try - { - IWritableImage plugin = - (IWritableImage)type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }); - RegisterWritableMedia(plugin); - } - catch(Exception exception) { DicConsole.ErrorWriteLine("Exception {0}", exception); } - } + PluginsList = new SortedDictionary(); + ReadOnlyFilesystems = new SortedDictionary(); + PartPluginsList = new SortedDictionary(); + ImagePluginsList = new SortedDictionary(); + WritableImages = new SortedDictionary(); + Checksums = new List(); + Filters = new SortedDictionary(); + FloppyImages = new SortedDictionary(); + WritableFloppyImages = new SortedDictionary(); } - void RegisterImagePlugin(IMediaImage plugin) + public void AddPlugins(IPluginRegister pluginRegister) { - if(!ImagePluginsList.ContainsKey(plugin.Name.ToLower())) - ImagePluginsList.Add(plugin.Name.ToLower(), plugin); - } + foreach(Type type in pluginRegister.GetAllChecksumPlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IChecksum plugin) + Checksums.Add(plugin); - void RegisterPlugin(IFilesystem plugin) - { - if(!PluginsList.ContainsKey(plugin.Name.ToLower())) PluginsList.Add(plugin.Name.ToLower(), plugin); - } + foreach(Type type in pluginRegister.GetAllFilesystemPlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IFilesystem plugin && + !PluginsList.ContainsKey(plugin.Name.ToLower())) + PluginsList.Add(plugin.Name.ToLower(), plugin); - void RegisterReadOnlyFilesystem(IReadOnlyFilesystem plugin) - { - if(!ReadOnlyFilesystems.ContainsKey(plugin.Name.ToLower())) - ReadOnlyFilesystems.Add(plugin.Name.ToLower(), plugin); - } + foreach(Type type in pluginRegister.GetAllFilterPlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IFilter plugin && + !Filters.ContainsKey(plugin.Name.ToLower())) + Filters.Add(plugin.Name.ToLower(), plugin); - void RegisterWritableMedia(IWritableImage plugin) - { - if(!WritableImages.ContainsKey(plugin.Name.ToLower())) WritableImages.Add(plugin.Name.ToLower(), plugin); - } + foreach(Type type in pluginRegister.GetAllFloppyImagePlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IFloppyImage plugin && + !FloppyImages.ContainsKey(plugin.Name.ToLower())) + FloppyImages.Add(plugin.Name.ToLower(), plugin); - void RegisterPartPlugin(IPartition partplugin) - { - if(!PartPluginsList.ContainsKey(partplugin.Name.ToLower())) - PartPluginsList.Add(partplugin.Name.ToLower(), partplugin); + foreach(Type type in pluginRegister.GetAllMediaImagePlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IMediaImage plugin && + !ImagePluginsList.ContainsKey(plugin.Name.ToLower())) + ImagePluginsList.Add(plugin.Name.ToLower(), plugin); + + foreach(Type type in pluginRegister.GetAllPartitionPlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IPartition plugin && + !PartPluginsList.ContainsKey(plugin.Name.ToLower())) + PartPluginsList.Add(plugin.Name.ToLower(), plugin); + + foreach(Type type in pluginRegister.GetAllReadOnlyFilesystemPlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IReadOnlyFilesystem plugin && + !ReadOnlyFilesystems.ContainsKey(plugin.Name.ToLower())) + ReadOnlyFilesystems.Add(plugin.Name.ToLower(), plugin); + + foreach(Type type in pluginRegister.GetAllWritableFloppyImagePlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IWritableFloppyImage plugin && + !WritableFloppyImages.ContainsKey(plugin.Name.ToLower())) + WritableFloppyImages.Add(plugin.Name.ToLower(), plugin); + + foreach(Type type in pluginRegister.GetAllWritableImagePlugins() ?? Enumerable.Empty()) + if(type.GetConstructor(Type.EmptyTypes)?.Invoke(new object[] { }) is IWritableImage plugin && + !WritableImages.ContainsKey(plugin.Name.ToLower())) + WritableImages.Add(plugin.Name.ToLower(), plugin); } } } \ No newline at end of file