diff options
| author | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-06-13 14:39:50 +0200 |
|---|---|---|
| committer | Xavier Claessens <xavier.claessens@collabora.co.uk> | 2012-06-19 18:03:40 +0200 |
| commit | d065b5ccf63b3a02a132cee370407a8a115fc444 (patch) | |
| tree | 2678ca31cbd9cad71df6dff0261675fb538f8899 | |
| parent | 3012a34361e6ca61e897d9e74079752b00c28ede (diff) | |
WockyConnector: Support see-other-host
| -rw-r--r-- | wocky/wocky-connector.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/wocky/wocky-connector.c b/wocky/wocky-connector.c index c8c45bb..133b9fd 100644 --- a/wocky/wocky-connector.c +++ b/wocky/wocky-connector.c @@ -291,6 +291,8 @@ struct _WockyConnectorPrivate WockyTLSHandler *tls_handler; WockyAuthRegistry *auth_registry; + + guint see_other_host_count; }; /* choose an appropriate chunk of text describing our state for debug/error */ @@ -1152,7 +1154,7 @@ xmpp_init_recv_cb (GObject *source, /* ************************************************************************* */ /* handle stream errors */ static gboolean -stream_error_abort (WockyConnector *connector, +stream_error_abort (WockyConnector *self, WockyStanza *stanza) { GError *error = NULL; @@ -1160,8 +1162,40 @@ stream_error_abort (WockyConnector *connector, if (!wocky_stanza_extract_stream_error (stanza, &error)) return FALSE; + if (g_error_matches (error, WOCKY_XMPP_STREAM_ERROR, + WOCKY_XMPP_STREAM_ERROR_SEE_OTHER_HOST)) + { + const gchar *other_host; + + other_host = wocky_node_get_content_from_child_ns ( + wocky_stanza_get_top_node (stanza), + "see-other-host", WOCKY_XMPP_NS_STREAMS); + + if (other_host != NULL && self->priv->see_other_host_count < 5) + { + DEBUG ("Need to restart connection with host: %s", other_host); + + self->priv->see_other_host_count++; + + /* Reset to initial state */ + g_clear_object (&self->priv->features); + g_clear_object (&self->priv->sock); + g_clear_object (&self->priv->conn); + self->priv->state = WCON_TCP_CONNECTING; + self->priv->authed = FALSE; + self->priv->encrypted = FALSE; + self->priv->connected = FALSE; + + connect_to_host_async (self, other_host, 5222); + + goto out; + } + } + DEBUG ("Received stream error: %s", error->message); - abort_connect (connector, error); + abort_connect (self, error); + +out: g_error_free (error); return TRUE; } |
