// 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 { /// /// Controls the plugins for the editor /// public class PluginControl { // ------------------------------------------- // PUBLIC // ------------------------------------------- /// /// Creates the plugins /// /// The XML config file 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