glib r6461 - trunk/gio
- From: alexl svn gnome org
- To: svn-commits-list gnome org
- Subject: glib r6461 - trunk/gio
- Date: Wed, 6 Feb 2008 10:57:27 +0000 (GMT)
Author: alexl
Date: Wed Feb 6 10:57:27 2008
New Revision: 6461
URL: http://svn.gnome.org/viewvc/glib?rev=6461&view=rev
Log:
2008-02-06 Alexander Larsson <alexl redhat com>
* gdesktopappinfo.c:
Update to use both mimeapps.list and
defaults.list as discussed on xdg list.
Modified:
trunk/gio/ChangeLog
trunk/gio/gdesktopappinfo.c
Modified: trunk/gio/gdesktopappinfo.c
==============================================================================
--- trunk/gio/gdesktopappinfo.c (original)
+++ trunk/gio/gdesktopappinfo.c Wed Feb 6 10:57:27 2008
@@ -54,6 +54,7 @@
**/
#define DEFAULT_APPLICATIONS_GROUP "Default Applications"
+#define ADDED_ASSOCIATIONS_GROUP "Added Associations"
#define REMOVED_ASSOCIATIONS_GROUP "Removed Associations"
#define MIME_CACHE_GROUP "MIME Cache"
@@ -1124,12 +1125,12 @@
}
static gboolean
-update_default_list (const char *desktop_id,
- const char *content_type,
- gboolean add_at_start,
- gboolean add_at_end,
- gboolean remove,
- GError **error)
+update_mimeapps_list (const char *desktop_id,
+ const char *content_type,
+ gboolean add_at_start,
+ gboolean add_at_end,
+ gboolean remove,
+ GError **error)
{
char *dirname, *filename;
GKeyFile *key_file;
@@ -1147,12 +1148,12 @@
if (!dirname)
return FALSE;
- filename = g_build_filename (dirname, "defaults.list", NULL);
+ filename = g_build_filename (dirname, "mimeapps.list", NULL);
g_free (dirname);
key_file = g_key_file_new ();
load_succeeded = g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, NULL);
- if (!load_succeeded || !g_key_file_has_group (key_file, DEFAULT_APPLICATIONS_GROUP))
+ if (!load_succeeded || !g_key_file_has_group (key_file, ADDED_ASSOCIATIONS_GROUP))
{
g_key_file_free (key_file);
key_file = g_key_file_new ();
@@ -1161,7 +1162,7 @@
/* Add to the right place in the list */
length = 0;
- old_list = g_key_file_get_string_list (key_file, DEFAULT_APPLICATIONS_GROUP,
+ old_list = g_key_file_get_string_list (key_file, ADDED_ASSOCIATIONS_GROUP,
content_type, &length, NULL);
list = g_new (char *, 1 + length + 1);
@@ -1184,7 +1185,7 @@
g_strfreev (old_list);
g_key_file_set_string_list (key_file,
- DEFAULT_APPLICATIONS_GROUP,
+ ADDED_ASSOCIATIONS_GROUP,
content_type,
(const char * const *)list, i);
@@ -1250,7 +1251,7 @@
if (!g_desktop_app_info_ensure_saved (info, error))
return FALSE;
- return update_default_list (info->desktop_id, content_type, TRUE, FALSE, FALSE, error);
+ return update_mimeapps_list (info->desktop_id, content_type, TRUE, FALSE, FALSE, error);
}
static void
@@ -1367,7 +1368,7 @@
if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error))
return FALSE;
- return update_default_list (info->desktop_id, content_type, FALSE, TRUE, FALSE, error);
+ return update_mimeapps_list (info->desktop_id, content_type, FALSE, TRUE, FALSE, error);
}
static gboolean
@@ -1386,7 +1387,7 @@
if (!g_desktop_app_info_ensure_saved (G_DESKTOP_APP_INFO (info), error))
return FALSE;
- return update_default_list (info->desktop_id, content_type, FALSE, FALSE, TRUE, error);
+ return update_mimeapps_list (info->desktop_id, content_type, FALSE, FALSE, TRUE, error);
}
static gboolean
@@ -1836,9 +1837,11 @@
char *path;
GHashTable *mime_info_cache_map;
GHashTable *defaults_list_map;
- GHashTable *defaults_list_removed_map;
+ GHashTable *mimeapps_list_added_map;
+ GHashTable *mimeapps_list_removed_map;
time_t mime_info_cache_timestamp;
time_t defaults_list_timestamp;
+ time_t mimeapps_list_timestamp;
} MimeInfoCacheDir;
typedef struct {
@@ -2024,10 +2027,6 @@
dir->defaults_list_map = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify)g_strfreev);
- if (dir->defaults_list_removed_map != NULL)
- g_hash_table_destroy (dir->defaults_list_removed_map);
- dir->defaults_list_removed_map = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, (GDestroyNotify)g_strfreev);
key_file = g_key_file_new ();
@@ -2070,6 +2069,90 @@
g_strfreev (mime_types);
}
+ g_key_file_free (key_file);
+ return;
+
+ error:
+ g_free (filename);
+ g_key_file_free (key_file);
+
+ if (mime_types != NULL)
+ g_strfreev (mime_types);
+
+ if (load_error)
+ g_error_free (load_error);
+}
+
+static void
+mime_info_cache_dir_init_mimeapps_list (MimeInfoCacheDir *dir)
+{
+ GKeyFile *key_file;
+ GError *load_error;
+ gchar *filename, **mime_types;
+ char *unaliased_type;
+ char **desktop_file_ids;
+ int i;
+ struct stat buf;
+
+ load_error = NULL;
+ mime_types = NULL;
+
+ if (dir->mimeapps_list_added_map != NULL &&
+ !mime_info_cache_dir_out_of_date (dir, "mimeapps.list",
+ &dir->mimeapps_list_timestamp))
+ return;
+
+ if (dir->mimeapps_list_added_map != NULL)
+ g_hash_table_destroy (dir->mimeapps_list_added_map);
+ dir->mimeapps_list_added_map = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify)g_strfreev);
+
+ if (dir->mimeapps_list_removed_map != NULL)
+ g_hash_table_destroy (dir->mimeapps_list_removed_map);
+ dir->mimeapps_list_removed_map = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, (GDestroyNotify)g_strfreev);
+
+ key_file = g_key_file_new ();
+
+ filename = g_build_filename (dir->path, "mimeapps.list", NULL);
+ if (g_stat (filename, &buf) < 0)
+ goto error;
+
+ if (dir->mimeapps_list_timestamp > 0)
+ mime_info_cache->should_ping_mime_monitor = TRUE;
+
+ dir->mimeapps_list_timestamp = buf.st_mtime;
+
+ g_key_file_load_from_file (key_file, filename, G_KEY_FILE_NONE, &load_error);
+ g_free (filename);
+ filename = NULL;
+
+ if (load_error != NULL)
+ goto error;
+
+ mime_types = g_key_file_get_keys (key_file, ADDED_ASSOCIATIONS_GROUP,
+ NULL, NULL);
+ if (mime_types != NULL)
+ {
+ for (i = 0; mime_types[i] != NULL; i++)
+ {
+ desktop_file_ids = g_key_file_get_string_list (key_file,
+ ADDED_ASSOCIATIONS_GROUP,
+ mime_types[i],
+ NULL,
+ NULL);
+ if (desktop_file_ids == NULL)
+ continue;
+
+ unaliased_type = _g_unix_content_type_unalias (mime_types[i]);
+ g_hash_table_replace (dir->mimeapps_list_added_map,
+ unaliased_type,
+ desktop_file_ids);
+ }
+
+ g_strfreev (mime_types);
+ }
+
mime_types = g_key_file_get_keys (key_file, REMOVED_ASSOCIATIONS_GROUP,
NULL, NULL);
if (mime_types != NULL)
@@ -2085,7 +2168,7 @@
continue;
unaliased_type = _g_unix_content_type_unalias (mime_types[i]);
- g_hash_table_replace (dir->defaults_list_removed_map,
+ g_hash_table_replace (dir->mimeapps_list_removed_map,
unaliased_type,
desktop_file_ids);
}
@@ -2137,10 +2220,16 @@
dir->defaults_list_map = NULL;
}
- if (dir->defaults_list_removed_map != NULL)
+ if (dir->mimeapps_list_added_map != NULL)
+ {
+ g_hash_table_destroy (dir->mimeapps_list_added_map);
+ dir->mimeapps_list_added_map = NULL;
+ }
+
+ if (dir->mimeapps_list_removed_map != NULL)
{
- g_hash_table_destroy (dir->defaults_list_removed_map);
- dir->defaults_list_removed_map = NULL;
+ g_hash_table_destroy (dir->mimeapps_list_removed_map);
+ dir->mimeapps_list_removed_map = NULL;
}
g_free (dir);
@@ -2187,6 +2276,7 @@
{
mime_info_cache_dir_init (dir);
mime_info_cache_dir_init_defaults_list (dir);
+ mime_info_cache_dir_init_mimeapps_list (dir);
mime_info_cache->dirs = g_list_append (mime_info_cache->dirs, dir);
}
@@ -2208,6 +2298,7 @@
mime_info_cache_blow_global_cache ();
mime_info_cache_dir_init (dir);
mime_info_cache_dir_init_defaults_list (dir);
+ mime_info_cache_dir_init_mimeapps_list (dir);
tmp = tmp->next;
}
@@ -2216,28 +2307,28 @@
static void
mime_info_cache_init (void)
{
- G_LOCK (mime_info_cache);
- if (mime_info_cache == NULL)
- mime_info_cache_init_dir_lists ();
- else
- {
- time_t now;
-
- time (&now);
- if (now >= mime_info_cache->last_stat_time + 10)
- {
- mime_info_cache_update_dir_lists ();
- mime_info_cache->last_stat_time = now;
- }
- }
-
- if (mime_info_cache->should_ping_mime_monitor)
- {
- /* g_idle_add (emit_mime_changed, NULL); */
- mime_info_cache->should_ping_mime_monitor = FALSE;
- }
-
- G_UNLOCK (mime_info_cache);
+ G_LOCK (mime_info_cache);
+ if (mime_info_cache == NULL)
+ mime_info_cache_init_dir_lists ();
+ else
+ {
+ time_t now;
+
+ time (&now);
+ if (now >= mime_info_cache->last_stat_time + 10)
+ {
+ mime_info_cache_update_dir_lists ();
+ mime_info_cache->last_stat_time = now;
+ }
+ }
+
+ if (mime_info_cache->should_ping_mime_monitor)
+ {
+ /* g_idle_add (emit_mime_changed, NULL); */
+ mime_info_cache->should_ping_mime_monitor = FALSE;
+ }
+
+ G_UNLOCK (mime_info_cache);
}
static MimeInfoCache *
@@ -2341,13 +2432,21 @@
dir_list = dir_list->next)
{
dir = dir_list->data;
- default_entries = g_hash_table_lookup (dir->defaults_list_map, mime_type);
+
+ /* First added associations from mimeapps.list */
+ default_entries = g_hash_table_lookup (dir->mimeapps_list_added_map, mime_type);
for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++)
desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries);
- removed_associations = g_hash_table_lookup (dir->defaults_list_removed_map, mime_type);
+ /* Then removed assiciations from mimeapps.list */
+ removed_associations = g_hash_table_lookup (dir->mimeapps_list_removed_map, mime_type);
for (j = 0; removed_associations != NULL && removed_associations[j] != NULL; j++)
removed_entries = append_desktop_entry (removed_entries, removed_associations[j], NULL);
+
+ /* Then system defaults (or old per-user config) (using removed associations from this dir or earlier) */
+ default_entries = g_hash_table_lookup (dir->defaults_list_map, mime_type);
+ for (j = 0; default_entries != NULL && default_entries[j] != NULL; j++)
+ desktop_entries = append_desktop_entry (desktop_entries, default_entries[j], removed_entries);
}
/* Go through all entries that support the mimetype */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]