diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index 40024d1b6..dae86a6c9 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -1925,6 +1925,7 @@ g_key_file_unref g_key_file_set_list_separator g_key_file_load_from_file g_key_file_load_from_data +g_key_file_load_from_bytes g_key_file_load_from_data_dirs g_key_file_load_from_dirs g_key_file_to_data diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index 4b25fd722..460d4830b 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -926,6 +926,36 @@ g_key_file_load_from_data (GKeyFile *key_file, return TRUE; } +/** + * g_key_file_load_from_bytes: + * @key_file: an empty #GKeyFile struct + * @bytes: a #GBytes + * @flags: flags from #GKeyFileFlags + * @error: return location for a #GError, or %NULL + * + * Loads a key file from the data in @bytes into an empty #GKeyFile structure. + * If the object cannot be created then %error is set to a #GKeyFileError. + * + * Returns: %TRUE if a key file could be loaded, %FALSE otherwise + * + * Since: 2.50 + **/ +gboolean +g_key_file_load_from_bytes (GKeyFile *key_file, + GBytes *bytes, + GKeyFileFlags flags, + GError **error) +{ + const guchar *data; + gsize size; + + g_return_val_if_fail (key_file != NULL, FALSE); + g_return_val_if_fail (bytes != NULL, FALSE); + + data = g_bytes_get_data (bytes, &size); + return g_key_file_load_from_data (key_file, (const gchar *) data, size, flags, error); +} + /** * g_key_file_load_from_dirs: * @key_file: an empty #GKeyFile struct diff --git a/glib/gkeyfile.h b/glib/gkeyfile.h index 0c8d3e5f8..2e1efa4f2 100644 --- a/glib/gkeyfile.h +++ b/glib/gkeyfile.h @@ -26,6 +26,7 @@ #error "Only can be included directly." #endif +#include #include G_BEGIN_DECLS @@ -76,6 +77,11 @@ gboolean g_key_file_load_from_data (GKeyFile *key_file, gsize length, GKeyFileFlags flags, GError **error); +GLIB_AVAILABLE_IN_2_50 +gboolean g_key_file_load_from_bytes (GKeyFile *key_file, + GBytes *bytes, + GKeyFileFlags flags, + GError **error); GLIB_AVAILABLE_IN_ALL gboolean g_key_file_load_from_dirs (GKeyFile *key_file, const gchar *file, diff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c index a5cc64607..5e8ee90b5 100644 --- a/glib/tests/keyfile.c +++ b/glib/tests/keyfile.c @@ -1645,6 +1645,42 @@ test_roundtrip (void) g_key_file_free (kf); } +static void +test_bytes (void) +{ + const gchar data[] = + "[Group1]\n" + "key1=value1\n" + "\n" + "[Group2]\n" + "key2=value2\n"; + + GKeyFile *kf = g_key_file_new (); + GBytes *bytes = g_bytes_new (data, strlen (data)); + GError *error = NULL; + + gchar **names; + gsize len; + + g_key_file_load_from_bytes (kf, bytes, 0, &error); + + g_assert_no_error (error); + + names = g_key_file_get_groups (kf, &len); + g_assert_nonnull (names); + + check_length ("groups", g_strv_length (names), len, 2); + check_name ("group name", names[0], "Group1", 0); + check_name ("group name", names[1], "Group2", 1); + + check_string_value (kf, "Group1", "key1", "value1"); + check_string_value (kf, "Group2", "key2", "value2"); + + g_strfreev (names); + g_bytes_unref (bytes); + g_key_file_free (kf); +} + int main (int argc, char *argv[]) { @@ -1688,6 +1724,7 @@ main (int argc, char *argv[]) g_test_add_func ("/keyfile/limbo", test_limbo); g_test_add_func ("/keyfile/utf8", test_utf8); g_test_add_func ("/keyfile/roundtrip", test_roundtrip); + g_test_add_func ("/keyfile/bytes", test_bytes); return g_test_run (); }