⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 providerloader.cs

📁 YetAnotherForum.Net+ScrewTurnWiki中文完美汉化增强版
💻 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 + -