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 : : }
|