/// <summary> /// Extract information for a class. /// </summary> /// <param name="assembly"></param> /// <param name="className"></param> /// <param name="defaultLang"></param> /// <param name="element"></param> private static void ProcessClass(Assembly resources, string assembly, string className, string defaultLang, XElement element) { MasterObjectTable mot = Locator.Current.GetService <MasterObjectTable>(); // Get the descriptions IEnumerable <XElement> nodes = from node in element.Descendants(DescriptionTag) select node; if (nodes.Count() > 0) { // Process the description LogHost.Default.Debug("Loading description definition for class '{0}'", className); ObjectDescription description = ProcessDescription(defaultLang, nodes.First()); if ((description.Icon != null) && (description.Icon.Length > 0)) { description.Icon = CopyIconImage(resources, assembly, description.Icon); } mot.AddDescription(className, description); } // Get the configurations nodes = from node in element.Descendants(ConfigurationTag) select node; if (nodes.Count() > 0) { // Process the configuration LogHost.Default.Debug("Loading configuration definition for class '{0}'", className); IConfigurationDescription config = ProcessConfiguration(defaultLang, nodes.First()); if (config != null) { mot.AddConfigurationDescription(className, config); } } }
/// <summary> /// Initialise all the plugins. /// /// Every available plugin (added with <see cref="AddPlugin"/> or <see cref="LoadPlugins"/>) /// that is not marked as disabled will be initialised. /// </summary> public void InitialisePlugins() { MasterObjectTable mot = Locator.Current.GetService <MasterObjectTable>(); lock (m_pluginsAvailable) { lock (m_pluginsEnabled) { foreach (Guid uuid in m_pluginsAvailable.Keys) { // Create the IPluginHost for this plugin and enable it PluginHost host = new PluginHost(m_pluginsAvailable[uuid]); if (host.EnablePlugin()) { this.Log().Debug("Enabled plugin {0} (ID = '{1}')", m_pluginsAvailable[uuid].GetType().Name, m_pluginsAvailable[uuid].UUID); m_pluginsEnabled[uuid] = host; mot.AddInstance(m_pluginsAvailable[uuid]); } } } } }
/// <summary> /// Enable the plugin /// </summary> /// <returns></returns> public bool EnablePlugin() { // Add the plugin to the MOT on the assumption it will work MasterObjectTable mot = Locator.Current.GetService <MasterObjectTable>(); mot.AddInstance(m_plugin); // If the plugin supports configuration we need to give it one before // initialisation IConfigurable configurable = m_plugin as IConfigurable; if (configurable != null) { IConfigurationDescription description = mot.GetConfigurationDescription(m_plugin.UUID); IDictionary <string, object> values = mot.GetConfiguration(m_plugin.UUID); Dictionary <string, string> failures = new Dictionary <string, string>(); if (!configurable.ValidateConfiguration(description, values, failures)) { StringBuilder sb = new StringBuilder(); string separator = ""; foreach (KeyValuePair <string, string> message in failures) { sb.Append(separator); separator = ", "; sb.Append(String.Format("'{0}' - {1}", message.Key, message.Value)); } this.Log().Error("One or more configuration values are not applicable - " + sb.ToString()); mot.RemoveInstance(m_plugin.UUID); return(false); } try { configurable.ApplyConfiguration(description, values); } catch (Exception ex) { this.Log().Error("Unable to apply configuration to plugin - {0}.", ex.ToString()); mot.RemoveInstance(m_plugin.UUID); return(false); } } // Now try and initialise it bool initialised = false; try { initialised = m_plugin.Initialise(this); if (initialised) { this.Log().Info("Initialised plugin"); } else { this.Log().Error("Failed to initialise plugin."); } } catch (Exception ex) { this.Log().Error("Failed to initialise plugin - {0}", ex.Message); } if (!initialised) { mot.RemoveInstance(m_plugin.UUID); } return(initialised); }