[tracker] tracker-miner-fs: fix crash receving album art raw data



commit fda715b54c209dc7bf6038efe35d7eb49db0ae57
Author: Martyn Russell <martyn imendio com>
Date:   Mon Jul 27 18:36:49 2009 +0100

    tracker-miner-fs: fix crash receving album art raw data

 data/dbus/tracker-extract.xml             |    3 +-
 src/tracker-extract/tracker-extract.c     |   23 +++++++++++-----
 src/tracker-extract/tracker-marshal.list  |    2 +-
 src/tracker-miner-fs/tracker-albumart.c   |   43 +++++++++++++++--------------
 src/tracker-miner-fs/tracker-marshal.list |    2 +-
 5 files changed, 41 insertions(+), 32 deletions(-)
---
diff --git a/data/dbus/tracker-extract.xml b/data/dbus/tracker-extract.xml
index 20dc59b..9100fda 100644
--- a/data/dbus/tracker-extract.xml
+++ b/data/dbus/tracker-extract.xml
@@ -23,8 +23,7 @@
     </method>
 
     <signal name="ProcessAlbumArt">
-      <arg type="y" name="buffer"/>
-      <arg type="i" name="size"/>
+      <arg type="ay" name="buffer"/>
       <arg type="s" name="mime"/>
       <arg type="s" name="artist"/>
       <arg type="s" name="album"/>
diff --git a/src/tracker-extract/tracker-extract.c b/src/tracker-extract/tracker-extract.c
index 826e767..6ca88bc 100644
--- a/src/tracker-extract/tracker-extract.c
+++ b/src/tracker-extract/tracker-extract.c
@@ -40,6 +40,8 @@
 
 #define MAX_EXTRACT_TIME 10
 
+#define DBUS_TYPE_UCHAR_ARRAY (dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR))
+
 #define TRACKER_EXTRACT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TRACKER_TYPE_EXTRACT, TrackerExtractPrivate))
 
 extern gboolean debug;
@@ -80,11 +82,10 @@ tracker_extract_class_init (TrackerExtractClass *klass)
 			      G_SIGNAL_RUN_LAST,
 			      0,
 			      NULL, NULL,
-			      tracker_marshal_VOID__UCHAR_INT_STRING_STRING_STRING_STRING,
+			      tracker_marshal_VOID__POINTER_STRING_STRING_STRING_STRING,
 			      G_TYPE_NONE,
-			      6,
-			      G_TYPE_UCHAR,
-			      G_TYPE_INT,
+			      5,
+			      DBUS_TYPE_UCHAR_ARRAY,
 			      G_TYPE_STRING,
 			      G_TYPE_STRING,
 			      G_TYPE_STRING,
@@ -493,18 +494,26 @@ tracker_extract_process_albumart (TrackerExtract      *object,
 				  const gchar         *filename)
 {
 	g_return_if_fail (buffer != NULL);
-	g_return_if_fail (len > 0);
 	g_return_if_fail (object != NULL);
 	g_return_if_fail (mime != NULL);
 	g_return_if_fail (filename != NULL);
 
+	GArray *array;
+
+	array = g_array_sized_new (FALSE,
+				   FALSE,
+				   sizeof (guchar),
+				   len);
+	g_array_append_vals (array, buffer, len);
+
 	g_signal_emit (object,
 		       signals[PROCESS_ALBUM_ART],
 		       0,
-		       buffer,
-		       len,
+		       array,
 		       mime,
 		       artist,
 		       album,
 		       filename);
+
+	g_array_free (array, TRUE);
 }
diff --git a/src/tracker-extract/tracker-marshal.list b/src/tracker-extract/tracker-marshal.list
index 5c71fca..e4d6982 100644
--- a/src/tracker-extract/tracker-marshal.list
+++ b/src/tracker-extract/tracker-marshal.list
@@ -1 +1 @@
-VOID:UCHAR,INT,STRING,STRING,STRING,STRING
+VOID:POINTER,STRING,STRING,STRING,STRING
diff --git a/src/tracker-miner-fs/tracker-albumart.c b/src/tracker-miner-fs/tracker-albumart.c
index 26f2d09..df78b33 100644
--- a/src/tracker-miner-fs/tracker-albumart.c
+++ b/src/tracker-miner-fs/tracker-albumart.c
@@ -51,6 +51,8 @@
 #define THUMBNAILER_PATH      "/org/freedesktop/thumbnailer/Generic"
 #define THUMBNAILER_INTERFACE "org.freedesktop.thumbnailer.Generic"
 
+#define DBUS_TYPE_UCHAR_ARRAY (dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR))
+
 typedef struct {
 	TrackerStorage *hal;
 	gchar *art_path;
@@ -61,8 +63,7 @@ static void     albumart_queue_cb   (DBusGProxy          *proxy,
 				     DBusGProxyCall      *call,
 				     gpointer             user_data);
 static gboolean albumart_process_cb (DBusGProxy          *proxy,
-				     const unsigned char *buffer,
-				     size_t               len,
+				     GArray              *buffer,
 				     const gchar         *mime,
 				     const gchar         *artist,
 				     const gchar         *album,
@@ -648,17 +649,20 @@ albumart_set (const unsigned char *buffer,
 
 	albumart_get_path (artist, album, "album", NULL, &local_path, NULL);
 
-	g_message ("Saving album art using GdkPixbuf for uri:'%s'", 
-		   local_path);
-
 	if (g_strcmp0 (mime, "image/jpeg") == 0 ||
 	    g_strcmp0 (mime, "JPG") == 0) {
+		g_debug ("Saving album art using raw data for uri:'%s'", 
+			 local_path);
+
 		g_file_set_contents (local_path, buffer, (gssize) len, NULL);
 	} else {
 		GdkPixbuf *pixbuf;
 		GdkPixbufLoader *loader;
 		GError *error = NULL;
 
+		g_debug ("Saving album art using GdkPixbufLoader for uri:'%s'", 
+			 local_path);
+
 		loader = gdk_pixbuf_loader_new ();
 
 		if (!gdk_pixbuf_loader_write (loader, buffer, len, &error)) {
@@ -810,8 +814,8 @@ albumart_copy_to_local (TrackerStorage *hal,
 			make_directory_with_parents (dirf, NULL, NULL);
 			g_object_unref (dirf);
 
-			g_message ("Copying album art from:'%s' to:'%s'", 
-				   filename, local_uri);
+			g_debug ("Copying album art from:'%s' to:'%s'", 
+				 filename, local_uri);
 
 			g_file_copy_async (from, local_file, 0, 0, 
 					   NULL, NULL, NULL, NULL, NULL);
@@ -824,8 +828,7 @@ albumart_copy_to_local (TrackerStorage *hal,
 
 static gboolean
 albumart_process_cb (DBusGProxy          *proxy,
-		     const unsigned char *buffer,
-		     size_t               len,
+		     GArray              *buffer,
 		     const gchar         *mime,
 		     const gchar         *artist,
 		     const gchar         *album,
@@ -862,9 +865,9 @@ albumart_process_cb (DBusGProxy          *proxy,
 	if (!g_file_test (art_path, G_FILE_TEST_EXISTS)) {
 #ifdef HAVE_GDKPIXBUF
 		/* If we have embedded album art */
-		if (buffer && len) {
-			processed = albumart_set (buffer, 
-						  len, 
+		if (buffer && buffer->len > 0) {
+			processed = albumart_set ((const unsigned char *) buffer->data, 
+						  (size_t) buffer->len, 
 						  mime,
 						  artist,
 						  album,
@@ -921,8 +924,8 @@ albumart_process_cb (DBusGProxy          *proxy,
 			tracker_thumbnailer_queue_add (filename_uri, "image/jpeg"); 
 		}
 	} else {
-		g_message ("Albumart already exists for uri:'%s'", 
-			   filename_uri);
+		g_debug ("Albumart already exists for uri:'%s'", 
+			 filename_uri);
 	}
 
 	if (local_uri && !g_file_test (local_uri, G_FILE_TEST_EXISTS)) {
@@ -974,8 +977,8 @@ albumart_queue_cb (DBusGProxy     *proxy,
 
 		uri = g_filename_to_uri (info->art_path, NULL, NULL);
 
-		g_message ("Downloaded album art using DBus service for uri:'%s'", 
-			   uri);
+		g_debug ("Downloaded album art using DBus service for uri:'%s'", 
+			 uri);
 
 		tracker_thumbnailer_queue_add (uri, "image/jpeg");
 		g_free (uri);
@@ -1035,10 +1038,9 @@ tracker_albumart_init (TrackerStorage *storage)
                 return FALSE;
 	}
 
-        dbus_g_object_register_marshaller (tracker_marshal_VOID__UCHAR_INT_STRING_STRING_STRING_STRING,
+        dbus_g_object_register_marshaller (tracker_marshal_VOID__POINTER_STRING_STRING_STRING_STRING,
                                            G_TYPE_NONE,
-					   G_TYPE_UCHAR,
-					   G_TYPE_INT,
+					   DBUS_TYPE_UCHAR_ARRAY,
 					   G_TYPE_STRING,
 					   G_TYPE_STRING,
                                            G_TYPE_STRING,
@@ -1047,8 +1049,7 @@ tracker_albumart_init (TrackerStorage *storage)
 	
         dbus_g_proxy_add_signal (proxy,
                                  "ProcessAlbumArt",
-                                 G_TYPE_UCHAR,
-                                 G_TYPE_INT,
+                                 DBUS_TYPE_UCHAR_ARRAY,
                                  G_TYPE_STRING,
                                  G_TYPE_STRING,
                                  G_TYPE_STRING,
diff --git a/src/tracker-miner-fs/tracker-marshal.list b/src/tracker-miner-fs/tracker-marshal.list
index f7994f7..5bba08b 100644
--- a/src/tracker-miner-fs/tracker-marshal.list
+++ b/src/tracker-miner-fs/tracker-marshal.list
@@ -5,4 +5,4 @@ VOID:STRING,OBJECT,OBJECT,BOOLEAN,BOOLEAN
 VOID:STRING,BOOL
 VOID:STRING,OBJECT
 VOID:STRING,UINT,UINT,UINT,UINT
-VOID:UCHAR,INT,STRING,STRING,STRING,STRING
+VOID:POINTER,STRING,STRING,STRING,STRING



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