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