From 05134b2dc9d5ae54916997da625563ce3c324917 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 17 Sep 2014 19:54:31 +0100 Subject: [PATCH 4/5] tp_variant_convert: support converting to/from (u)int16 Now that we're using native GVariant instead of GValue, (u)int16 can happen. --- telepathy-glib/variant-util.c | 154 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) diff --git a/telepathy-glib/variant-util.c b/telepathy-glib/variant-util.c index b17766e..a4932d1 100644 --- a/telepathy-glib/variant-util.c +++ b/telepathy-glib/variant-util.c @@ -104,6 +104,12 @@ _tp_variant_convert_double (GVariant *variant, case G_VARIANT_CLASS_BYTE: return g_variant_get_byte (variant); + case G_VARIANT_CLASS_UINT16: + return g_variant_get_uint16 (variant); + + case G_VARIANT_CLASS_INT16: + return g_variant_get_int16 (variant); + case G_VARIANT_CLASS_UINT32: return g_variant_get_uint32 (variant); @@ -124,6 +130,61 @@ _tp_variant_convert_double (GVariant *variant, return 0.0; } +static gint16 +_tp_variant_convert_int16 (GVariant *variant, + gboolean *valid) +{ + gint64 i; + guint64 u; + + *valid = TRUE; + + switch (g_variant_classify (variant)) + { + case G_VARIANT_CLASS_BYTE: + return g_variant_get_byte (variant); + + case G_VARIANT_CLASS_UINT16: + u = g_variant_get_uint16 (variant); + if (G_LIKELY (u <= G_MAXINT16)) + return u; + break; + + case G_VARIANT_CLASS_INT16: + return g_variant_get_int16 (variant); + + case G_VARIANT_CLASS_UINT32: + u = g_variant_get_uint32 (variant); + if (G_LIKELY (u <= G_MAXINT32)) + return u; + break; + + case G_VARIANT_CLASS_INT32: + i = g_variant_get_int32 (variant); + if (G_LIKELY (i >= G_MININT32 && i <= G_MAXINT32)) + return i; + break; + + case G_VARIANT_CLASS_INT64: + i = g_variant_get_int64 (variant); + if (G_LIKELY (i >= G_MININT32 && i <= G_MAXINT32)) + return i; + break; + + case G_VARIANT_CLASS_UINT64: + u = g_variant_get_uint64 (variant); + if (G_LIKELY (u <= G_MAXINT32)) + return u; + break; + + default: + break; + } + + *valid = FALSE; + return 0; +} + static gint32 _tp_variant_convert_int32 (GVariant *variant, gboolean *valid) @@ -138,6 +199,12 @@ _tp_variant_convert_int32 (GVariant *variant, case G_VARIANT_CLASS_BYTE: return g_variant_get_byte (variant); + case G_VARIANT_CLASS_UINT16: + return g_variant_get_uint16 (variant); + + case G_VARIANT_CLASS_INT16: + return g_variant_get_int16 (variant); + case G_VARIANT_CLASS_UINT32: u = g_variant_get_uint32 (variant); if (G_LIKELY (u <= G_MAXINT32)) @@ -180,6 +247,12 @@ _tp_variant_convert_int64 (GVariant *variant, case G_VARIANT_CLASS_BYTE: return g_variant_get_byte (variant); + case G_VARIANT_CLASS_INT16: + return g_variant_get_int16 (variant); + + case G_VARIANT_CLASS_UINT16: + return g_variant_get_uint16 (variant); + case G_VARIANT_CLASS_UINT32: return g_variant_get_uint32 (variant); @@ -203,6 +276,61 @@ _tp_variant_convert_int64 (GVariant *variant, return 0; } +static guint16 +_tp_variant_convert_uint16 (GVariant *variant, + gboolean *valid) +{ + gint64 i; + guint64 u; + + *valid = TRUE; + + switch (g_variant_classify (variant)) + { + case G_VARIANT_CLASS_BYTE: + return g_variant_get_byte (variant); + + case G_VARIANT_CLASS_UINT16: + return g_variant_get_uint16 (variant); + + case G_VARIANT_CLASS_INT16: + i = g_variant_get_int16 (variant); + if (G_LIKELY (i >= 0)) + return i; + break; + + case G_VARIANT_CLASS_UINT32: + u = g_variant_get_uint32 (variant); + if (G_LIKELY (u <= G_MAXUINT16)) + return u; + break; + + case G_VARIANT_CLASS_INT32: + i = g_variant_get_int32 (variant); + if (G_LIKELY (i >= 0)) + return i; + break; + + case G_VARIANT_CLASS_INT64: + i = g_variant_get_int64 (variant); + if (G_LIKELY (i >= 0 && i <= G_MAXUINT16)) + return i; + break; + + case G_VARIANT_CLASS_UINT64: + u = g_variant_get_uint64 (variant); + if (G_LIKELY (u <= G_MAXUINT16)) + return u; + break; + + default: + break; + } + + *valid = FALSE; + return 0; +} + static guint32 _tp_variant_convert_uint32 (GVariant *variant, gboolean *valid) @@ -217,6 +345,15 @@ _tp_variant_convert_uint32 (GVariant *variant, case G_VARIANT_CLASS_BYTE: return g_variant_get_byte (variant); + case G_VARIANT_CLASS_UINT16: + return g_variant_get_uint16 (variant); + + case G_VARIANT_CLASS_INT16: + i = g_variant_get_int16 (variant); + if (G_LIKELY (i >= 0)) + return i; + break; + case G_VARIANT_CLASS_UINT32: return g_variant_get_uint32 (variant); @@ -259,6 +396,15 @@ _tp_variant_convert_uint64 (GVariant *variant, case G_VARIANT_CLASS_BYTE: return g_variant_get_byte (variant); + case G_VARIANT_CLASS_UINT16: + return g_variant_get_uint16 (variant); + + case G_VARIANT_CLASS_INT16: + tmp = g_variant_get_int16 (variant); + if (G_LIKELY (tmp >= 0)) + return tmp; + break; + case G_VARIANT_CLASS_UINT32: return g_variant_get_uint32 (variant); @@ -324,6 +470,10 @@ tp_variant_convert (GVariant *variant, CASE (double); break; + case G_VARIANT_CLASS_INT16: + CASE (int16); + break; + case G_VARIANT_CLASS_INT32: CASE (int32); break; @@ -332,6 +482,10 @@ tp_variant_convert (GVariant *variant, CASE (int64); break; + case G_VARIANT_CLASS_UINT16: + CASE (uint16); + break; + case G_VARIANT_CLASS_UINT32: CASE (uint32); break; -- 2.1.0