From 0417ddab6fbd2f1cddbb9218e0e300e04da2eda5 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sat, 14 Apr 2012 19:34:00 +0200 Subject: [PATCH] GAppInfo: add a mechanism to query supported content types This essentially adds an accessor for the MimeType field in desktop files, to retrieve the list of all mime types supported by an application. The interface though is part of GAppInfo, so it could be implemented in the future by other backends. https://bugzilla.gnome.org/show_bug.cgi?id=674111 --- docs/reference/gio/gio-sections.txt | 1 + gio/gappinfo.c | 31 +++++++++++++++++++++++++++++ gio/gappinfo.h | 4 ++++ gio/gdesktopappinfo.c | 13 ++++++++++++ gio/gio.symbols | 1 + gio/tests/appinfo-test.desktop | 1 + gio/tests/appinfo.c | 16 +++++++++++++++ 7 files changed, 67 insertions(+) diff --git a/docs/reference/gio/gio-sections.txt b/docs/reference/gio/gio-sections.txt index 584a3f551..7c5636d4c 100644 --- a/docs/reference/gio/gio-sections.txt +++ b/docs/reference/gio/gio-sections.txt @@ -1313,6 +1313,7 @@ g_app_info_set_as_last_used_for_type g_app_info_add_supports_type g_app_info_can_remove_supports_type g_app_info_remove_supports_type +g_app_info_get_supported_types g_app_info_get_all g_app_info_get_all_for_type g_app_info_get_default_for_type diff --git a/gio/gappinfo.c b/gio/gappinfo.c index 666d2b03b..53d3c3972 100644 --- a/gio/gappinfo.c +++ b/gio/gappinfo.c @@ -458,6 +458,37 @@ g_app_info_remove_supports_type (GAppInfo *appinfo, return FALSE; } +/** + * g_app_info_get_supported_types: + * @info: a #GAppInfo that can handle files + * + * Retrieves the list of content types that @app_info claims to support. + * If this information is not provided by the environment, this function + * will return %NULL. + * This function does not take in consideration associations added with + * g_app_info_add_supports_type(), but only those exported directly by + * the application. + * + * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): + * a list of content types. + * + * Since: 2.34 + */ +const char ** +g_app_info_get_supported_types (GAppInfo *appinfo) +{ + GAppInfoIface *iface; + + g_return_val_if_fail (G_IS_APP_INFO (appinfo), NULL); + + iface = G_APP_INFO_GET_IFACE (appinfo); + + if (iface->get_supported_types) + return iface->get_supported_types (appinfo); + else + return NULL; +} + /** * g_app_info_get_icon: diff --git a/gio/gappinfo.h b/gio/gappinfo.h index b6786d603..17d2f76cc 100644 --- a/gio/gappinfo.h +++ b/gio/gappinfo.h @@ -132,6 +132,7 @@ struct _GAppInfoIface gboolean (* set_as_last_used_for_type) (GAppInfo *appinfo, const char *content_type, GError **error); + const char ** (* get_supported_types) (GAppInfo *appinfo); }; GType g_app_info_get_type (void) G_GNUC_CONST; @@ -174,6 +175,9 @@ gboolean g_app_info_can_remove_supports_type (GAppInfo *appin gboolean g_app_info_remove_supports_type (GAppInfo *appinfo, const char *content_type, GError **error); +GLIB_AVAILABLE_IN_2_34 +const char **g_app_info_get_supported_types (GAppInfo *appinfo); + gboolean g_app_info_can_delete (GAppInfo *appinfo); gboolean g_app_info_delete (GAppInfo *appinfo); diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index 4044679e9..fafea1cd9 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -108,6 +108,7 @@ struct _GDesktopAppInfo char *path; char *categories; char *startup_wm_class; + char **mime_types; guint nodisplay : 1; guint hidden : 1; @@ -187,6 +188,7 @@ g_desktop_app_info_finalize (GObject *object) g_free (info->path); g_free (info->categories); g_free (info->startup_wm_class); + g_strfreev (info->mime_types); G_OBJECT_CLASS (g_desktop_app_info_parent_class)->finalize (object); } @@ -333,6 +335,7 @@ g_desktop_app_info_load_from_keyfile (GDesktopAppInfo *info, info->hidden = g_key_file_get_boolean (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_HIDDEN, NULL) != FALSE; info->categories = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_CATEGORIES, NULL); info->startup_wm_class = g_key_file_get_string (key_file, G_KEY_FILE_DESKTOP_GROUP, STARTUP_WM_CLASS_KEY, NULL); + info->mime_types = g_key_file_get_string_list (key_file, G_KEY_FILE_DESKTOP_GROUP, G_KEY_FILE_DESKTOP_KEY_MIME_TYPE, NULL, NULL); info->icon = NULL; if (info->icon_name) @@ -1981,6 +1984,15 @@ g_desktop_app_info_remove_supports_type (GAppInfo *appinfo, error); } +static const char ** +g_desktop_app_info_get_supported_types (GAppInfo *appinfo) +{ + GDesktopAppInfo *info = G_DESKTOP_APP_INFO (appinfo); + + return (const char**) info->mime_types; +} + + static gboolean g_desktop_app_info_ensure_saved (GDesktopAppInfo *info, GError **error) @@ -2202,6 +2214,7 @@ g_desktop_app_info_iface_init (GAppInfoIface *iface) iface->get_commandline = g_desktop_app_info_get_commandline; iface->get_display_name = g_desktop_app_info_get_display_name; iface->set_as_last_used_for_type = g_desktop_app_info_set_as_last_used_for_type; + iface->get_supported_types = g_desktop_app_info_get_supported_types; } static gboolean diff --git a/gio/gio.symbols b/gio/gio.symbols index f4dff3555..3f6f773e2 100644 --- a/gio/gio.symbols +++ b/gio/gio.symbols @@ -56,6 +56,7 @@ g_app_info_get_description g_app_info_get_executable g_app_info_get_commandline g_app_info_get_icon +g_app_info_get_supported_types g_app_info_launch g_app_info_supports_uris g_app_info_supports_files diff --git a/gio/tests/appinfo-test.desktop b/gio/tests/appinfo-test.desktop index f2b873afe..e4d839696 100644 --- a/gio/tests/appinfo-test.desktop +++ b/gio/tests/appinfo-test.desktop @@ -10,3 +10,4 @@ Exec=./appinfo-test --option Icon=testicon StartupNotify=true StartupWMClass=appinfo-class +MimeType=image/png;image/jpeg; diff --git a/gio/tests/appinfo.c b/gio/tests/appinfo.c index bb24669a6..e8e511a01 100644 --- a/gio/tests/appinfo.c +++ b/gio/tests/appinfo.c @@ -287,6 +287,21 @@ test_startup_wm_class (void) g_object_unref (appinfo); } +static void +test_supported_types (void) +{ + GAppInfo *appinfo; + const char * const *content_types; + + appinfo = G_APP_INFO (g_desktop_app_info_new_from_filename (SRCDIR "/appinfo-test.desktop")); + content_types = g_app_info_get_supported_types (appinfo); + + g_assert_cmpint (g_strv_length ((char**)content_types), ==, 2); + g_assert_cmpstr (content_types[0], ==, "image/png"); + + g_object_unref (appinfo); +} + int main (int argc, char *argv[]) { @@ -303,6 +318,7 @@ main (int argc, char *argv[]) g_test_add_func ("/appinfo/associations", test_associations); g_test_add_func ("/appinfo/environment", test_environment); g_test_add_func ("/appinfo/startup-wm-class", test_startup_wm_class); + g_test_add_func ("/appinfo/supported-types", test_supported_types); return g_test_run (); }