Mercurial > pidgin
comparison 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 |
comparison
equal
deleted
inserted
replaced
25731:d6351b105e42 | 25733:51cbb9be484e |
---|---|
1002 { | 1002 { |
1003 const gchar *who = xmlnode_get_attrib(packet, "from"); | 1003 const gchar *who = xmlnode_get_attrib(packet, "from"); |
1004 xmlnode *open = xmlnode_get_child(packet, "open"); | 1004 xmlnode *open = xmlnode_get_child(packet, "open"); |
1005 const gchar *sid = xmlnode_get_attrib(open, "sid"); | 1005 const gchar *sid = xmlnode_get_attrib(open, "sid"); |
1006 PurpleXfer *xfer = jabber_si_xfer_find(js, sid, who); | 1006 PurpleXfer *xfer = jabber_si_xfer_find(js, sid, who); |
1007 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1007 if (xfer) { |
1008 JabberIBBSession *sess = | 1008 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; |
1009 jabber_ibb_session_create_from_xmlnode(js, packet, xfer); | 1009 JabberIBBSession *sess = |
1010 | 1010 jabber_ibb_session_create_from_xmlnode(js, packet, xfer); |
1011 if (sess) { | |
1012 /* setup callbacks here...*/ | |
1013 jabber_ibb_session_set_data_received_callback(sess, | |
1014 jabber_si_xfer_ibb_recv_data_cb); | |
1015 jabber_ibb_session_set_closed_callback(sess, | |
1016 jabber_si_xfer_ibb_closed_cb); | |
1017 jabber_ibb_session_set_error_callback(sess, | |
1018 jabber_si_xfer_ibb_error_cb); | |
1019 | 1011 |
1020 /* open the file to write to */ | 1012 if (sess) { |
1021 jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "wb"); | 1013 /* setup callbacks here...*/ |
1022 | 1014 jabber_ibb_session_set_data_received_callback(sess, |
1023 jsx->ibb_session = sess; | 1015 jabber_si_xfer_ibb_recv_data_cb); |
1024 | 1016 jabber_ibb_session_set_closed_callback(sess, |
1025 /* start the transfer */ | 1017 jabber_si_xfer_ibb_closed_cb); |
1026 purple_xfer_start(xfer, 0, NULL, 0); | 1018 jabber_ibb_session_set_error_callback(sess, |
1027 return TRUE; | 1019 jabber_si_xfer_ibb_error_cb); |
1020 | |
1021 /* open the file to write to */ | |
1022 jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "wb"); | |
1023 | |
1024 jsx->ibb_session = sess; | |
1025 | |
1026 /* start the transfer */ | |
1027 purple_xfer_start(xfer, 0, NULL, 0); | |
1028 return TRUE; | |
1029 } else { | |
1030 /* failed to create IBB session */ | |
1031 purple_debug_error("jabber", "failed to create IBB session\n"); | |
1032 jabber_si_xfer_cancel_recv(xfer); | |
1033 purple_xfer_end(xfer); | |
1034 return FALSE; | |
1035 } | |
1028 } else { | 1036 } else { |
1029 /* failed to create IBB session */ | 1037 /* we got an IBB <open/> for an unknown file transfer, pass along... */ |
1030 purple_debug_error("jabber", "failed to create IBB session\n"); | 1038 purple_debug_info("jabber", |
1031 jabber_si_xfer_cancel_recv(xfer); | 1039 "IBB open did not match any SI file transfer\n"); |
1032 purple_xfer_end(xfer); | |
1033 return FALSE; | 1040 return FALSE; |
1034 } | 1041 } |
1035 } | 1042 } |
1036 | 1043 |
1037 static void | 1044 static void |
1083 jabber_si_xfer_ibb_opened_cb(JabberIBBSession *sess) | 1090 jabber_si_xfer_ibb_opened_cb(JabberIBBSession *sess) |
1084 { | 1091 { |
1085 PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); | 1092 PurpleXfer *xfer = (PurpleXfer *) jabber_ibb_session_get_user_data(sess); |
1086 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; | 1093 JabberSIXfer *jsx = (JabberSIXfer *) xfer->data; |
1087 | 1094 |
1088 purple_xfer_start(xfer, 0, NULL, 0); | 1095 if (jabber_ibb_session_get_state(sess) == JABBER_IBB_SESSION_OPENED) { |
1089 purple_xfer_set_bytes_sent(xfer, 0); | 1096 purple_xfer_start(xfer, 0, NULL, 0); |
1090 purple_xfer_update_progress(xfer); | 1097 purple_xfer_set_bytes_sent(xfer, 0); |
1091 jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "rb"); | 1098 purple_xfer_update_progress(xfer); |
1092 jabber_si_xfer_ibb_send_data(sess); | 1099 jsx->fp = g_fopen(purple_xfer_get_local_filename(xfer), "rb"); |
1100 jabber_si_xfer_ibb_send_data(sess); | |
1101 } else { | |
1102 /* error */ | |
1103 JabberStream *js = jabber_ibb_session_get_js(sess); | |
1104 PurpleConnection *gc = js->gc; | |
1105 PurpleAccount *account = purple_connection_get_account(gc); | |
1106 jabber_si_xfer_free(xfer); | |
1107 purple_xfer_error(purple_xfer_get_type(xfer), account, | |
1108 jabber_ibb_session_get_who(sess), | |
1109 _("Failed to open in-band bytestream")); | |
1110 purple_xfer_end(xfer); | |
1111 } | |
1093 } | 1112 } |
1094 | 1113 |
1095 static void | 1114 static void |
1096 jabber_si_xfer_ibb_send_init(JabberStream *js, PurpleXfer *xfer) | 1115 jabber_si_xfer_ibb_send_init(JabberStream *js, PurpleXfer *xfer) |
1097 { | 1116 { |