From bfca95a79c427fee1ee1419b7eef6481c7d1bb45 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Wed, 17 Sep 2014 20:04:48 +0100 Subject: [PATCH 2/2] Update for GVariant TpCMParamSpec and GVariant channel properties --- src/idle-im-channel.c | 4 +- src/idle-muc-channel.c | 4 +- src/idle-roomlist-channel.c | 4 +- src/protocol.c | 154 +++++++++++++++++++++++++++++++------------- src/server-tls-channel.c | 4 +- 5 files changed, 119 insertions(+), 51 deletions(-) diff --git a/src/idle-im-channel.c b/src/idle-im-channel.c index 40df806..18c3db5 100644 --- a/src/idle-im-channel.c +++ b/src/idle-im-channel.c @@ -81,13 +81,13 @@ idle_im_channel_constructed (GObject *obj) static void idle_im_channel_fill_properties ( TpBaseChannel *chan, - GHashTable *properties) + GVariantDict *properties) { TpBaseChannelClass *klass = TP_BASE_CHANNEL_CLASS (idle_im_channel_parent_class); klass->fill_immutable_properties (chan, properties); - tp_dbus_properties_mixin_fill_properties_hash ( + tp_dbus_properties_mixin_fill_properties ( G_OBJECT (chan), properties, TP_IFACE_CHANNEL_TYPE_TEXT, "MessagePartSupportFlags", TP_IFACE_CHANNEL_TYPE_TEXT, "DeliveryReportingSupport", diff --git a/src/idle-muc-channel.c b/src/idle-muc-channel.c index 7ee6313..3bce33b 100644 --- a/src/idle-muc-channel.c +++ b/src/idle-muc-channel.c @@ -314,14 +314,14 @@ idle_muc_channel_get_path_suffix ( static void idle_muc_channel_fill_immutable_properties ( TpBaseChannel *chan, - GHashTable *properties) + GVariantDict *properties) { TpBaseChannelClass *parent_class = TP_BASE_CHANNEL_CLASS (idle_muc_channel_parent_class); parent_class->fill_immutable_properties (chan, properties); - tp_dbus_properties_mixin_fill_properties_hash ( + tp_dbus_properties_mixin_fill_properties ( G_OBJECT (chan), properties, TP_IFACE_CHANNEL_TYPE_TEXT, "MessagePartSupportFlags", TP_IFACE_CHANNEL_TYPE_TEXT, "DeliveryReportingSupport", diff --git a/src/idle-roomlist-channel.c b/src/idle-roomlist-channel.c index e69bd8d..744ed05 100644 --- a/src/idle-roomlist-channel.c +++ b/src/idle-roomlist-channel.c @@ -119,13 +119,13 @@ idle_roomlist_channel_get_roomlist_property ( static void idle_roomlist_channel_fill_properties ( TpBaseChannel *chan, - GHashTable *properties) + GVariantDict *properties) { TpBaseChannelClass *klass = TP_BASE_CHANNEL_CLASS (idle_roomlist_channel_parent_class); klass->fill_immutable_properties (chan, properties); - tp_dbus_properties_mixin_fill_properties_hash ( + tp_dbus_properties_mixin_fill_properties ( G_OBJECT (chan), properties, TP_IFACE_CHANNEL_TYPE_ROOM_LIST1, "Server", NULL); diff --git a/src/protocol.c b/src/protocol.c index 49287ca..89750b0 100644 --- a/src/protocol.c +++ b/src/protocol.c @@ -39,38 +39,43 @@ G_DEFINE_TYPE (IdleProtocol, idle_protocol, TP_TYPE_BASE_PROTOCOL) -static gboolean +struct _IdleProtocolPrivate +{ + GPtrArray *params; +}; + +static GVariant * filter_nick (const TpCMParamSpec *paramspec, - GValue *value, + GVariant *value, + gpointer user_data, GError **error) { - const gchar *nick = g_value_get_string (value); - - g_assert (value); - g_assert (G_VALUE_HOLDS_STRING(value)); + const gchar *nick = g_variant_get_string (value, NULL); if (!idle_nickname_is_valid (nick, TRUE)) { g_set_error (error, TP_ERROR, TP_ERROR_INVALID_HANDLE, "Invalid account name '%s'", nick); - return FALSE; + g_variant_unref (value); + return NULL; } - return TRUE; + return value; } -static gboolean +static GVariant * filter_username (const TpCMParamSpec *paramspec, - GValue *value, + GVariant *value, + gpointer user_data, GError **error) { const gchar *username; size_t i; g_assert (value); - g_assert (G_VALUE_HOLDS_STRING (value)); + g_assert (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING)); - username = g_value_get_string (value); + username = g_variant_get_string (value, NULL); for (i = 0; username[i] != '\0'; i++) { @@ -80,47 +85,95 @@ filter_username (const TpCMParamSpec *paramspec, { g_set_error (error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT, "Invalid user name '%s'", username); - return FALSE; + g_variant_unref (value); + return NULL; } } - return TRUE; + return value; } -static const TpCMParamSpec idle_params[] = { - {"account", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_REQUIRED, NULL, 0, filter_nick}, - { "server", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_REQUIRED }, - { "port", DBUS_TYPE_UINT16_AS_STRING, G_TYPE_UINT, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GUINT_TO_POINTER (DEFAULT_PORT) }, - { "password", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_SECRET }, - { "fullname", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0 }, - { "username", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0, NULL, 0, - filter_username }, - { "charset", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, "UTF-8" }, - { "keepalive-interval", DBUS_TYPE_UINT32_AS_STRING, G_TYPE_UINT, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, - GUINT_TO_POINTER (DEFAULT_KEEPALIVE_INTERVAL) }, - { "quit-message", DBUS_TYPE_STRING_AS_STRING, G_TYPE_STRING, 0 }, - { "use-ssl", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER (FALSE) }, - { "password-prompt", DBUS_TYPE_BOOLEAN_AS_STRING, G_TYPE_BOOLEAN, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, GINT_TO_POINTER (FALSE) }, - { NULL, NULL, 0, 0, NULL, 0 } -}; - static void idle_protocol_init (IdleProtocol *self) { + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, IDLE_TYPE_PROTOCOL, + IdleProtocolPrivate); } -static const TpCMParamSpec * -get_parameters (TpBaseProtocol *self G_GNUC_UNUSED) +static GPtrArray * +dup_parameters (TpBaseProtocol *base) { - return idle_params; + IdleProtocol *self = IDLE_PROTOCOL (base); + + if (self->priv->params == NULL) + { + self->priv->params = g_ptr_array_new_full (11, + (GDestroyNotify) tp_cm_param_spec_unref); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("account", + TP_CONN_MGR_PARAM_FLAG_REQUIRED, + g_variant_new_string (""), + filter_nick, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("server", + TP_CONN_MGR_PARAM_FLAG_REQUIRED, + g_variant_new_string (""), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("port", + TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, + g_variant_new_uint16 (DEFAULT_PORT), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("password", + TP_CONN_MGR_PARAM_FLAG_SECRET, + g_variant_new_string (""), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("fullname", + 0, g_variant_new_string (""), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("username", + 0, g_variant_new_string (""), + filter_username, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("charset", + TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, + g_variant_new_string ("UTF-8"), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("keepalive-interval", + TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, + g_variant_new_uint32 (DEFAULT_KEEPALIVE_INTERVAL), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("quit-message", + 0, g_variant_new_string (""), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("use-ssl", + 0, g_variant_new_boolean (FALSE), + NULL, NULL, NULL)); + + g_ptr_array_add (self->priv->params, + tp_cm_param_spec_new ("password-prompt", + 0, g_variant_new_boolean (FALSE), + NULL, NULL, NULL)); + } + + + return g_ptr_array_ref (self->priv->params); } static TpBaseConnection * @@ -231,11 +284,26 @@ dup_authentication_types (TpBaseProtocol *base) } static void +finalize (GObject *object) +{ + IdleProtocol *self = IDLE_PROTOCOL (object); + + g_clear_pointer (&self->priv->params, g_ptr_array_unref); + + G_OBJECT_CLASS (idle_protocol_parent_class)->finalize (object); +} + +static void idle_protocol_class_init (IdleProtocolClass *klass) { + GObjectClass *oclass = (GObjectClass *) klass; TpBaseProtocolClass *base_class = (TpBaseProtocolClass *) klass; - base_class->get_parameters = get_parameters; + g_type_class_add_private (klass, sizeof (IdleProtocolPrivate)); + + oclass->finalize = finalize; + + base_class->dup_parameters = dup_parameters; base_class->new_connection = new_connection; base_class->normalize_contact = normalize_contact; base_class->identify_account = identify_account; diff --git a/src/server-tls-channel.c b/src/server-tls-channel.c index 8f23e38..8b959cf 100644 --- a/src/server-tls-channel.c +++ b/src/server-tls-channel.c @@ -203,12 +203,12 @@ idle_server_tls_channel_constructed (GObject *object) static void idle_server_tls_channel_fill_immutable_properties ( TpBaseChannel *chan, - GHashTable *properties) + GVariantDict *properties) { TP_BASE_CHANNEL_CLASS (idle_server_tls_channel_parent_class) ->fill_immutable_properties (chan, properties); - tp_dbus_properties_mixin_fill_properties_hash ( + tp_dbus_properties_mixin_fill_properties ( G_OBJECT (chan), properties, TP_IFACE_CHANNEL_TYPE_SERVER_TLS_CONNECTION1, "ServerCertificate", TP_IFACE_CHANNEL_TYPE_SERVER_TLS_CONNECTION1, "Hostname", -- 2.1.0