From 547c07400aa5d90d2a14c19d5c436658620e92f9 Mon Sep 17 00:00:00 2001 From: Stefan Becker Date: Sun, 26 Aug 2012 18:51:33 +0300 Subject: [PATCH] telepathy: copy parameters to connection properties This seems to be required, even if we ourselves don't use the properties. --- src/telepathy/telepathy-connection.c | 98 ++++++++++++++++---------------- src/telepathy/telepathy-protocol.c | 107 +++++++++++++++++++++-------------- 2 files changed, 114 insertions(+), 91 deletions(-) diff --git a/src/telepathy/telepathy-connection.c b/src/telepathy/telepathy-connection.c index a2a42c4a..d13e4abf 100644 --- a/src/telepathy/telepathy-connection.c +++ b/src/telepathy/telepathy-connection.c @@ -143,24 +143,17 @@ static void sipe_connection_init(SIPE_UNUSED_PARAMETER SipeConnection *self) } /* create new connection object and attach it to SIPE core */ -TpBaseConnection *sipe_telepathy_connection_new(SIPE_UNUSED_PARAMETER TpBaseProtocol *protocol, +TpBaseConnection *sipe_telepathy_connection_new(TpBaseProtocol *protocol, GHashTable *params, GError **error) { const gchar *password = tp_asv_get_string(params, "password"); const gchar *login = tp_asv_get_string(params, "login"); - const gchar *server = tp_asv_get_string(params, "server"); - const gchar *transport = tp_asv_get_string(params, "transport"); - SipeConnection *conn = g_object_new(SIPE_TYPE_CONNECTION, - "protocol", SIPE_TELEPATHY_DOMAIN, - "password", password, - NULL); + gchar *login_domain = NULL; + gchar *login_account = NULL; + TpBaseConnection *base = NULL; struct sipe_core_public *sipe_public; - gchar *login_domain = NULL; - gchar *login_account = NULL; const gchar *errmsg; - guint port; - gboolean valid; SIPE_DEBUG_INFO_NOFORMAT("sipe_telepathy_connection_new"); @@ -189,46 +182,55 @@ TpBaseConnection *sipe_telepathy_connection_new(SIPE_UNUSED_PARAMETER TpBaseProt SIPE_DEBUG_INFO("sipe_telepathy_connection_new: created %p", sipe_public); - if (!sipe_public) { + if (sipe_public) { + const gchar *server = tp_asv_get_string(params, "server"); + const gchar *transport = tp_asv_get_string(params, "transport"); + SipeConnection *conn = g_object_new(SIPE_TYPE_CONNECTION, + "protocol", tp_base_protocol_get_name(protocol), + NULL); + guint port; + gboolean valid; + + /* initialize backend private data */ + sipe_public->backend_private = (struct sipe_backend_private *) conn; + conn->public = sipe_public; + + /* map option list to flags - default is NTLM */ + SIPE_CORE_FLAG_UNSET(KRB5); + SIPE_CORE_FLAG_UNSET(TLS_DSK); + SIPE_CORE_FLAG_UNSET(SSO); + /* @TODO: add parameters for these */ + + /* server name */ + if (server && strlen(server)) + conn->server = g_strdup(server); + else + conn->server = NULL; + + /* server port: core expects a string */ + port = tp_asv_get_uint32(params, "port", &valid); + if (valid) + conn->port = g_strdup_printf("%d", port); + else + conn->port = NULL; + + /* transport type */ + if (sipe_strequal(transport, "auto")) { + conn->transport = conn->server ? + SIPE_TRANSPORT_TLS : SIPE_TRANSPORT_AUTO; + } else if (sipe_strequal(transport, "tls")) { + conn->transport = SIPE_TRANSPORT_TLS; + } else { + conn->transport = SIPE_TRANSPORT_TCP; + } + + base = TP_BASE_CONNECTION(conn); + + } else g_set_error_literal(error, TP_ERROR, TP_ERROR_INVALID_ARGUMENT, errmsg); - g_object_unref(G_OBJECT(conn)); - return NULL; - } - - sipe_public->backend_private = (struct sipe_backend_private *) conn; - conn->public = sipe_public; - - /* map option list to flags - default is NTLM */ - SIPE_CORE_FLAG_UNSET(KRB5); - SIPE_CORE_FLAG_UNSET(TLS_DSK); - SIPE_CORE_FLAG_UNSET(SSO); - /* @TODO: add parameters for these */ - - /* server name */ - if (server && strlen(server)) - conn->server = g_strdup(server); - else - conn->server = NULL; - - /* server port: core expects a string */ - port = tp_asv_get_uint32(params, "port", &valid); - if (valid) - conn->port = g_strdup_printf("%d", port); - else - conn->port = NULL; - - /* transport type */ - if (sipe_strequal(transport, "auto")) { - conn->transport = conn->server ? - SIPE_TRANSPORT_TLS : SIPE_TRANSPORT_AUTO; - } else if (sipe_strequal(transport, "tls")) { - conn->transport = SIPE_TRANSPORT_TLS; - } else { - conn->transport = SIPE_TRANSPORT_TCP; - } - return(TP_BASE_CONNECTION(conn)); + return(base); } diff --git a/src/telepathy/telepathy-protocol.c b/src/telepathy/telepathy-protocol.c index 637621a3..358c530c 100644 --- a/src/telepathy/telepathy-protocol.c +++ b/src/telepathy/telepathy-protocol.c @@ -100,8 +100,6 @@ static gboolean parameter_filter_account(SIPE_UNUSED_PARAMETER const TpCMParamSp return(TRUE); } -static const TpCMParamSpec *get_parameters(SIPE_UNUSED_PARAMETER TpBaseProtocol *self) -{ /* ISO C99 Designated Initializers silences -Wmissing-field-initializers */ #define SIPE_PROTOCOL_PARAMETER(_name, _dtype, _gtype, _flags, _default, _filter) \ { \ @@ -113,50 +111,73 @@ static const TpCMParamSpec *get_parameters(SIPE_UNUSED_PARAMETER TpBaseProtocol .filter = (_filter), \ } - static const TpCMParamSpec const sipe_parameters[] = { - SIPE_PROTOCOL_PARAMETER("account", - DBUS_TYPE_STRING_AS_STRING, - G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER, - NULL, - parameter_filter_account), - SIPE_PROTOCOL_PARAMETER("login", - DBUS_TYPE_STRING_AS_STRING, - G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER, - NULL, - tp_cm_param_filter_string_nonempty), - SIPE_PROTOCOL_PARAMETER("password", - DBUS_TYPE_STRING_AS_STRING, - G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER | TP_CONN_MGR_PARAM_FLAG_SECRET, - NULL, - tp_cm_param_filter_string_nonempty), - SIPE_PROTOCOL_PARAMETER("server", - DBUS_TYPE_STRING_AS_STRING, - G_TYPE_STRING, - 0, - NULL, - NULL /* can be empty */), - SIPE_PROTOCOL_PARAMETER("port", - DBUS_TYPE_UINT16_AS_STRING, - G_TYPE_UINT, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, - GUINT_TO_POINTER(0), - NULL), - /* @TODO: this should be combo auto/ssl/tcp */ - SIPE_PROTOCOL_PARAMETER("transport", - DBUS_TYPE_STRING_AS_STRING, - G_TYPE_STRING, - TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, - "auto", - tp_cm_param_filter_string_nonempty), - SIPE_PROTOCOL_PARAMETER(NULL, NULL, 0, 0, NULL, NULL) - }; +static const TpCMParamSpec const sipe_parameters[] = { + SIPE_PROTOCOL_PARAMETER("account", + DBUS_TYPE_STRING_AS_STRING, + G_TYPE_STRING, + TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER, + NULL, + parameter_filter_account), + SIPE_PROTOCOL_PARAMETER("login", + DBUS_TYPE_STRING_AS_STRING, + G_TYPE_STRING, + TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER, + NULL, + tp_cm_param_filter_string_nonempty), + SIPE_PROTOCOL_PARAMETER("password", + DBUS_TYPE_STRING_AS_STRING, + G_TYPE_STRING, + TP_CONN_MGR_PARAM_FLAG_REQUIRED | TP_CONN_MGR_PARAM_FLAG_REGISTER | TP_CONN_MGR_PARAM_FLAG_SECRET, + NULL, + tp_cm_param_filter_string_nonempty), + SIPE_PROTOCOL_PARAMETER("server", + DBUS_TYPE_STRING_AS_STRING, + G_TYPE_STRING, + 0, + NULL, + NULL /* can be empty */), + SIPE_PROTOCOL_PARAMETER("port", + DBUS_TYPE_UINT16_AS_STRING, + G_TYPE_UINT, + TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, + GUINT_TO_POINTER(0), + NULL), + /* @TODO: this should be combo auto/ssl/tcp */ + SIPE_PROTOCOL_PARAMETER("transport", + DBUS_TYPE_STRING_AS_STRING, + G_TYPE_STRING, + TP_CONN_MGR_PARAM_FLAG_HAS_DEFAULT, + "auto", + tp_cm_param_filter_string_nonempty), + SIPE_PROTOCOL_PARAMETER(NULL, NULL, 0, 0, NULL, NULL) +}; +static const TpCMParamSpec *get_parameters(SIPE_UNUSED_PARAMETER TpBaseProtocol *self) +{ return(sipe_parameters); } +static TpBaseConnection *connection_new(TpBaseProtocol *protocol, + GHashTable *params, + GError **error) +{ + TpBaseConnection *conn = sipe_telepathy_connection_new(protocol, + params, + error); + if (conn) { + const TpCMParamSpec *param; + for (param = sipe_parameters; param->name; param++) { + const GValue *value = g_hash_table_lookup(params, + param->name); + if (value) + g_object_set_property(G_OBJECT(conn), + param->name, + value); + } + } + return(conn); +} + static gchar *normalize_contact(SIPE_UNUSED_PARAMETER TpBaseProtocol *self, const gchar *contact, GError **error) @@ -240,7 +261,7 @@ static void sipe_protocol_class_init(SipeProtocolClass *klass) SIPE_DEBUG_INFO_NOFORMAT("SipeProtocol::class_init"); base_class->get_parameters = get_parameters; - base_class->new_connection = sipe_telepathy_connection_new; + base_class->new_connection = connection_new; base_class->normalize_contact = normalize_contact; base_class->identify_account = identify_account; base_class->get_interfaces = get_interfaces; -- 2.11.4.GIT