// 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