[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.orgDate: Tue Sep 30 17:19:02 EEST 2008
- Previous message: [maemo-commits] r16297 - projects/haf/tags/glib
- Next message: [maemo-commits] r16299 - in projects/haf/branches/hildon-thumbnail/daemonize: . daemon
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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);
- Previous message: [maemo-commits] r16297 - projects/haf/tags/glib
- Next message: [maemo-commits] r16299 - in projects/haf/branches/hildon-thumbnail/daemonize: . daemon
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]