using System;
|
|
using System.IO;
|
|
|
|
namespace IPA.Loader.Features
|
|
{
|
|
internal class DefineFeature : Feature
|
|
{
|
|
public static bool NewFeature = true;
|
|
|
|
protected internal override bool StoreOnPlugin => false;
|
|
|
|
public override bool Initialize(PluginMetadata meta, string[] parameters)
|
|
{ // parameters should be (name, fully qualified type)
|
|
if (parameters.Length != 2)
|
|
{
|
|
InvalidMessage = "Incorrect number of parameters";
|
|
return false;
|
|
}
|
|
|
|
RequireLoaded(meta);
|
|
|
|
Type type;
|
|
try
|
|
{
|
|
type = meta.Assembly.GetType(parameters[1]);
|
|
}
|
|
catch (ArgumentException)
|
|
{
|
|
InvalidMessage = $"Invalid type name {parameters[1]}";
|
|
return false;
|
|
}
|
|
catch (Exception e) when (e is FileNotFoundException || e is FileLoadException || e is BadImageFormatException)
|
|
{
|
|
var filename = "";
|
|
|
|
switch (e)
|
|
{
|
|
case FileNotFoundException fn:
|
|
filename = fn.FileName;
|
|
break;
|
|
case FileLoadException fl:
|
|
filename = fl.FileName;
|
|
break;
|
|
case BadImageFormatException bi:
|
|
filename = bi.FileName;
|
|
break;
|
|
}
|
|
|
|
InvalidMessage = $"Could not find {filename} while loading type";
|
|
return false;
|
|
}
|
|
|
|
if (type == null)
|
|
{
|
|
InvalidMessage = $"Invalid type name {parameters[1]}";
|
|
return false;
|
|
}
|
|
|
|
try
|
|
{
|
|
if (RegisterFeature(parameters[0], type)) return NewFeature = true;
|
|
|
|
InvalidMessage = $"Feature with name {parameters[0]} already exists";
|
|
return false;
|
|
|
|
}
|
|
catch (ArgumentException)
|
|
{
|
|
InvalidMessage = $"{type.FullName} not a subclass of {nameof(Feature)}";
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|