diff options
-rw-r--r-- | common/xfconf-dbus.xml | 48 | ||||
-rw-r--r-- | xfconf/xfconf-channel.c | 195 | ||||
-rw-r--r-- | xfconf/xfconf-channel.h | 42 | ||||
-rw-r--r-- | xfconfd/xfconf-backend-perchannel-xml.c | 44 | ||||
-rw-r--r-- | xfconfd/xfconf-backend.c | 43 | ||||
-rw-r--r-- | xfconfd/xfconf-backend.h | 34 | ||||
-rw-r--r-- | xfconfd/xfconf-daemon.c | 41 |
7 files changed, 353 insertions, 94 deletions
diff --git a/common/xfconf-dbus.xml b/common/xfconf-dbus.xml index 4c05876..5cd3cc6 100644 --- a/common/xfconf-dbus.xml +++ b/common/xfconf-dbus.xml @@ -37,6 +37,54 @@ </method> <!-- + Array{String,Variant} org.xfce.Xfconf.GetAll(String channel) + + @channel: A channel/application/namespace name. + + Gets all the properties and values that exist in + @channel. + + Returns: An array of properties and values; the + properties are strings, and the values are + variants. + --> + <method name="GetAll"> + <arg direction="in" name="channel" type="s"/> + <arg direction="out" name="properties" type="a{sv}"/> + </method> + + <!-- + Boolean org.xfce.Xfconf.Exists(String channel, + String property) + + @channel: A channel/application/namespace name. + @property: A property name. + + Checks to see if @property exists in @channel. + + Returns: %TRUE if @property exists, %FALSE if not. + --> + <method name="Exists"> + <arg direction="in" name="channel" type="s"/> + <arg direction="in" name="property" type="s"/> + <arg direction="out" name="exists" type="b"/> + </method> + + <!-- + void org.xfce.Xfconf.Remove(String channel, + String property) + + @channel: A channel/application/namespace name. + @property: A property name. + + Removes @property and its value from @channel. + --> + <method name="Remove"> + <arg direction="in" name="channel" type="s"/> + <arg direction="in" name="property" type="s"/> + </method> + + <!-- void org.xfce.Xfconf.Changed(String channel, String property) diff --git a/xfconf/xfconf-channel.c b/xfconf/xfconf-channel.c index 1dc2fa2..9851de6 100644 --- a/xfconf/xfconf-channel.c +++ b/xfconf/xfconf-channel.c @@ -203,6 +203,26 @@ xfconf_channel_property_changed(DBusGProxy *proxy, } + +static gboolean +xfconf_channel_get_internal(XfconfChannel *channel, + const gchar *property, + GType property_type, + GValue *value) +{ + DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); + gboolean ret; + + g_value_init(value, property_type); + + ret = xfconf_client_get(proxy, channel->channel_name, property, value, NULL); + if(!ret) + g_value_unset(value); + + return ret; +} + + /** * xfconf_channel_new: * @channel_name: A channel name. @@ -229,131 +249,164 @@ xfconf_channel_new(const gchar *channel_name) } gboolean -xfconf_channel_get_string(XfconfChannel *channel, - const gchar *property, - gchar **value) +xfconf_channel_has_property(XfconfChannel *channel, + const gchar *property) { DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); - GValue val; - - g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property && value, FALSE); + gboolean exists = FALSE; - g_value_init(&val, G_TYPE_STRING); - if(!xfconf_client_get(proxy, channel->channel_name, property, &val, NULL)) + if(!xfconf_client_exists(proxy, channel->channel_name, property, + &exists, NULL)) + { return FALSE; + } - *value = g_value_dup_string(&val); - g_value_unset(&val); + return exists; +} + +void +xfconf_channel_remove_property(XfconfChannel *channel, + const gchar *property) +{ + DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); - return TRUE; + xfconf_client_remove(proxy, channel->channel_name, property, NULL); } -gboolean -xfconf_channel_get_string_list(XfconfChannel *channel, - const gchar *property, - gchar ***value) +GHashTable * +xfconf_channel_get_all(XfconfChannel *channel) { DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); + GHashTable *properties = NULL; + + if(!xfconf_client_get_all(proxy, channel->channel_name, &properties, NULL)) + return NULL; + + return properties; +} + +gchar * +xfconf_channel_get_string(XfconfChannel *channel, + const gchar *property, + const gchar *default_value) +{ + gchar *value = NULL; GValue val; - GPtrArray *arr; - gint i; - g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property && value, FALSE); + g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property, NULL); - g_value_init(&val, dbus_g_type_get_collection("GPtrArray", G_TYPE_STRING)); - if(!xfconf_client_get(proxy, channel->channel_name, property, &val, NULL)) - return FALSE; + if(xfconf_channel_get_internal(channel, property, G_TYPE_STRING, &val)) { + value = g_value_dup_string(&val); + g_value_unset(&val); + } else if(default_value) + value = g_strdup(default_value); - arr = g_value_get_boxed(&val); + return value; +} + +gchar ** +xfconf_channel_get_string_list(XfconfChannel *channel, + const gchar *property, + const gchar **default_value) +{ + gchar **value = NULL; + GValue val; + gint i = 0; - *value = g_new(gchar *, arr->len + 1); - for(i = 0; i < arr->len; ++i) - (*value)[i] = g_strdup(arr->pdata[i]); - (*value)[arr->len] = NULL; + g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property, NULL); - g_value_unset(&val); + if(xfconf_channel_get_internal(channel, property, + dbus_g_type_get_collection("GPtrArray", G_TYPE_STRING), + &val)) + { + GPtrArray *arr = g_value_get_boxed(&val); + + value = g_new0(gchar *, arr->len + 1); + for(i = 0; i < arr->len; ++i) + value[i] = g_strdup(arr->pdata[i]); + + g_value_unset(&val); + } else if(default_value) { + while(default_value[i]) + ++i; + value = g_new0(gchar *, i + 1); + for(i = 0; default_value[i]; ++i) + value[i] = g_strdup(default_value[i]); + } - return TRUE; + return value; } -gboolean +gint xfconf_channel_get_int(XfconfChannel *channel, const gchar *property, - gint *value) + gint default_value) { - DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); + gint value = default_value; GValue val; - g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property && value, FALSE); + g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property, value); - g_value_init(&val, G_TYPE_INT); - if(!xfconf_client_get(proxy, channel->channel_name, property, &val, NULL)) - return FALSE; - - *value = g_value_get_int(&val); - g_value_unset(&val); + if(xfconf_channel_get_internal(channel, property, G_TYPE_INT, &val)) { + value = g_value_get_int(&val); + g_value_unset(&val); + } - return TRUE; + return value; } -gboolean +gint64 xfconf_channel_get_int64(XfconfChannel *channel, const gchar *property, - gint64 *value) + gint64 default_value) { - DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); + gint64 value = default_value; GValue val; - g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property && value, FALSE); + g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property, value); - g_value_init(&val, G_TYPE_INT64); - if(!xfconf_client_get(proxy, channel->channel_name, property, &val, NULL)) - return FALSE; - - *value = g_value_get_int64(&val); - g_value_unset(&val); + if(xfconf_channel_get_internal(channel, property, G_TYPE_INT64, &val)) { + value = g_value_get_int64(&val); + g_value_unset(&val); + } - return TRUE; + return value; } -gboolean +gdouble xfconf_channel_get_double(XfconfChannel *channel, const gchar *property, - gdouble *value) + gdouble default_value) { - DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); + gdouble value = default_value; GValue val; - g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property && value, FALSE); - - g_value_init(&val, G_TYPE_DOUBLE); - if(!xfconf_client_get(proxy, channel->channel_name, property, &val, NULL)) - return FALSE; + g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property, value); - *value = g_value_get_double(&val); - g_value_unset(&val); + if(xfconf_channel_get_internal(channel, property, G_TYPE_DOUBLE, &val)) { + value = g_value_get_double(&val); + g_value_unset(&val); + } - return TRUE; + return value; } gboolean xfconf_channel_get_bool(XfconfChannel *channel, const gchar *property, - gboolean *value) + gboolean default_value) { - DBusGProxy *proxy = _xfconf_get_dbus_g_proxy(); + gboolean value = default_value; GValue val; - g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property && value, FALSE); + g_return_val_if_fail(XFCONF_IS_CHANNEL(channel) && property, value); - g_value_init(&val, G_TYPE_BOOLEAN); - if(!xfconf_client_get(proxy, channel->channel_name, property, &val, NULL)) - return FALSE; - - *value = g_value_get_boolean(&val); - g_value_unset(&val); + if(xfconf_channel_get_internal(channel, property, G_TYPE_BOOLEAN, &val)) { + value = g_value_get_boolean(&val); + g_value_unset(&val); + } - return TRUE; + return value; } gboolean diff --git a/xfconf/xfconf-channel.h b/xfconf/xfconf-channel.h index f4246e3..67d7f9d 100644 --- a/xfconf/xfconf-channel.h +++ b/xfconf/xfconf-channel.h @@ -37,50 +37,48 @@ GType xfconf_channel_get_type() G_GNUC_CONST; XfconfChannel *xfconf_channel_new(const gchar *channel_name); -gboolean xfconf_channel_get_string(XfconfChannel *channel, - const gchar *property, - gchar **value); +gboolean xfconf_channel_has_property(XfconfChannel *channel, + const gchar *property); -gboolean xfconf_channel_get_string_list(XfconfChannel *channel, - const gchar *property, - gchar ***value); +void xfconf_channel_remove_property(XfconfChannel *channel, + const gchar *property); -gboolean xfconf_channel_get_int(XfconfChannel *channel, - const gchar *property, - gint *value); +GHashTable *xfconf_channel_get_all(XfconfChannel *channel); -gboolean xfconf_channel_get_int64(XfconfChannel *channel, +gchar *xfconf_channel_get_string(XfconfChannel *channel, + const gchar *property, + const gchar *default_value); +gchar **xfconf_channel_get_string_list(XfconfChannel *channel, + const gchar *property, + const gchar **default_value); +gint xfconf_channel_get_int(XfconfChannel *channel, + const gchar *property, + gint default_value); +gint64 xfconf_channel_get_int64(XfconfChannel *channel, + const gchar *property, + gint64 default_value); +gdouble xfconf_channel_get_double(XfconfChannel *channel, const gchar *property, - gint64 *value); - -gboolean xfconf_channel_get_double(XfconfChannel *channel, - const gchar *property, - gdouble *value); - + gdouble default_value); gboolean xfconf_channel_get_bool(XfconfChannel *channel, const gchar *property, - gboolean *value); + gboolean default_value); gboolean xfconf_channel_set_string(XfconfChannel *channel, const gchar *property, const gchar *value); - gboolean xfconf_channel_set_string_list(XfconfChannel *channel, const gchar *property, const gchar **value); - gboolean xfconf_channel_set_int(XfconfChannel *channel, const gchar *property, gint value); - gboolean xfconf_channel_set_int64(XfconfChannel *channel, const gchar *property, gint64 value); - gboolean xfconf_channel_set_double(XfconfChannel *channel, const gchar *property, gdouble value); - gboolean xfconf_channel_set_bool(XfconfChannel *channel, const gchar *property, gboolean value); diff --git a/xfconfd/xfconf-backend-perchannel-xml.c b/xfconfd/xfconf-backend-perchannel-xml.c index 96d0240..43787e3 100644 --- a/xfconfd/xfconf-backend-perchannel-xml.c +++ b/xfconfd/xfconf-backend-perchannel-xml.c @@ -57,6 +57,19 @@ static gboolean xfconf_backend_perchannel_xml_get(XfconfBackend *backend, const gchar *property, GValue *value, GError **error); +static gboolean xfconf_backend_perchannel_xml_get_all(XfconfBackend *backend, + const gchar *channel, + GHashTable **properties, + GError **error); +static gboolean xfconf_backend_perchannel_xml_exists(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error); +static gboolean xfconf_backend_perchannel_xml_remove(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + GError **error); static gboolean xfconf_backend_perchannel_xml_flush(XfconfBackend *backend, GError **error); @@ -92,6 +105,9 @@ xfconf_backend_perchannel_xml_backend_init(XfconfBackendInterface *iface) iface->initialize = xfconf_backend_perchannel_xml_initialize; iface->set = xfconf_backend_perchannel_xml_set; iface->get = xfconf_backend_perchannel_xml_get; + iface->get_all = xfconf_backend_perchannel_xml_get_all; + iface->exists = xfconf_backend_perchannel_xml_exists; + iface->remove = xfconf_backend_perchannel_xml_remove; iface->flush = xfconf_backend_perchannel_xml_flush; } @@ -139,6 +155,34 @@ xfconf_backend_perchannel_xml_get(XfconfBackend *backend, } static gboolean +xfconf_backend_perchannel_xml_get_all(XfconfBackend *backend, + const gchar *channel, + GHashTable **properties, + GError **error) +{ + return FALSE; +} + +static gboolean +xfconf_backend_perchannel_xml_exists(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error) +{ + return FALSE; +} + +static gboolean +xfconf_backend_perchannel_xml_remove(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + GError **error) +{ + return FALSE; +} + +static gboolean xfconf_backend_perchannel_xml_flush(XfconfBackend *backend, GError **error) { diff --git a/xfconfd/xfconf-backend.c b/xfconfd/xfconf-backend.c index 4b67aaf..03402a2 100644 --- a/xfconfd/xfconf-backend.c +++ b/xfconfd/xfconf-backend.c @@ -103,6 +103,49 @@ xfconf_backend_get(XfconfBackend *backend, } gboolean +xfconf_backend_get_all(XfconfBackend *backend, + const gchar *channel, + GHashTable **properties, + GError **error) +{ + XfconfBackendInterface *iface = XFCONF_BACKEND_GET_INTERFACE(backend); + + g_return_val_if_fail(iface && iface->get_all && channel && properties + && (!error || *error), FALSE); + + return iface->get_all(backend, channel, properties, error); +} + +gboolean +xfconf_backend_exists(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error) +{ + XfconfBackendInterface *iface = XFCONF_BACKEND_GET_INTERFACE(backend); + + g_return_val_if_fail(iface && iface->exists && channel && property && exists + && (!error || *error), FALSE); + + return iface->exists(backend, channel, property, exists, error); +} + +gboolean +xfconf_backend_remove(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + GError **error) +{ + XfconfBackendInterface *iface = XFCONF_BACKEND_GET_INTERFACE(backend); + + g_return_val_if_fail(iface && iface->remove && channel && property + && (!error || *error), FALSE); + + return iface->remove(backend, channel, property, error); +} + +gboolean xfconf_backend_flush(XfconfBackend *backend, GError **error) { diff --git a/xfconfd/xfconf-backend.h b/xfconfd/xfconf-backend.h index 112a552..3d7be58 100644 --- a/xfconfd/xfconf-backend.h +++ b/xfconfd/xfconf-backend.h @@ -53,6 +53,22 @@ struct _XfconfBackendInterface GValue *value, GError **error); + gboolean (*get_all)(XfconfBackend *backend, + const gchar *channel, + GHashTable **properties, + GError **error); + + gboolean (*exists)(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error); + + gboolean (*remove)(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + GError **error); + gboolean (*flush)(XfconfBackend *backend, GError **error); @@ -74,13 +90,29 @@ gboolean xfconf_backend_set(XfconfBackend *backend, const gchar *property, const GValue *value, GError **error); - + gboolean xfconf_backend_get(XfconfBackend *backend, const gchar *channel, const gchar *property, GValue *value, GError **error); +gboolean xfconf_backend_get_all(XfconfBackend *backend, + const gchar *channel, + GHashTable **properties, + GError **error); + +gboolean xfconf_backend_exists(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error); + +gboolean xfconf_backend_remove(XfconfBackend *backend, + const gchar *channel, + const gchar *property, + GError **error); + gboolean xfconf_backend_flush(XfconfBackend *backend, GError **error); diff --git a/xfconfd/xfconf-daemon.c b/xfconfd/xfconf-daemon.c index 6f9a926..061211e 100644 --- a/xfconfd/xfconf-daemon.c +++ b/xfconfd/xfconf-daemon.c @@ -40,6 +40,19 @@ static gboolean xfconfd_get(XfconfDaemon *xfconfd, const gchar *property, GValue *value, GError **error); +static gboolean xfconfd_get_all(XfconfDaemon *xfconfd, + const gchar *channel, + GHashTable **properties, + GError **error); +static gboolean xfconfd_exists(XfconfDaemon *xfconfd, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error); +static gboolean xfconfd_remove(XfconfDaemon *xfconfd, + const gchar *channel, + const gchar *property, + GError **error); static gboolean xfconfd_show_list(XfconfDaemon *xfconfd, const gchar *display, GError **error); @@ -133,6 +146,34 @@ xfconfd_get(XfconfDaemon *xfconfd, } static gboolean +xfconfd_get_all(XfconfDaemon *xfconfd, + const gchar *channel, + GHashTable **properties, + GError **error) +{ + return xfconf_backend_get_all(xfconfd->backend, channel, properties, error); +} + +static gboolean +xfconfd_exists(XfconfDaemon *xfconfd, + const gchar *channel, + const gchar *property, + gboolean *exists, + GError **error) +{ + return xfconf_backend_exists(xfconfd->backend, channel, property, exists, error); +} + +static gboolean +xfconfd_remove(XfconfDaemon *xfconfd, + const gchar *channel, + const gchar *property, + GError **error) +{ + return xfconf_backend_remove(xfconfd->backend, channel, property, error); +} + +static gboolean xfconfd_show_list(XfconfDaemon *xfconfd, const gchar *display, GError **error) |