IDX_DATA
};
-
+/* Returns a GVariant containing the data contained
+ in IN and WIDTH. The returned GVariant has a floating
+ reference.
+ */
GVariant *
value_variant_new (const union value *in, int width)
{
if (width == 0)
vv[IDX_DATA] = g_variant_new_double (in->f);
- else if (width <= MAX_SHORT_STRING)
- {
- char xx[MAX_SHORT_STRING + 1];
- memset (xx, '\0', MAX_SHORT_STRING + 1);
- memcpy (xx, in->short_string, width);
- vv[IDX_DATA] = g_variant_new_bytestring (xx);
- }
else
{
gchar *q = xmalloc (width + 1);
- memcpy (q, in->long_string, width);
+ memcpy (q, in->s, width);
q[width] = '\0';
vv[IDX_DATA] = g_variant_new_from_data (G_VARIANT_TYPE_BYTESTRING, q,
width + 1, FALSE, NULL, NULL);
}
-
+
return g_variant_new_tuple (vv, 2);
}
+/* Destroy the contents of VAL. Also unref V */
void
value_destroy_from_variant (union value *val, GVariant *v)
{
GVariant *vwidth = g_variant_get_child_value (v, IDX_WIDTH);
- gint32 width = g_variant_get_int32 (vwidth);
+ gint32 width = g_variant_get_int32 (vwidth); /* v is unreffed here */
g_variant_unref (vwidth);
value_destroy (val, width);
}
+/* Fills VAL with the value data held in V.
+ When VAL is no longer required it must be destroyed using
+ value_destroy_from_variant. */
void
value_variant_get (union value *val, GVariant *v)
{
else
{
const gchar *data = g_variant_get_bytestring (vdata);
- if (width <= MAX_SHORT_STRING)
- memcpy (val->short_string, data, MAX_SHORT_STRING);
- else
- {
- val->long_string = xmemdup (data, width);
- }
+ size_t len = strlen (data);
+ val->s = xmemdup (data, MIN (width, len));
}
g_variant_unref (vdata);