LCOV - code coverage report
Current view: top level - gio - gsettings-mapping.c (source / functions) Coverage Total Hit
Test: unnamed Lines: 69.8 % 308 215
Test Date: 2024-11-26 05:23:01 Functions: 100.0 % 9 9
Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /*
       2                 :             :  * Copyright © 2010 Novell, Inc.
       3                 :             :  *
       4                 :             :  * SPDX-License-Identifier: LGPL-2.1-or-later
       5                 :             :  *
       6                 :             :  * This library is free software; you can redistribute it and/or
       7                 :             :  * modify it under the terms of the GNU Lesser General Public
       8                 :             :  * License as published by the Free Software Foundation; either
       9                 :             :  * version 2.1 of the License, or (at your option) any later version.
      10                 :             :  *
      11                 :             :  * This library is distributed in the hope that it will be useful,
      12                 :             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 :             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14                 :             :  * Lesser General Public License for more details.
      15                 :             :  *
      16                 :             :  * You should have received a copy of the GNU Lesser General Public
      17                 :             :  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
      18                 :             :  *
      19                 :             :  * Author: Vincent Untz <vuntz@gnome.org>
      20                 :             :  */
      21                 :             : 
      22                 :             : #include "config.h"
      23                 :             : 
      24                 :             : #include "gsettings-mapping.h"
      25                 :             : 
      26                 :             : static GVariant *
      27                 :           6 : g_settings_set_mapping_int (const GValue       *value,
      28                 :             :                             const GVariantType *expected_type)
      29                 :             : {
      30                 :           6 :   GVariant *variant = NULL;
      31                 :             :   gint64 l;
      32                 :             : 
      33                 :           6 :   if (G_VALUE_HOLDS_INT (value))
      34                 :           5 :     l = g_value_get_int (value);
      35                 :           1 :   else if (G_VALUE_HOLDS_INT64 (value))
      36                 :           1 :     l = g_value_get_int64 (value);
      37                 :             :   else
      38                 :           0 :     return NULL;
      39                 :             : 
      40                 :           6 :   if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
      41                 :             :     {
      42                 :           1 :       if (G_MININT16 <= l && l <= G_MAXINT16)
      43                 :           1 :         variant = g_variant_new_int16 ((gint16) l);
      44                 :             :     }
      45                 :           5 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
      46                 :             :     {
      47                 :           0 :       if (0 <= l && l <= G_MAXUINT16)
      48                 :           0 :         variant = g_variant_new_uint16 ((guint16) l);
      49                 :             :     }
      50                 :           5 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
      51                 :             :     {
      52                 :           4 :       if (G_MININT32 <= l && l <= G_MAXINT32)
      53                 :           4 :         variant = g_variant_new_int32 ((gint) l);
      54                 :             :     }
      55                 :           1 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
      56                 :             :     {
      57                 :           0 :       if (0 <= l && l <= G_MAXUINT32)
      58                 :           0 :         variant = g_variant_new_uint32 ((guint) l);
      59                 :             :     }
      60                 :           1 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
      61                 :             :     {
      62                 :             :       if (G_MININT64 <= l && l <= G_MAXINT64)
      63                 :           1 :         variant = g_variant_new_int64 ((gint64) l);
      64                 :             :     }
      65                 :           0 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
      66                 :             :     {
      67                 :           0 :       if (0 <= l && (guint64) l <= G_MAXUINT64)
      68                 :           0 :         variant = g_variant_new_uint64 ((guint64) l);
      69                 :             :     }
      70                 :           0 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
      71                 :             :     {
      72                 :           0 :       if (0 <= l && l <= G_MAXUINT32)
      73                 :           0 :         variant = g_variant_new_handle ((guint) l);
      74                 :             :     }
      75                 :           0 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
      76                 :           0 :     variant = g_variant_new_double ((gdouble) l);
      77                 :             : 
      78                 :           6 :   return variant;
      79                 :             : }
      80                 :             : 
      81                 :             : static GVariant *
      82                 :           2 : g_settings_set_mapping_float (const GValue       *value,
      83                 :             :                               const GVariantType *expected_type)
      84                 :             : {
      85                 :           2 :   GVariant *variant = NULL;
      86                 :             :   gdouble d;
      87                 :             :   gint64 l;
      88                 :             : 
      89                 :           2 :   if (G_VALUE_HOLDS_DOUBLE (value))
      90                 :           2 :     d = g_value_get_double (value);
      91                 :             :   else
      92                 :           0 :     return NULL;
      93                 :             : 
      94                 :           2 :   l = (gint64) d;
      95                 :           2 :   if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
      96                 :             :     {
      97                 :           0 :       if (G_MININT16 <= l && l <= G_MAXINT16)
      98                 :           0 :         variant = g_variant_new_int16 ((gint16) l);
      99                 :             :     }
     100                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
     101                 :             :     {
     102                 :           0 :       if (0 <= l && l <= G_MAXUINT16)
     103                 :           0 :         variant = g_variant_new_uint16 ((guint16) l);
     104                 :             :     }
     105                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
     106                 :             :     {
     107                 :           0 :       if (G_MININT32 <= l && l <= G_MAXINT32)
     108                 :           0 :         variant = g_variant_new_int32 ((gint) l);
     109                 :             :     }
     110                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
     111                 :             :     {
     112                 :           0 :       if (0 <= l && l <= G_MAXUINT32)
     113                 :           0 :         variant = g_variant_new_uint32 ((guint) l);
     114                 :             :     }
     115                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
     116                 :             :     {
     117                 :             :       if (G_MININT64 <= l && l <= G_MAXINT64)
     118                 :           0 :         variant = g_variant_new_int64 ((gint64) l);
     119                 :             :     }
     120                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
     121                 :             :     {
     122                 :           0 :       if (0 <= l && (guint64) l <= G_MAXUINT64)
     123                 :           0 :         variant = g_variant_new_uint64 ((guint64) l);
     124                 :             :     }
     125                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
     126                 :             :     {
     127                 :           0 :       if (0 <= l && l <= G_MAXUINT32)
     128                 :           0 :         variant = g_variant_new_handle ((guint) l);
     129                 :             :     }
     130                 :           2 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
     131                 :           2 :     variant = g_variant_new_double ((gdouble) d);
     132                 :             : 
     133                 :           2 :   return variant;
     134                 :             : }
     135                 :             : static GVariant *
     136                 :          18 : g_settings_set_mapping_unsigned_int (const GValue       *value,
     137                 :             :                                      const GVariantType *expected_type)
     138                 :             : {
     139                 :          18 :   GVariant *variant = NULL;
     140                 :             :   guint64 u;
     141                 :             : 
     142                 :          18 :   if (G_VALUE_HOLDS_UINT (value))
     143                 :          15 :     u = g_value_get_uint (value);
     144                 :           3 :   else if (G_VALUE_HOLDS_UINT64 (value))
     145                 :           3 :     u = g_value_get_uint64 (value);
     146                 :             :   else
     147                 :           0 :     return NULL;
     148                 :             : 
     149                 :          18 :   if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
     150                 :             :     {
     151                 :           0 :       if (u <= G_MAXINT16)
     152                 :           0 :         variant = g_variant_new_int16 ((gint16) u);
     153                 :             :     }
     154                 :          18 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
     155                 :             :     {
     156                 :           1 :       if (u <= G_MAXUINT16)
     157                 :           1 :         variant = g_variant_new_uint16 ((guint16) u);
     158                 :             :     }
     159                 :          17 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
     160                 :             :     {
     161                 :           0 :       if (u <= G_MAXINT32)
     162                 :           0 :         variant = g_variant_new_int32 ((gint) u);
     163                 :             :     }
     164                 :          17 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
     165                 :             :     {
     166                 :          14 :       if (u <= G_MAXUINT32)
     167                 :          14 :         variant = g_variant_new_uint32 ((guint) u);
     168                 :             :     }
     169                 :           3 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
     170                 :             :     {
     171                 :           0 :       if (u <= G_MAXINT64)
     172                 :           0 :         variant = g_variant_new_int64 ((gint64) u);
     173                 :             :     }
     174                 :           3 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
     175                 :             :     {
     176                 :             :       if (u <= G_MAXUINT64)
     177                 :           3 :         variant = g_variant_new_uint64 ((guint64) u);
     178                 :             :     }
     179                 :           0 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
     180                 :             :     {
     181                 :           0 :       if (u <= G_MAXUINT32)
     182                 :           0 :         variant = g_variant_new_handle ((guint) u);
     183                 :             :     }
     184                 :           0 :   else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
     185                 :           0 :     variant = g_variant_new_double ((gdouble) u);
     186                 :             : 
     187                 :          18 :   return variant;
     188                 :             : }
     189                 :             : 
     190                 :             : static gboolean
     191                 :           7 : g_settings_get_mapping_int (GValue   *value,
     192                 :             :                             GVariant *variant)
     193                 :             : {
     194                 :             :   const GVariantType *type;
     195                 :             :   gint64 l;
     196                 :             : 
     197                 :           7 :   type = g_variant_get_type (variant);
     198                 :             : 
     199                 :           7 :   if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16))
     200                 :           2 :     l = g_variant_get_int16 (variant);
     201                 :           5 :   else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32))
     202                 :           3 :     l = g_variant_get_int32 (variant);
     203                 :           2 :   else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64))
     204                 :           2 :     l = g_variant_get_int64 (variant);
     205                 :           0 :   else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE))
     206                 :           0 :     l = g_variant_get_handle (variant);
     207                 :             :   else
     208                 :           0 :     return FALSE;
     209                 :             : 
     210                 :           7 :   if (G_VALUE_HOLDS_INT (value))
     211                 :             :     {
     212                 :           5 :       g_value_set_int (value, l);
     213                 :           5 :       return (G_MININT32 <= l && l <= G_MAXINT32);
     214                 :             :     }
     215                 :           2 :   else if (G_VALUE_HOLDS_UINT (value))
     216                 :             :     {
     217                 :           0 :       g_value_set_uint (value, l);
     218                 :           0 :       return (0 <= l && l <= G_MAXUINT32);
     219                 :             :     }
     220                 :           2 :   else if (G_VALUE_HOLDS_INT64 (value))
     221                 :             :     {
     222                 :           2 :       g_value_set_int64 (value, l);
     223                 :           2 :       return (G_MININT64 <= l && l <= G_MAXINT64);
     224                 :             :     }
     225                 :           0 :   else if (G_VALUE_HOLDS_UINT64 (value))
     226                 :             :     {
     227                 :           0 :       g_value_set_uint64 (value, l);
     228                 :           0 :       return (0 <= l && (guint64) l <= G_MAXUINT64);
     229                 :             :     }
     230                 :           0 :   else if (G_VALUE_HOLDS_DOUBLE (value))
     231                 :             :     {
     232                 :           0 :       g_value_set_double (value, l);
     233                 :           0 :       return TRUE;
     234                 :             :     }
     235                 :             : 
     236                 :           0 :   return FALSE;
     237                 :             : }
     238                 :             : 
     239                 :             : static gboolean
     240                 :           3 : g_settings_get_mapping_float (GValue   *value,
     241                 :             :                               GVariant *variant)
     242                 :             : {
     243                 :             :   const GVariantType *type;
     244                 :             :   gdouble d;
     245                 :             :   gint64 l;
     246                 :             : 
     247                 :           3 :   type = g_variant_get_type (variant);
     248                 :             : 
     249                 :           3 :   if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE))
     250                 :           3 :     d = g_variant_get_double (variant);
     251                 :             :   else
     252                 :           0 :     return FALSE;
     253                 :             : 
     254                 :           3 :   l = (gint64)d;
     255                 :           3 :   if (G_VALUE_HOLDS_INT (value))
     256                 :             :     {
     257                 :           0 :       g_value_set_int (value, l);
     258                 :           0 :       return (G_MININT32 <= l && l <= G_MAXINT32);
     259                 :             :     }
     260                 :           3 :   else if (G_VALUE_HOLDS_UINT (value))
     261                 :             :     {
     262                 :           0 :       g_value_set_uint (value, l);
     263                 :           0 :       return (0 <= l && l <= G_MAXUINT32);
     264                 :             :     }
     265                 :           3 :   else if (G_VALUE_HOLDS_INT64 (value))
     266                 :             :     {
     267                 :           0 :       g_value_set_int64 (value, l);
     268                 :           0 :       return (G_MININT64 <= l && l <= G_MAXINT64);
     269                 :             :     }
     270                 :           3 :   else if (G_VALUE_HOLDS_UINT64 (value))
     271                 :             :     {
     272                 :           0 :       g_value_set_uint64 (value, l);
     273                 :           0 :       return (0 <= l && (guint64) l <= G_MAXUINT64);
     274                 :             :     }
     275                 :           3 :   else if (G_VALUE_HOLDS_DOUBLE (value))
     276                 :             :     {
     277                 :           3 :       g_value_set_double (value, d);
     278                 :           3 :       return TRUE;
     279                 :             :     }
     280                 :             : 
     281                 :           0 :   return FALSE;
     282                 :             : }
     283                 :             : static gboolean
     284                 :          13 : g_settings_get_mapping_unsigned_int (GValue   *value,
     285                 :             :                                      GVariant *variant)
     286                 :             : {
     287                 :             :   const GVariantType *type;
     288                 :             :   guint64 u;
     289                 :             : 
     290                 :          13 :   type = g_variant_get_type (variant);
     291                 :             : 
     292                 :          13 :   if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16))
     293                 :           2 :     u = g_variant_get_uint16 (variant);
     294                 :          11 :   else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32))
     295                 :           7 :     u = g_variant_get_uint32 (variant);
     296                 :           4 :   else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64))
     297                 :           4 :     u = g_variant_get_uint64 (variant);
     298                 :             :   else
     299                 :           0 :     return FALSE;
     300                 :             : 
     301                 :          13 :   if (G_VALUE_HOLDS_INT (value))
     302                 :             :     {
     303                 :           0 :       g_value_set_int (value, u);
     304                 :           0 :       return (u <= G_MAXINT32);
     305                 :             :     }
     306                 :          13 :   else if (G_VALUE_HOLDS_UINT (value))
     307                 :             :     {
     308                 :           9 :       g_value_set_uint (value, u);
     309                 :           9 :       return (u <= G_MAXUINT32);
     310                 :             :     }
     311                 :           4 :   else if (G_VALUE_HOLDS_INT64 (value))
     312                 :             :     {
     313                 :           0 :       g_value_set_int64 (value, u);
     314                 :           0 :       return (u <= G_MAXINT64);
     315                 :             :     }
     316                 :           4 :   else if (G_VALUE_HOLDS_UINT64 (value))
     317                 :             :     {
     318                 :           4 :       g_value_set_uint64 (value, u);
     319                 :           4 :       return (u <= G_MAXUINT64);
     320                 :             :     }
     321                 :           0 :   else if (G_VALUE_HOLDS_DOUBLE (value))
     322                 :             :     {
     323                 :           0 :       g_value_set_double (value, u);
     324                 :           0 :       return TRUE;
     325                 :             :     }
     326                 :             : 
     327                 :           0 :   return FALSE;
     328                 :             : }
     329                 :             : 
     330                 :             : GVariant *
     331                 :          68 : g_settings_set_mapping (const GValue       *value,
     332                 :             :                         const GVariantType *expected_type,
     333                 :             :                         gpointer            user_data)
     334                 :             : {
     335                 :             :   gchar *type_string;
     336                 :             : 
     337                 :          68 :   if (G_VALUE_HOLDS_BOOLEAN (value))
     338                 :             :     {
     339                 :          20 :       if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BOOLEAN))
     340                 :          20 :         return g_variant_new_boolean (g_value_get_boolean (value));
     341                 :             :     }
     342                 :             : 
     343                 :          48 :   else if (G_VALUE_HOLDS_CHAR (value)  ||
     344                 :          47 :            G_VALUE_HOLDS_UCHAR (value))
     345                 :             :     {
     346                 :           1 :       if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTE))
     347                 :             :         {
     348                 :           1 :           if (G_VALUE_HOLDS_CHAR (value))
     349                 :           1 :             return g_variant_new_byte (g_value_get_schar (value));
     350                 :             :           else
     351                 :           0 :             return g_variant_new_byte (g_value_get_uchar (value));
     352                 :             :         }
     353                 :             :     }
     354                 :             : 
     355                 :          47 :   else if (G_VALUE_HOLDS_INT (value)   ||
     356                 :          42 :            G_VALUE_HOLDS_INT64 (value))
     357                 :           6 :     return g_settings_set_mapping_int (value, expected_type);
     358                 :             : 
     359                 :          41 :   else if (G_VALUE_HOLDS_DOUBLE (value))
     360                 :           2 :     return g_settings_set_mapping_float (value, expected_type);
     361                 :             : 
     362                 :          39 :   else if (G_VALUE_HOLDS_UINT (value)  ||
     363                 :          24 :            G_VALUE_HOLDS_UINT64 (value))
     364                 :          18 :     return g_settings_set_mapping_unsigned_int (value, expected_type);
     365                 :             : 
     366                 :          21 :   else if (G_VALUE_HOLDS_STRING (value))
     367                 :             :     {
     368                 :          11 :       if (g_value_get_string (value) == NULL)
     369                 :           1 :         return NULL;
     370                 :          10 :       else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_STRING))
     371                 :           9 :         return g_variant_new_string (g_value_get_string (value));
     372                 :           1 :       else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTESTRING))
     373                 :           1 :         return g_variant_new_bytestring (g_value_get_string (value));
     374                 :           0 :       else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_OBJECT_PATH))
     375                 :           0 :         return g_variant_new_object_path (g_value_get_string (value));
     376                 :           0 :       else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_SIGNATURE))
     377                 :           0 :         return g_variant_new_signature (g_value_get_string (value));
     378                 :             :     }
     379                 :             : 
     380                 :          10 :   else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
     381                 :             :     {
     382                 :           1 :       if (g_value_get_boxed (value) == NULL)
     383                 :           0 :         return NULL;
     384                 :           1 :       return g_variant_new_strv ((const gchar **) g_value_get_boxed (value),
     385                 :             :                                  -1);
     386                 :             :     }
     387                 :             : 
     388                 :           9 :   else if (G_VALUE_HOLDS_ENUM (value))
     389                 :             :     {
     390                 :             :       GEnumValue *enumval;
     391                 :             :       GEnumClass *eclass;
     392                 :             : 
     393                 :             :       /* GParamSpecEnum holds a ref on the class so we just peek... */
     394                 :           8 :       eclass = g_type_class_peek (G_VALUE_TYPE (value));
     395                 :           8 :       enumval = g_enum_get_value (eclass, g_value_get_enum (value));
     396                 :             : 
     397                 :           8 :       if (enumval)
     398                 :           8 :         return g_variant_new_string (enumval->value_nick);
     399                 :             :       else
     400                 :           0 :         return NULL;
     401                 :             :     }
     402                 :             : 
     403                 :           1 :   else if (G_VALUE_HOLDS_FLAGS (value))
     404                 :             :     {
     405                 :             :       GVariantBuilder builder;
     406                 :             :       GFlagsValue *flagsval;
     407                 :             :       GFlagsClass *fclass;
     408                 :             :       guint flags;
     409                 :             : 
     410                 :           1 :       fclass = g_type_class_peek (G_VALUE_TYPE (value));
     411                 :           1 :       flags = g_value_get_flags (value);
     412                 :             : 
     413                 :           1 :       g_variant_builder_init_static (&builder, G_VARIANT_TYPE ("as"));
     414                 :           2 :       while (flags)
     415                 :             :         {
     416                 :           1 :           flagsval = g_flags_get_first_value (fclass, flags);
     417                 :             : 
     418                 :           1 :           if (flagsval == NULL)
     419                 :             :             {
     420                 :           0 :               g_variant_builder_clear (&builder);
     421                 :           0 :               return NULL;
     422                 :             :             }
     423                 :             : 
     424                 :           1 :           g_variant_builder_add (&builder, "s", flagsval->value_nick);
     425                 :           1 :           flags &= ~flagsval->value;
     426                 :             :         }
     427                 :             : 
     428                 :           1 :       return g_variant_builder_end (&builder);
     429                 :             :     }
     430                 :             : 
     431                 :           0 :   type_string = g_variant_type_dup_string (expected_type);
     432                 :           0 :   g_critical ("No GSettings bind handler for type \"%s\".", type_string);
     433                 :           0 :   g_free (type_string);
     434                 :             : 
     435                 :           0 :   return NULL;
     436                 :             : }
     437                 :             : 
     438                 :             : gboolean
     439                 :          50 : g_settings_get_mapping (GValue   *value,
     440                 :             :                         GVariant *variant,
     441                 :             :                         gpointer  user_data)
     442                 :             : {
     443                 :          50 :   if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN))
     444                 :             :     {
     445                 :           7 :       if (!G_VALUE_HOLDS_BOOLEAN (value))
     446                 :           0 :         return FALSE;
     447                 :           7 :       g_value_set_boolean (value, g_variant_get_boolean (variant));
     448                 :           7 :       return TRUE;
     449                 :             :     }
     450                 :             : 
     451                 :          43 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTE))
     452                 :             :     {
     453                 :           2 :       if (G_VALUE_HOLDS_UCHAR (value))
     454                 :           0 :         g_value_set_uchar (value, g_variant_get_byte (variant));
     455                 :           2 :       else if (G_VALUE_HOLDS_CHAR (value))
     456                 :           2 :         g_value_set_schar (value, (gint8)g_variant_get_byte (variant));
     457                 :             :       else
     458                 :           0 :         return FALSE;
     459                 :           2 :       return TRUE;
     460                 :             :     }
     461                 :             : 
     462                 :          80 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16)  ||
     463                 :          75 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32)  ||
     464                 :          70 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64)  ||
     465                 :          34 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_HANDLE))
     466                 :           7 :     return g_settings_get_mapping_int (value, variant);
     467                 :             : 
     468                 :          34 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE))
     469                 :           3 :     return g_settings_get_mapping_float (value, variant);
     470                 :             : 
     471                 :          60 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16) ||
     472                 :          51 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32) ||
     473                 :          22 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64))
     474                 :          13 :     return g_settings_get_mapping_unsigned_int (value, variant);
     475                 :             : 
     476                 :          24 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING)      ||
     477                 :          12 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_OBJECT_PATH) ||
     478                 :           6 :            g_variant_is_of_type (variant, G_VARIANT_TYPE_SIGNATURE))
     479                 :             :     {
     480                 :          12 :       if (G_VALUE_HOLDS_STRING (value))
     481                 :             :         {
     482                 :           7 :           g_value_set_string (value, g_variant_get_string (variant, NULL));
     483                 :           7 :           return TRUE;
     484                 :             :         }
     485                 :             : 
     486                 :           5 :       else if (G_VALUE_HOLDS_ENUM (value))
     487                 :             :         {
     488                 :             :           GEnumClass *eclass;
     489                 :             :           GEnumValue *evalue;
     490                 :             :           const gchar *nick;
     491                 :             : 
     492                 :             :           /* GParamSpecEnum holds a ref on the class so we just peek... */
     493                 :           5 :           eclass = g_type_class_peek (G_VALUE_TYPE (value));
     494                 :           5 :           nick = g_variant_get_string (variant, NULL);
     495                 :           5 :           evalue = g_enum_get_value_by_nick (eclass, nick);
     496                 :             : 
     497                 :           5 :           if (evalue)
     498                 :             :             {
     499                 :           5 :              g_value_set_enum (value, evalue->value);
     500                 :           5 :              return TRUE;
     501                 :             :             }
     502                 :             : 
     503                 :           0 :           g_warning ("Unable to look up enum nick ‘%s’ via GType", nick);
     504                 :           0 :           return FALSE;
     505                 :             :         }
     506                 :             :     }
     507                 :           6 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("as")))
     508                 :             :     {
     509                 :           5 :       if (G_VALUE_HOLDS (value, G_TYPE_STRV))
     510                 :             :         {
     511                 :           3 :           g_value_take_boxed (value, g_variant_dup_strv (variant, NULL));
     512                 :           3 :           return TRUE;
     513                 :             :         }
     514                 :             : 
     515                 :           2 :       else if (G_VALUE_HOLDS_FLAGS (value))
     516                 :             :         {
     517                 :             :           GFlagsClass *fclass;
     518                 :             :           GFlagsValue *fvalue;
     519                 :             :           const gchar *nick;
     520                 :             :           GVariantIter iter;
     521                 :           2 :           guint flags = 0;
     522                 :             : 
     523                 :           2 :           fclass = g_type_class_peek (G_VALUE_TYPE (value));
     524                 :             : 
     525                 :           2 :           g_variant_iter_init (&iter, variant);
     526                 :           6 :           while (g_variant_iter_next (&iter, "&s", &nick))
     527                 :             :             {
     528                 :           4 :               fvalue = g_flags_get_value_by_nick (fclass, nick);
     529                 :             : 
     530                 :           4 :               if (fvalue)
     531                 :           4 :                 flags |= fvalue->value;
     532                 :             : 
     533                 :             :               else
     534                 :             :                 {
     535                 :           0 :                   g_warning ("Unable to lookup flags nick '%s' via GType",
     536                 :             :                              nick);
     537                 :           0 :                   return FALSE;
     538                 :             :                 }
     539                 :             :             }
     540                 :             : 
     541                 :           2 :           g_value_set_flags (value, flags);
     542                 :           2 :           return TRUE;
     543                 :             :         }
     544                 :             :     }
     545                 :           1 :   else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTESTRING))
     546                 :             :     {
     547                 :           1 :       g_value_set_string (value, g_variant_get_bytestring (variant));
     548                 :           1 :       return TRUE;
     549                 :             :     }
     550                 :             : 
     551                 :           0 :   g_critical ("No GSettings bind handler for type \"%s\".",
     552                 :             :               g_variant_get_type_string (variant));
     553                 :             : 
     554                 :           0 :   return FALSE;
     555                 :             : }
     556                 :             : 
     557                 :             : gboolean
     558                 :          25 : g_settings_mapping_is_compatible (GType               gvalue_type,
     559                 :             :                                   const GVariantType *variant_type)
     560                 :             : {
     561                 :          25 :   gboolean ok = FALSE;
     562                 :             : 
     563                 :          25 :   if (gvalue_type == G_TYPE_BOOLEAN)
     564                 :           3 :     ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BOOLEAN);
     565                 :          22 :   else if (gvalue_type == G_TYPE_CHAR  ||
     566                 :             :            gvalue_type == G_TYPE_UCHAR)
     567                 :           1 :     ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BYTE);
     568                 :          21 :   else if (gvalue_type == G_TYPE_INT    ||
     569                 :          13 :            gvalue_type == G_TYPE_UINT   ||
     570                 :          12 :            gvalue_type == G_TYPE_INT64  ||
     571                 :          10 :            gvalue_type == G_TYPE_UINT64 ||
     572                 :             :            gvalue_type == G_TYPE_DOUBLE)
     573                 :          35 :     ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT16)  ||
     574                 :          21 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT16) ||
     575                 :          17 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT32)  ||
     576                 :          11 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT32) ||
     577                 :           7 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT64)  ||
     578                 :           4 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT64) ||
     579                 :          24 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_HANDLE) ||
     580                 :           1 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_DOUBLE));
     581                 :           9 :   else if (gvalue_type == G_TYPE_STRING)
     582                 :          13 :     ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING)      ||
     583                 :           1 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE ("ay")) ||
     584                 :           7 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_OBJECT_PATH) ||
     585                 :           0 :           g_variant_type_equal (variant_type, G_VARIANT_TYPE_SIGNATURE));
     586                 :           3 :   else if (gvalue_type == G_TYPE_STRV)
     587                 :           1 :     ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
     588                 :           2 :   else if (G_TYPE_IS_ENUM (gvalue_type))
     589                 :           1 :     ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING);
     590                 :           1 :   else if (G_TYPE_IS_FLAGS (gvalue_type))
     591                 :           1 :     ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
     592                 :             : 
     593                 :          25 :   return ok;
     594                 :             : }
        

Generated by: LCOV version 2.0-1