[maemo-commits] [maemo-commits] r16298 - in projects/haf/branches/hildon-thumbnail/daemonize: albumart-providers/googleimages daemon

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue Sep 30 17:19:02 EEST 2008
Author: pvanhoof
Date: 2008-09-30 17:18:47 +0300 (Tue, 30 Sep 2008)
New Revision: 16298

Modified:
   projects/haf/branches/hildon-thumbnail/daemonize/albumart-providers/googleimages/com.nokia.albumart.AlbumartProvider.GoogleImages.service
   projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart-manager.c
   projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart.c
   projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnail-manager.c
Log:
2008-09-30  Philip Van Hoof  <pvanhoof at gnome.org>

	* albumart-providers/googleimages/com.nokia.albumart.AlbumartProvider.GoogleImages.service
	* daemon/albumart.c
	* daemon/albumart-manager.c
	* daemon/thumbnail-manager.c: Priority ordering, various bugfixes

2008-09-30  Philip Van Hoof  <pvanhoof at gnome.org>

	* albumart-providers/googleimages/google-images-art-downloader.vala 
	* albumart-providers/googleimages/Makefile.am 
	* albumart-providers/Makefile.am 
	* daemon/utils.c 
	* daemon/utils.h 
	* daemon/albumart.c 
	* daemon/albumart.h 
	* daemon/albumart-marshal.list 
	* daemon/albumart.xml: Changed the DBus API



Modified: projects/haf/branches/hildon-thumbnail/daemonize/albumart-providers/googleimages/com.nokia.albumart.AlbumartProvider.GoogleImages.service
===================================================================
--- projects/haf/branches/hildon-thumbnail/daemonize/albumart-providers/googleimages/com.nokia.albumart.AlbumartProvider.GoogleImages.service	2008-09-30 14:16:04 UTC (rev 16297)
+++ projects/haf/branches/hildon-thumbnail/daemonize/albumart-providers/googleimages/com.nokia.albumart.AlbumartProvider.GoogleImages.service	2008-09-30 14:18:47 UTC (rev 16298)
@@ -1,3 +1,3 @@
 [D-BUS Album art provider]
 Name=com.nokia.albumart.GoogleImages
-
+Priority=10

Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart-manager.c
===================================================================
--- projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart-manager.c	2008-09-30 14:16:04 UTC (rev 16297)
+++ projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart-manager.c	2008-09-30 14:18:47 UTC (rev 16298)
@@ -41,7 +41,7 @@
 
 typedef struct {
 	DBusGConnection *connection;
-	GHashTable *handlers;
+	GList *handlers;
 	GMutex *mutex;
 } AlbumartManagerPrivate;
 
@@ -50,27 +50,68 @@
 	PROP_CONNECTION
 };
 
+
+typedef struct {
+	gchar *name;
+	gint prio;
+	DBusGProxy *proxy;
+} ValueInfo;
+
+static void
+free_valueinfo (ValueInfo *info) {
+	g_free (info->name);
+	g_slice_free (ValueInfo, info);
+}
+
+
+
 GList*
 albumart_manager_get_handlers (AlbumartManager *object)
 {
 	AlbumartManagerPrivate *priv = ALBUMART_MANAGER_GET_PRIVATE (object);
-	GList *retval;
+	GList *retval = NULL, *copy = priv->handlers;
 
 	g_mutex_lock (priv->mutex);
-	retval = g_hash_table_get_values (priv->handlers);
+
+	while (copy) {
+		ValueInfo *info = copy->data;
+		retval = g_list_prepend (retval, g_object_ref (info->proxy));
+		copy = g_list_next (copy);
+	}
+
 	g_mutex_unlock (priv->mutex);
 
 	return retval;
 }
 
+
+static gint 
+compar_func (gconstpointer a, gconstpointer b)
+{
+	ValueInfo *info_a = (ValueInfo *) a;
+	ValueInfo *info_b = (ValueInfo *) b;
+
+	return strcmp (info_a->name, info_b->name);
+}
+
+static gint 
+sort_func (gconstpointer a, gconstpointer b)
+{
+	ValueInfo *info_a = (ValueInfo *) a;
+	ValueInfo *info_b = (ValueInfo *) b;
+
+	return info_a->prio - info_b->prio;
+}
+
 static void
-albumart_manager_add (AlbumartManager *object, gchar *insignificant_key, gchar *name)
+albumart_manager_add (AlbumartManager *object, ValueInfo *info)
 {
 	AlbumartManagerPrivate *priv = ALBUMART_MANAGER_GET_PRIVATE (object);
 	DBusGProxy *proxy;
-	gchar *path = g_strdup_printf ("/%s", name);
+	gchar *path = g_strdup_printf ("/%s", info->name);
 	guint len = strlen (path);
 	guint i;
+	GList *link;
 
 	/* Not sure if this path stuff makes any sense ... but it works */
 
@@ -79,49 +120,35 @@
 			path[i] = '/';
 	}
 
-	proxy = dbus_g_proxy_new_for_name (priv->connection, name, 
+	info->proxy = dbus_g_proxy_new_for_name (priv->connection, info->name, 
 									   path,
 									   PROVIDER_INTERFACE);
 
-	g_hash_table_replace (priv->handlers, 
-			      g_strdup (path),
-			      g_object_ref (proxy));
+	link = g_list_find_custom (priv->handlers, info, compar_func);
 
-	g_free (path);
+	if (link) {
+		priv->handlers = g_list_remove_link (priv->handlers, link);
+		free_valueinfo (link->data);
+		g_list_free (link);
+	}
 
-}
+	priv->handlers = g_list_insert_sorted (priv->handlers, info, sort_func);
 
-typedef struct {
-	gchar *name;
-	guint64 mtime;
-	gboolean prio;
-} ValueInfo;
+	g_free (path);
 
-static void
-free_valueinfo (ValueInfo *info) {
-	g_slice_free (ValueInfo, info);
 }
-
 static void
 albumart_manager_check_dir (AlbumartManager *object, gchar *path, gboolean override)
 {
 	AlbumartManagerPrivate *priv = ALBUMART_MANAGER_GET_PRIVATE (object);
 	const gchar *filen;
 	GDir *dir;
-	GHashTableIter iter;
-	GHashTable *pre;
-	gpointer pkey, pvalue;
-	gboolean has_override = FALSE;
 
 	dir = g_dir_open (path, 0, NULL);
 
 	if (!dir)
 		return;
 
-	pre = g_hash_table_new_full (g_str_hash, g_str_equal,
-				     (GDestroyNotify) g_free, 
-				     (GDestroyNotify) free_valueinfo);
-
 	for (filen = g_dir_read_name (dir); filen; filen = g_dir_read_name (dir)) {
 		GKeyFile *keyfile;
 		gchar *fullfilen;
@@ -132,12 +159,14 @@
 		GFileInfo *info;
 		GFile *file;
 		ValueInfo *v_info;
+		gint prio;
+		GError *err = NULL;
 
 		fullfilen = g_build_filename (path, filen, NULL);
 		keyfile = g_key_file_new ();
 
 		/* If we can't parse it as a key-value file, skip */
-	
+
 		if (!g_key_file_load_from_file (keyfile, fullfilen, G_KEY_FILE_NONE, NULL)) {
 			g_free (fullfilen);
 			continue;
@@ -153,6 +182,13 @@
 			continue;
 		}
 
+		prio = g_key_file_get_integer (keyfile, "D-BUS Album art provider", "Priority", &err);
+
+		if (err) {
+			prio = -1;
+			g_error_free (err);
+		}
+
 		/* Else, get the modificiation time, we'll need it later */
 
 		file = g_file_new_for_path (fullfilen);
@@ -179,23 +215,12 @@
 		/* And register it in the temporary hashtable that is being formed */
 
 		v_info = g_slice_new (ValueInfo);
+
 		v_info->name = g_strdup (value);
+		v_info->prio = prio;
 
-		/* The modification time of the albumarter-service file is
-		 * used, as specified, to determine the priority. We simply 
-		 * override older-ones with newer-ones in the hashtable (using 
-		 * replace). */
+		albumart_manager_add (object, v_info);
 
-		v_info->mtime = mtime;
-
-		/* Only items in overrides are prioritized. */
-
-		v_info->prio = FALSE;
-
-		g_hash_table_replace (pre, 
-						      g_strdup (fullfilen), 
-						      v_info);
-
 		g_free (fullfilen);
 
 		if (info)
@@ -209,35 +234,6 @@
 
 	g_dir_close (dir);
 
-	g_hash_table_iter_init (&iter, pre);
-
-	while (g_hash_table_iter_next (&iter, &pkey, &pvalue))  {
-		gchar *k = pkey;
-		ValueInfo *v = pvalue;
-		gchar *oname = NULL;
-
-		/* If this is a prioritized one, we'll always override the older. If we
-		 * are in overriding mode, we'll also override. We override by looking
-		 * up the service-name for the MIME-type and we put that in oname, which
-		 * stands for original-name. */
-
-		if (!v->prio && !override) {
-			DBusGProxy *proxy = g_hash_table_lookup (priv->handlers, k);
-			if (proxy)
-				oname = (gchar *) dbus_g_proxy_get_bus_name (proxy);
-		}
-
-		/* Now if the original name is set (we'll override) and if the new name
-		 * is different than the original-name (else there's no point in 
-		 * overriding anything, als the proxy will point to the same thing 
-		 * anyway), we add it (adding here means overriding, as replace is used
-		 * on the hashtable). */
-
-		if (!oname || g_ascii_strcasecmp (v->name, oname) != 0)
-			albumart_manager_add (object, k, v->name);
-	}
-
-	g_hash_table_unref (pre);
 }
 
 
@@ -249,10 +245,13 @@
 		case G_FILE_MONITOR_EVENT_CHANGED:
 		case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
 		case G_FILE_MONITOR_EVENT_DELETED:
-		case G_FILE_MONITOR_EVENT_CREATED:
-			albumart_manager_check_dir (ALBUMART_MANAGER (user_data), 
-										ALBUMARTERS_DIR, FALSE);
-		break;
+		case G_FILE_MONITOR_EVENT_CREATED: {
+			AlbumartManager *object = user_data;
+			AlbumartManagerPrivate *priv = ALBUMART_MANAGER_GET_PRIVATE (object);
+			g_mutex_lock (priv->mutex);
+			albumart_manager_check_dir (object, ALBUMARTERS_DIR, FALSE);
+			g_mutex_unlock (priv->mutex);
+		} break;
 		default:
 		break;
 	}
@@ -272,7 +271,7 @@
 	artdir = g_file_new_for_path (ALBUMARTERS_DIR);
 	artmon =  g_file_monitor_directory (artdir, G_FILE_MONITOR_NONE, NULL, NULL);
 	g_signal_connect (G_OBJECT (artmon), "changed", 
-			  G_CALLBACK (on_dir_changed), NULL);
+			  G_CALLBACK (on_dir_changed), object);
 
 	g_mutex_unlock (priv->mutex);
 }
@@ -283,7 +282,11 @@
 {
 	AlbumartManagerPrivate *priv = ALBUMART_MANAGER_GET_PRIVATE (object);
 
-	g_hash_table_unref (priv->handlers);
+	if (priv->handlers) {
+		g_list_foreach (priv->handlers, (GFunc) free_valueinfo, NULL);
+		g_list_free (priv->handlers);
+	}
+
 	g_mutex_free (priv->mutex);
 
 	G_OBJECT_CLASS (albumart_manager_parent_class)->finalize (object);
@@ -359,9 +362,7 @@
 	AlbumartManagerPrivate *priv = ALBUMART_MANAGER_GET_PRIVATE (object);
 
 	priv->mutex = g_mutex_new ();
-	priv->handlers = g_hash_table_new_full (g_str_hash, g_str_equal,
-						(GDestroyNotify) g_free, 
-						(GDestroyNotify) g_object_unref);
+	priv->handlers = NULL;
 }
 
 void 

Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart.c
===================================================================
--- projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart.c	2008-09-30 14:16:04 UTC (rev 16297)
+++ projects/haf/branches/hildon-thumbnail/daemonize/daemon/albumart.c	2008-09-30 14:18:47 UTC (rev 16298)
@@ -189,14 +189,15 @@
 
 
 	if (!g_file_test (path, G_FILE_TEST_EXISTS)) {
-		GList *proxies, *copy;
 		gboolean handled = FALSE;
 
 		// TODO: Perform copy from embedded (in uri) to path
 		// TODO: Perform heuristics from uri to path
 
 		if (!handled) {
+			GList *proxies, *copy;
 			gboolean handled = FALSE;
+
 			proxies = albumart_manager_get_handlers (priv->manager);
 			copy = proxies;
 
@@ -216,8 +217,6 @@
 
 				keep_alive ();
 
-				// g_object_unref (proxy);
-
 				if (error) {
 					g_signal_emit (task->object, signals[ERROR_SIGNAL],
 						       0, task->num, 1, error->message);
@@ -231,7 +230,9 @@
 				copy = g_list_next (copy);
 			} 
 
-			g_list_free (proxies);
+			g_list_foreach (proxies, (GFunc) g_object_unref, NULL);
+			if (proxies)
+				g_list_free (proxies);
 		}
 	}
 

Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnail-manager.c
===================================================================
--- projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnail-manager.c	2008-09-30 14:16:04 UTC (rev 16297)
+++ projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnail-manager.c	2008-09-30 14:18:47 UTC (rev 16298)
@@ -108,6 +108,7 @@
 
 static void
 free_valueinfo (ValueInfo *info) {
+	g_free (info->name);
 	g_slice_free (ValueInfo, info);
 }
 
@@ -325,11 +326,15 @@
 		case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
 		case G_FILE_MONITOR_EVENT_DELETED:
 		case G_FILE_MONITOR_EVENT_CREATED: {
+			ThumbnailManager *object = user_data;
+			ThumbnailManagerPrivate *priv = THUMBNAIL_MANAGER_GET_PRIVATE (object);
 			gchar *path = g_file_get_path (file);
 			gboolean override = (strcmp (THUMBNAILERS_DIR, path) == 0);
 
+			g_mutex_lock (priv->mutex);
 			/* We override when it's the dir in the user's homedir*/
-			thumbnail_manager_check_dir (THUMBNAIL_MANAGER (user_data), path, override);
+			thumbnail_manager_check_dir (object, path, override);
+			g_mutex_unlock (priv->mutex);
 
 			g_free (path);
 		} 
@@ -358,13 +363,13 @@
 	homedir = g_file_new_for_path (home_thumbnlrs);
 	homemon =  g_file_monitor_directory (homedir, G_FILE_MONITOR_NONE, NULL, NULL);
 	g_signal_connect (G_OBJECT (homemon), "changed", 
-			  G_CALLBACK (on_dir_changed), NULL);
+			  G_CALLBACK (on_dir_changed), object);
 
 	/* Monitor the dir for changes */
 	thumbdir = g_file_new_for_path (THUMBNAILERS_DIR);
 	thumbmon =  g_file_monitor_directory (thumbdir, G_FILE_MONITOR_NONE, NULL, NULL);
 	g_signal_connect (G_OBJECT (thumbmon), "changed", 
-			  G_CALLBACK (on_dir_changed), NULL);
+			  G_CALLBACK (on_dir_changed), object);
 
 	g_mutex_unlock (priv->mutex);
 


More information about the maemo-commits mailing list