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 {