📄 providerloader.cs
字号:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Reflection;
using ScrewTurn.Wiki.PluginFramework;
namespace ScrewTurn.Wiki {
/// <summary>
/// Loads providers from assemblies.
/// </summary>
public static class ProviderLoader {
public const string UsersProviderInterfaceName = "ScrewTurn.Wiki.PluginFramework.IUsersStorageProvider";
public const string PagesProviderInterfaceName = "ScrewTurn.Wiki.PluginFramework.IPagesStorageProvider";
public const string FormatterProviderInterfaceName = "ScrewTurn.Wiki.PluginFramework.IFormatterProvider";
/// <summary>
/// Loads all the Providers and initialises them.
/// </summary>
public static void FullLoad() {
string[] files = Directory.GetFiles(Settings.PluginsDirectory, "*.dll");
List<IUsersStorageProvider> users = new List<IUsersStorageProvider>();
List<IUsersStorageProvider> dUsers = new List<IUsersStorageProvider>();
List<IPagesStorageProvider> pages = new List<IPagesStorageProvider>();
List<IPagesStorageProvider> dPages = new List<IPagesStorageProvider>();
List<IFormatterProvider> forms = new List<IFormatterProvider>();
List<IFormatterProvider> dForms = new List<IFormatterProvider>();
for(int i = 0; i < files.Length; i++) {
IUsersStorageProvider[] u;
IPagesStorageProvider[] p;
IFormatterProvider[] f;
LoadFrom(files[i], out u, out p, out f);
users.AddRange(u);
pages.AddRange(p);
forms.AddRange(f);
}
// Init and add to the Collectors
for(int i = 0; i < users.Count; i++) {
if(Collectors.UsersProviderCollector.GetProvider(users[i].GetType().ToString()) != null ||
Collectors.DisabledUsersProviderCollector.GetProvider(users[i].GetType().ToString()) != null) {
Log.LogEntry("Provider " + users[i].Information.Name + " already in memory", EntryType.Warning, "SYSTEM");
continue;
}
bool enabled = !IsDisabled(users[i].GetType().ToString());
try {
if(enabled) {
users[i].Init(Host.Instance, LoadConfiguration(users[i].GetType().ToString()));
}
}
catch {
// Disable Provider
enabled = false;
Log.LogEntry("Unable to load provider " + users[i].Information.Name, EntryType.Error, "SYSTEM");
}
if(enabled) Collectors.UsersProviderCollector.AddProvider(users[i]);
else Collectors.DisabledUsersProviderCollector.AddProvider(users[i]);
Log.LogEntry("Provider " + users[i].Information.Name + " loaded (" + (enabled ? "Enabled" : "Disabled") + ")", EntryType.General, "SYSTEM");
}
for(int i = 0; i < pages.Count; i++) {
if(Collectors.PagesProviderCollector.GetProvider(pages[i].GetType().ToString()) != null ||
Collectors.DisabledPagesProviderCollector.GetProvider(pages[i].GetType().ToString()) != null) {
Log.LogEntry("Provider " + pages[i].Information.Name + " already in memory", EntryType.Warning, "SYSTEM");
continue;
}
bool enabled = !IsDisabled(pages[i].GetType().ToString());
try {
if(enabled) {
pages[i].Init(Host.Instance, LoadConfiguration(pages[i].GetType().ToString()));
}
}
catch {
// Disable Provider
enabled = false;
Log.LogEntry("Unable to load provider " + pages[i].Information.Name, EntryType.Error, "SYSTEM");
}
if(enabled) Collectors.PagesProviderCollector.AddProvider(pages[i]);
else Collectors.DisabledPagesProviderCollector.AddProvider(pages[i]);
Log.LogEntry("Provider " + pages[i].Information.Name + " loaded (" + (enabled ? "Enabled" : "Disabled") + ")", EntryType.General, "SYSTEM");
}
for(int i = 0; i < forms.Count; i++) {
if(Collectors.FormatterProviderCollector.GetProvider(forms[i].GetType().ToString()) != null ||
Collectors.DisabledFormatterProviderCollector.GetProvider(forms[i].GetType().ToString()) != null) {
Log.LogEntry("Provider " + forms[i].Information.Name + " already in memory", EntryType.Warning, "SYSTEM");
continue;
}
bool enabled = !IsDisabled(forms[i].GetType().ToString());
try {
if(enabled) {
forms[i].Init(Host.Instance, LoadConfiguration(forms[i].GetType().ToString()));
}
}
catch {
// Disable Provider
enabled = false;
Log.LogEntry("Unable to load provider " + forms[i].Information.Name, EntryType.Error, "SYSTEM");
}
if(enabled) Collectors.FormatterProviderCollector.AddProvider(forms[i]);
else Collectors.DisabledFormatterProviderCollector.AddProvider(forms[i]);
Log.LogEntry("Provider " + forms[i].Information.Name + " loaded (" + (enabled ? "Enabled" : "Disabled") + ")", EntryType.General, "SYSTEM");
}
}
/// <summary>
/// Loads the Configuration data of a Provider.
/// </summary>
/// <param name="typeName">The Type Name of the Provider.</param>
/// <returns>The Configuration, if available, otherwise an empty string.</returns>
public static string LoadConfiguration(string typeName) {
if(File.Exists(Settings.PluginsConfigurationDirectory + typeName + ".cs")) {
return Tools.LoadFile(Settings.PluginsConfigurationDirectory + typeName + ".cs");
}
else return "";
}
/// <summary>
/// Saves the Configuration data of a Provider.
/// </summary>
/// <param name="typeName">The Type Name of the Provider.</param>
/// <param name="config">The Configuration data to save.</param>
public static void SaveConfiguration(string typeName, string config) {
Tools.WriteFile(Settings.PluginsConfigurationDirectory + typeName + ".cs", config);
}
/// <summary>
/// Saves the Status of a Provider.
/// </summary>
/// <param name="typeName">The Type Name of the Provider.</param>
/// <param name="enabled">A value specifying whether or not the Provider is enabled.</param>
public static void SaveStatus(string typeName, bool enabled) {
string data = Tools.LoadFile(Settings.PluginsStatusFile).Replace("\r", "");
string[] lines = data.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
int idx = -1;
for(int i = 0; i < lines.Length; i++) {
if(lines[i].Equals(typeName)) {
idx = i;
break;
}
}
if(enabled) {
if(idx >= 0) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < lines.Length; i++) {
if(i != idx) sb.Append(lines[i] + "\r\n");
}
Tools.WriteFile(Settings.PluginsStatusFile, sb.ToString());
}
// Else nothing to do
}
else {
if(idx == -1) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i < lines.Length; i++) {
if(i != idx) sb.Append(lines[i] + "\r\n");
}
sb.Append(typeName + "\r\n");
Tools.WriteFile(Settings.PluginsStatusFile, sb.ToString());
}
// Else nothing to do
}
}
/// <summary>
/// Returns a value specifying whether or not a Provider is disabled.
/// </summary>
/// <param name="typeName">The Type Name of the Provider.</param>
/// <returns>True if the Provider is disabled.</returns>
public static bool IsDisabled(string typeName) {
string data = Tools.LoadFile(Settings.PluginsStatusFile).Replace("\r", "");
string[] lines = data.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
for(int i = 0; i < lines.Length; i++) {
if(lines[i].Equals(typeName)) return true;
}
return false;
}
/// <summary>
/// Loads Providers from an assembly.
/// </summary>
/// <param name="assembly">The path of the Assembly to load the Providers from.</param>
public static void LoadFromAuto(string assembly) {
IUsersStorageProvider[] users;
IPagesStorageProvider[] pages;
IFormatterProvider[] forms;
LoadFrom(assembly, out users, out pages, out forms);
// Init and add to the Collectors
for(int i = 0; i < users.Length; i++) {
if(Collectors.UsersProviderCollector.GetProvider(users[i].GetType().ToString()) != null ||
Collectors.DisabledUsersProviderCollector.GetProvider(users[i].GetType().ToString()) != null) {
Log.LogEntry("Provider " + users[i].Information.Name + " already in memory", EntryType.Warning, "SYSTEM");
continue;
}
bool enabled = !IsDisabled(users[i].GetType().ToString());
try {
users[i].Init(Host.Instance, LoadConfiguration(users[i].GetType().ToString()));
}
catch {
// Disable Provider
enabled = false;
Log.LogEntry("Unable to load provider " + users[i].Information.Name, EntryType.Error, "SYSTEM");
}
if(enabled) Collectors.UsersProviderCollector.AddProvider(users[i]);
else Collectors.DisabledUsersProviderCollector.AddProvider(users[i]);
Log.LogEntry("Provider " + users[i].Information.Name + " loaded (" + (enabled ? "Enabled" : "Disabled") + ")", EntryType.General, "SYSTEM");
}
for(int i = 0; i < pages.Length; i++) {
if(Collectors.PagesProviderCollector.GetProvider(pages[i].GetType().ToString()) != null ||
Collectors.DisabledPagesProviderCollector.GetProvider(pages[i].GetType().ToString()) != null) {
Log.LogEntry("Provider " + pages[i].Information.Name + " already in memory", EntryType.Warning, "SYSTEM");
continue;
}
bool enabled = !IsDisabled(pages[i].GetType().ToString());
try {
pages[i].Init(Host.Instance, LoadConfiguration(pages[i].GetType().ToString()));
}
catch {
// Disable Provider
enabled = false;
Log.LogEntry("Unable to load provider " + pages[i].Information.Name, EntryType.Error, "SYSTEM");
}
if(enabled) Collectors.PagesProviderCollector.AddProvider(pages[i]);
else Collectors.DisabledPagesProviderCollector.AddProvider(pages[i]);
Log.LogEntry("Provider " + pages[i].Information.Name + " loaded (" + (enabled ? "Enabled" : "Disabled") + ")", EntryType.General, "SYSTEM");
}
for(int i = 0; i < forms.Length; i++) {
if(Collectors.FormatterProviderCollector.GetProvider(forms[i].GetType().ToString()) != null ||
Collectors.DisabledFormatterProviderCollector.GetProvider(forms[i].GetType().ToString()) != null) {
Log.LogEntry("Provider " + forms[i].Information.Name + " already in memory", EntryType.Warning, "SYSTEM");
continue;
}
bool enabled = !IsDisabled(forms[i].GetType().ToString());
try {
forms[i].Init(Host.Instance, LoadConfiguration(forms[i].GetType().ToString()));
}
catch {
// Disable Provider
enabled = false;
Log.LogEntry("Unable to load provider " + forms[i].Information.Name, EntryType.Error, "SYSTEM");
}
if(enabled) Collectors.FormatterProviderCollector.AddProvider(forms[i]);
else Collectors.DisabledFormatterProviderCollector.AddProvider(forms[i]);
Log.LogEntry("Provider " + forms[i].Information.Name + " loaded (" + (enabled ? "Enabled" : "Disabled") + ")", EntryType.General, "SYSTEM");
}
}
/// <summary>
/// Loads Providers from an assembly.
/// </summary>
/// <param name="assembly">The path of the Assembly to load the Providers from.</param>
/// <param name="users">The Users Providers.</param>
/// <param name="pages">The Pages Providers.</param>
/// <param name="formatters">The Formatter Providers.</param>
/// <remarks>The Components returned are <b>not</b> initialized.</remarks>
public static void LoadFrom(string assembly, out IUsersStorageProvider[] users, out IPagesStorageProvider[] pages, out IFormatterProvider[] formatters) {
Assembly asm = null;
try {
//asm = Assembly.LoadFile(assembly);
// This way the DLL is not locked and can be deleted at runtime
asm = Assembly.Load(LoadAssembly(assembly));
}
catch {
users = new IUsersStorageProvider[0];
pages = new IPagesStorageProvider[0];
formatters = new IFormatterProvider[0];
Log.LogEntry("Unable to load assembly " + Path.GetFileNameWithoutExtension(assembly), EntryType.Error, "SYSTEM");
return;
}
Type[] types = asm.GetTypes();
List<IUsersStorageProvider> urs = new List<IUsersStorageProvider>();
List<IPagesStorageProvider> pgs = new List<IPagesStorageProvider>();
List<IFormatterProvider> frs = new List<IFormatterProvider>();
Type[] interfaces;
for(int i = 0; i < types.Length; i++) {
interfaces = types[i].GetInterfaces();
for(int k = 0; k < interfaces.Length; k++) {
switch(interfaces[k].ToString()) {
case UsersProviderInterfaceName:
IUsersStorageProvider tmpu;
try {
tmpu = asm.CreateInstance(types[i].ToString()) as IUsersStorageProvider;
if(tmpu != null) urs.Add(tmpu);
}
catch {
Log.LogEntry("Unable to create instance of " + types[i].ToString(), EntryType.Error, "SYSTEM");
}
break;
case PagesProviderInterfaceName:
IPagesStorageProvider tmpp;
try {
tmpp = asm.CreateInstance(types[i].ToString()) as IPagesStorageProvider;
if(tmpp != null) pgs.Add(tmpp);
}
catch {
Log.LogEntry("Unable to create instance of " + types[i].ToString(), EntryType.Error, "SYSTEM");
}
break;
case FormatterProviderInterfaceName:
IFormatterProvider tmpf;
try {
tmpf = asm.CreateInstance(types[i].ToString()) as IFormatterProvider;
if(tmpf != null) frs.Add(tmpf);
}
catch {
Log.LogEntry("Unable to create instance of " + types[i].ToString(), EntryType.Error, "SYSTEM");
}
break;
}
}
}
users = urs.ToArray();
pages = pgs.ToArray();
formatters = frs.ToArray();
}
private static byte[] LoadAssembly(string assembly) {
byte[] result;
FileStream fs = new FileStream(assembly, FileMode.Open, FileAccess.Read, FileShare.Read);
MemoryStream ms = new MemoryStream();
int read = 0;
byte[] buff = new byte[512];
do {
read = fs.Read(buff, 0, buff.Length);
ms.Write(buff, 0, read);
} while(read > 0);
fs.Close(); // Important
result = ms.ToArray();
ms.Close(); // Important
return result;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -