diff options
Diffstat (limited to 'PluginControl.cs')
-rw-r--r-- | PluginControl.cs | 217 |
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() + { + } + } +} |