[maemo-commits] [maemo-commits] r16148 - projects/haf/branches/hildon-thumbnail/daemonize/daemon
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Wed Sep 17 13:01:11 EEST 2008
- Previous message: [maemo-commits] r16147 - projects/haf/branches/hildon-thumbnail/daemonize/daemon
- Next message: [maemo-commits] r16149 - projects/haf/branches/hildon-thumbnail/daemonize/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: pvanhoof Date: 2008-09-17 13:01:06 +0300 (Wed, 17 Sep 2008) New Revision: 16148 Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/hildon-thumbnail-daemon.c projects/haf/branches/hildon-thumbnail/daemonize/daemon/manager.c projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnailer.c Log: Code comments and small bugfixes Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/hildon-thumbnail-daemon.c =================================================================== --- projects/haf/branches/hildon-thumbnail/daemonize/daemon/hildon-thumbnail-daemon.c 2008-09-17 08:08:42 UTC (rev 16147) +++ projects/haf/branches/hildon-thumbnail/daemonize/daemon/hildon-thumbnail-daemon.c 2008-09-17 10:01:06 UTC (rev 16148) @@ -96,6 +96,8 @@ (GDestroyNotify) g_free, (GDestroyNotify) NULL); + /* TODO: Monitor this directory for plugin removals and additions */ + dir = g_dir_open (PLUGINS_DIR, 0, &error); if (dir) { Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/manager.c =================================================================== --- projects/haf/branches/hildon-thumbnail/daemonize/daemon/manager.c 2008-09-17 08:08:42 UTC (rev 16147) +++ projects/haf/branches/hildon-thumbnail/daemonize/daemon/manager.c 2008-09-17 10:01:06 UTC (rev 16148) @@ -78,6 +78,8 @@ guint len = strlen (path); guint i; + /* Not sure if this path stuff makes any sense ... but it works */ + for (i = 0; i< len; i++) { if (path[i] == '.') path[i] = '/'; @@ -98,6 +100,7 @@ typedef struct { gchar *name; guint64 mtime; + gboolean prio; } ValueInfo; static void @@ -136,6 +139,8 @@ GFileInfo *info; GFile *file; + /* If the file is the 'overrides', skip it (we'll deal with that later) */ + if (strcmp (filen, "overrides") == 0) { has_override = TRUE; continue; @@ -144,6 +149,8 @@ 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; @@ -151,14 +158,27 @@ value = g_key_file_get_string (keyfile, "D-BUS Thumbnailer", "Name", NULL); - if (!value) + /* If it doesn't have the required things, skip */ + + if (!value) { + g_free (fullfilen); + g_key_file_free (keyfile); continue; + } values = g_key_file_get_string_list (keyfile, "D-BUS Thumbnailer", "MimeTypes", NULL, NULL); - if (!values) + /* If it doesn't have the required things, skip */ + + if (!values) { + g_free (fullfilen); + g_free (value); + g_key_file_free (keyfile); continue; + } + /* Else, get the modificiation time, we'll need it later */ + file = g_file_new_for_path (fullfilen); g_free (fullfilen); @@ -167,7 +187,13 @@ G_FILE_QUERY_INFO_NONE, NULL, &error); + /* If that didn't work out, skip */ + if (error) { + if (info) + g_object_unref (info); + if (file) + g_object_unref (file); g_free (value); g_strfreev (values); g_key_file_free (keyfile); @@ -176,16 +202,30 @@ mtime = g_file_info_get_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED); + /* And register it in the temporary hashtable that is being formed */ + while (values[i] != NULL) { ValueInfo *info; info = g_hash_table_lookup (pre, values[i]); if (!info || info->mtime < mtime) { + info = g_slice_new (ValueInfo); + info->name = g_strdup (value); + + /* The modification time of the thumbnailer-service file is + * used, as specified, to determine the priority. We simply + * override older-ones with newer-ones in the hashtable (using + * replace). */ + info->mtime = mtime; + /* Only items in overrides are prioritized. */ + + info->prio = FALSE; + g_hash_table_replace (pre, g_strdup (values[i]), info); @@ -221,8 +261,15 @@ ValueInfo *info = g_slice_new (ValueInfo); info->name = g_key_file_get_string (keyfile, mimes[i], "Name", NULL); + + /* This is atm unused for items in overrides. */ + info->mtime = time (NULL); + /* Items in overrides are prioritized. */ + + info->prio = TRUE; + g_hash_table_replace (pre, g_strdup (mimes[i]), info); @@ -241,12 +288,23 @@ ValueInfo *v = pvalue; gchar *oname = NULL; - if (!override) { + /* 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) manager_add (object, k, v->name); } @@ -266,7 +324,10 @@ case G_FILE_MONITOR_EVENT_CREATED: { gchar *path = g_file_get_path (file); gboolean override = (strcmp (THUMBNAILERS_DIR, path) == 0); + + /* We override when it's the one in the user's homedir*/ manager_check_dir (MANAGER (user_data), path, override); + g_free (path); } break; @@ -287,9 +348,11 @@ g_mutex_lock (priv->mutex); + /* We override when it's the one in the user's homedir*/ manager_check_dir (object, THUMBNAILERS_DIR, FALSE); manager_check_dir (object, home_thumbnlrs, TRUE); + /* Monitor the dir for changes */ file = g_file_new_for_path (home_thumbnlrs); monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, NULL); g_signal_connect (G_OBJECT (monitor), "changed", @@ -298,6 +361,7 @@ // g_object_unref (file) // g_object_unref (monitor) + /* Monitor the dir for changes */ file = g_file_new_for_path (THUMBNAILERS_DIR); monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE, NULL, NULL); g_signal_connect (G_OBJECT (monitor), "changed", @@ -328,7 +392,9 @@ g_mutex_lock (priv->mutex); - /* This only happens for not-activable ones */ + /* This only happens for not-activable ones: if the service disappears, we + * unregister it. Note that this is actually only for our plugin-runner to + * work correctly (not to implement any specification related things) */ g_hash_table_foreach_remove (priv->handlers, do_remove_or_not, @@ -373,6 +439,9 @@ dbus_g_method_return (context); } +/* A function for letting the manager know what mime-types we already deal with + * ourselves outside of the manager's registration procedure (internal plugins) */ + void manager_i_have (Manager *object, const gchar *mime_type) { @@ -385,6 +454,9 @@ } +/* This is a custom spec addition, for dynamic registration of thumbnailers. + * Consult manager.xml for more information about this custom spec addition. */ + void manager_get_supported (Manager *object, DBusGMethodInvocation *context) { @@ -415,6 +487,7 @@ copy = g_list_next (copy); } g_mutex_unlock (priv->mutex); + g_list_free (copy); g_hash_table_iter_init (&iter, supported_h); Modified: projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnailer.c =================================================================== --- projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnailer.c 2008-09-17 08:08:42 UTC (rev 16147) +++ projects/haf/branches/hildon-thumbnail/daemonize/daemon/thumbnailer.c 2008-09-17 10:01:06 UTC (rev 16148) @@ -200,7 +200,8 @@ } /* This is the threadpool's function. This means that everything we do is - * asynchronous wrt to the mainloop (we aren't blocking it). + * asynchronous wrt to the mainloop (we aren't blocking it). Because it all + * happens in a thread, we must care about proper locking, too. * * Thanks to the pool_sort_compare sorter is this pool a LIFO, which means that * new requests get a certain priority over older requests. Note that we are not @@ -250,8 +251,6 @@ 0, task->num, 1, error->message); g_error_free (error); } else { - // g_print ("M: %s\n", mime_type); - if (mime_type && !has_thumb) { GList *urls_for_mime = g_hash_table_lookup (hash, mime_type); urls_for_mime = g_list_prepend (urls_for_mime, urls[i]);
- Previous message: [maemo-commits] r16147 - projects/haf/branches/hildon-thumbnail/daemonize/daemon
- Next message: [maemo-commits] r16149 - projects/haf/branches/hildon-thumbnail/daemonize/debian
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]