[PATCH 3/6] [grl-plugin-registry] Get plugins' info from XML file



Builds the XML from the library name and parses it to retrieve the
plugin's info.
---
 src/grl-plugin-registry.c |   66 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)

diff --git a/src/grl-plugin-registry.c b/src/grl-plugin-registry.c
index e04cae5..9b626fd 100644
--- a/src/grl-plugin-registry.c
+++ b/src/grl-plugin-registry.c
@@ -44,12 +44,15 @@
 
 #include <string.h>
 #include <gmodule.h>
+#include <libxml/parser.h>
 
 #define GRL_PLUGIN_PATH_DEFAULT GRL_PLUGINS_DIR
 
 #undef G_LOG_DOMAIN
 #define G_LOG_DOMAIN "grl-plugin-registry"
 
+#define XML_ROOT_ELEMENT_NAME "pluginInfo"
+
 #define GRL_PLUGIN_REGISTRY_GET_PRIVATE(object)                 \
   (G_TYPE_INSTANCE_GET_PRIVATE((object),                        \
                                GRL_TYPE_PLUGIN_REGISTRY,        \
@@ -229,6 +232,64 @@ sort_by_rank (GrlMediaPlugin **source_list)
   }
 }
 
+static gchar *
+get_xml_path_from_plugin_path (const gchar *path)
+{
+  gchar *path_prefix, *xml_path, *extension;
+  gint extension_index;
+
+  extension = g_strrstr (path, G_MODULE_SUFFIX);
+  if (!extension) {
+    return g_strdup (path);
+  }
+
+  extension_index = g_utf8_pointer_to_offset (path, extension);
+  path_prefix = (gchar *) g_malloc(extension - path);
+  g_utf8_strncpy (path_prefix,
+		  path,
+		  extension_index);
+  xml_path =  g_strconcat (path_prefix, "xml", NULL);
+  g_free (path_prefix);
+
+  return xml_path;
+}
+
+static GHashTable *
+get_info_from_plugin_xml (const gchar *xml_path)
+{
+  GHashTable *hash_table;
+  xmlNodePtr node, child;
+  xmlDocPtr doc_ptr = xmlReadFile (xml_path,
+				   NULL,
+				   XML_PARSE_RECOVER | XML_PARSE_NOBLANKS |
+				   XML_PARSE_NOWARNING | XML_PARSE_NOERROR);
+  if (!doc_ptr) {
+    g_warning ("Could not read XML file under the location: %s", xml_path);
+    return NULL;
+  }
+
+  node = xmlDocGetRootElement (doc_ptr);
+  if (!node || g_strcmp0 ((gchar *) node->name, XML_ROOT_ELEMENT_NAME)) {
+    g_warning ("%s did not have a %s root element.",
+	       xml_path,
+	       XML_ROOT_ELEMENT_NAME);
+    xmlFreeDoc (doc_ptr);
+    return NULL;
+  }
+
+  hash_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+  child = node->children;
+  while (child) {
+    g_hash_table_insert (hash_table,
+			 g_strdup ((gchar *) child->name),
+			 (gchar *) xmlNodeGetContent (child));
+    child = child->next;
+  }
+  xmlFreeDoc (doc_ptr);
+
+  return hash_table;
+}
+
 /* ================ API ================ */
 
 /**
@@ -332,6 +393,7 @@ grl_plugin_registry_load (GrlPluginRegistry *registry, const gchar *path)
   GModule *module;
   GrlPluginDescriptor *plugin;
   GList *plugin_configs;
+  gchar *xml_path;
 
   module = g_module_open (path, G_MODULE_BIND_LAZY);
   if (!module) {
@@ -350,6 +412,10 @@ grl_plugin_registry_load (GrlPluginRegistry *registry, const gchar *path)
     return FALSE;
   }
 
+  xml_path = get_xml_path_from_plugin_path (path);
+  plugin->info.optional_info =  get_info_from_plugin_xml (xml_path);
+  g_free (xml_path);
+
   set_plugin_rank (registry, plugin);
 
   g_hash_table_insert (registry->priv->plugins,
-- 
1.7.0.4



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]