Blame gio/gsettings-mapping.c

Packit ae235b
/*
Packit ae235b
 * Copyright © 2010 Novell, Inc.
Packit ae235b
 *
Packit ae235b
 * This library is free software; you can redistribute it and/or
Packit ae235b
 * modify it under the terms of the GNU Lesser General Public
Packit ae235b
 * License as published by the Free Software Foundation; either
Packit ae235b
 * version 2.1 of the License, or (at your option) any later version.
Packit ae235b
 *
Packit ae235b
 * This library is distributed in the hope that it will be useful,
Packit ae235b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ae235b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ae235b
 * Lesser General Public License for more details.
Packit ae235b
 *
Packit ae235b
 * You should have received a copy of the GNU Lesser General Public
Packit ae235b
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit ae235b
 *
Packit ae235b
 * Author: Vincent Untz <vuntz@gnome.org>
Packit ae235b
 */
Packit ae235b
Packit ae235b
#include "config.h"
Packit ae235b
Packit ae235b
#include "gsettings-mapping.h"
Packit ae235b
Packit ae235b
static GVariant *
Packit ae235b
g_settings_set_mapping_int (const GValue       *value,
Packit ae235b
                            const GVariantType *expected_type)
Packit ae235b
{
Packit ae235b
  GVariant *variant = NULL;
Packit ae235b
  gint64 l;
Packit ae235b
Packit ae235b
  if (G_VALUE_HOLDS_INT (value))
Packit ae235b
    l = g_value_get_int (value);
Packit ae235b
  else if (G_VALUE_HOLDS_INT64 (value))
Packit ae235b
    l = g_value_get_int64 (value);
Packit ae235b
  else
Packit ae235b
    return NULL;
Packit ae235b
Packit ae235b
  if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
Packit ae235b
    {
Packit ae235b
      if (G_MININT16 <= l && l <= G_MAXINT16)
Packit ae235b
        variant = g_variant_new_int16 ((gint16) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT16)
Packit ae235b
        variant = g_variant_new_uint16 ((guint16) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
Packit ae235b
    {
Packit ae235b
      if (G_MININT32 <= l && l <= G_MAXINT32)
Packit ae235b
        variant = g_variant_new_int32 ((gint) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT32)
Packit ae235b
        variant = g_variant_new_uint32 ((guint) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
Packit ae235b
    {
Packit ae235b
      if (G_MININT64 <= l && l <= G_MAXINT64)
Packit ae235b
        variant = g_variant_new_int64 ((gint64) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT64)
Packit ae235b
        variant = g_variant_new_uint64 ((guint64) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT32)
Packit ae235b
        variant = g_variant_new_handle ((guint) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
Packit ae235b
    variant = g_variant_new_double ((gdouble) l);
Packit ae235b
Packit ae235b
  return variant;
Packit ae235b
}
Packit ae235b
Packit ae235b
static GVariant *
Packit ae235b
g_settings_set_mapping_float (const GValue       *value,
Packit ae235b
                              const GVariantType *expected_type)
Packit ae235b
{
Packit ae235b
  GVariant *variant = NULL;
Packit ae235b
  gdouble d;
Packit ae235b
  gint64 l;
Packit ae235b
Packit ae235b
  if (G_VALUE_HOLDS_DOUBLE (value))
Packit ae235b
    d = g_value_get_double (value);
Packit ae235b
  else
Packit ae235b
    return NULL;
Packit ae235b
Packit ae235b
  l = (gint64) d;
Packit ae235b
  if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
Packit ae235b
    {
Packit ae235b
      if (G_MININT16 <= l && l <= G_MAXINT16)
Packit ae235b
        variant = g_variant_new_int16 ((gint16) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT16)
Packit ae235b
        variant = g_variant_new_uint16 ((guint16) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
Packit ae235b
    {
Packit ae235b
      if (G_MININT32 <= l && l <= G_MAXINT32)
Packit ae235b
        variant = g_variant_new_int32 ((gint) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT32)
Packit ae235b
        variant = g_variant_new_uint32 ((guint) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
Packit ae235b
    {
Packit ae235b
      if (G_MININT64 <= l && l <= G_MAXINT64)
Packit ae235b
        variant = g_variant_new_int64 ((gint64) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT64)
Packit ae235b
        variant = g_variant_new_uint64 ((guint64) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
Packit ae235b
    {
Packit ae235b
      if (0 <= l && l <= G_MAXUINT32)
Packit ae235b
        variant = g_variant_new_handle ((guint) l);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
Packit ae235b
    variant = g_variant_new_double ((gdouble) d);
Packit ae235b
Packit ae235b
  return variant;
Packit ae235b
}
Packit ae235b
static GVariant *
Packit ae235b
g_settings_set_mapping_unsigned_int (const GValue       *value,
Packit ae235b
                                     const GVariantType *expected_type)
Packit ae235b
{
Packit ae235b
  GVariant *variant = NULL;
Packit ae235b
  guint64 u;
Packit ae235b
Packit ae235b
  if (G_VALUE_HOLDS_UINT (value))
Packit ae235b
    u = g_value_get_uint (value);
Packit ae235b
  else if (G_VALUE_HOLDS_UINT64 (value))
Packit ae235b
    u = g_value_get_uint64 (value);
Packit ae235b
  else
Packit ae235b
    return NULL;
Packit ae235b
Packit ae235b
  if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXINT16)
Packit ae235b
        variant = g_variant_new_int16 ((gint16) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXUINT16)
Packit ae235b
        variant = g_variant_new_uint16 ((guint16) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXINT32)
Packit ae235b
        variant = g_variant_new_int32 ((gint) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXUINT32)
Packit ae235b
        variant = g_variant_new_uint32 ((guint) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXINT64)
Packit ae235b
        variant = g_variant_new_int64 ((gint64) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXUINT64)
Packit ae235b
        variant = g_variant_new_uint64 ((guint64) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
Packit ae235b
    {
Packit ae235b
      if (u <= G_MAXUINT32)
Packit ae235b
        variant = g_variant_new_handle ((guint) u);
Packit ae235b
    }
Packit ae235b
  else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
Packit ae235b
    variant = g_variant_new_double ((gdouble) u);
Packit ae235b
Packit ae235b
  return variant;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
g_settings_get_mapping_int (GValue   *value,
Packit ae235b
                            GVariant *variant)
Packit ae235b
{
Packit ae235b
  const GVariantType *type;
Packit ae235b
  gint64 l;
Packit ae235b
Packit ae235b
  type = g_variant_get_type (variant);
Packit ae235b
Packit ae235b
  if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16))
Packit ae235b
    l = g_variant_get_int16 (variant);
Packit ae235b
  else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32))
Packit ae235b
    l = g_variant_get_int32 (variant);
Packit ae235b
  else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64))
Packit ae235b
    l = g_variant_get_int64 (variant);
Packit ae235b
  else
Packit ae235b
    return FALSE;
Packit ae235b
Packit ae235b
  if (G_VALUE_HOLDS_INT (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_int (value, l);
Packit ae235b
      return (G_MININT32 <= l && l <= G_MAXINT32);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_UINT (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_uint (value, l);
Packit ae235b
      return (0 <= l && l <= G_MAXUINT32);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_INT64 (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_int64 (value, l);
Packit ae235b
      return (G_MININT64 <= l && l <= G_MAXINT64);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_UINT64 (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_uint64 (value, l);
Packit ae235b
      return (0 <= l && l <= G_MAXUINT64);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_DOUBLE (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_double (value, l);
Packit ae235b
      return TRUE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
static gboolean
Packit ae235b
g_settings_get_mapping_float (GValue   *value,
Packit ae235b
                              GVariant *variant)
Packit ae235b
{
Packit ae235b
  const GVariantType *type;
Packit ae235b
  gdouble d;
Packit ae235b
  gint64 l;
Packit ae235b
Packit ae235b
  type = g_variant_get_type (variant);
Packit ae235b
Packit ae235b
  if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE))
Packit ae235b
    d = g_variant_get_double (variant);
Packit ae235b
  else
Packit ae235b
    return FALSE;
Packit ae235b
Packit ae235b
  l = (gint64)d;
Packit ae235b
  if (G_VALUE_HOLDS_INT (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_int (value, l);
Packit ae235b
      return (G_MININT32 <= l && l <= G_MAXINT32);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_UINT (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_uint (value, l);
Packit ae235b
      return (0 <= l && l <= G_MAXUINT32);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_INT64 (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_int64 (value, l);
Packit ae235b
      return (G_MININT64 <= l && l <= G_MAXINT64);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_UINT64 (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_uint64 (value, l);
Packit ae235b
      return (0 <= l && l <= G_MAXUINT64);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_DOUBLE (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_double (value, d);
Packit ae235b
      return TRUE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
static gboolean
Packit ae235b
g_settings_get_mapping_unsigned_int (GValue   *value,
Packit ae235b
                                     GVariant *variant)
Packit ae235b
{
Packit ae235b
  const GVariantType *type;
Packit ae235b
  guint64 u;
Packit ae235b
Packit ae235b
  type = g_variant_get_type (variant);
Packit ae235b
Packit ae235b
  if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16))
Packit ae235b
    u = g_variant_get_uint16 (variant);
Packit ae235b
  else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32))
Packit ae235b
    u = g_variant_get_uint32 (variant);
Packit ae235b
  else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64))
Packit ae235b
    u = g_variant_get_uint64 (variant);
Packit ae235b
  else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE))
Packit ae235b
    u = g_variant_get_handle (variant);
Packit ae235b
  else
Packit ae235b
    return FALSE;
Packit ae235b
Packit ae235b
  if (G_VALUE_HOLDS_INT (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_int (value, u);
Packit ae235b
      return (u <= G_MAXINT32);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_UINT (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_uint (value, u);
Packit ae235b
      return (u <= G_MAXUINT32);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_INT64 (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_int64 (value, u);
Packit ae235b
      return (u <= G_MAXINT64);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_UINT64 (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_uint64 (value, u);
Packit ae235b
      return (u <= G_MAXUINT64);
Packit ae235b
    }
Packit ae235b
  else if (G_VALUE_HOLDS_DOUBLE (value))
Packit ae235b
    {
Packit ae235b
      g_value_set_double (value, u);
Packit ae235b
      return TRUE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
GVariant *
Packit ae235b
g_settings_set_mapping (const GValue       *value,
Packit ae235b
                        const GVariantType *expected_type,
Packit ae235b
                        gpointer            user_data)
Packit ae235b
{
Packit ae235b
  gchar *type_string;
Packit ae235b
Packit ae235b
  if (G_VALUE_HOLDS_BOOLEAN (value))
Packit ae235b
    {
Packit ae235b
      if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BOOLEAN))
Packit ae235b
        return g_variant_new_boolean (g_value_get_boolean (value));
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_CHAR (value)  ||
Packit ae235b
           G_VALUE_HOLDS_UCHAR (value))
Packit ae235b
    {
Packit ae235b
      if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTE))
Packit ae235b
        {
Packit ae235b
          if (G_VALUE_HOLDS_CHAR (value))
Packit ae235b
            return g_variant_new_byte (g_value_get_schar (value));
Packit ae235b
          else
Packit ae235b
            return g_variant_new_byte (g_value_get_uchar (value));
Packit ae235b
        }
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_INT (value)   ||
Packit ae235b
           G_VALUE_HOLDS_INT64 (value))
Packit ae235b
    return g_settings_set_mapping_int (value, expected_type);
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_DOUBLE (value))
Packit ae235b
    return g_settings_set_mapping_float (value, expected_type);
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_UINT (value)  ||
Packit ae235b
           G_VALUE_HOLDS_UINT64 (value))
Packit ae235b
    return g_settings_set_mapping_unsigned_int (value, expected_type);
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_STRING (value))
Packit ae235b
    {
Packit ae235b
      if (g_value_get_string (value) == NULL)
Packit ae235b
        return NULL;
Packit ae235b
      else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_STRING))
Packit ae235b
        return g_variant_new_string (g_value_get_string (value));
Packit ae235b
      else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTESTRING))
Packit ae235b
        return g_variant_new_bytestring (g_value_get_string (value));
Packit ae235b
      else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_OBJECT_PATH))
Packit ae235b
        return g_variant_new_object_path (g_value_get_string (value));
Packit ae235b
      else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_SIGNATURE))
Packit ae235b
        return g_variant_new_signature (g_value_get_string (value));
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
Packit ae235b
    {
Packit ae235b
      if (g_value_get_boxed (value) == NULL)
Packit ae235b
        return NULL;
Packit ae235b
      return g_variant_new_strv ((const gchar **) g_value_get_boxed (value),
Packit ae235b
                                 -1);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_ENUM (value))
Packit ae235b
    {
Packit ae235b
      GEnumValue *enumval;
Packit ae235b
      GEnumClass *eclass;
Packit ae235b
Packit ae235b
      /* GParamSpecEnum holds a ref on the class so we just peek... */
Packit ae235b
      eclass = g_type_class_peek (G_VALUE_TYPE (value));
Packit ae235b
      enumval = g_enum_get_value (eclass, g_value_get_enum (value));
Packit ae235b
Packit ae235b
      if (enumval)
Packit ae235b
        return g_variant_new_string (enumval->value_nick);
Packit ae235b
      else
Packit ae235b
        return NULL;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (G_VALUE_HOLDS_FLAGS (value))
Packit ae235b
    {
Packit ae235b
      GVariantBuilder builder;
Packit ae235b
      GFlagsValue *flagsval;
Packit ae235b
      GFlagsClass *fclass;
Packit ae235b
      guint flags;
Packit ae235b
Packit ae235b
      fclass = g_type_class_peek (G_VALUE_TYPE (value));
Packit ae235b
      flags = g_value_get_flags (value);
Packit ae235b
Packit ae235b
      g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
Packit ae235b
      while (flags)
Packit ae235b
        {
Packit ae235b
          flagsval = g_flags_get_first_value (fclass, flags);
Packit ae235b
Packit ae235b
          if (flagsval == NULL)
Packit ae235b
            {
Packit ae235b
              g_variant_builder_clear (&builder);
Packit ae235b
              return NULL;
Packit ae235b
            }
Packit ae235b
Packit ae235b
          g_variant_builder_add (&builder, "s", flagsval->value_nick);
Packit ae235b
          flags &= ~flagsval->value;
Packit ae235b
        }
Packit ae235b
Packit ae235b
      return g_variant_builder_end (&builder);
Packit ae235b
    }
Packit ae235b
Packit ae235b
  type_string = g_variant_type_dup_string (expected_type);
Packit ae235b
  g_critical ("No GSettings bind handler for type \"%s\".", type_string);
Packit ae235b
  g_free (type_string);
Packit ae235b
Packit ae235b
  return NULL;
Packit ae235b
}
Packit ae235b
Packit ae235b
gboolean
Packit ae235b
g_settings_get_mapping (GValue   *value,
Packit ae235b
                        GVariant *variant,
Packit ae235b
                        gpointer  user_data)
Packit ae235b
{
Packit ae235b
  if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN))
Packit ae235b
    {
Packit ae235b
      if (!G_VALUE_HOLDS_BOOLEAN (value))
Packit ae235b
        return FALSE;
Packit ae235b
      g_value_set_boolean (value, g_variant_get_boolean (variant));
Packit ae235b
      return TRUE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTE))
Packit ae235b
    {
Packit ae235b
      if (G_VALUE_HOLDS_UCHAR (value))
Packit ae235b
        g_value_set_uchar (value, g_variant_get_byte (variant));
Packit ae235b
      else if (G_VALUE_HOLDS_CHAR (value))
Packit ae235b
        g_value_set_schar (value, (gint8)g_variant_get_byte (variant));
Packit ae235b
      else
Packit ae235b
        return FALSE;
Packit ae235b
      return TRUE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16)  ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32)  ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64))
Packit ae235b
    return g_settings_get_mapping_int (value, variant);
Packit ae235b
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE))
Packit ae235b
    return g_settings_get_mapping_float (value, variant);
Packit ae235b
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16) ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32) ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64) ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_HANDLE))
Packit ae235b
    return g_settings_get_mapping_unsigned_int (value, variant);
Packit ae235b
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)      ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_OBJECT_PATH) ||
Packit ae235b
           g_variant_is_of_type (variant, G_VARIANT_TYPE_SIGNATURE))
Packit ae235b
    {
Packit ae235b
      if (G_VALUE_HOLDS_STRING (value))
Packit ae235b
        {
Packit ae235b
          g_value_set_string (value, g_variant_get_string (variant, NULL));
Packit ae235b
          return TRUE;
Packit ae235b
        }
Packit ae235b
Packit ae235b
      else if (G_VALUE_HOLDS_ENUM (value))
Packit ae235b
        {
Packit ae235b
          GEnumClass *eclass;
Packit ae235b
          GEnumValue *evalue;
Packit ae235b
          const gchar *nick;
Packit ae235b
Packit ae235b
          /* GParamSpecEnum holds a ref on the class so we just peek... */
Packit ae235b
          eclass = g_type_class_peek (G_VALUE_TYPE (value));
Packit ae235b
          nick = g_variant_get_string (variant, NULL);
Packit ae235b
          evalue = g_enum_get_value_by_nick (eclass, nick);
Packit ae235b
Packit ae235b
          if (evalue)
Packit ae235b
            {
Packit ae235b
             g_value_set_enum (value, evalue->value);
Packit ae235b
             return TRUE;
Packit ae235b
            }
Packit ae235b
Packit ae235b
          g_warning ("Unable to lookup enum nick '%s' via GType\n", nick);
Packit ae235b
          return FALSE;
Packit ae235b
        }
Packit ae235b
    }
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("as")))
Packit ae235b
    {
Packit ae235b
      if (G_VALUE_HOLDS (value, G_TYPE_STRV))
Packit ae235b
        {
Packit ae235b
          g_value_take_boxed (value, g_variant_dup_strv (variant, NULL));
Packit ae235b
          return TRUE;
Packit ae235b
        }
Packit ae235b
Packit ae235b
      else if (G_VALUE_HOLDS_FLAGS (value))
Packit ae235b
        {
Packit ae235b
          GFlagsClass *fclass;
Packit ae235b
          GFlagsValue *fvalue;
Packit ae235b
          const gchar *nick;
Packit ae235b
          GVariantIter iter;
Packit ae235b
          guint flags = 0;
Packit ae235b
Packit ae235b
          fclass = g_type_class_peek (G_VALUE_TYPE (value));
Packit ae235b
Packit ae235b
          g_variant_iter_init (&iter, variant);
Packit ae235b
          while (g_variant_iter_next (&iter, "&s", &nick))
Packit ae235b
            {
Packit ae235b
              fvalue = g_flags_get_value_by_nick (fclass, nick);
Packit ae235b
Packit ae235b
              if (fvalue)
Packit ae235b
                flags |= fvalue->value;
Packit ae235b
Packit ae235b
              else
Packit ae235b
                {
Packit ae235b
                  g_warning ("Unable to lookup flags nick '%s' via GType\n",
Packit ae235b
                             nick);
Packit ae235b
                  return FALSE;
Packit ae235b
                }
Packit ae235b
            }
Packit ae235b
Packit ae235b
          g_value_set_flags (value, flags);
Packit ae235b
          return TRUE;
Packit ae235b
        }
Packit ae235b
    }
Packit ae235b
  else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTESTRING))
Packit ae235b
    {
Packit ae235b
      g_value_set_string (value, g_variant_get_bytestring (variant));
Packit ae235b
      return TRUE;
Packit ae235b
    }
Packit ae235b
Packit ae235b
  g_critical ("No GSettings bind handler for type \"%s\".",
Packit ae235b
              g_variant_get_type_string (variant));
Packit ae235b
Packit ae235b
  return FALSE;
Packit ae235b
}
Packit ae235b
Packit ae235b
gboolean
Packit ae235b
g_settings_mapping_is_compatible (GType               gvalue_type,
Packit ae235b
                                  const GVariantType *variant_type)
Packit ae235b
{
Packit ae235b
  gboolean ok = FALSE;
Packit ae235b
Packit ae235b
  if (gvalue_type == G_TYPE_BOOLEAN)
Packit ae235b
    ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BOOLEAN);
Packit ae235b
  else if (gvalue_type == G_TYPE_CHAR  ||
Packit ae235b
           gvalue_type == G_TYPE_UCHAR)
Packit ae235b
    ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BYTE);
Packit ae235b
  else if (gvalue_type == G_TYPE_INT    ||
Packit ae235b
           gvalue_type == G_TYPE_UINT   ||
Packit ae235b
           gvalue_type == G_TYPE_INT64  ||
Packit ae235b
           gvalue_type == G_TYPE_UINT64 ||
Packit ae235b
           gvalue_type == G_TYPE_DOUBLE)
Packit ae235b
    ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT16)  ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT16) ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT32)  ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT32) ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT64)  ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT64) ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_HANDLE) ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_DOUBLE));
Packit ae235b
  else if (gvalue_type == G_TYPE_STRING)
Packit ae235b
    ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING)      ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE ("ay")) ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_OBJECT_PATH) ||
Packit ae235b
          g_variant_type_equal (variant_type, G_VARIANT_TYPE_SIGNATURE));
Packit ae235b
  else if (gvalue_type == G_TYPE_STRV)
Packit ae235b
    ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
Packit ae235b
  else if (G_TYPE_IS_ENUM (gvalue_type))
Packit ae235b
    ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING);
Packit ae235b
  else if (G_TYPE_IS_FLAGS (gvalue_type))
Packit ae235b
    ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
Packit ae235b
Packit ae235b
  return ok;
Packit ae235b
}