private void LoadData() { if (_setup != null) { _name = _setup.PluginName(); _setup.GetHome(out _text, out _btnImage, out _focus, out _picImage); } if (_name != string.Empty) { using (Profile.Settings xmlreader = new Profile.MPSettings()) { _index = xmlreader.GetValueAsInt("pluginSorting", _name, Int32.MaxValue); } } }
private void LoadPlugins() { tvMenu.Nodes.Clear(); string directory = Config.GetSubFolder(Config.Dir.Plugins, "windows"); if (!Directory.Exists(directory)) { return; } using (Profile.Settings xmlreader = new Profile.MPSettings()) { TreeNode tnMyPlugIns = null; bool useMyPlugins = xmlreader.GetValueAsBool("home", "usemyplugins", true); if (useMyPlugins) { tnMyPlugIns = new TreeNode("my Plugins"); tnMyPlugIns.Tag = new PluginInfo("my Plugins"); tvMenu.Nodes.Add(tnMyPlugIns); } string[] files = Directory.GetFiles(directory, "*.dll"); foreach (string pluginFile in files) { try { Assembly pluginAssembly = Assembly.LoadFrom(pluginFile); if (pluginAssembly != null) { Type[] exportedTypes = pluginAssembly.GetExportedTypes(); foreach (Type type in exportedTypes) { // an abstract class cannot be instanciated if (type.IsAbstract) { continue; } // Try to locate the interface we're interested in if (type.GetInterface("MediaPortal.GUI.Library.ISetupForm") != null) { try { // Create instance of the current type object pluginObject = Activator.CreateInstance(type); ISetupForm pluginForm = pluginObject as ISetupForm; if (pluginForm != null) { if (pluginForm.PluginName().Equals("Home")) { continue; } if (pluginForm.PluginName().Equals("my Plugins")) { if (tnMyPlugIns != null) { tnMyPlugIns.Tag = new PluginInfo(pluginForm); tvMenu.Nodes.Add(tnMyPlugIns); } continue; } string enabled = xmlreader.GetValue("plugins", pluginForm.PluginName()); if (enabled.CompareTo("yes") != 0) { continue; } string showInHome = xmlreader.GetValue("home", pluginForm.PluginName()); TreeNode node; if ((useMyPlugins) && (showInHome.CompareTo("no") == 0)) { node = tnMyPlugIns.Nodes.Add(pluginForm.PluginName()); } else { node = tvMenu.Nodes.Add(pluginForm.PluginName()); } if (node != null) { node.Tag = new PluginInfo(pluginForm); } } } catch (Exception setupFormException) { Log.Info("Exception in plugin SetupForm loading :{0}", setupFormException.Message); Log.Info("Current class is :{0}", type.FullName); Log.Info(setupFormException.StackTrace); } } } } } catch (Exception unknownException) { Log.Info("Exception in plugin loading :{0}", unknownException.Message); Log.Info(unknownException.StackTrace); } } } ValidateIndex(); tvMenu.TreeViewNodeSorter = this; tvMenu.Sort(); }
private static void LoadPlugin(string strFile) { if (!IsPlugInEnabled(strFile)) { return; } Type[] foundInterfaces = null; Log.Info(" Load plugins from : {0}", strFile); try { Assembly assem = Assembly.LoadFrom(strFile); if (assem != null) { Log.Info(" File Version : {0}", FileVersionInfo.GetVersionInfo(strFile).ProductVersion); Type[] types = assem.GetExportedTypes(); TypeFilter myFilter2 = new TypeFilter(MyInterfaceFilter); if (types.Any(t => t.IsClass && !t.IsAbstract && typeof(IPlugin).IsAssignableFrom(t)) && !CompatibilityManager.IsPluginCompatible(assem)) { Log.Error( "PluginManager: {0} is tagged as incompatible with the current MediaPortal version and won't be loaded!", assem.FullName); _incompatibilities.Add(assem); } else { foreach (Type t in types) { try { if (t.IsClass) { if (t.IsAbstract) { continue; } Object newObj = null; IPlugin plugin = null; try { foundInterfaces = t.FindInterfaces(myFilter2, "MediaPortal.GUI.Library.IPlugin"); if (foundInterfaces.Length > 0) { if (!CompatibilityManager.IsPluginCompatible(t)) { Log.Error( "PluginManager: {0} is tagged as incompatible with the current MediaPortal version and won't be loaded!", t.FullName); _incompatibilities.Add(t); continue; } newObj = (object)Activator.CreateInstance(t); plugin = (IPlugin)newObj; } } catch (TargetInvocationException ex) { Log.Error(ex); Log.Error( "PluginManager: {0} is incompatible with the current MediaPortal version and won't be loaded!", t.FullName); continue; } catch (Exception iPluginException) { Log.Error("Exception while loading IPlugin instances: {0}", t.FullName); Log.Error(iPluginException.ToString()); Log.Error(iPluginException.Message); Log.Error(iPluginException.StackTrace); } if (plugin == null) { continue; } // If we get to this point, the plugin has loaded successfully // Mark it as compatible. //MarkPluginAsCompatible(t); try { foundInterfaces = t.FindInterfaces(myFilter2, "MediaPortal.GUI.Library.ISetupForm"); if (foundInterfaces.Length > 0) { if (newObj == null) { newObj = (object)Activator.CreateInstance(t); } ISetupForm setup = (ISetupForm)newObj; // don't activate plugins that have NO entry at all in // MediaPortal.xml if (!PluginEntryExists(setup.PluginName())) { Log.Info("PluginManager: {0} {1} not found in Mediaportal.xml so adding it now", setup.PluginName(), t.Assembly.ManifestModule.Name); AddPluginEntry(setup.PluginName(), t.Assembly.ManifestModule.Name); MPSettings.Instance.SetValueAsBool("home", setup.PluginName(), false); MPSettings.Instance.SetValueAsBool("myplugins", setup.PluginName(), true); MPSettings.Instance.SetValueAsBool("pluginswindows", t.ToString(), true); } if (IsPluginNameEnabled(setup.PluginName())) { _setupForms.Add(setup); _nonGuiPlugins.Add(plugin); } } else { //IPlugin without ISetupForm, adding anyway if (!PluginEntryExists(t.Name)) { AddPluginEntry(t.Name, t.Assembly.ManifestModule.Name); } _nonGuiPlugins.Add(plugin); } } catch (Exception iSetupFormException) { Log.Error("Exception while loading ISetupForm instances: {0}", t.FullName); Log.Error(iSetupFormException.Message); Log.Error(iSetupFormException.StackTrace); } try { foundInterfaces = t.FindInterfaces(myFilter2, "MediaPortal.GUI.Library.IWakeable"); if (foundInterfaces.Length > 0) { if (newObj == null) { newObj = (object)Activator.CreateInstance(t); } IWakeable setup = (IWakeable)newObj; if (PluginEntryExists(setup.PluginName()) && IsPluginNameEnabled(setup.PluginName())) { _wakeables.Add(setup); } } } catch (Exception iWakeableException) { Log.Error("Exception while loading IWakeable instances: {0}", t.FullName); Log.Error(iWakeableException.Message); Log.Error(iWakeableException.StackTrace); } } } catch (NullReferenceException) {} } } } } catch (Exception ex) { Log.Info( "PluginManager: Plugin file {0} is broken or incompatible with the current MediaPortal version and won't be loaded!", strFile.Substring(strFile.LastIndexOf(@"\") + 1)); Log.Info("PluginManager: Exception: {0}", ex); } }
public static void LoadWindowPlugin(string strFile) { if (!IsPlugInEnabled(strFile)) { return; } Log.Info(" Load plugins from : {0}", strFile); try { Assembly assem = Assembly.LoadFrom(strFile); if (assem != null) { Log.Info(" File Version : {0}", FileVersionInfo.GetVersionInfo(strFile).ProductVersion); Type[] types = assem.GetExportedTypes(); if (types.Any(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(GUIWindow))) && !CompatibilityManager.IsPluginCompatible(assem)) { Log.Error( "PluginManager: {0} is tagged as incompatible with the current MediaPortal version and won't be loaded!", assem.FullName); _incompatibilities.Add(assem); } else { //MarkPluginAsCompatible(assem); Type[] foundInterfaces = null; foreach (Type t in types) { try { if (t.IsClass) { if (t.IsAbstract) { continue; } Object newObj = null; if (t.IsSubclassOf(typeof(GUIWindow))) { try { if (!CompatibilityManager.IsPluginCompatible(t)) { Log.Error( "PluginManager: {0} is tagged as incompatible with the current MediaPortal version and won't be loaded!", t.FullName); _incompatibilities.Add(t); continue; } newObj = (object)Activator.CreateInstance(t); GUIWindow win = (GUIWindow)newObj; if (win.GetID >= 0 && IsWindowPlugInEnabled(win.GetType().ToString())) { try { win.Init(); _guiPlugins.Add(win); } catch (Exception ex) { Log.Error("Error initializing window:{0} {1} {2} {3}", win.ToString(), ex.Message, ex.Source, ex.StackTrace); } GUIWindowManager.Add(ref win); } //else Log.Info(" plugin:{0} not enabled",win.GetType().ToString()); } catch (Exception guiWindowsException) { Log.Error("Exception while loading GUIWindows instances: {0}", t.FullName); Log.Error(guiWindowsException.Message); Log.Error(guiWindowsException.StackTrace); } } // If we get to this point, the plugin has loaded successfully // Mark it as compatible. //MarkPluginAsCompatible(t); TypeFilter myFilter2 = new TypeFilter(MyInterfaceFilter); try { foundInterfaces = t.FindInterfaces(myFilter2, "MediaPortal.GUI.Library.ISetupForm"); if (foundInterfaces.Length > 0) { if (newObj == null) { newObj = (object)Activator.CreateInstance(t); } ISetupForm setup = (ISetupForm)newObj; if (!PluginEntryExists(setup.PluginName())) { Log.Info("PluginManager: {0} {1} not found in Mediaportal.xml so adding it now", setup.PluginName(), t.Assembly.ManifestModule.Name); AddPluginEntry(setup.PluginName(), t.Assembly.ManifestModule.Name); } if (IsPluginNameEnabled(setup.PluginName())) { _setupForms.Add(setup); } } } catch (Exception iSetupFormException) { Log.Error("Exception while loading ISetupForm instances: {0}", t.FullName); Log.Error(iSetupFormException.Message); Log.Error(iSetupFormException.StackTrace); } try { foundInterfaces = t.FindInterfaces(myFilter2, "MediaPortal.GUI.Library.IWakeable"); if (foundInterfaces.Length > 0) { if (newObj == null) { newObj = (object)Activator.CreateInstance(t); } IWakeable setup = (IWakeable)newObj; if (PluginEntryExists(setup.PluginName()) && IsPluginNameEnabled(setup.PluginName())) { _wakeables.Add(setup); } } } catch (Exception iWakeableException) { Log.Error("Exception while loading IWakeable instances: {0}", t.FullName); Log.Error(iWakeableException.Message); Log.Error(iWakeableException.StackTrace); } } } catch (NullReferenceException) {} } } } } catch (BadImageFormatException) { } catch (Exception ex) { Log.Info( "PluginManager: Plugin file {0} is broken or incompatible with the current MediaPortal version and won't be loaded!", strFile.Substring(strFile.LastIndexOf(@"\") + 1)); Log.Info("PluginManager: Exception: {0}", ex); } }
public static void LoadPlugins() { foreach (string pluginFile in availablePlugins) { Assembly pluginAssembly = null; try { Log.Debug("PluginsNew: loadPlugins {0}", pluginFile); pluginAssembly = Assembly.LoadFrom(pluginFile); } catch (BadImageFormatException) { Log.Warn("PluginsNew: {0} has a bad image format", pluginFile); } if (pluginAssembly != null) { try { Type[] exportedTypes = pluginAssembly.GetExportedTypes(); List <object> NonSetupWindows = new List <object>(); if (!exportedTypes.Any(t => t.IsClass && !t.IsAbstract && (typeof(ISetupForm).IsAssignableFrom(t) || typeof(GUIWindow).IsAssignableFrom(t)))) { continue; // there are no plugins in the assembly, skip it } foreach (Type type in exportedTypes) { bool isPlugin = (type.GetInterface("MediaPortal.GUI.Library.ISetupForm") != null); bool isGuiWindow = ((type.IsClass) && (type.IsSubclassOf(typeof(GUIWindow)))); // an abstract class cannot be instanciated if (type.IsAbstract) { continue; } bool isIncompatible = !CompatibilityManager.IsPluginCompatible(type); if (isIncompatible) { Log.Warn( "Plugin Manager: Plugin {0} is incompatible with the current MediaPortal version! (File: {1})", type.FullName, pluginFile.Substring(pluginFile.LastIndexOf(@"\") + 1)); } // Try to locate the interface we're interested in if (isPlugin || isGuiWindow) { // Create instance of the current type object pluginObject; try { pluginObject = Activator.CreateInstance(type); } catch (TargetInvocationException) { MessageBox.Show( string.Format( "An error occured while loading the plugin {0}.\n\nIt's incompatible with the current MediaPortal version and won't be loaded.", type.FullName ), "Plugin Manager", MessageBoxButtons.OK, MessageBoxIcon.Error); Log.Warn( "Plugin Manager: Plugin {0} is incompatible with the current MediaPortal version! (File: {1})", type.FullName, pluginFile.Substring(pluginFile.LastIndexOf(@"\") + 1)); continue; } if (isPlugin) { ISetupForm pluginForm = pluginObject as ISetupForm; IExternalPlayer extPlayer = pluginObject as IExternalPlayer; IShowPlugin showPlugin = pluginObject as IShowPlugin; if (pluginForm != null) { ItemTag tag = new ItemTag(); tag.expType = type; tag.PluginName = pluginForm.PluginName(); tag.SetupForm = pluginForm; tag.DllName = pluginFile.Substring(pluginFile.LastIndexOf(@"\") + 1); tag.WindowId = pluginForm.GetWindowId(); if (isGuiWindow) { GUIWindow win = (GUIWindow)pluginObject; if (tag.WindowId == win.GetID) { tag.Type = win.GetType().ToString(); tag.IsProcess = false; tag.IsWindow = true; } } else if (extPlayer != null) { tag.IsExternalPlayer = true; } else { tag.IsProcess = true; } if (showPlugin != null) { tag.ShowDefaultHome = showPlugin.ShowDefaultHome(); } tag.IsIncompatible = isIncompatible; //LoadPluginImages(type, tag); loadedPlugins.Add(tag); } } else { NonSetupWindows.Add(pluginObject); } } } // Filter plugins from e.g. dialogs or other windows. foreach (GUIWindow win in NonSetupWindows) { foreach (ItemTag tag in loadedPlugins) { if (tag.WindowId == win.GetID) { tag.Type = win.GetType().ToString(); tag.IsProcess = false; tag.IsWindow = true; Log.Debug( "PluginsNew: {0}, window plugin, does not implement \"ISetupForm\" and \"GUIWindow\" in the same class", tag.Type); break; } } } } catch (Exception ex) { MessageBox.Show( string.Format( "An error occured while loading the plugin file {0}.\n\nIt's broken or incompatible with the current MediaPortal version and won't be loaded.", pluginFile.Substring(pluginFile.LastIndexOf(@"\") + 1)), "Plugin Manager", MessageBoxButtons.OK, MessageBoxIcon.Error); Log.Warn( "PluginManager: Plugin file {0} is broken or incompatible with the current MediaPortal version and won't be loaded!", pluginFile.Substring(pluginFile.LastIndexOf(@"\") + 1)); Log.Error("PluginManager: Exception: {0}", ex); } } } }