summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/xfconf-dbus.xml48
-rw-r--r--xfconf/xfconf-channel.c195
-rw-r--r--xfconf/xfconf-channel.h42
-rw-r--r--xfconfd/xfconf-backend-perchannel-xml.c44
-rw-r--r--xfconfd/xfconf-backend.c43
-rw-r--r--xfconfd/xfconf-backend.h34
-rw-r--r--xfconfd/xfconf-daemon.c41
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)