[gthumb/ext] changed the gth_metadata_provider_can_read/can_write functions



commit fd9afa7287b191713a09f031b3c8ffd26cf84e12
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Fri Jan 1 17:44:05 2010 +0100

    changed the gth_metadata_provider_can_read/can_write functions
    
    added a mime type argument to the can_read/can_write functions
    to make them more usefull.

 .../comments/gth-metadata-provider-comment.c       |   77 +++----
 .../comments/gth-metadata-provider-comment.h       |    2 -
 extensions/exiv2/gth-metadata-provider-exiv2.c     |   89 ++++----
 extensions/exiv2/gth-metadata-provider-exiv2.h     |    2 -
 .../gstreamer/gth-metadata-provider-gstreamer.c    |   67 ++----
 .../gstreamer/gth-metadata-provider-gstreamer.h    |    2 -
 .../image_viewer/gth-metadata-provider-image.c     |   67 ++----
 .../image_viewer/gth-metadata-provider-image.h     |    2 -
 gthumb/gth-main.c                                  |   34 +++-
 gthumb/gth-main.h                                  |    7 +-
 gthumb/gth-metadata-provider-file.c                |   62 ++----
 gthumb/gth-metadata-provider-file.h                |    2 -
 gthumb/gth-metadata-provider.c                     |  251 +++++---------------
 gthumb/gth-metadata-provider.h                     |   24 ++-
 14 files changed, 230 insertions(+), 458 deletions(-)
---
diff --git a/extensions/comments/gth-metadata-provider-comment.c b/extensions/comments/gth-metadata-provider-comment.c
index a2846c0..190c23f 100644
--- a/extensions/comments/gth-metadata-provider-comment.c
+++ b/extensions/comments/gth-metadata-provider-comment.c
@@ -21,23 +21,41 @@
  */
 
 #include <config.h>
-#include <string.h>
-#include <glib/gi18n.h>
 #include <glib.h>
 #include <gthumb.h>
 #include "gth-comment.h"
 #include "gth-metadata-provider-comment.h"
 
 
-#define GTH_METADATA_PROVIDER_COMMENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_METADATA_PROVIDER_COMMENT, GthMetadataProviderCommentPrivate))
+static gpointer parent_class = NULL;
 
 
-struct _GthMetadataProviderCommentPrivate {
-	int dummy;
-};
+static gboolean
+gth_metadata_provider_comment_can_read (GthMetadataProvider  *self,
+				        const char           *mime_type,
+				        char                **attribute_v)
+{
+	return _g_file_attributes_matches_any_v ("comment::*,"
+						 "general::datetime,"
+						 "general::description,"
+						 "general::location,"
+						 "general::tags",
+					         attribute_v);
+}
 
 
-static gpointer parent_class = NULL;
+static gboolean
+gth_metadata_provider_comment_can_write (GthMetadataProvider  *self,
+				         const char           *mime_type,
+				         char                **attribute_v)
+{
+	return _g_file_attributes_matches_any_v ("comment::*,"
+						 "general::datetime,"
+						 "general::description,"
+						 "general::location,"
+						 "general::tags",
+					         attribute_v);
+}
 
 
 static void
@@ -193,56 +211,17 @@ gth_metadata_provider_comment_write (GthMetadataProvider *self,
 
 
 static void
-gth_metadata_provider_comment_finalize (GObject *object)
-{
-	/*GthMetadataProviderComment *comment = GTH_METADATA_PROVIDER_COMMENT (object);*/
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-static GObject *
-gth_metadata_provider_constructor (GType                  type,
-				   guint                  n_construct_properties,
-				   GObjectConstructParam *construct_properties)
-{
-	GthMetadataProviderClass *klass;
-	GObjectClass             *parent_class;
-	GObject                  *obj;
-	GthMetadataProvider      *self;
-
-	klass = GTH_METADATA_PROVIDER_CLASS (g_type_class_peek (GTH_TYPE_METADATA_PROVIDER));
-	parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
-	self = GTH_METADATA_PROVIDER (obj);
-
-	g_object_set (self, "readable-attributes", "comment::*,general::datetime,general::description,general::location,general::tags", NULL);
-	g_object_set (self, "writable-attributes", "comment::*,general::datetime,general::description,general::location,general::tags", NULL);
-
-	return obj;
-}
-
-
-static void
 gth_metadata_provider_comment_class_init (GthMetadataProviderCommentClass *klass)
 {
 	parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (GthMetadataProviderCommentPrivate));
-
-	G_OBJECT_CLASS (klass)->finalize = gth_metadata_provider_comment_finalize;
-	G_OBJECT_CLASS (klass)->constructor = gth_metadata_provider_constructor;
 
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_read = gth_metadata_provider_comment_can_read;
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_write = gth_metadata_provider_comment_can_write;
 	GTH_METADATA_PROVIDER_CLASS (klass)->read = gth_metadata_provider_comment_read;
 	GTH_METADATA_PROVIDER_CLASS (klass)->write = gth_metadata_provider_comment_write;
 }
 
 
-static void
-gth_metadata_provider_comment_init (GthMetadataProviderComment *catalogs)
-{
-}
-
-
 GType
 gth_metadata_provider_comment_get_type (void)
 {
@@ -258,7 +237,7 @@ gth_metadata_provider_comment_get_type (void)
 			NULL,
 			sizeof (GthMetadataProviderComment),
 			0,
-			(GInstanceInitFunc) gth_metadata_provider_comment_init
+			(GInstanceInitFunc) NULL
 		};
 
 		type = g_type_register_static (GTH_TYPE_METADATA_PROVIDER,
diff --git a/extensions/comments/gth-metadata-provider-comment.h b/extensions/comments/gth-metadata-provider-comment.h
index 5404e7a..677c083 100644
--- a/extensions/comments/gth-metadata-provider-comment.h
+++ b/extensions/comments/gth-metadata-provider-comment.h
@@ -35,13 +35,11 @@
 #define GTH_METADATA_PROVIDER_COMMENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_METADATA_PROVIDER_COMMENT, GthMetadataProviderCommentClass))
 
 typedef struct _GthMetadataProviderComment         GthMetadataProviderComment;
-typedef struct _GthMetadataProviderCommentPrivate  GthMetadataProviderCommentPrivate;
 typedef struct _GthMetadataProviderCommentClass    GthMetadataProviderCommentClass;
 
 struct _GthMetadataProviderComment
 {
 	GthMetadataProvider __parent;
-	GthMetadataProviderCommentPrivate *priv;
 };
 
 struct _GthMetadataProviderCommentClass
diff --git a/extensions/exiv2/gth-metadata-provider-exiv2.c b/extensions/exiv2/gth-metadata-provider-exiv2.c
index 2e96201..c35ea5b 100644
--- a/extensions/exiv2/gth-metadata-provider-exiv2.c
+++ b/extensions/exiv2/gth-metadata-provider-exiv2.c
@@ -29,15 +29,49 @@
 #include "gth-metadata-provider-exiv2.h"
 
 
-#define GTH_METADATA_PROVIDER_EXIV2_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_METADATA_PROVIDER_EXIV2, GthMetadataProviderExiv2Private))
+static GthMetadataProviderClass *parent_class = NULL;
 
 
-struct _GthMetadataProviderExiv2Private {
-	int dummy;
-};
+static gboolean
+gth_metadata_provider_exiv2_can_read (GthMetadataProvider  *self,
+				      const char           *mime_type,
+				      char                **attribute_v)
+{
+	if (! _g_content_type_is_a (mime_type, "image/*"))
+		return FALSE;
+
+	return _g_file_attributes_matches_any_v ("Exif::*,"
+						 "Xmp::*,"
+						 "Iptc::*,"
+						 "Embedded::Image::*,"
+						 "Embedded::Photo::*,"
+						 "general::datetime,"
+						 "general::description,"
+						 "general::location,"
+						 "general::tags",
+					         attribute_v);
+}
 
 
-static GthMetadataProviderClass *parent_class = NULL;
+static gboolean
+gth_metadata_provider_exiv2_can_write (GthMetadataProvider  *self,
+				       const char           *mime_type,
+				       char                **attribute_v)
+{
+	if (! exiv2_supports_writes (mime_type))
+		return FALSE;
+
+	return _g_file_attributes_matches_any_v ("Exif::*,"
+						 "Xmp::*,"
+						 "Iptc::*,"
+						 "Embedded::Image::*,"
+						 "Embedded::Photo::*,"
+						 "general::datetime,"
+						 "general::description,"
+						 "general::location,"
+						 "general::tags",
+					         attribute_v);
+}
 
 
 static void
@@ -165,56 +199,17 @@ gth_metadata_provider_exiv2_write (GthMetadataProvider *self,
 
 
 static void
-gth_metadata_provider_exiv2_finalize (GObject *object)
-{
-	/*GthMetadataProviderExiv2 *comment = GTH_METADATA_PROVIDER_EXIV2 (object);*/
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-static GObject *
-gth_metadata_provider_constructor (GType                  type,
-				   guint                  n_construct_properties,
-				   GObjectConstructParam *construct_properties)
-{
-	GthMetadataProviderClass *klass;
-	GObjectClass             *parent_class;
-	GObject                  *obj;
-	GthMetadataProvider      *self;
-
-	klass = GTH_METADATA_PROVIDER_CLASS (g_type_class_peek (GTH_TYPE_METADATA_PROVIDER));
-	parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
-	self = GTH_METADATA_PROVIDER (obj);
-
-	g_object_set (self, "readable-attributes", "Exif::*,Xmp::*,Iptc::*,Embedded::Image::*,Embedded::Photo::*,general::datetime,general::description,general::location,general::tags", NULL);
-	g_object_set (self, "writable-attributes", "Exif::*,Xmp::*,Iptc::*,Embedded::Image::*,Embedded::Photo::*,general::datetime,general::description,general::location,general::tags", NULL);
-
-	return obj;
-}
-
-
-static void
 gth_metadata_provider_exiv2_class_init (GthMetadataProviderExiv2Class *klass)
 {
 	parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (GthMetadataProviderExiv2Private));
-
-	G_OBJECT_CLASS (klass)->finalize = gth_metadata_provider_exiv2_finalize;
-	G_OBJECT_CLASS (klass)->constructor = gth_metadata_provider_constructor;
 
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_read = gth_metadata_provider_exiv2_can_read;
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_write = gth_metadata_provider_exiv2_can_write;
 	GTH_METADATA_PROVIDER_CLASS (klass)->read = gth_metadata_provider_exiv2_read;
 	GTH_METADATA_PROVIDER_CLASS (klass)->write = gth_metadata_provider_exiv2_write;
 }
 
 
-static void
-gth_metadata_provider_exiv2_init (GthMetadataProviderExiv2 *catalogs)
-{
-}
-
-
 GType
 gth_metadata_provider_exiv2_get_type (void)
 {
@@ -230,7 +225,7 @@ gth_metadata_provider_exiv2_get_type (void)
 			NULL,
 			sizeof (GthMetadataProviderExiv2),
 			0,
-			(GInstanceInitFunc) gth_metadata_provider_exiv2_init
+			(GInstanceInitFunc) NULL
 		};
 
 		type = g_type_register_static (GTH_TYPE_METADATA_PROVIDER,
diff --git a/extensions/exiv2/gth-metadata-provider-exiv2.h b/extensions/exiv2/gth-metadata-provider-exiv2.h
index a6b4c7d..24404b7 100644
--- a/extensions/exiv2/gth-metadata-provider-exiv2.h
+++ b/extensions/exiv2/gth-metadata-provider-exiv2.h
@@ -35,13 +35,11 @@
 #define GTH_METADATA_PROVIDER_EXIV2_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_METADATA_PROVIDER_EXIV2, GthMetadataProviderExiv2Class))
 
 typedef struct _GthMetadataProviderExiv2         GthMetadataProviderExiv2;
-typedef struct _GthMetadataProviderExiv2Private  GthMetadataProviderExiv2Private;
 typedef struct _GthMetadataProviderExiv2Class    GthMetadataProviderExiv2Class;
 
 struct _GthMetadataProviderExiv2
 {
 	GthMetadataProvider __parent;
-	GthMetadataProviderExiv2Private *priv;
 };
 
 struct _GthMetadataProviderExiv2Class
diff --git a/extensions/gstreamer/gth-metadata-provider-gstreamer.c b/extensions/gstreamer/gth-metadata-provider-gstreamer.c
index f9ec253..087a876 100644
--- a/extensions/gstreamer/gth-metadata-provider-gstreamer.c
+++ b/extensions/gstreamer/gth-metadata-provider-gstreamer.c
@@ -21,23 +21,31 @@
  */
 
 #include <config.h>
-#include <string.h>
-#include <glib/gi18n.h>
 #include <glib.h>
 #include <gthumb.h>
 #include "gstreamer-utils.h"
 #include "gth-metadata-provider-gstreamer.h"
 
 
-#define GTH_METADATA_PROVIDER_GSTREAMER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_METADATA_PROVIDER_GSTREAMER, GthMetadataProviderGstreamerPrivate))
-
+static GthMetadataProviderClass *parent_class = NULL;
 
-struct _GthMetadataProviderGstreamerPrivate {
-	int dummy;
-};
 
+static gboolean
+gth_metadata_provider_gstreamer_can_read (GthMetadataProvider  *self,
+				          const char           *mime_type,
+				          char                **attribute_v)
+{
+	if (! _g_content_type_is_a (mime_type, "audio/*")
+	    && ! _g_content_type_is_a (mime_type, "video/*"))
+	{
+		return FALSE;
+	}
 
-static GthMetadataProviderClass *parent_class = NULL;
+	return _g_file_attributes_matches_any_v ("general::format,"
+						 "general::dimensions,"
+						 "audio-video::*",
+					         attribute_v);
+}
 
 
 static void
@@ -59,54 +67,15 @@ gth_metadata_provider_gstreamer_read (GthMetadataProvider *self,
 
 
 static void
-gth_metadata_provider_gstreamer_finalize (GObject *object)
-{
-	/*GthMetadataProviderGstreamer *comment = GTH_METADATA_PROVIDER_GSTREAMER (object);*/
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-static GObject *
-gth_metadata_provider_constructor (GType                  type,
-				   guint                  n_construct_properties,
-				   GObjectConstructParam *construct_properties)
-{
-	GthMetadataProviderClass *klass;
-	GObjectClass             *parent_class;
-	GObject                  *obj;
-	GthMetadataProvider      *self;
-
-	klass = GTH_METADATA_PROVIDER_CLASS (g_type_class_peek (GTH_TYPE_METADATA_PROVIDER));
-	parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
-	self = GTH_METADATA_PROVIDER (obj);
-
-	g_object_set (self, "readable-attributes", "general::format,general::dimensions,audio-video::*", NULL);
-
-	return obj;
-}
-
-
-static void
 gth_metadata_provider_gstreamer_class_init (GthMetadataProviderGstreamerClass *klass)
 {
 	parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (GthMetadataProviderGstreamerPrivate));
-
-	G_OBJECT_CLASS (klass)->finalize = gth_metadata_provider_gstreamer_finalize;
-	G_OBJECT_CLASS (klass)->constructor = gth_metadata_provider_constructor;
 
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_read = gth_metadata_provider_gstreamer_can_read;
 	GTH_METADATA_PROVIDER_CLASS (klass)->read = gth_metadata_provider_gstreamer_read;
 }
 
 
-static void
-gth_metadata_provider_gstreamer_init (GthMetadataProviderGstreamer *catalogs)
-{
-}
-
-
 GType
 gth_metadata_provider_gstreamer_get_type (void)
 {
@@ -122,7 +91,7 @@ gth_metadata_provider_gstreamer_get_type (void)
 			NULL,
 			sizeof (GthMetadataProviderGstreamer),
 			0,
-			(GInstanceInitFunc) gth_metadata_provider_gstreamer_init
+			(GInstanceInitFunc) NULL
 		};
 
 		type = g_type_register_static (GTH_TYPE_METADATA_PROVIDER,
diff --git a/extensions/gstreamer/gth-metadata-provider-gstreamer.h b/extensions/gstreamer/gth-metadata-provider-gstreamer.h
index 58c3337..1dd5b50 100644
--- a/extensions/gstreamer/gth-metadata-provider-gstreamer.h
+++ b/extensions/gstreamer/gth-metadata-provider-gstreamer.h
@@ -35,13 +35,11 @@
 #define GTH_METADATA_PROVIDER_GSTREAMER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_METADATA_PROVIDER_GSTREAMER, GthMetadataProviderGstreamerClass))
 
 typedef struct _GthMetadataProviderGstreamer         GthMetadataProviderGstreamer;
-typedef struct _GthMetadataProviderGstreamerPrivate  GthMetadataProviderGstreamerPrivate;
 typedef struct _GthMetadataProviderGstreamerClass    GthMetadataProviderGstreamerClass;
 
 struct _GthMetadataProviderGstreamer
 {
 	GthMetadataProvider __parent;
-	GthMetadataProviderGstreamerPrivate *priv;
 };
 
 struct _GthMetadataProviderGstreamerClass
diff --git a/extensions/image_viewer/gth-metadata-provider-image.c b/extensions/image_viewer/gth-metadata-provider-image.c
index e61f977..e7a188f 100644
--- a/extensions/image_viewer/gth-metadata-provider-image.c
+++ b/extensions/image_viewer/gth-metadata-provider-image.c
@@ -21,23 +21,29 @@
  */
 
 #include <config.h>
-#include <string.h>
-#include <glib/gi18n.h>
 #include <glib.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gthumb.h>
 #include "gth-metadata-provider-image.h"
 
 
-#define GTH_METADATA_PROVIDER_IMAGE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_METADATA_PROVIDER_IMAGE, GthMetadataProviderImagePrivate))
-
-
-struct _GthMetadataProviderImagePrivate {
-	int dummy;
-};
+static GthMetadataProviderClass *parent_class = NULL;
 
 
-static GthMetadataProviderClass *parent_class = NULL;
+static gboolean
+gth_metadata_provider_image_can_read (GthMetadataProvider  *self,
+				      const char           *mime_type,
+				      char                **attribute_v)
+{
+	if (! _g_content_type_is_a (mime_type, "image/*"))
+		return FALSE;
+
+	return _g_file_attributes_matches_any_v ("general::format,"
+			                         "general::dimensions,"
+						 "image::width,"
+						 "image::height",
+					         attribute_v);
+}
 
 
 static void
@@ -73,54 +79,15 @@ gth_metadata_provider_image_read (GthMetadataProvider *self,
 
 
 static void
-gth_metadata_provider_image_finalize (GObject *object)
-{
-	/*GthMetadataProviderImage *image = GTH_METADATA_PROVIDER_IMAGE (object);*/
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-static GObject *
-gth_metadata_provider_constructor (GType                  type,
-				   guint                  n_construct_properties,
-				   GObjectConstructParam *construct_properties)
-{
-	GthMetadataProviderClass *klass;
-	GObjectClass             *parent_class;
-	GObject                  *obj;
-	GthMetadataProvider      *self;
-
-	klass = GTH_METADATA_PROVIDER_CLASS (g_type_class_peek (GTH_TYPE_METADATA_PROVIDER));
-	parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
-	self = GTH_METADATA_PROVIDER (obj);
-
-	g_object_set (self, "readable-attributes", "general::format,general::dimensions,image::width,image::height", NULL);
-
-	return obj;
-}
-
-
-static void
 gth_metadata_provider_image_class_init (GthMetadataProviderImageClass *klass)
 {
 	parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (GthMetadataProviderImagePrivate));
-
-	G_OBJECT_CLASS (klass)->finalize = gth_metadata_provider_image_finalize;
-	G_OBJECT_CLASS (klass)->constructor = gth_metadata_provider_constructor;
 
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_read = gth_metadata_provider_image_can_read;
 	GTH_METADATA_PROVIDER_CLASS (klass)->read = gth_metadata_provider_image_read;
 }
 
 
-static void
-gth_metadata_provider_image_init (GthMetadataProviderImage *catalogs)
-{
-}
-
-
 GType
 gth_metadata_provider_image_get_type (void)
 {
@@ -136,7 +103,7 @@ gth_metadata_provider_image_get_type (void)
 			NULL,
 			sizeof (GthMetadataProviderImage),
 			0,
-			(GInstanceInitFunc) gth_metadata_provider_image_init
+			(GInstanceInitFunc) NULL
 		};
 
 		type = g_type_register_static (GTH_TYPE_METADATA_PROVIDER,
diff --git a/extensions/image_viewer/gth-metadata-provider-image.h b/extensions/image_viewer/gth-metadata-provider-image.h
index 1af3cbc..49c4965 100644
--- a/extensions/image_viewer/gth-metadata-provider-image.h
+++ b/extensions/image_viewer/gth-metadata-provider-image.h
@@ -35,13 +35,11 @@
 #define GTH_METADATA_PROVIDER_IMAGE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_METADATA_PROVIDER_IMAGE, GthMetadataProviderImageClass))
 
 typedef struct _GthMetadataProviderImage         GthMetadataProviderImage;
-typedef struct _GthMetadataProviderImagePrivate  GthMetadataProviderImagePrivate;
 typedef struct _GthMetadataProviderImageClass    GthMetadataProviderImageClass;
 
 struct _GthMetadataProviderImage
 {
 	GthMetadataProvider __parent;
-	GthMetadataProviderImagePrivate *priv;
 };
 
 struct _GthMetadataProviderImageClass
diff --git a/gthumb/gth-main.c b/gthumb/gth-main.c
index ec659b6..34a29b8 100644
--- a/gthumb/gth-main.c
+++ b/gthumb/gth-main.c
@@ -526,7 +526,8 @@ gth_main_get_metadata_attributes (const char *mask)
 
 
 GthMetadataProvider *
-gth_main_get_metadata_reader (const char *id)
+gth_main_get_metadata_reader (const char *id,
+			      const char *mime_type)
 {
 	GthMetadataProvider *metadata = NULL;
 	GList               *scan;
@@ -535,7 +536,28 @@ gth_main_get_metadata_reader (const char *id)
 	for (scan = Main->priv->metadata_provider; scan; scan = scan->next) {
 		GthMetadataProvider *registered_metadata = scan->data;
 
-		if (gth_metadata_provider_can_read (registered_metadata, (char **)attribute_v)) {
+		if (gth_metadata_provider_can_read (registered_metadata, mime_type, (char **)attribute_v)) {
+			metadata = g_object_new (G_OBJECT_TYPE (registered_metadata), NULL);
+			break;
+		}
+	}
+
+	return metadata;
+}
+
+
+GthMetadataProvider *
+gth_main_get_metadata_writer (const char *id,
+			      const char *mime_type)
+{
+	GthMetadataProvider *metadata = NULL;
+	GList               *scan;
+	const char          *attribute_v[] = { id, NULL };
+
+	for (scan = Main->priv->metadata_provider; scan; scan = scan->next) {
+		GthMetadataProvider *registered_metadata = scan->data;
+
+		if (gth_metadata_provider_can_write (registered_metadata, mime_type, (char **)attribute_v)) {
 			metadata = g_object_new (G_OBJECT_TYPE (registered_metadata), NULL);
 			break;
 		}
@@ -1261,8 +1283,8 @@ gth_main_extension_is_active (const char *extension_name)
 
 
 gboolean
-attribute_list_reaload_required (const char *old_attributes,
-				 const char *new_attributes)
+attribute_list_reload_required (const char *old_attributes,
+				const char *new_attributes)
 {
 	char     **old_attributes_v;
 	char     **new_attributes_v;
@@ -1285,7 +1307,7 @@ attribute_list_reaload_required (const char *old_attributes,
 		GthMetadataProvider *provider;
 		int                  j;
 
-		provider = gth_main_get_metadata_reader (old_attributes_v[i]);
+		provider = gth_main_get_metadata_reader (old_attributes_v[i], "*");
 		if (provider == NULL)
 			continue;
 
@@ -1298,7 +1320,7 @@ attribute_list_reaload_required (const char *old_attributes,
 
 				attr_v[0] = new_attributes_v[j];
 				attr_v[1] = NULL;
-				if (gth_metadata_provider_can_read (provider, attr_v)) {
+				if (gth_metadata_provider_can_read (provider, "*", attr_v)) {
 					g_free (new_attributes_v[j]);
 					new_attributes_v[j] = NULL;
 				}
diff --git a/gthumb/gth-main.h b/gthumb/gth-main.h
index d7612ac..89687d5 100644
--- a/gthumb/gth-main.h
+++ b/gthumb/gth-main.h
@@ -80,7 +80,10 @@ void                   gth_main_register_metadata_info_v      (GthMetadataInfo
 void                   gth_main_register_metadata_provider    (GType                 metadata_provider_type);
 GList *                gth_main_get_all_metadata_providers    (void);
 char **                gth_main_get_metadata_attributes       (const char           *mask);
-GthMetadataProvider *  gth_main_get_metadata_reader           (const char           *id);
+GthMetadataProvider *  gth_main_get_metadata_reader           (const char           *id,
+							       const char           *mime_type);
+GthMetadataProvider *  gth_main_get_metadata_writer           (const char           *id,
+							       const char           *mime_type);
 GthMetadataCategory *  gth_main_get_metadata_category         (const char           *id);
 GthMetadataInfo *      gth_main_get_metadata_info             (const char           *id);
 GPtrArray *            gth_main_get_all_metadata_info         (void);
@@ -126,7 +129,7 @@ gboolean               gth_main_extension_is_active           (const char *exten
 
 /* utilities */
 
-gboolean               attribute_list_reaload_required        (const char *old_attributes,
+gboolean               attribute_list_reload_required         (const char *old_attributes,
 							       const char *new_attributes);
 
 G_END_DECLS
diff --git a/gthumb/gth-metadata-provider-file.c b/gthumb/gth-metadata-provider-file.c
index 37b7808..1592697 100644
--- a/gthumb/gth-metadata-provider-file.c
+++ b/gthumb/gth-metadata-provider-file.c
@@ -21,8 +21,6 @@
  */
 
 #include <config.h>
-#include <string.h>
-#include <glib/gi18n.h>
 #include <glib.h>
 #include "glib-utils.h"
 #include "gth-metadata-provider-file.h"
@@ -31,12 +29,21 @@
 #define GTH_METADATA_PROVIDER_FILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_METADATA_PROVIDER_COMMENT, GthMetadataProviderFilePrivate))
 
 
-struct _GthMetadataProviderFilePrivate {
-	int dummy;
-};
+static GthMetadataProviderClass *parent_class = NULL;
 
 
-static GthMetadataProviderClass *parent_class = NULL;
+static gboolean
+gth_metadata_provider_file_can_read (GthMetadataProvider  *self,
+				     const char           *mime_type,
+				     char                **attribute_v)
+{
+	return _g_file_attributes_matches_any_v ("gth::file::display-size,"
+						 "gth::file::display-mtime,"
+						 "gth::file::content-type,"
+						 "gth::file::is-modified,"
+						 "gth::file::full-name",
+					         attribute_v);
+}
 
 
 static void
@@ -73,54 +80,15 @@ gth_metadata_provider_file_read (GthMetadataProvider *self,
 
 
 static void
-gth_metadata_provider_file_finalize (GObject *object)
-{
-	/*GthMetadataProviderFile *file = GTH_METADATA_PROVIDER_FILE (object);*/
-
-	G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-
-static GObject *
-gth_metadata_provider_constructor (GType                  type,
-				   guint                  n_construct_properties,
-				   GObjectConstructParam *construct_properties)
-{
-	GthMetadataProviderClass *klass;
-	GObjectClass     *parent_class;
-	GObject          *obj;
-	GthMetadataProvider      *self;
-
-	klass = GTH_METADATA_PROVIDER_CLASS (g_type_class_peek (GTH_TYPE_METADATA_PROVIDER));
-	parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (klass));
-	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
-	self = GTH_METADATA_PROVIDER (obj);
-
-	g_object_set (self, "readable-attributes", "gth::file::display-size,gth::file::display-mtime,gth::file::content-type,gth::file::is-modified,gth::file::full-name", NULL);
-
-	return obj;
-}
-
-
-static void
 gth_metadata_provider_file_class_init (GthMetadataProviderFileClass *klass)
 {
 	parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (GthMetadataProviderFilePrivate));
-
-	G_OBJECT_CLASS (klass)->finalize = gth_metadata_provider_file_finalize;
-	G_OBJECT_CLASS (klass)->constructor = gth_metadata_provider_constructor;
 
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_read = gth_metadata_provider_file_can_read;
 	GTH_METADATA_PROVIDER_CLASS (klass)->read = gth_metadata_provider_file_read;
 }
 
 
-static void
-gth_metadata_provider_file_init (GthMetadataProviderFile *catalogs)
-{
-}
-
-
 GType
 gth_metadata_provider_file_get_type (void)
 {
@@ -136,7 +104,7 @@ gth_metadata_provider_file_get_type (void)
 			NULL,
 			sizeof (GthMetadataProviderFile),
 			0,
-			(GInstanceInitFunc) gth_metadata_provider_file_init
+			(GInstanceInitFunc) NULL
 		};
 
 		type = g_type_register_static (GTH_TYPE_METADATA_PROVIDER,
diff --git a/gthumb/gth-metadata-provider-file.h b/gthumb/gth-metadata-provider-file.h
index 42a3bc0..7c79b4a 100644
--- a/gthumb/gth-metadata-provider-file.h
+++ b/gthumb/gth-metadata-provider-file.h
@@ -37,13 +37,11 @@ G_BEGIN_DECLS
 #define GTH_METADATA_PROVIDER_FILE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GTH_TYPE_METADATA_PROVIDER_FILE, GthMetadataProviderFileClass))
 
 typedef struct _GthMetadataProviderFile         GthMetadataProviderFile;
-typedef struct _GthMetadataProviderFilePrivate  GthMetadataProviderFilePrivate;
 typedef struct _GthMetadataProviderFileClass    GthMetadataProviderFileClass;
 
 struct _GthMetadataProviderFile
 {
 	GthMetadataProvider __parent;
-	GthMetadataProviderFilePrivate *priv;
 };
 
 struct _GthMetadataProviderFileClass
diff --git a/gthumb/gth-metadata-provider.c b/gthumb/gth-metadata-provider.c
index 23564ae..e86e205 100644
--- a/gthumb/gth-metadata-provider.c
+++ b/gthumb/gth-metadata-provider.c
@@ -27,128 +27,43 @@
 #include "gth-metadata-provider.h"
 
 
-#define GTH_METADATA_PROVIDER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTH_TYPE_METADATA_PROVIDER, GthMetadataProviderPrivate))
 #define CHECK_THREAD_RATE 5
 
 
-enum  {
-	GTH_METADATA_PROVIDER_DUMMY_PROPERTY,
-	GTH_METADATA_PROVIDER_READABLE_ATTRIBUTES,
-	GTH_METADATA_PROVIDER_WRITABLE_ATTRIBUTES
-};
-
-
-struct _GthMetadataProviderPrivate {
-	char *_readable_attributes;
-	char *_writable_attributes;
-};
-
 static gpointer gth_metadata_provider_parent_class = NULL;
 
 
-static void
-gth_metadata_provider_real_read (GthMetadataProvider *self,
-				 GthFileData         *file_data,
-				 const char          *attributes)
-{
-}
-
-
-static void
-gth_metadata_provider_real_write (GthMetadataProvider *self,
-				  GthFileData         *file_data,
-				  const char          *attributes)
-{
-}
-
-
-static void
-gth_metadata_provider_set_readable_attributes (GthMetadataProvider *self,
-					       const char          *value)
+static gboolean
+gth_metadata_provider_real_can_read (GthMetadataProvider  *self,
+				     const char           *mime_type,
+				     char                **attribute_v)
 {
-	if (self->priv->_readable_attributes != NULL) {
-		g_free (self->priv->_readable_attributes);
-		self->priv->_readable_attributes = NULL;
-	}
-
-	if (value != NULL)
-		self->priv->_readable_attributes = g_strdup (value);
+	return FALSE;
 }
 
 
-static void
-gth_metadata_provider_set_writable_attributes (GthMetadataProvider *self,
-					       const char          *value)
+static gboolean
+gth_metadata_provider_real_can_write (GthMetadataProvider  *self,
+				      const char           *mime_type,
+				      char                **attribute_v)
 {
-	if (self->priv->_writable_attributes != NULL) {
-		g_free (self->priv->_writable_attributes);
-		self->priv->_writable_attributes = NULL;
-	}
-
-	if (value != NULL)
-		self->priv->_writable_attributes = g_strdup (value);
+	return FALSE;
 }
 
 
 static void
-gth_metadata_provider_set_property (GObject      *object,
-				    guint         property_id,
-				    const GValue *value,
-				    GParamSpec   *pspec)
+gth_metadata_provider_real_read (GthMetadataProvider *self,
+				 GthFileData         *file_data,
+				 const char          *attributes)
 {
-	GthMetadataProvider *self;
-
-	self = GTH_METADATA_PROVIDER (object);
-
-	switch (property_id) {
-	case GTH_METADATA_PROVIDER_READABLE_ATTRIBUTES:
-		gth_metadata_provider_set_readable_attributes (self, g_value_get_string (value));
-		break;
-	case GTH_METADATA_PROVIDER_WRITABLE_ATTRIBUTES:
-		gth_metadata_provider_set_writable_attributes (self, g_value_get_string (value));
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-		break;
-	}
 }
 
 
 static void
-gth_metadata_provider_get_property (GObject    *object,
-				    guint       property_id,
-				    GValue     *value,
-				    GParamSpec *pspec)
-{
-	GthMetadataProvider *self;
-
-	self = GTH_METADATA_PROVIDER (object);
-
-	switch (property_id) {
-	case GTH_METADATA_PROVIDER_READABLE_ATTRIBUTES:
-		g_value_set_string (value, self->priv->_readable_attributes);
-		break;
-	case GTH_METADATA_PROVIDER_WRITABLE_ATTRIBUTES:
-		g_value_set_string (value, self->priv->_writable_attributes);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-		break;
-	}
-}
-
-
-static void
-gth_metadata_provider_finalize (GObject *obj)
+gth_metadata_provider_real_write (GthMetadataProvider *self,
+				  GthFileData         *file_data,
+				  const char          *attributes)
 {
-	GthMetadataProvider *self;
-
-	self = GTH_METADATA_PROVIDER (obj);
-
-	g_free (self->priv->_readable_attributes);
-	g_free (self->priv->_writable_attributes);
-
-	G_OBJECT_CLASS (gth_metadata_provider_parent_class)->finalize (obj);
 }
 
 
@@ -156,36 +71,11 @@ static void
 gth_metadata_provider_class_init (GthMetadataProviderClass * klass)
 {
 	gth_metadata_provider_parent_class = g_type_class_peek_parent (klass);
-	g_type_class_add_private (klass, sizeof (GthMetadataProviderPrivate));
-
-	G_OBJECT_CLASS (klass)->set_property = gth_metadata_provider_set_property;
-	G_OBJECT_CLASS (klass)->get_property = gth_metadata_provider_get_property;
-	G_OBJECT_CLASS (klass)->finalize = gth_metadata_provider_finalize;
 
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_read = gth_metadata_provider_real_can_read;
+	GTH_METADATA_PROVIDER_CLASS (klass)->can_write = gth_metadata_provider_real_can_write;
 	GTH_METADATA_PROVIDER_CLASS (klass)->read = gth_metadata_provider_real_read;
 	GTH_METADATA_PROVIDER_CLASS (klass)->write = gth_metadata_provider_real_write;
-
-	g_object_class_install_property (G_OBJECT_CLASS (klass),
-					 GTH_METADATA_PROVIDER_READABLE_ATTRIBUTES,
-					 g_param_spec_string ("readable-attributes",
-					 		      "readable-attributes",
-					 		      "readable-attributes",
-					 		      NULL,
-					 		      G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
-	g_object_class_install_property (G_OBJECT_CLASS (klass),
-					 GTH_METADATA_PROVIDER_WRITABLE_ATTRIBUTES,
-					 g_param_spec_string ("writable-attributes",
-					 		      "writable-attributes",
-					 		      "writable-attributes",
-					 		      NULL,
-					 		      G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
-}
-
-
-static void
-gth_metadata_provider_instance_init (GthMetadataProvider *self)
-{
-	self->priv = GTH_METADATA_PROVIDER_GET_PRIVATE (self);
 }
 
 
@@ -203,7 +93,7 @@ gth_metadata_provider_get_type (void)
 			NULL,
 			sizeof (GthMetadataProvider),
 			0,
-			(GInstanceInitFunc) gth_metadata_provider_instance_init,
+			(GInstanceInitFunc) NULL,
 			NULL
 		};
 		gth_metadata_provider_type_id = g_type_register_static (G_TYPE_OBJECT, "GthMetadataProvider", &g_define_type_info, 0);
@@ -212,51 +102,21 @@ gth_metadata_provider_get_type (void)
 }
 
 
-GthMetadataProvider *
-gth_metadata_provider_new (void)
-{
-
-	return g_object_new (GTH_TYPE_METADATA_PROVIDER, NULL);
-}
-
-
-static gboolean
-attribute_matches_attributes (const char  *attributes,
-			      char       **attribute_v)
-{
-	gboolean matches;
-	int      i;
-
-	if (attributes == NULL)
-		return FALSE;
-
-	matches = FALSE;
-	for (i = 0; ! matches && (attribute_v[i] != NULL); i++)
-		matches = _g_file_attributes_matches (attributes, attribute_v[i]);
-
-	return matches;
-}
-
-
 gboolean
 gth_metadata_provider_can_read (GthMetadataProvider  *self,
+				const char           *mime_type,
 				char                **attribute_v)
 {
-	g_return_val_if_fail (self != NULL, FALSE);
-	g_return_val_if_fail (attribute_v != NULL, FALSE);
-
-	return attribute_matches_attributes (self->priv->_readable_attributes, attribute_v);
+	return GTH_METADATA_PROVIDER_GET_CLASS (self)->can_read (self, mime_type, attribute_v);
 }
 
 
 gboolean
 gth_metadata_provider_can_write (GthMetadataProvider  *self,
+				 const char           *mime_type,
 				 char                **attribute_v)
 {
-	g_return_val_if_fail (self != NULL, FALSE);
-	g_return_val_if_fail (attribute_v != NULL, FALSE);
-
-	return attribute_matches_attributes (self->priv->_writable_attributes, attribute_v);
+	return GTH_METADATA_PROVIDER_GET_CLASS (self)->can_write (self, mime_type, attribute_v);
 }
 
 
@@ -326,34 +186,36 @@ static gpointer
 read_metadata_thread (gpointer data)
 {
 	QueryMetadataThreadData *rmtd = data;
+	GList                   *providers;
 	GList                   *scan;
 	gboolean                 cancelled = FALSE;
 
-	for (scan = gth_main_get_all_metadata_providers (); ! cancelled && scan; scan = scan->next) {
-		GthMetadataProvider *metadata_provider;
-
-		metadata_provider = g_object_new (G_OBJECT_TYPE (scan->data), NULL);
+	providers = NULL;
+	for (scan = gth_main_get_all_metadata_providers (); scan; scan = scan->next)
+		providers = g_list_prepend (providers, g_object_new (G_OBJECT_TYPE (scan->data), NULL));
+	providers = g_list_reverse (providers);
 
-		if (gth_metadata_provider_can_read (metadata_provider, rmtd->attributes_v)) {
-			GList *scan_files;
+	for (scan = rmtd->files; scan; scan = scan->next) {
+		GthFileData *file_data = scan->data;
+		GList       *scan_providers;
 
-			for (scan_files = rmtd->files; scan_files; scan_files = scan_files->next) {
-				GthFileData *file_data = scan_files->data;
+		g_mutex_lock (rmtd->mutex);
+		cancelled = rmtd->thread_done;
+		g_mutex_unlock (rmtd->mutex);
 
-				g_mutex_lock (rmtd->mutex);
-				cancelled = rmtd->thread_done;
-				g_mutex_unlock (rmtd->mutex);
+		if (cancelled)
+			break;
 
-				if (cancelled)
-					break;
+		for (scan_providers = providers; scan_providers; scan_providers = scan_providers->next) {
+			GthMetadataProvider *metadata_provider = scan_providers->data;
 
+			if (gth_metadata_provider_can_read (metadata_provider, gth_file_data_get_mime_type (file_data), rmtd->attributes_v))
 				gth_metadata_provider_read (metadata_provider, file_data, rmtd->attributes);
-			}
 		}
-
-		g_object_unref (metadata_provider);
 	}
 
+	_g_object_list_unref (providers);
+
 	if (! cancelled)
 		for (scan = rmtd->files; scan; scan = scan->next) {
 			GthFileData *file_data = scan->data;
@@ -480,25 +342,36 @@ static gpointer
 write_metadata_thread (gpointer data)
 {
 	WriteMetadataThreadData *wmtd = data;
+	GList                   *providers;
 	GList                   *scan;
+	gboolean                 cancelled = FALSE;
 
-	for (scan = gth_main_get_all_metadata_providers (); scan; scan = scan->next) {
-		GthMetadataProvider *metadata_provider;
+	providers = NULL;
+	for (scan = gth_main_get_all_metadata_providers (); scan; scan = scan->next)
+		providers = g_list_prepend (providers, g_object_new (G_OBJECT_TYPE (scan->data), NULL));
+	providers = g_list_reverse (providers);
 
-		metadata_provider = g_object_new (G_OBJECT_TYPE (scan->data), NULL);
+	for (scan = wmtd->files; scan; scan = scan->next) {
+		GthFileData *file_data = scan->data;
+		GList       *scan_providers;
 
-		if (gth_metadata_provider_can_write (metadata_provider, wmtd->attributes_v)) {
-			GList *scan_files;
+		g_mutex_lock (wmtd->mutex);
+		cancelled = wmtd->thread_done;
+		g_mutex_unlock (wmtd->mutex);
 
-			for (scan_files = wmtd->files; scan_files; scan_files = scan_files->next) {
-				GthFileData *file_data = scan_files->data;
+		if (cancelled)
+			break;
+
+		for (scan_providers = providers; scan_providers; scan_providers = scan_providers->next) {
+			GthMetadataProvider *metadata_provider = scan_providers->data;
+
+			if (gth_metadata_provider_can_write (metadata_provider, gth_file_data_get_mime_type (file_data), wmtd->attributes_v))
 				gth_metadata_provider_write (metadata_provider, file_data, wmtd->attributes);
-			}
 		}
-
-		g_object_unref (metadata_provider);
 	}
 
+	_g_object_list_unref (providers);
+
 	g_mutex_lock (wmtd->mutex);
 	wmtd->thread_done = TRUE;
 	g_mutex_unlock (wmtd->mutex);
diff --git a/gthumb/gth-metadata-provider.h b/gthumb/gth-metadata-provider.h
index 5018b03..66f8647 100644
--- a/gthumb/gth-metadata-provider.h
+++ b/gthumb/gth-metadata-provider.h
@@ -39,28 +39,33 @@ G_BEGIN_DECLS
 
 typedef struct _GthMetadataProvider GthMetadataProvider;
 typedef struct _GthMetadataProviderClass GthMetadataProviderClass;
-typedef struct _GthMetadataProviderPrivate GthMetadataProviderPrivate;
 
 struct _GthMetadataProvider {
 	GObject parent_instance;
-	GthMetadataProviderPrivate *priv;
 };
 
 struct _GthMetadataProviderClass {
 	GObjectClass parent_class;
-	void (*read)  (GthMetadataProvider *self,
-		       GthFileData         *file_data,
-		       const char          *attributes);
-	void (*write) (GthMetadataProvider *self,
-		       GthFileData         *file_data,
-		       const char          *attributes);
+	gboolean  (*can_read)  (GthMetadataProvider  *self,
+			        const char           *mime_type,
+			        char                **attribute_v);
+	gboolean  (*can_write) (GthMetadataProvider  *self,
+			        const char           *mime_type,
+			        char                **attribute_v);
+	void      (*read)      (GthMetadataProvider  *self,
+		                GthFileData          *file_data,
+		                const char           *attributes);
+	void      (*write)     (GthMetadataProvider  *self,
+			        GthFileData          *file_data,
+			        const char           *attributes);
 };
 
 GType                   gth_metadata_provider_get_type   (void);
-GthMetadataProvider *   gth_metadata_provider_new        (void);
 gboolean                gth_metadata_provider_can_read   (GthMetadataProvider  *self,
+							  const char           *mime_type,
 						          char                **attribute_v);
 gboolean                gth_metadata_provider_can_write  (GthMetadataProvider  *self,
+							  const char           *mime_type,
 						          char                **attribute_v);
 void                    gth_metadata_provider_read       (GthMetadataProvider  *self,
 							  GthFileData          *file_data,
@@ -68,6 +73,7 @@ void                    gth_metadata_provider_read       (GthMetadataProvider  *
 void                    gth_metadata_provider_write      (GthMetadataProvider  *self,
 							  GthFileData          *file_data,
 							  const char           *attributes);
+
 void                    _g_query_metadata_async          (GList                *files, /* GthFileData * list */
 							  const char           *attributes,
 							  GCancellable         *cancellable,



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