Mercurial > pidgin
diff libpurple/protocols/jabber/si.c @ 25733:51cbb9be484e
Set state error on IBBSession if the receiver gives an error.
Handle errors better in si.c
author | Marcus Lundblad <ml@update.uu.se> |
---|---|
date | Sun, 12 Oct 2008 17:41:26 +0000 |
parents | d6351b105e42 |
children | 487a750cc924 |
line wrap: on
line diff
--- a/libpurple/protocols/jabber/si.c Wed Oct 01 18:19:00 2008 +0000 +++ b/libpurple/protocols/jabber/si.c Sun Oct 12 17:41:26 2008 +0000 @@ -1004,32 +1004,39 @@ xmlnode *open = xmlnode_get_child(packet, "open"); const gchar *sid = xmlnode_get_attrib(open, "sid"); PurpleXfer *xfer = jabber_si_xfer_find(js, sid, who); - JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; - JabberIBBSession *sess = - jabber_ibb_session_create_from_xmlnode(js, packet, xfer); - - if (sess) { - /* setup callbacks here...*/ - jabber_ibb_session_set_data_received_callback(sess, - jabber_si_xfer_ibb_recv_data_cb); - jabber_ibb_session_set_closed_callback(sess, - jabber_si_xfer_ibb_closed_cb); - jabber_ibb_session_set_error_callback(sess, - jabber_si_xfer_ibb_error_cb); + if (xfer) { + JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; + JabberIBBSession *sess = + jabber_ibb_session_create_from_xmlnode(js, packet, xfer); - /* open the file to write to */ - jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "wb"); - - jsx->ibb_session = sess; - - /* start the transfer */ - purple_xfer_start(xfer, 0, NULL, 0); - return TRUE; + if (sess) { + /* setup callbacks here...*/ + jabber_ibb_session_set_data_received_callback(sess, + jabber_si_xfer_ibb_recv_data_cb); + jabber_ibb_session_set_closed_callback(sess, + jabber_si_xfer_ibb_closed_cb); + jabber_ibb_session_set_error_callback(sess, + jabber_si_xfer_ibb_error_cb); + + /* open the file to write to */ + jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "wb"); + + jsx->ibb_session = sess; + + /* start the transfer */ + purple_xfer_start(xfer, 0, NULL, 0); + return TRUE; + } else { + /* failed to create IBB session */ + purple_debug_error("jabber", "failed to create IBB session\n"); + jabber_si_xfer_cancel_recv(xfer); + purple_xfer_end(xfer); + return FALSE; + } } else { - /* failed to create IBB session */ - purple_debug_error("jabber", "failed to create IBB session\n"); - jabber_si_xfer_cancel_recv(xfer); - purple_xfer_end(xfer); + /* we got an IBB <open/> for an unknown file transfer, pass along... */ + purple_debug_info("jabber", + "IBB open did not match any SI file transfer\n"); return FALSE; } } @@ -1085,11 +1092,23 @@ PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; - purple_xfer_start(xfer, 0, NULL, 0); - purple_xfer_set_bytes_sent(xfer, 0); - purple_xfer_update_progress(xfer); - jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "rb"); - jabber_si_xfer_ibb_send_data(sess); + if (jabber_ibb_session_get_state(sess) == JABBER_IBB_SESSION_OPENED) { + purple_xfer_start(xfer, 0, NULL, 0); + purple_xfer_set_bytes_sent(xfer, 0); + purple_xfer_update_progress(xfer); + jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "rb"); + jabber_si_xfer_ibb_send_data(sess); + } else { + /* error */ + JabberStream *js = jabber_ibb_session_get_js(sess); + PurpleConnection *gc = js->gc; + PurpleAccount *account = purple_connection_get_account(gc); + jabber_si_xfer_free(xfer); + purple_xfer_error(purple_xfer_get_type(xfer), account, + jabber_ibb_session_get_who(sess), + _("Failed to open in-band bytestream")); + purple_xfer_end(xfer); + } } static void