[glib/wjt/g_desktop_app_info_get_string_list: 2/2] gdesktopappinfo: add get_string_list() function
- From: Will Thompson <wjt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wjt/g_desktop_app_info_get_string_list: 2/2] gdesktopappinfo: add get_string_list() function
- Date: Thu, 20 Sep 2018 16:05:25 +0000 (UTC)
commit d3d834ee74741e92d56ef05c0ff2b6be69faa531
Author: Will Thompson <will willthompson co uk>
Date: Thu Sep 20 16:26:55 2018 +0100
gdesktopappinfo: add get_string_list() function
The X-Flatpak-RenamedFrom key is used in .desktop files to identify past
names for the desktop file. It is defined to be a list of strings.
However, there was previously no correct way to retrieve a list of
strings from the GKeyFile wrapped by GDesktopAppInfo, short of
re-parsing the file with GKeyFile.
Note that doing something like:
g_strsplit (g_desktop_app_info_get_string (...), ";", -1)
is not correct: the raw value "a\;b;" represents the one-element list
["a;b"], but g_key_file_get_string() rejects the sequence "\;", and so
g_desktop_app_info_get_string() returns NULL in this case. (Of course, a
.desktop file with a semicolon in its name is a pathological case.)
Add g_desktop_app_info_get_string_list(), a trivial wrapper around
g_key_file_get_string_list(), similar to g_desktop_app_info_get_string()
and co.
gio/gdesktopappinfo.c | 27 +++++++++++++++++++++++++++
gio/gdesktopappinfo.h | 5 +++++
gio/tests/appinfo.c | 9 +++++++++
3 files changed, 41 insertions(+)
---
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
index d0ffbace3..c55a0abe2 100644
--- a/gio/gdesktopappinfo.c
+++ b/gio/gdesktopappinfo.c
@@ -4534,6 +4534,33 @@ g_desktop_app_info_get_boolean (GDesktopAppInfo *info,
G_KEY_FILE_DESKTOP_GROUP, key, NULL);
}
+/**
+ * g_desktop_app_info_get_string_list:
+ * @info: a #GDesktopAppInfo
+ * @key: the key to look up
+ * @length: (out) (optional): return location for the number of returned strings, or %NULL
+ *
+ * Looks up a string list value in the keyfile backing @info.
+ *
+ * The @key is looked up in the "Desktop Entry" group.
+ *
+ * Returns: (array zero-terminated=1 length=length) (element-type utf8) (transfer full):
+ * a %NULL-terminated string array or %NULL if the specified
+ * key cannot be found. The array should be freed with g_strfreev().
+ *
+ * Since: 2.59.0
+ */
+gchar **
+g_desktop_app_info_get_string_list (GDesktopAppInfo *info,
+ const char *key,
+ gsize *length)
+{
+ g_return_val_if_fail (G_IS_DESKTOP_APP_INFO (info), NULL);
+
+ return g_key_file_get_string_list (info->keyfile,
+ G_KEY_FILE_DESKTOP_GROUP, key, length, NULL);
+}
+
/**
* g_desktop_app_info_has_key:
* @info: a #GDesktopAppInfo
diff --git a/gio/gdesktopappinfo.h b/gio/gdesktopappinfo.h
index 86a3caa30..1254038a4 100644
--- a/gio/gdesktopappinfo.h
+++ b/gio/gdesktopappinfo.h
@@ -89,6 +89,11 @@ GLIB_AVAILABLE_IN_2_36
gboolean g_desktop_app_info_get_boolean (GDesktopAppInfo *info,
const char *key);
+GLIB_AVAILABLE_IN_2_60
+gchar ** g_desktop_app_info_get_string_list (GDesktopAppInfo *info,
+ const char *key,
+ gsize *length);
+
GLIB_AVAILABLE_IN_2_38
const gchar * const * g_desktop_app_info_list_actions (GDesktopAppInfo *info);
diff --git a/gio/tests/appinfo.c b/gio/tests/appinfo.c
index a52bc7094..63240f5ae 100644
--- a/gio/tests/appinfo.c
+++ b/gio/tests/appinfo.c
@@ -512,6 +512,8 @@ test_from_keyfile (void)
GKeyFile *kf;
GError *error = NULL;
const gchar *categories;
+ gchar **categories_list;
+ gsize categories_count;
gchar **keywords;
const gchar *file;
const gchar *name;
@@ -532,6 +534,12 @@ test_from_keyfile (void)
g_assert (file == NULL);
categories = g_desktop_app_info_get_categories (info);
g_assert_cmpstr (categories, ==, "GNOME;GTK;");
+ categories_list = g_desktop_app_info_get_string_list (info, "Categories", &categories_count);
+ g_assert_cmpint (g_strv_length (categories_list), ==, 2);
+ g_assert_cmpint (categories_count, ==, 2);
+ g_assert_cmpint (g_strv_length (categories_list), ==, 2);
+ g_assert_cmpstr (categories_list[0], ==, "GNOME");
+ g_assert_cmpstr (categories_list[1], ==, "GTK");
keywords = (gchar **)g_desktop_app_info_get_keywords (info);
g_assert_cmpint (g_strv_length (keywords), ==, 2);
g_assert_cmpstr (keywords[0], ==, "keyword1");
@@ -540,6 +548,7 @@ test_from_keyfile (void)
g_assert_cmpstr (name, ==, "generic-appinfo-test");
g_assert (!g_desktop_app_info_get_nodisplay (info));
+ g_strfreev (categories_list);
g_object_unref (info);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]