[gthumb/ext: 24/79] before loading an extension load its dependencies
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb/ext: 24/79] before loading an extension load its dependencies
- Date: Sun, 2 Aug 2009 20:25:54 +0000 (UTC)
commit 14883dfd63ceaea993ceb347905ca328b5e48e55
Author: Paolo Bacchilega <paobac src gnome org>
Date: Thu Jun 25 23:58:33 2009 +0200
before loading an extension load its dependencies
gthumb/gth-extensions.c | 197 +++++++++++++++++++++++++++++++++--------------
gthumb/gth-extensions.h | 21 +++--
gthumb/gth-main.c | 9 +--
3 files changed, 153 insertions(+), 74 deletions(-)
---
diff --git a/gthumb/gth-extensions.c b/gthumb/gth-extensions.c
index 5fc16b4..ace257a 100644
--- a/gthumb/gth-extensions.c
+++ b/gthumb/gth-extensions.c
@@ -180,15 +180,15 @@ gth_extension_configure (GthExtension *self,
/* -- gth_extension_module -- */
-static gpointer gth_extension_module_parent_class = NULL;
-
-
struct _GthExtensionModulePrivate {
char *module_name;
GModule *module;
};
+static gpointer gth_extension_module_parent_class = NULL;
+
+
static gboolean
gth_extension_module_real_open (GthExtension *base)
{
@@ -338,12 +338,9 @@ gth_extension_module_finalize (GObject *obj)
self = GTH_EXTENSION_MODULE (obj);
- if (self->priv != NULL) {
- if (self->priv->module != NULL)
- g_module_close (self->priv->module);
- g_free (self->priv->module_name);
- g_free (self->priv);
- }
+ if (self->priv->module != NULL)
+ g_module_close (self->priv->module);
+ g_free (self->priv->module_name);
G_OBJECT_CLASS (gth_extension_module_parent_class)->finalize (obj);
}
@@ -355,6 +352,7 @@ gth_extension_module_class_init (GthExtensionModuleClass *klass)
GthExtensionClass *elc;
gth_extension_module_parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GthExtensionModulePrivate));
G_OBJECT_CLASS (klass)->finalize = gth_extension_module_finalize;
@@ -371,7 +369,7 @@ gth_extension_module_class_init (GthExtensionModuleClass *klass)
static void
gth_extension_module_instance_init (GthExtensionModule *self)
{
- self->priv = g_new0 (GthExtensionModulePrivate, 1);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_EXTENSION_MODULE, GthExtensionModulePrivate);
}
@@ -413,6 +411,13 @@ gth_extension_module_new (const char *module_name)
/* -- gth_extension_description -- */
+struct _GthExtensionDescriptionPrivate {
+ gboolean opened;
+ gboolean activated;
+ GthExtension *extension;
+};
+
+
static gpointer gth_extension_description_parent_class = NULL;
@@ -431,6 +436,8 @@ gth_extension_description_finalize (GObject *obj)
g_free (self->url);
g_free (self->loader_type);
g_free (self->loader_file);
+ g_strfreev (self->loader_requires);
+ _g_object_unref (self->priv->extension);
G_OBJECT_CLASS (gth_extension_description_parent_class)->finalize (obj);
}
@@ -440,6 +447,8 @@ static void
gth_extension_description_class_init (GthExtensionDescriptionClass *klass)
{
gth_extension_description_parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GthExtensionDescriptionPrivate));
+
G_OBJECT_CLASS (klass)->finalize = gth_extension_description_finalize;
}
@@ -447,6 +456,10 @@ gth_extension_description_class_init (GthExtensionDescriptionClass *klass)
static void
gth_extension_description_instance_init (GthExtensionDescription *self)
{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_EXTENSION_DESCRIPTION, GthExtensionDescriptionPrivate);
+ self->priv->opened = FALSE;
+ self->priv->activated = FALSE;
+ self->priv->extension = NULL;
}
@@ -473,14 +486,18 @@ gth_extension_description_get_type (void)
}
-static void
+static gboolean
gth_extension_description_load_from_file (GthExtensionDescription *desc,
- const char *file_name)
+ GFile *file)
{
GKeyFile *key_file;
+ char *file_path;
key_file = g_key_file_new ();
- g_key_file_load_from_file (key_file, file_name, G_KEY_FILE_NONE, NULL);
+ file_path = g_file_get_path (file);
+ if (! g_key_file_load_from_file (key_file, file_path, G_KEY_FILE_NONE, NULL))
+ return FALSE;
+
desc->name = g_key_file_get_string (key_file, "Extension", "Name", NULL);
desc->description = g_key_file_get_string (key_file, "Extension", "Description", NULL);
desc->version = g_key_file_get_string (key_file, "Extension", "Version", NULL);
@@ -489,7 +506,12 @@ gth_extension_description_load_from_file (GthExtensionDescription *desc,
desc->url = g_key_file_get_string (key_file, "Extension", "URL", NULL);
desc->loader_type = g_key_file_get_string (key_file, "Loader", "Type", NULL);
desc->loader_file = g_key_file_get_string (key_file, "Loader", "File", NULL);
+ desc->loader_requires = g_key_file_get_string_list (key_file, "Loader", "Requires", NULL, NULL);
+
+ g_free (file_path);
g_key_file_free (key_file);
+
+ return TRUE;
}
@@ -499,11 +521,9 @@ gth_extension_description_new (GFile *file)
GthExtensionDescription *desc;
desc = g_object_new (GTH_TYPE_EXTENSION_DESCRIPTION, NULL);
- if (file != NULL) {
- char *file_name;
- file_name = g_file_get_path (file);
- gth_extension_description_load_from_file (desc, file_name);
- g_free (file_name);
+ if (! gth_extension_description_load_from_file (desc, file)) {
+ g_object_unref (desc);
+ desc = NULL;
}
return desc;
@@ -517,7 +537,7 @@ static gpointer gth_extension_manager_parent_class = NULL;
struct _GthExtensionManagerPrivate {
- GList *extensions;
+ GHashTable *extensions;
};
@@ -528,10 +548,7 @@ gth_extension_manager_finalize (GObject *obj)
self = GTH_EXTENSION_MANAGER (obj);
- if (self->priv != NULL) {
- _g_object_list_unref (self->priv->extensions);
- g_free (self->priv);
- }
+ g_hash_table_destroy (self->priv->extensions);
G_OBJECT_CLASS (gth_extension_manager_parent_class)->finalize (obj);
}
@@ -541,6 +558,7 @@ static void
gth_extension_manager_class_init (GthExtensionManagerClass *klass)
{
gth_extension_manager_parent_class = g_type_class_peek_parent (klass);
+ g_type_class_add_private (klass, sizeof (GthExtensionManagerPrivate));
G_OBJECT_CLASS (klass)->finalize = gth_extension_manager_finalize;
}
@@ -549,7 +567,8 @@ gth_extension_manager_class_init (GthExtensionManagerClass *klass)
static void
gth_extension_manager_instance_init (GthExtensionManager *self)
{
- self->priv = g_new0 (GthExtensionManagerPrivate, 1);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_EXTENSION_MANAGER, GthExtensionManagerPrivate);
+ self->priv->extensions = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
}
@@ -575,23 +594,7 @@ gth_extension_manager_get_type (void) {
}
-static GthExtensionManager *
-gth_extension_manager_construct (GType object_type)
-{
- GthExtensionManager *self;
- self = g_object_newv (object_type, 0, NULL);
- return self;
-}
-
-
-GthExtensionManager *
-gth_extension_manager_new (void)
-{
- return gth_extension_manager_construct (GTH_TYPE_EXTENSION_MANAGER);
-}
-
-
-void
+static void
gth_extension_manager_load_extensions (GthExtensionManager *self)
{
GFile *extensions_dir;
@@ -600,38 +603,114 @@ gth_extension_manager_load_extensions (GthExtensionManager *self)
g_return_if_fail (GTH_IS_EXTENSION_MANAGER (self));
- _g_object_list_unref (self->priv->extensions);
- self->priv->extensions = NULL;
-
extensions_dir = g_file_new_for_path (GTHUMB_EXTENSIONS_DIR);
enumerator = g_file_enumerate_children (extensions_dir, G_FILE_ATTRIBUTE_STANDARD_NAME, 0, NULL, NULL);
while ((info = g_file_enumerator_next_file (enumerator, NULL, NULL)) != NULL) {
- const char *name;
+ const char *name;
+ GFile *ext_file;
+ GthExtensionDescription *ext_desc;
name = g_file_info_get_name (info);
- if ((name != NULL) && g_str_has_suffix (name, EXTENSION_SUFFIX)) {
- GFile *ext_file;
- GthExtensionDescription *ext_desc;
- ext_file = g_file_get_child (extensions_dir, name);
- ext_desc = gth_extension_description_new (ext_file);
- if (ext_desc != NULL)
- self->priv->extensions = g_list_prepend (self->priv->extensions, ext_desc);
+#ifdef RUN_IN_PLACE
+ {
+ char *basename;
+ char *path;
+
+ basename = g_strconcat (name, EXTENSION_SUFFIX, NULL);
+ path = g_build_filename (GTHUMB_EXTENSIONS_DIR, name, basename, NULL);
+ ext_file = g_file_new_for_path (path);
+
+ g_free (path);
+ g_free (basename);
+ }
+#else
+ ext_file = g_file_get_child (extensions_dir, name);
+#endif
- g_object_unref (ext_file);
- }
+ ext_desc = gth_extension_description_new (ext_file);
+ if (ext_desc != NULL)
+ g_hash_table_insert (self->priv->extensions, g_strdup (name), ext_desc);
+ g_object_unref (ext_file);
g_object_unref (info);
}
+
g_object_unref (enumerator);
g_object_unref (extensions_dir);
}
-GthExtension *
-gth_extension_manager_get_extension (GthExtensionManager *self,
- GthExtensionDescription *desc)
+GthExtensionManager *
+gth_extension_manager_new (void)
{
- GthExtension *loader = NULL;
- return loader;
+ GthExtensionManager *manager;
+
+ manager = (GthExtensionManager *) g_object_newv (GTH_TYPE_EXTENSION_MANAGER, 0, NULL);
+ gth_extension_manager_load_extensions (manager);
+
+ return manager;
+}
+
+
+gboolean
+gth_extension_manager_open (GthExtensionManager *manager,
+ const char *extension_name)
+{
+ GthExtensionDescription *description;
+
+ description = g_hash_table_lookup (manager->priv->extensions, extension_name);
+ g_return_val_if_fail (description != NULL, FALSE);
+
+ if (description->priv->opened)
+ return TRUE;
+
+ g_return_val_if_fail (description->loader_type != NULL, FALSE);
+
+ if (strcmp (description->loader_type, "module") == 0)
+ description->priv->extension = gth_extension_module_new (extension_name);
+
+ g_return_val_if_fail (description->priv->extension != NULL, FALSE);
+
+ description->priv->opened = gth_extension_open (description->priv->extension);
+
+ return description->priv->opened;
+}
+
+
+gboolean
+gth_extension_manager_activate (GthExtensionManager *manager,
+ const char *extension_name)
+{
+ GthExtensionDescription *description;
+
+ if (! gth_extension_manager_open (manager, extension_name))
+ return FALSE;
+
+ description = g_hash_table_lookup (manager->priv->extensions, extension_name);
+ if (description->loader_requires != NULL) {
+ int i;
+
+ for (i = 0; description->loader_requires[i] != NULL; i++)
+ if (! gth_extension_manager_activate (manager, description->loader_requires[i]))
+ return FALSE;
+ }
+ gth_extension_activate (description->priv->extension);
+
+ return TRUE;
+}
+
+
+GList *
+gth_extension_manager_get_extensions (GthExtensionManager *manager)
+{
+ return g_hash_table_get_keys (manager->priv->extensions);
+}
+
+
+GthExtensionDescription *
+gth_extension_manager_get_description (GthExtensionManager *manager,
+ const char *extension_name)
+{
+ return g_hash_table_lookup (manager->priv->extensions, extension_name);
}
diff --git a/gthumb/gth-extensions.h b/gthumb/gth-extensions.h
index 67d7e58..16f178e 100644
--- a/gthumb/gth-extensions.h
+++ b/gthumb/gth-extensions.h
@@ -19,7 +19,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
*/
-
+
#ifndef GTH_EXTENSIONS_H
#define GTH_EXTENSIONS_H
@@ -77,7 +77,7 @@ typedef struct _GthExtensionManagerPrivate GthExtensionManagerPrivate;
struct _GthExtension {
GObject parent_instance;
- GthExtensionPrivate *priv;
+ GthExtensionPrivate *priv;
gboolean initialized;
gboolean active;
};
@@ -89,7 +89,7 @@ struct _GthExtensionClass {
void (*activate) (GthExtension *self);
void (*deactivate) (GthExtension *self);
gboolean (*is_configurable) (GthExtension *self);
- void (*configure) (GthExtension *self,
+ void (*configure) (GthExtension *self,
GtkWindow *parent);
};
@@ -104,7 +104,6 @@ struct _GthExtensionModuleClass {
struct _GthExtensionDescription {
GObject parent_instance;
- GthExtensionDescriptionPrivate *priv;
char *name;
char *description;
char **authors;
@@ -113,6 +112,8 @@ struct _GthExtensionDescription {
char *url;
char *loader_type;
char *loader_file;
+ char **loader_requires;
+ GthExtensionDescriptionPrivate *priv;
};
struct _GthExtensionDescriptionClass {
@@ -135,7 +136,7 @@ gboolean gth_extension_is_active (GthExtension
void gth_extension_activate (GthExtension *self);
void gth_extension_deactivate (GthExtension *self);
gboolean gth_extension_is_configurable (GthExtension *self);
-void gth_extension_configure (GthExtension *self,
+void gth_extension_configure (GthExtension *self,
GtkWindow *parent);
GType gth_extension_module_get_type (void);
@@ -146,9 +147,13 @@ GthExtensionDescription * gth_extension_description_new (GFile
GType gth_extension_manager_get_type (void);
GthExtensionManager * gth_extension_manager_new (void);
-void gth_extension_manager_load_extensions (GthExtensionManager *self);
-GthExtension * gth_extension_manager_get_extension (GthExtensionManager *self,
- GthExtensionDescription *desc);
+gboolean gth_extension_manager_open (GthExtensionManager *manager,
+ const char *extension_name);
+gboolean gth_extension_manager_activate (GthExtensionManager *manager,
+ const char *extension_name);
+GList * gth_extension_manager_get_extensions (GthExtensionManager *manager);
+GthExtensionDescription * gth_extension_manager_get_description (GthExtensionManager *manager,
+ const char *extension_name);
G_END_DECLS
diff --git a/gthumb/gth-main.c b/gthumb/gth-main.c
index aef8ccc..ee780a6 100644
--- a/gthumb/gth-main.c
+++ b/gthumb/gth-main.c
@@ -1000,11 +1000,6 @@ gth_main_activate_extensions (void)
/* FIXME: read the extensions list from a gconf key */
- for (i = 0; default_extensions[i] != NULL; i++) {
- GthExtension *extension;
-
- extension = gth_extension_module_new (default_extensions[i]);
- if ((extension != NULL) && gth_extension_open (extension))
- gth_extension_activate (extension);
- }
+ for (i = 0; default_extensions[i] != NULL; i++)
+ gth_extension_manager_activate (Main->priv->extension_manager, default_extensions[i]);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]