mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-07-26 03:47:52 +02:00
.gitlab-ci
.reuse
LICENSES
docs
fuzzing
gio
completion
gdbus-2.0
inotify
kqueue
tests
win32
xdgmime
data-to-c.py
dbus-daemon.xml
gaction.c
gaction.h
gactiongroup.c
gactiongroup.h
gactiongroupexporter.c
gactiongroupexporter.h
gactionmap.c
gactionmap.h
gappinfo.c
gappinfo.h
gappinfoprivate.h
gapplication-tool.c
gapplication.c
gapplication.h
gapplicationcommandline.c
gapplicationcommandline.h
gapplicationimpl-dbus.c
gapplicationimpl.h
gasynchelper.c
gasynchelper.h
gasyncinitable.c
gasyncinitable.h
gasyncresult.c
gasyncresult.h
gbufferedinputstream.c
gbufferedinputstream.h
gbufferedoutputstream.c
gbufferedoutputstream.h
gbytesicon.c
gbytesicon.h
gcancellable.c
gcancellable.h
gcharsetconverter.c
gcharsetconverter.h
gcocoanotificationbackend.m
gcontenttype-fdo.c
gcontenttype-osx.m
gcontenttype-win32.c
gcontenttype.c
gcontenttype.h
gcontenttypeprivate.h
gcontextspecificgroup.c
gcontextspecificgroup.h
gconverter.c
gconverter.h
gconverterinputstream.c
gconverterinputstream.h
gconverteroutputstream.c
gconverteroutputstream.h
gcredentials.c
gcredentials.h
gcredentialsprivate.h
gdatagrambased.c
gdatagrambased.h
gdatainputstream.c
gdatainputstream.h
gdataoutputstream.c
gdataoutputstream.h
gdbus-tool.c
gdbusactiongroup-private.h
gdbusactiongroup.c
gdbusactiongroup.h
gdbusaddress.c
gdbusaddress.h
gdbusauth.c
gdbusauth.h
gdbusauthmechanism.c
gdbusauthmechanism.h
gdbusauthmechanismanon.c
gdbusauthmechanismanon.h
gdbusauthmechanismexternal.c
gdbusauthmechanismexternal.h
gdbusauthmechanismsha1.c
gdbusauthmechanismsha1.h
gdbusauthobserver.c
gdbusauthobserver.h
gdbusconnection.c
gdbusconnection.h
gdbusdaemon.c
gdbusdaemon.h
gdbuserror.c
gdbuserror.h
gdbusinterface.c
gdbusinterface.h
gdbusinterfaceskeleton.c
gdbusinterfaceskeleton.h
gdbusintrospection.c
gdbusintrospection.h
gdbusmenumodel.c
gdbusmenumodel.h
gdbusmessage.c
gdbusmessage.h
gdbusmethodinvocation.c
gdbusmethodinvocation.h
gdbusnameowning.c
gdbusnameowning.h
gdbusnamewatching.c
gdbusnamewatching.h
gdbusobject.c
gdbusobject.h
gdbusobjectmanager.c
gdbusobjectmanager.h
gdbusobjectmanagerclient.c
gdbusobjectmanagerclient.h
gdbusobjectmanagerserver.c
gdbusobjectmanagerserver.h
gdbusobjectproxy.c
gdbusobjectproxy.h
gdbusobjectskeleton.c
gdbusobjectskeleton.h
gdbusprivate.c
gdbusprivate.h
gdbusproxy.c
gdbusproxy.h
gdbusserver.c
gdbusserver.h
gdbusutils.c
gdbusutils.h
gdebugcontroller.c
gdebugcontroller.h
gdebugcontrollerdbus.c
gdebugcontrollerdbus.h
gdelayedsettingsbackend.c
gdelayedsettingsbackend.h
gdesktopappinfo.c
gdesktopappinfo.h
gdocumentportal.c
gdocumentportal.h
gdrive.c
gdrive.h
gdtlsclientconnection.c
gdtlsclientconnection.h
gdtlsconnection.c
gdtlsconnection.h
gdtlsserverconnection.c
gdtlsserverconnection.h
gdummyfile.c
gdummyfile.h
gdummyproxyresolver.c
gdummyproxyresolver.h
gdummytlsbackend.c
gdummytlsbackend.h
gemblem.c
gemblem.h
gemblemedicon.c
gemblemedicon.h
gfdonotificationbackend.c
gfile.c
gfile.h
gfileattribute-priv.h
gfileattribute.c
gfileattribute.h
gfiledescriptorbased.c
gfiledescriptorbased.h
gfileenumerator.c
gfileenumerator.h
gfileicon.c
gfileicon.h
gfileinfo-priv.h
gfileinfo.c
gfileinfo.h
gfileinputstream.c
gfileinputstream.h
gfileiostream.c
gfileiostream.h
gfilemonitor.c
gfilemonitor.h
gfilenamecompleter.c
gfilenamecompleter.h
gfileoutputstream.c
gfileoutputstream.h
gfilterinputstream.c
gfilterinputstream.h
gfilteroutputstream.c
gfilteroutputstream.h
ggtknotificationbackend.c
ghttpproxy.c
ghttpproxy.h
gicon.c
gicon.h
ginetaddress.c
ginetaddress.h
ginetaddressmask.c
ginetaddressmask.h
ginetsocketaddress.c
ginetsocketaddress.h
ginitable.c
ginitable.h
ginputstream.c
ginputstream.h
gio-autocleanups.h
gio-launch-desktop.c
gio-querymodules.c
gio-tool-cat.c
gio-tool-copy.c
gio-tool-info.c
gio-tool-launch.c
gio-tool-list.c
gio-tool-mime.c
gio-tool-mkdir.c
gio-tool-monitor.c
gio-tool-mount.c
gio-tool-move.c
gio-tool-open.c
gio-tool-remove.c
gio-tool-rename.c
gio-tool-save.c
gio-tool-set.c
gio-tool-trash.c
gio-tool-tree.c
gio-tool.c
gio-tool.h
gio.h
gio.rc.in
gio.stp.in
gio_probes.d
gio_trace.h
gioenums.h
gioenumtypes.c.template
gioenumtypes.h.template
gioerror.c
gioerror.h
giomodule-priv.c
giomodule-priv.h
giomodule.c
giomodule.h
gioprivate.h
gioscheduler.c
gioscheduler.h
giostream.c
giostream.h
giotypes.h
giounix-private.c
giounix-private.h
giowin32-afunix.h
giowin32-priv.h
giowin32-private.c
gkeyfilesettingsbackend.c
glib-compile-resources.c
glib-compile-schemas.c
glistmodel.c
glistmodel.h
gliststore.c
gliststore.h
gloadableicon.c
gloadableicon.h
glocalfile.c
glocalfile.h
glocalfileenumerator.c
glocalfileenumerator.h
glocalfileinfo.c
glocalfileinfo.h
glocalfileinputstream.c
glocalfileinputstream.h
glocalfileiostream.c
glocalfileiostream.h
glocalfilemonitor.c
glocalfilemonitor.h
glocalfileoutputstream.c
glocalfileoutputstream.h
glocalvfs.c
glocalvfs.h
gmarshal-internal.c
gmarshal-internal.h
gmarshal-internal.list
gmemoryinputstream.c
gmemoryinputstream.h
gmemorymonitor.c
gmemorymonitor.h
gmemorymonitordbus.c
gmemorymonitordbus.h
gmemorymonitorportal.c
gmemorymonitorportal.h
gmemorymonitorwin32.c
gmemoryoutputstream.c
gmemoryoutputstream.h
gmemorysettingsbackend.c
gmenu.c
gmenu.h
gmenuexporter.c
gmenuexporter.h
gmenumodel.c
gmenumodel.h
gmount.c
gmount.h
gmountoperation.c
gmountoperation.h
gmountprivate.h
gnativesocketaddress.c
gnativesocketaddress.h
gnativevolumemonitor.c
gnativevolumemonitor.h
gnetworkaddress.c
gnetworkaddress.h
gnetworking.c
gnetworking.h.in
gnetworkingprivate.h
gnetworkmonitor.c
gnetworkmonitor.h
gnetworkmonitorbase.c
gnetworkmonitorbase.h
gnetworkmonitornetlink.c
gnetworkmonitornetlink.h
gnetworkmonitornm.c
gnetworkmonitornm.h
gnetworkmonitorportal.c
gnetworkmonitorportal.h
gnetworkservice.c
gnetworkservice.h
gnextstepsettingsbackend.m
gnotification-private.h
gnotification.c
gnotification.h
gnotificationbackend.c
gnotificationbackend.h
gnullsettingsbackend.c
gopenuriportal.c
gopenuriportal.h
gosxappinfo.h
gosxappinfo.m
gosxnetworkmonitor.c
gosxnetworkmonitor.h
goutputstream.c
goutputstream.h
gpermission.c
gpermission.h
gpollableinputstream.c
gpollableinputstream.h
gpollableoutputstream.c
gpollableoutputstream.h
gpollableutils.c
gpollableutils.h
gpollfilemonitor.c
gpollfilemonitor.h
gportalnotificationbackend.c
gportalsupport.c
gportalsupport.h
gpowerprofilemonitor.c
gpowerprofilemonitor.h
gpowerprofilemonitordbus.c
gpowerprofilemonitordbus.h
gpowerprofilemonitorportal.c
gpowerprofilemonitorportal.h
gpropertyaction.c
gpropertyaction.h
gproxy.c
gproxy.h
gproxyaddress.c
gproxyaddress.h
gproxyaddressenumerator.c
gproxyaddressenumerator.h
gproxyresolver.c
gproxyresolver.h
gproxyresolverportal.c
gproxyresolverportal.h
gregistrysettingsbackend.c
gregistrysettingsbackend.h
gremoteactiongroup.c
gremoteactiongroup.h
gresolver.c
gresolver.h
gresource-tool.c
gresource.c
gresource.dtd
gresource.h
gresourcefile.c
gresourcefile.h
gsandbox.c
gsandbox.h
gschema.dtd
gschema.its
gschema.loc
gseekable.c
gseekable.h
gsettings-mapping.c
gsettings-mapping.h
gsettings-tool.c
gsettings.c
gsettings.h
gsettingsbackend.c
gsettingsbackend.h
gsettingsbackendinternal.h
gsettingsschema-internal.h
gsettingsschema.c
gsettingsschema.h
gsimpleaction.c
gsimpleaction.h
gsimpleactiongroup.c
gsimpleactiongroup.h
gsimpleasyncresult.c
gsimpleasyncresult.h
gsimpleiostream.c
gsimpleiostream.h
gsimplepermission.c
gsimplepermission.h
gsimpleproxyresolver.c
gsimpleproxyresolver.h
gsocket.c
gsocket.h
gsocketaddress.c
gsocketaddress.h
gsocketaddressenumerator.c
gsocketaddressenumerator.h
gsocketclient.c
gsocketclient.h
gsocketconnectable.c
gsocketconnectable.h
gsocketconnection.c
gsocketconnection.h
gsocketcontrolmessage.c
gsocketcontrolmessage.h
gsocketinputstream.c
gsocketinputstream.h
gsocketlistener.c
gsocketlistener.h
gsocketoutputstream.c
gsocketoutputstream.h
gsocketservice.c
gsocketservice.h
gsocks4aproxy.c
gsocks4aproxy.h
gsocks4proxy.c
gsocks4proxy.h
gsocks5proxy.c
gsocks5proxy.h
gsrvtarget.c
gsrvtarget.h
gsubprocess.c
gsubprocess.h
gsubprocesslauncher-private.h
gsubprocesslauncher.c
gsubprocesslauncher.h
gtask.c
gtask.h
gtcpconnection.c
gtcpconnection.h
gtcpwrapperconnection.c
gtcpwrapperconnection.h
gtestdbus.c
gtestdbus.h
gthemedicon.c
gthemedicon.h
gthreadedresolver-private.h
gthreadedresolver.c
gthreadedresolver.h
gthreadedsocketservice.c
gthreadedsocketservice.h
gtlsbackend.c
gtlsbackend.h
gtlscertificate.c
gtlscertificate.h
gtlsclientconnection.c
gtlsclientconnection.h
gtlsconnection.c
gtlsconnection.h
gtlsdatabase.c
gtlsdatabase.h
gtlsfiledatabase.c
gtlsfiledatabase.h
gtlsinteraction.c
gtlsinteraction.h
gtlspassword.c
gtlspassword.h
gtlsserverconnection.c
gtlsserverconnection.h
gtrashportal.c
gtrashportal.h
gunionvolumemonitor.c
gunionvolumemonitor.h
gunixconnection.c
gunixconnection.h
gunixcredentialsmessage.c
gunixcredentialsmessage.h
gunixfdlist.c
gunixfdlist.h
gunixfdmessage.c
gunixfdmessage.h
gunixinputstream.c
gunixinputstream.h
gunixmount.c
gunixmount.h
gunixmounts.c
gunixmounts.h
gunixoutputstream.c
gunixoutputstream.h
gunixsocketaddress.c
gunixsocketaddress.h
gunixvolume.c
gunixvolume.h
gunixvolumemonitor.c
gunixvolumemonitor.h
gvfs.c
gvfs.h
gvolume.c
gvolume.h
gvolumemonitor.c
gvolumemonitor.h
gwin32api-application-activation-manager.h
gwin32api-iterator.h
gwin32api-misc.h
gwin32api-package.h
gwin32api-storage.h
gwin32appinfo.c
gwin32appinfo.h
gwin32file-sync-stream.c
gwin32file-sync-stream.h
gwin32inputstream.c
gwin32inputstream.h
gwin32mount.c
gwin32mount.h
gwin32networkmonitor.c
gwin32networkmonitor.h
gwin32notificationbackend.c
gwin32outputstream.c
gwin32outputstream.h
gwin32packageparser.c
gwin32packageparser.h
gwin32registrykey.c
gwin32registrykey.h
gwin32sid.c
gwin32sid.h
gwin32volumemonitor.c
gwin32volumemonitor.h
gzlibcompressor.c
gzlibcompressor.h
gzlibdecompressor.c
gzlibdecompressor.h
meson.build
org.freedesktop.portal.Documents.xml
org.freedesktop.portal.OpenURI.xml
org.freedesktop.portal.ProxyResolver.xml
org.freedesktop.portal.Request.xml
org.freedesktop.portal.Trash.xml
strinfo.c
thumbnail-verify.c
thumbnail-verify.h
girepository
glib
gmodule
gobject
gthread
m4macros
po
subprojects
tests
tools
.clang-format
.dir-locals.el
.editorconfig
.gitignore
.gitlab-ci.yml
.gitmodules
.lcovrc
CODE_OF_CONDUCT.md
CONTRIBUTING.md
COPYING
INSTALL.md
NEWS
README.md
SECURITY.md
glib.doap
meson.build
meson.options
All uses of g_variant_builder_init() in gio are safe to translate to the new g_variant_builder_init_static() alternative as the type will outlive the call to g_variant_builder_end() (or is already static in nature).
595 lines
18 KiB
C
595 lines
18 KiB
C
/*
|
||
* Copyright © 2010 Novell, Inc.
|
||
*
|
||
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||
*
|
||
* This library is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU Lesser General Public
|
||
* License as published by the Free Software Foundation; either
|
||
* version 2.1 of the License, or (at your option) any later version.
|
||
*
|
||
* This library is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* Lesser General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||
*
|
||
* Author: Vincent Untz <vuntz@gnome.org>
|
||
*/
|
||
|
||
#include "config.h"
|
||
|
||
#include "gsettings-mapping.h"
|
||
|
||
static GVariant *
|
||
g_settings_set_mapping_int (const GValue *value,
|
||
const GVariantType *expected_type)
|
||
{
|
||
GVariant *variant = NULL;
|
||
gint64 l;
|
||
|
||
if (G_VALUE_HOLDS_INT (value))
|
||
l = g_value_get_int (value);
|
||
else if (G_VALUE_HOLDS_INT64 (value))
|
||
l = g_value_get_int64 (value);
|
||
else
|
||
return NULL;
|
||
|
||
if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
|
||
{
|
||
if (G_MININT16 <= l && l <= G_MAXINT16)
|
||
variant = g_variant_new_int16 ((gint16) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
|
||
{
|
||
if (0 <= l && l <= G_MAXUINT16)
|
||
variant = g_variant_new_uint16 ((guint16) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
|
||
{
|
||
if (G_MININT32 <= l && l <= G_MAXINT32)
|
||
variant = g_variant_new_int32 ((gint) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
|
||
{
|
||
if (0 <= l && l <= G_MAXUINT32)
|
||
variant = g_variant_new_uint32 ((guint) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
|
||
{
|
||
if (G_MININT64 <= l && l <= G_MAXINT64)
|
||
variant = g_variant_new_int64 ((gint64) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
|
||
{
|
||
if (0 <= l && (guint64) l <= G_MAXUINT64)
|
||
variant = g_variant_new_uint64 ((guint64) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
|
||
{
|
||
if (0 <= l && l <= G_MAXUINT32)
|
||
variant = g_variant_new_handle ((guint) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
|
||
variant = g_variant_new_double ((gdouble) l);
|
||
|
||
return variant;
|
||
}
|
||
|
||
static GVariant *
|
||
g_settings_set_mapping_float (const GValue *value,
|
||
const GVariantType *expected_type)
|
||
{
|
||
GVariant *variant = NULL;
|
||
gdouble d;
|
||
gint64 l;
|
||
|
||
if (G_VALUE_HOLDS_DOUBLE (value))
|
||
d = g_value_get_double (value);
|
||
else
|
||
return NULL;
|
||
|
||
l = (gint64) d;
|
||
if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
|
||
{
|
||
if (G_MININT16 <= l && l <= G_MAXINT16)
|
||
variant = g_variant_new_int16 ((gint16) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
|
||
{
|
||
if (0 <= l && l <= G_MAXUINT16)
|
||
variant = g_variant_new_uint16 ((guint16) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
|
||
{
|
||
if (G_MININT32 <= l && l <= G_MAXINT32)
|
||
variant = g_variant_new_int32 ((gint) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
|
||
{
|
||
if (0 <= l && l <= G_MAXUINT32)
|
||
variant = g_variant_new_uint32 ((guint) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
|
||
{
|
||
if (G_MININT64 <= l && l <= G_MAXINT64)
|
||
variant = g_variant_new_int64 ((gint64) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
|
||
{
|
||
if (0 <= l && (guint64) l <= G_MAXUINT64)
|
||
variant = g_variant_new_uint64 ((guint64) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
|
||
{
|
||
if (0 <= l && l <= G_MAXUINT32)
|
||
variant = g_variant_new_handle ((guint) l);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
|
||
variant = g_variant_new_double ((gdouble) d);
|
||
|
||
return variant;
|
||
}
|
||
static GVariant *
|
||
g_settings_set_mapping_unsigned_int (const GValue *value,
|
||
const GVariantType *expected_type)
|
||
{
|
||
GVariant *variant = NULL;
|
||
guint64 u;
|
||
|
||
if (G_VALUE_HOLDS_UINT (value))
|
||
u = g_value_get_uint (value);
|
||
else if (G_VALUE_HOLDS_UINT64 (value))
|
||
u = g_value_get_uint64 (value);
|
||
else
|
||
return NULL;
|
||
|
||
if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT16))
|
||
{
|
||
if (u <= G_MAXINT16)
|
||
variant = g_variant_new_int16 ((gint16) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT16))
|
||
{
|
||
if (u <= G_MAXUINT16)
|
||
variant = g_variant_new_uint16 ((guint16) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT32))
|
||
{
|
||
if (u <= G_MAXINT32)
|
||
variant = g_variant_new_int32 ((gint) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT32))
|
||
{
|
||
if (u <= G_MAXUINT32)
|
||
variant = g_variant_new_uint32 ((guint) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_INT64))
|
||
{
|
||
if (u <= G_MAXINT64)
|
||
variant = g_variant_new_int64 ((gint64) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_UINT64))
|
||
{
|
||
if (u <= G_MAXUINT64)
|
||
variant = g_variant_new_uint64 ((guint64) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_HANDLE))
|
||
{
|
||
if (u <= G_MAXUINT32)
|
||
variant = g_variant_new_handle ((guint) u);
|
||
}
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_DOUBLE))
|
||
variant = g_variant_new_double ((gdouble) u);
|
||
|
||
return variant;
|
||
}
|
||
|
||
static gboolean
|
||
g_settings_get_mapping_int (GValue *value,
|
||
GVariant *variant)
|
||
{
|
||
const GVariantType *type;
|
||
gint64 l;
|
||
|
||
type = g_variant_get_type (variant);
|
||
|
||
if (g_variant_type_equal (type, G_VARIANT_TYPE_INT16))
|
||
l = g_variant_get_int16 (variant);
|
||
else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT32))
|
||
l = g_variant_get_int32 (variant);
|
||
else if (g_variant_type_equal (type, G_VARIANT_TYPE_INT64))
|
||
l = g_variant_get_int64 (variant);
|
||
else if (g_variant_type_equal (type, G_VARIANT_TYPE_HANDLE))
|
||
l = g_variant_get_handle (variant);
|
||
else
|
||
return FALSE;
|
||
|
||
if (G_VALUE_HOLDS_INT (value))
|
||
{
|
||
g_value_set_int (value, l);
|
||
return (G_MININT32 <= l && l <= G_MAXINT32);
|
||
}
|
||
else if (G_VALUE_HOLDS_UINT (value))
|
||
{
|
||
g_value_set_uint (value, l);
|
||
return (0 <= l && l <= G_MAXUINT32);
|
||
}
|
||
else if (G_VALUE_HOLDS_INT64 (value))
|
||
{
|
||
g_value_set_int64 (value, l);
|
||
return (G_MININT64 <= l && l <= G_MAXINT64);
|
||
}
|
||
else if (G_VALUE_HOLDS_UINT64 (value))
|
||
{
|
||
g_value_set_uint64 (value, l);
|
||
return (0 <= l && (guint64) l <= G_MAXUINT64);
|
||
}
|
||
else if (G_VALUE_HOLDS_DOUBLE (value))
|
||
{
|
||
g_value_set_double (value, l);
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
static gboolean
|
||
g_settings_get_mapping_float (GValue *value,
|
||
GVariant *variant)
|
||
{
|
||
const GVariantType *type;
|
||
gdouble d;
|
||
gint64 l;
|
||
|
||
type = g_variant_get_type (variant);
|
||
|
||
if (g_variant_type_equal (type, G_VARIANT_TYPE_DOUBLE))
|
||
d = g_variant_get_double (variant);
|
||
else
|
||
return FALSE;
|
||
|
||
l = (gint64)d;
|
||
if (G_VALUE_HOLDS_INT (value))
|
||
{
|
||
g_value_set_int (value, l);
|
||
return (G_MININT32 <= l && l <= G_MAXINT32);
|
||
}
|
||
else if (G_VALUE_HOLDS_UINT (value))
|
||
{
|
||
g_value_set_uint (value, l);
|
||
return (0 <= l && l <= G_MAXUINT32);
|
||
}
|
||
else if (G_VALUE_HOLDS_INT64 (value))
|
||
{
|
||
g_value_set_int64 (value, l);
|
||
return (G_MININT64 <= l && l <= G_MAXINT64);
|
||
}
|
||
else if (G_VALUE_HOLDS_UINT64 (value))
|
||
{
|
||
g_value_set_uint64 (value, l);
|
||
return (0 <= l && (guint64) l <= G_MAXUINT64);
|
||
}
|
||
else if (G_VALUE_HOLDS_DOUBLE (value))
|
||
{
|
||
g_value_set_double (value, d);
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
static gboolean
|
||
g_settings_get_mapping_unsigned_int (GValue *value,
|
||
GVariant *variant)
|
||
{
|
||
const GVariantType *type;
|
||
guint64 u;
|
||
|
||
type = g_variant_get_type (variant);
|
||
|
||
if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT16))
|
||
u = g_variant_get_uint16 (variant);
|
||
else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT32))
|
||
u = g_variant_get_uint32 (variant);
|
||
else if (g_variant_type_equal (type, G_VARIANT_TYPE_UINT64))
|
||
u = g_variant_get_uint64 (variant);
|
||
else
|
||
return FALSE;
|
||
|
||
if (G_VALUE_HOLDS_INT (value))
|
||
{
|
||
g_value_set_int (value, u);
|
||
return (u <= G_MAXINT32);
|
||
}
|
||
else if (G_VALUE_HOLDS_UINT (value))
|
||
{
|
||
g_value_set_uint (value, u);
|
||
return (u <= G_MAXUINT32);
|
||
}
|
||
else if (G_VALUE_HOLDS_INT64 (value))
|
||
{
|
||
g_value_set_int64 (value, u);
|
||
return (u <= G_MAXINT64);
|
||
}
|
||
else if (G_VALUE_HOLDS_UINT64 (value))
|
||
{
|
||
g_value_set_uint64 (value, u);
|
||
return (u <= G_MAXUINT64);
|
||
}
|
||
else if (G_VALUE_HOLDS_DOUBLE (value))
|
||
{
|
||
g_value_set_double (value, u);
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
GVariant *
|
||
g_settings_set_mapping (const GValue *value,
|
||
const GVariantType *expected_type,
|
||
gpointer user_data)
|
||
{
|
||
gchar *type_string;
|
||
|
||
if (G_VALUE_HOLDS_BOOLEAN (value))
|
||
{
|
||
if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BOOLEAN))
|
||
return g_variant_new_boolean (g_value_get_boolean (value));
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS_CHAR (value) ||
|
||
G_VALUE_HOLDS_UCHAR (value))
|
||
{
|
||
if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTE))
|
||
{
|
||
if (G_VALUE_HOLDS_CHAR (value))
|
||
return g_variant_new_byte (g_value_get_schar (value));
|
||
else
|
||
return g_variant_new_byte (g_value_get_uchar (value));
|
||
}
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS_INT (value) ||
|
||
G_VALUE_HOLDS_INT64 (value))
|
||
return g_settings_set_mapping_int (value, expected_type);
|
||
|
||
else if (G_VALUE_HOLDS_DOUBLE (value))
|
||
return g_settings_set_mapping_float (value, expected_type);
|
||
|
||
else if (G_VALUE_HOLDS_UINT (value) ||
|
||
G_VALUE_HOLDS_UINT64 (value))
|
||
return g_settings_set_mapping_unsigned_int (value, expected_type);
|
||
|
||
else if (G_VALUE_HOLDS_STRING (value))
|
||
{
|
||
if (g_value_get_string (value) == NULL)
|
||
return NULL;
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_STRING))
|
||
return g_variant_new_string (g_value_get_string (value));
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_BYTESTRING))
|
||
return g_variant_new_bytestring (g_value_get_string (value));
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_OBJECT_PATH))
|
||
return g_variant_new_object_path (g_value_get_string (value));
|
||
else if (g_variant_type_equal (expected_type, G_VARIANT_TYPE_SIGNATURE))
|
||
return g_variant_new_signature (g_value_get_string (value));
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
|
||
{
|
||
if (g_value_get_boxed (value) == NULL)
|
||
return NULL;
|
||
return g_variant_new_strv ((const gchar **) g_value_get_boxed (value),
|
||
-1);
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS_ENUM (value))
|
||
{
|
||
GEnumValue *enumval;
|
||
GEnumClass *eclass;
|
||
|
||
/* GParamSpecEnum holds a ref on the class so we just peek... */
|
||
eclass = g_type_class_peek (G_VALUE_TYPE (value));
|
||
enumval = g_enum_get_value (eclass, g_value_get_enum (value));
|
||
|
||
if (enumval)
|
||
return g_variant_new_string (enumval->value_nick);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS_FLAGS (value))
|
||
{
|
||
GVariantBuilder builder;
|
||
GFlagsValue *flagsval;
|
||
GFlagsClass *fclass;
|
||
guint flags;
|
||
|
||
fclass = g_type_class_peek (G_VALUE_TYPE (value));
|
||
flags = g_value_get_flags (value);
|
||
|
||
g_variant_builder_init_static (&builder, G_VARIANT_TYPE ("as"));
|
||
while (flags)
|
||
{
|
||
flagsval = g_flags_get_first_value (fclass, flags);
|
||
|
||
if (flagsval == NULL)
|
||
{
|
||
g_variant_builder_clear (&builder);
|
||
return NULL;
|
||
}
|
||
|
||
g_variant_builder_add (&builder, "s", flagsval->value_nick);
|
||
flags &= ~flagsval->value;
|
||
}
|
||
|
||
return g_variant_builder_end (&builder);
|
||
}
|
||
|
||
type_string = g_variant_type_dup_string (expected_type);
|
||
g_critical ("No GSettings bind handler for type \"%s\".", type_string);
|
||
g_free (type_string);
|
||
|
||
return NULL;
|
||
}
|
||
|
||
gboolean
|
||
g_settings_get_mapping (GValue *value,
|
||
GVariant *variant,
|
||
gpointer user_data)
|
||
{
|
||
if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BOOLEAN))
|
||
{
|
||
if (!G_VALUE_HOLDS_BOOLEAN (value))
|
||
return FALSE;
|
||
g_value_set_boolean (value, g_variant_get_boolean (variant));
|
||
return TRUE;
|
||
}
|
||
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTE))
|
||
{
|
||
if (G_VALUE_HOLDS_UCHAR (value))
|
||
g_value_set_uchar (value, g_variant_get_byte (variant));
|
||
else if (G_VALUE_HOLDS_CHAR (value))
|
||
g_value_set_schar (value, (gint8)g_variant_get_byte (variant));
|
||
else
|
||
return FALSE;
|
||
return TRUE;
|
||
}
|
||
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_INT16) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_INT32) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_INT64) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_HANDLE))
|
||
return g_settings_get_mapping_int (value, variant);
|
||
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_DOUBLE))
|
||
return g_settings_get_mapping_float (value, variant);
|
||
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT16) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT32) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_UINT64))
|
||
return g_settings_get_mapping_unsigned_int (value, variant);
|
||
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_STRING) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_OBJECT_PATH) ||
|
||
g_variant_is_of_type (variant, G_VARIANT_TYPE_SIGNATURE))
|
||
{
|
||
if (G_VALUE_HOLDS_STRING (value))
|
||
{
|
||
g_value_set_string (value, g_variant_get_string (variant, NULL));
|
||
return TRUE;
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS_ENUM (value))
|
||
{
|
||
GEnumClass *eclass;
|
||
GEnumValue *evalue;
|
||
const gchar *nick;
|
||
|
||
/* GParamSpecEnum holds a ref on the class so we just peek... */
|
||
eclass = g_type_class_peek (G_VALUE_TYPE (value));
|
||
nick = g_variant_get_string (variant, NULL);
|
||
evalue = g_enum_get_value_by_nick (eclass, nick);
|
||
|
||
if (evalue)
|
||
{
|
||
g_value_set_enum (value, evalue->value);
|
||
return TRUE;
|
||
}
|
||
|
||
g_warning ("Unable to look up enum nick ‘%s’ via GType", nick);
|
||
return FALSE;
|
||
}
|
||
}
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE ("as")))
|
||
{
|
||
if (G_VALUE_HOLDS (value, G_TYPE_STRV))
|
||
{
|
||
g_value_take_boxed (value, g_variant_dup_strv (variant, NULL));
|
||
return TRUE;
|
||
}
|
||
|
||
else if (G_VALUE_HOLDS_FLAGS (value))
|
||
{
|
||
GFlagsClass *fclass;
|
||
GFlagsValue *fvalue;
|
||
const gchar *nick;
|
||
GVariantIter iter;
|
||
guint flags = 0;
|
||
|
||
fclass = g_type_class_peek (G_VALUE_TYPE (value));
|
||
|
||
g_variant_iter_init (&iter, variant);
|
||
while (g_variant_iter_next (&iter, "&s", &nick))
|
||
{
|
||
fvalue = g_flags_get_value_by_nick (fclass, nick);
|
||
|
||
if (fvalue)
|
||
flags |= fvalue->value;
|
||
|
||
else
|
||
{
|
||
g_warning ("Unable to lookup flags nick '%s' via GType",
|
||
nick);
|
||
return FALSE;
|
||
}
|
||
}
|
||
|
||
g_value_set_flags (value, flags);
|
||
return TRUE;
|
||
}
|
||
}
|
||
else if (g_variant_is_of_type (variant, G_VARIANT_TYPE_BYTESTRING))
|
||
{
|
||
g_value_set_string (value, g_variant_get_bytestring (variant));
|
||
return TRUE;
|
||
}
|
||
|
||
g_critical ("No GSettings bind handler for type \"%s\".",
|
||
g_variant_get_type_string (variant));
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
gboolean
|
||
g_settings_mapping_is_compatible (GType gvalue_type,
|
||
const GVariantType *variant_type)
|
||
{
|
||
gboolean ok = FALSE;
|
||
|
||
if (gvalue_type == G_TYPE_BOOLEAN)
|
||
ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BOOLEAN);
|
||
else if (gvalue_type == G_TYPE_CHAR ||
|
||
gvalue_type == G_TYPE_UCHAR)
|
||
ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_BYTE);
|
||
else if (gvalue_type == G_TYPE_INT ||
|
||
gvalue_type == G_TYPE_UINT ||
|
||
gvalue_type == G_TYPE_INT64 ||
|
||
gvalue_type == G_TYPE_UINT64 ||
|
||
gvalue_type == G_TYPE_DOUBLE)
|
||
ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT16) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT16) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT32) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT32) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_INT64) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_UINT64) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_HANDLE) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_DOUBLE));
|
||
else if (gvalue_type == G_TYPE_STRING)
|
||
ok = (g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE ("ay")) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_OBJECT_PATH) ||
|
||
g_variant_type_equal (variant_type, G_VARIANT_TYPE_SIGNATURE));
|
||
else if (gvalue_type == G_TYPE_STRV)
|
||
ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
|
||
else if (G_TYPE_IS_ENUM (gvalue_type))
|
||
ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE_STRING);
|
||
else if (G_TYPE_IS_FLAGS (gvalue_type))
|
||
ok = g_variant_type_equal (variant_type, G_VARIANT_TYPE ("as"));
|
||
|
||
return ok;
|
||
}
|