# HG changeset patch # User Paul Aurich # Date 1247874591 0 # Node ID 409ef6d76bf656b886623f45bc12bbb1a5a3d94b # Parent e5fdfff98aa9e9e1104d7e640f064a84e810d4f6 Refactor jabber_login and jabber_register_account Now they both call jabber_stream_new and jabber_stream_connect and do the separate stuff between those two calls. diff -r e5fdfff98aa9 -r 409ef6d76bf6 libpurple/protocols/jabber/jabber.c --- a/libpurple/protocols/jabber/jabber.c Fri Jul 17 21:11:25 2009 +0000 +++ b/libpurple/protocols/jabber/jabber.c Fri Jul 17 23:49:51 2009 +0000 @@ -759,31 +759,54 @@ } } -void -jabber_login(PurpleAccount *account) +static JabberStream * +jabber_stream_new(PurpleAccount *account) { PurpleConnection *gc = purple_account_get_connection(account); - const char *connect_server = purple_account_get_string(account, - "connect_server", ""); - const char *bosh_url = purple_account_get_string(account, - "bosh_url", ""); JabberStream *js; + JabberBuddy *my_jb; PurplePresence *presence; - PurpleStoredImage *image; - JabberBuddy *my_jb = NULL; - - gc->flags |= PURPLE_CONNECTION_HTML | - PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY; + js = gc->proto_data = g_new0(JabberStream, 1); js->gc = gc; js->fd = -1; - js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); + js->user = jabber_id_new(purple_account_get_username(account)); + + if (!js->user) { + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Invalid XMPP ID")); + /* Destroying the connection will free the JabberStream */ + return NULL; + } + + if (!js->user->domain || *(js->user->domain) == '\0') { + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Invalid XMPP ID. Domain must be set.")); + /* Destroying the connection will free the JabberStream */ + return NULL; + } + js->buddies = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_buddy_free); + + my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE); + if (!my_jb) { + /* This basically *can't* fail, but for good measure... */ + purple_connection_error_reason(gc, + PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, + _("Invalid XMPP ID")); + /* Destroying the connection will free the JabberStream */ + g_return_val_if_reached(NULL); + } + + my_jb->subscription |= JABBER_SUB_BOTH; + + js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, + g_free, g_free); js->chats = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_chat_free); - js->user = jabber_id_new(purple_account_get_username(account)); js->next_id = g_random_int(); js->write_buffer = purple_circ_buffer_new(512); js->old_length = 0; @@ -802,37 +825,21 @@ if (purple_presence_is_idle(presence)) js->idle = purple_presence_get_idle_time(presence); - if(!js->user) { - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, - _("Invalid XMPP ID")); - return; - } - - if (!js->user->domain || *(js->user->domain) == '\0') { - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, - _("Invalid XMPP ID. Domain must be set.")); - return; - } - - /* - * Calculate the avatar hash for our current image so we know (when we - * fetch our vCard and PEP avatar) if we should send our avatar to the - * server. - */ - if ((image = purple_buddy_icons_find_account_icon(account))) { - js->initial_avatar_hash = jabber_calculate_data_sha1sum(purple_imgstore_get_data(image), - purple_imgstore_get_size(image)); - purple_imgstore_unref(image); - } - - if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE))) - my_jb->subscription |= JABBER_SUB_BOTH; + return js; +} + +static void +jabber_stream_connect(JabberStream *js) +{ + PurpleConnection *gc = js->gc; + PurpleAccount *account = purple_connection_get_account(gc); + const char *connect_server = purple_account_get_string(account, + "connect_server", ""); + const char *bosh_url = purple_account_get_string(account, + "bosh_url", ""); jabber_stream_set_state(js, JABBER_STREAM_CONNECTING); - /* TODO: Just use purple_url_parse? */ /* If both BOSH and a Connect Server are specified, we prefer BOSH. I'm not * attached to that choice, though. */ @@ -842,7 +849,7 @@ if (js->bosh) jabber_bosh_connection_connect(js->bosh); else { - purple_connection_error_reason(js->gc, + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, _("Malformed BOSH URL")); } @@ -853,19 +860,18 @@ js->certificate_CN = g_strdup(connect_server[0] ? connect_server : js->user->domain); /* if they've got old-ssl mode going, we probably want to ignore SRV lookups */ - if(purple_account_get_bool(js->gc->account, "old_ssl", FALSE)) { + if(purple_account_get_bool(account, "old_ssl", FALSE)) { if(purple_ssl_is_supported()) { - js->gsc = purple_ssl_connect(js->gc->account, - js->certificate_CN, - purple_account_get_int(account, "port", 5223), jabber_login_callback_ssl, - jabber_ssl_connect_failure, js->gc); + js->gsc = purple_ssl_connect(account, js->certificate_CN, + purple_account_get_int(account, "port", 5223), + jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); if (!js->gsc) { - purple_connection_error_reason(js->gc, + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, _("Unable to establish SSL connection")); } } else { - purple_connection_error_reason(js->gc, + purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, _("SSL support unavailable")); } @@ -883,6 +889,35 @@ } } +void +jabber_login(PurpleAccount *account) +{ + PurpleConnection *gc = purple_account_get_connection(account); + JabberStream *js; + PurpleStoredImage *image; + + gc->flags |= PURPLE_CONNECTION_HTML | + PURPLE_CONNECTION_ALLOW_CUSTOM_SMILEY; + js = jabber_stream_new(account); + if (js == NULL) + return; + + /* + * Calculate the avatar hash for our current image so we know (when we + * fetch our vCard and PEP avatar) if we should send our avatar to the + * server. + */ + image = purple_buddy_icons_find_account_icon(account); + if (image != NULL) { + js->initial_avatar_hash = + jabber_calculate_data_sha1sum(purple_imgstore_get_data(image), + purple_imgstore_get_size(image)); + purple_imgstore_unref(image); + } + + jabber_stream_connect(js); +} + static gboolean conn_close_cb(gpointer data) @@ -1293,90 +1328,14 @@ void jabber_register_account(PurpleAccount *account) { - PurpleConnection *gc = purple_account_get_connection(account); JabberStream *js; - JabberBuddy *my_jb = NULL; - const char *connect_server = purple_account_get_string(account, - "connect_server", ""); - const char *server; - - js = gc->proto_data = g_new0(JabberStream, 1); - js->gc = gc; - js->registration = TRUE; - js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); - js->user = jabber_id_new(purple_account_get_username(account)); - js->next_id = g_random_int(); - js->old_length = 0; - js->keepalive_timeout = 0; - - if(!js->user) { - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, - _("Invalid XMPP ID")); + + js = jabber_stream_new(account); + if (js == NULL) return; - } - - js->write_buffer = purple_circ_buffer_new(512); - - if((my_jb = jabber_buddy_find(js, purple_account_get_username(account), TRUE))) - my_jb->subscription |= JABBER_SUB_BOTH; - - server = connect_server[0] ? connect_server : js->user->domain; - js->certificate_CN = g_strdup(server); - - js->stun_ip = NULL; - js->stun_port = 0; - js->stun_query = NULL; - - jabber_stream_set_state(js, JABBER_STREAM_CONNECTING); - - /* TODO: Just use purple_url_parse? */ - if (!g_ascii_strncasecmp(connect_server, "http://", 7) || !g_ascii_strncasecmp(connect_server, "https://", 8)) { - js->use_bosh = TRUE; - js->bosh = jabber_bosh_connection_init(js, connect_server); - if (!js->bosh) { - purple_connection_error_reason(js->gc, - PURPLE_CONNECTION_ERROR_INVALID_SETTINGS, - _("Malformed BOSH Connect Server")); - return; - } - jabber_bosh_connection_connect(js->bosh); - return; - } else { - js->certificate_CN = g_strdup(connect_server[0] ? connect_server : js->user->domain); - } - - if(purple_account_get_bool(account, "old_ssl", FALSE)) { - if(purple_ssl_is_supported()) { - js->gsc = purple_ssl_connect(account, server, - purple_account_get_int(account, "port", 5222), - jabber_login_callback_ssl, jabber_ssl_connect_failure, gc); - if (!js->gsc) { - purple_connection_error_reason(js->gc, - PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, - _("Unable to establish SSL connection")); - } - } else { - purple_connection_error_reason(gc, - PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, - _("SSL support unavailable")); - } - - return; - } - - if (connect_server[0]) { - jabber_login_connect(js, js->user->domain, server, - purple_account_get_int(account, - "port", 5222), TRUE); - } else { - js->srv_query_data = purple_srv_resolve("xmpp-client", - "tcp", - js->user->domain, - srv_resolved_cb, - js); - } + + js->registration = TRUE; + jabber_stream_connect(js); } static void