Commit dbb65b54 authored by Allison Karlitskaya's avatar Allison Karlitskaya

GVariant: add new g_variant_new_take_string() API

Lots of people have variously asked for APIs like
g_variant_new_string_printf() in order to avoid having to use
g_strdup_printf(), create a GVariant using g_variant_new_string(), then
free the temporary string.

Instead of supporting that, plus a million other potential cases,
introduce g_variant_new_take_string() as a compromise.

It's not possible to write:

 v = g_variant_new_take_string (g_strdup_printf (....));

to get the desired result and avoid the extra copies.  In addition, it
works with many other functions.

https://bugzilla.gnome.org/show_bug.cgi?id=698455
parent a2a44a96
......@@ -3108,6 +3108,7 @@ g_variant_new_uint64
g_variant_new_handle
g_variant_new_double
g_variant_new_string
g_variant_new_take_string
g_variant_new_object_path
g_variant_is_object_path
g_variant_new_signature
......
......@@ -1273,6 +1273,42 @@ g_variant_new_string (const gchar *string)
string, strlen (string) + 1);
}
/**
* g_variant_new_take_string: (skip)
* @string: a normal utf8 nul-terminated string
*
* Creates a string #GVariant with the contents of @string.
*
* @string must be valid utf8.
*
* This function consumes @string. g_free() will be called on @string
* when it is no longer required.
*
* You must not modify or access @string in any other way after passing
* it to this function. It is even possible that @string is immediately
* freed.
*
* Returns: (transfer none): a floating reference to a new string
* #GVariant instance
*
* Since: 2.38
**/
GVariant *
g_variant_new_take_string (gchar *string)
{
GVariant *value;
GBytes *bytes;
g_return_val_if_fail (string != NULL, NULL);
g_return_val_if_fail (g_utf8_validate (string, -1, NULL), NULL);
bytes = g_bytes_new_take (string, strlen (string) + 1);
value = g_variant_new_from_bytes (G_VARIANT_TYPE_STRING, bytes, TRUE);
g_bytes_unref (bytes);
return value;
}
/**
* g_variant_new_object_path:
* @object_path: a normal C nul-terminated string
......
......@@ -101,6 +101,8 @@ GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_double (gdouble value);
GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_string (const gchar *string);
GLIB_AVAILABLE_IN_2_38
GVariant * g_variant_new_take_string (gchar *string);
GLIB_AVAILABLE_IN_ALL
GVariant * g_variant_new_object_path (const gchar *object_path);
GLIB_AVAILABLE_IN_ALL
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment