[next] telepathy-glib: tp_account_channel_request_dup_request, request-vardict property: add
Simon McVittie
smcv at kemper.freedesktop.org
Mon Oct 8 08:23:32 PDT 2012
Module: telepathy-glib
Branch: next
Commit: b4012b9e337f10a60123ac76c44c68a83700face
URL: http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=b4012b9e337f10a60123ac76c44c68a83700face
Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date: Wed Sep 19 12:52:43 2012 +0100
tp_account_channel_request_dup_request, request-vardict property: add
Signed-off-by: Simon McVittie <simon.mcvittie at collabora.co.uk>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=55099
---
docs/reference/telepathy-glib-sections.txt | 1 +
telepathy-glib/account-channel-request.c | 89 ++++++++++++++++++++++++++--
telepathy-glib/account-channel-request.h | 3 +
tests/dbus/account-channel-request.c | 21 +++++++
4 files changed, 108 insertions(+), 6 deletions(-)
diff --git a/docs/reference/telepathy-glib-sections.txt b/docs/reference/telepathy-glib-sections.txt
index ce0b15f..f4bbeed 100644
--- a/docs/reference/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib-sections.txt
@@ -6172,6 +6172,7 @@ TpAccountChannelRequest
tp_account_channel_request_new
tp_account_channel_request_new_vardict
tp_account_channel_request_get_request
+tp_account_channel_request_dup_request
tp_account_channel_request_get_user_action_time
tp_account_channel_request_get_account
tp_account_channel_request_set_target_contact
diff --git a/telepathy-glib/account-channel-request.c b/telepathy-glib/account-channel-request.c
index 59cd1e3..e240835 100644
--- a/telepathy-glib/account-channel-request.c
+++ b/telepathy-glib/account-channel-request.c
@@ -110,6 +110,7 @@ G_DEFINE_TYPE(TpAccountChannelRequest,
enum {
PROP_ACCOUNT = 1,
PROP_REQUEST,
+ PROP_REQUEST_VARDICT,
PROP_USER_ACTION_TIME,
PROP_CHANNEL_REQUEST,
N_PROPS
@@ -244,6 +245,11 @@ tp_account_channel_request_get_property (GObject *object,
g_value_set_boxed (value, self->priv->request);
break;
+ case PROP_REQUEST_VARDICT:
+ g_value_take_variant (value,
+ tp_account_channel_request_dup_request (self));
+ break;
+
case PROP_USER_ACTION_TIME:
g_value_set_int64 (value, self->priv->user_action_time);
break;
@@ -274,6 +280,14 @@ tp_account_channel_request_set_property (GObject *object,
break;
case PROP_REQUEST:
+ /* If this property remains unset, GObject will set it to a NULL
+ * value. Ignore that, so request-vardict can be set instead. */
+ if (g_value_get_boxed (value) == NULL)
+ return;
+
+ /* Construct-only and mutually exclusive with request-vardict */
+ g_return_if_fail (self->priv->request == NULL);
+
/* We do not use tp_asv_new() and friends, because in principle,
* the request can contain user-defined keys. */
self->priv->request = g_hash_table_new_full (g_str_hash, g_str_equal,
@@ -284,6 +298,29 @@ tp_account_channel_request_set_property (GObject *object,
(GBoxedCopyFunc) tp_g_value_slice_dup);
break;
+ case PROP_REQUEST_VARDICT:
+ {
+ GHashTable *hash;
+
+ /* If this property remains unset, GObject will set it to a NULL
+ * value. Ignore that, so request can be set instead. */
+ if (g_value_get_variant (value) == NULL)
+ return;
+
+ /* Construct-only and mutually exclusive with request */
+ g_return_if_fail (self->priv->request == NULL);
+
+ hash = _tp_asv_from_vardict (g_value_get_variant (value));
+ self->priv->request = g_hash_table_new_full (g_str_hash,
+ g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free);
+
+ tp_g_hash_table_update (self->priv->request,
+ hash, (GBoxedCopyFunc) g_strdup,
+ (GBoxedCopyFunc) tp_g_value_slice_dup);
+ g_hash_table_unref (hash);
+ }
+ break;
+
case PROP_USER_ACTION_TIME:
self->priv->user_action_time = g_value_get_int64 (value);
break;
@@ -350,7 +387,10 @@ tp_account_channel_request_class_init (
* The desired D-Bus properties for the channel, represented as a
* #GHashTable where the keys are strings and the values are #GValue.
*
- * This property can't be %NULL.
+ * When constructing a new object, one of
+ * #TpAccountChannelRequest:request or
+ * #TpAccountChannelRequest:request-vardict must be set to a non-%NULL
+ * value, and the other must remain unspecified.
*
* Since: 0.11.12
*/
@@ -362,6 +402,25 @@ tp_account_channel_request_class_init (
param_spec);
/**
+ * TpAccountChannelRequest:request-vardict:
+ *
+ * The desired D-Bus properties for the channel.
+ *
+ * When constructing a new object, one of
+ * #TpAccountChannelRequest:request or
+ * #TpAccountChannelRequest:request-vardict must be set to a non-%NULL
+ * value, and the other must remain unspecified.
+ *
+ * Since: 0.UNRELEASED
+ */
+ param_spec = g_param_spec_variant ("request-vardict", "Request",
+ "A dictionary containing desirable properties for the channel",
+ G_VARIANT_TYPE_VARDICT, NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_REQUEST_VARDICT,
+ param_spec);
+
+ /**
* TpAccountChannelRequest:user-action-time:
*
* The user action time that will be passed to the channel dispatcher when
@@ -519,7 +578,6 @@ tp_account_channel_request_new_vardict (
GVariant *request,
gint64 user_action_time)
{
- GHashTable *hash;
TpAccountChannelRequest *ret;
g_return_val_if_fail (TP_IS_ACCOUNT (account), NULL);
@@ -528,15 +586,13 @@ tp_account_channel_request_new_vardict (
NULL);
g_variant_ref_sink (request);
- hash = _tp_asv_from_vardict (request);
- g_variant_unref (request);
ret = g_object_new (TP_TYPE_ACCOUNT_CHANNEL_REQUEST,
"account", account,
- "request", hash,
+ "request-vardict", request,
"user-action-time", user_action_time,
NULL);
- g_hash_table_unref (hash);
+ g_variant_unref (request);
return ret;
}
@@ -575,6 +631,27 @@ tp_account_channel_request_get_request (
}
/**
+ * tp_account_channel_request_dup_request:
+ * @self: a #TpAccountChannelRequest
+ *
+ * Return the #TpAccountChannelRequest:request-vardict construct-only
+ * property.
+ *
+ * Returns: (transfer full): the value of
+ * #TpAccountChannelRequest:request-vardict
+ *
+ * Since: 0.11.UNRELEASED
+ */
+GVariant *
+tp_account_channel_request_dup_request (
+ TpAccountChannelRequest *self)
+{
+ g_return_val_if_fail (TP_IS_ACCOUNT_CHANNEL_REQUEST (self), NULL);
+
+ return _tp_asv_to_vardict (self->priv->request);
+}
+
+/**
* tp_account_channel_request_get_user_action_time:
* @self: a #TpAccountChannelRequest
*
diff --git a/telepathy-glib/account-channel-request.h b/telepathy-glib/account-channel-request.h
index fe0b102..416c937 100644
--- a/telepathy-glib/account-channel-request.h
+++ b/telepathy-glib/account-channel-request.h
@@ -77,6 +77,9 @@ TpAccount * tp_account_channel_request_get_account (
GHashTable * tp_account_channel_request_get_request (
TpAccountChannelRequest *self);
+_TP_AVAILABLE_IN_UNRELEASED
+GVariant *tp_account_channel_request_dup_request (
+ TpAccountChannelRequest *self);
gint64 tp_account_channel_request_get_user_action_time (
TpAccountChannelRequest *self);
diff --git a/tests/dbus/account-channel-request.c b/tests/dbus/account-channel-request.c
index 895f1b8..0de180b 100644
--- a/tests/dbus/account-channel-request.c
+++ b/tests/dbus/account-channel-request.c
@@ -447,6 +447,8 @@ test_handle_ensure_success (Test *test,
{
TpAccountChannelRequest *req;
TpContact *alice;
+ GHashTable *asv;
+ GVariant *vardict;
alice = tp_tests_connection_run_until_contact_by_id (test->connection,
"alice", 0, NULL);
@@ -454,6 +456,25 @@ test_handle_ensure_success (Test *test,
req = tp_account_channel_request_new_text (test->account, 0);
tp_account_channel_request_set_target_contact (req, alice);
+ asv = (GHashTable *) tp_account_channel_request_get_request (req);
+ vardict = tp_account_channel_request_dup_request (req);
+ g_assert_cmpstr (tp_asv_get_string (asv,
+ TP_PROP_CHANNEL_TARGET_ID), ==, "alice");
+ g_assert_cmpstr (tp_vardict_get_string (vardict,
+ TP_PROP_CHANNEL_TARGET_ID), ==, "alice");
+ g_variant_unref (vardict);
+
+ g_object_get (req,
+ "request", &asv,
+ "request-vardict", &vardict,
+ NULL);
+ g_assert_cmpstr (tp_asv_get_string (asv,
+ TP_PROP_CHANNEL_TARGET_ID), ==, "alice");
+ g_assert_cmpstr (tp_vardict_get_string (vardict,
+ TP_PROP_CHANNEL_TARGET_ID), ==, "alice");
+ g_hash_table_unref (asv);
+ g_variant_unref (vardict);
+
tp_account_channel_request_ensure_and_handle_channel_async (req,
NULL, ensure_and_handle_cb, test);
More information about the telepathy-commits
mailing list