summaryrefslogtreecommitdiff
path: root/PluginControl.cs
diff options
context:
space:
mode:
Diffstat (limited to 'PluginControl.cs')
-rw-r--r--PluginControl.cs217
1 files changed, 217 insertions, 0 deletions
diff --git a/PluginControl.cs b/PluginControl.cs
new file mode 100644
index 0000000..82cbd39
--- /dev/null
+++ b/PluginControl.cs
@@ -0,0 +1,217 @@
+// GfxEd8
+// Copyright (C) 2004 Ian Cowburn
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// $Id$
+//
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+using System.Reflection;
+using System.Collections;
+using System.Collections.Specialized;
+using GfxEdInterface;
+using System.Diagnostics;
+
+namespace GfxEd8
+{
+ /// <summary>
+ /// Controls the plugins for the editor
+ /// </summary>
+ public class PluginControl
+ {
+ // -------------------------------------------
+ // PUBLIC
+ // -------------------------------------------
+
+ /// <summary>
+ /// Creates the plugins
+ /// </summary>
+ /// <param name="config">The XML config file</param>
+ public static void Initialise(string config)
+ {
+ XmlDocument xml=new XmlDocument();
+
+ xml.PreserveWhitespace=false;
+
+ //Debugger.Break();
+
+ xml.Load(config);
+
+ XmlNode node=xml.FirstChild;
+
+ if (node.Name!="Config")
+ {
+ throw new Exception("Illegal element " + node.Name + " in config");
+ }
+
+ m_names=new StringCollection();
+ m_interface=new Hashtable();
+
+ foreach (XmlNode n in node.ChildNodes)
+ {
+ if (n.Name!="Import")
+ {
+ throw new Exception("Illegal element " + node.Name + " in config");
+ }
+
+ PluginData plg=new PluginData();
+
+ XmlNode dll=n.Attributes.GetNamedItem("dll");
+ XmlNode name=n.Attributes.GetNamedItem("name");
+
+ if (dll==null || name==null)
+ {
+ throw new Exception("Missing attributes in Import config");
+ }
+
+ string path=Path.GetFullPath(dll.Value);
+
+ try
+ {
+ plg.asm=Assembly.LoadFile(path);
+ }
+ catch (System.Security.SecurityException)
+ {
+ throw new Exception("Do not have permission to load:\n"+path);
+ }
+ catch (Exception)
+ {
+ throw new Exception("Could not load plugin:\n"+path);
+ }
+
+ try
+ {
+ plg.iface=(IPlugin)plg.asm.CreateInstance(name.Value);
+ }
+ catch (InvalidCastException)
+ {
+ throw new Exception("The plugin " + dll.Value+" is incorrect");
+ }
+
+ Validate(plg.iface,path);
+
+ m_names.Add(plg.iface.ShortName);
+ m_interface[plg.iface.ShortName]=plg;
+ }
+ }
+
+
+ public static StringCollection Names
+ {
+ get {return m_names;}
+ }
+
+ public static IPlugin Get(string name)
+ {
+ PluginData d=(PluginData)m_interface[name];
+
+ if (d!=null)
+ {
+ return d.iface;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public static Assembly GetAssembly(string name)
+ {
+ PluginData d=(PluginData)m_interface[name];
+
+ if (d!=null)
+ {
+ return d.asm;
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ public static string Version(string name)
+ {
+ Assembly a=GetAssembly(name);
+
+ if (a==null)
+ {
+ return "0.0";
+ }
+
+ AssemblyName n=a.GetName();
+
+ return n.Version.Major.ToString()+"."+n.Version.Minor.ToString();
+ }
+
+ // -------------------------------------------
+ // PRIVATE
+ // -------------------------------------------
+ private static StringCollection m_names=null;
+ private static Hashtable m_interface=null;
+
+ private class PluginData
+ {
+ public PluginData()
+ {
+ asm=null;
+ iface=null;
+ }
+
+ public Assembly asm;
+ public IPlugin iface;
+ }
+
+ private static void Validate(IPlugin p, string path)
+ {
+ foreach (SpriteSize s in p.AllowedSizes)
+ {
+ if (s==null)
+ {
+ throw new Exception("Sprite Sizes incorrecly defined in\n"+path);
+ }
+ }
+
+ foreach (Colour c in p.Palette)
+ {
+ if (c==null)
+ {
+ throw new Exception("Sprite Sizes incorrecly defined in\n"+path);
+ }
+ }
+
+ if (p.Palette.Length<p.MaxColours)
+ {
+ throw new Exception("Not enough colours defined in\n"+path);
+ }
+
+ if (p.SprPalEditable.Length!=p.MaxColours)
+ {
+ throw new Exception("Wrong editable colour indicators in\n"+path);
+ }
+
+ if (p.SprPalCommon.Length!=p.MaxColours)
+ {
+ throw new Exception("Wrong common colour indicators in\n"+path);
+ }
+ }
+
+ private PluginControl()
+ {
+ }
+ }
+}