Mercurial > pidgin.yaz
diff libpurple/protocols/msn/directconn.c @ 31292:47b6eda87723
propagate from branch 'im.pidgin.pidgin' (head 07d0765c444a097af45c2650f54323afb900a07b)
to branch 'im.pidgin.soc.2010.msn-tlc' (head f3998422a4724ab424e4e2328f58fc0504856557)
author | masca@cpw.pidgin.im |
---|---|
date | Mon, 19 Jul 2010 21:11:32 +0000 |
parents | c7fa7c7aca7d |
children | 2d00d29a45fd |
line wrap: on
line diff
--- a/libpurple/protocols/msn/directconn.c Mon Jul 19 18:25:47 2010 +0000 +++ b/libpurple/protocols/msn/directconn.c Mon Jul 19 21:11:32 2010 +0000 @@ -21,30 +21,20 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA */ + +#include "internal.h" +#include "cipher.h" +#include "debug.h" + #include "msn.h" #include "directconn.h" #include "slp.h" #include "slpmsg.h" +#include "p2p.h" -#pragma pack(push,1) -typedef struct { - guint32 session_id; - guint32 seq_id; - guint64 offset; - guint64 total_size; - guint32 length; - guint32 flags; - guint32 ack_id; - guint32 ack_uid; - guint64 ack_size; -/* guint8 body[1]; */ -} MsnDcContext; -#pragma pack(pop) - -#define DC_PACKET_HEADER_SIZE sizeof(MsnDcContext) #define DC_MAX_BODY_SIZE 8*1024 -#define DC_MAX_PACKET_SIZE (DC_PACKET_HEADER_SIZE + DC_MAX_BODY_SIZE) +#define DC_MAX_PACKET_SIZE (P2P_PACKET_HEADER_SIZE + DC_MAX_BODY_SIZE) static void msn_dc_calculate_nonce_hash(MsnDirectConnNonceType type, @@ -121,8 +111,12 @@ { g_free(p->data); +#if 0 if (p->msg) msn_message_unref(p->msg); +#endif + if (p->part) + msn_slpmsgpart_unref(p->part); g_free(p); } @@ -191,7 +185,7 @@ if (slplink) { slplink->dc = NULL; if (slplink->swboard == NULL) - msn_slplink_destroy(slplink); + msn_slplink_unref(slplink); } g_free(dc->msg_body); @@ -353,7 +347,7 @@ if (queue) { while (!g_queue_is_empty(queue)) { MsnDirectConnPacket *p = g_queue_pop_head(queue); - msn_slplink_send_msg(slplink, p->msg); + msn_slplink_send_msgpart(slplink, (MsnSlpMessage*)p->part->ack_data); msn_dc_destroy_packet(p); } g_queue_free(queue); @@ -363,51 +357,6 @@ } static void -msn_dc_parse_binary_header(MsnDirectConn *dc) -{ - MsnSlpHeader *h; - MsnDcContext *context; - - g_return_if_fail(dc != NULL); - - h = &dc->header; - /* Skip packet size */ - context = (MsnDcContext *)(dc->in_buffer + 4); - - h->session_id = GUINT32_FROM_LE(context->session_id); - h->id = GUINT32_FROM_LE(context->seq_id); - h->offset = GUINT64_FROM_LE(context->offset); - h->total_size = GUINT64_FROM_LE(context->total_size); - h->length = GUINT32_FROM_LE(context->length); - h->flags = GUINT32_FROM_LE(context->flags); - h->ack_id = GUINT32_FROM_LE(context->ack_id); - h->ack_sub_id = GUINT32_FROM_LE(context->ack_uid); - h->ack_size = GUINT64_FROM_LE(context->ack_size); -} - -static const gchar * -msn_dc_serialize_binary_header(MsnDirectConn *dc) { - MsnSlpHeader *h; - static MsnDcContext bin_header; - - g_return_val_if_fail(dc != NULL, NULL); - - h = &dc->header; - - bin_header.session_id = GUINT32_TO_LE(h->session_id); - bin_header.seq_id = GUINT32_TO_LE(h->id); - bin_header.offset = GUINT64_TO_LE(h->offset); - bin_header.total_size = GUINT64_TO_LE(h->total_size); - bin_header.length = GUINT32_TO_LE(h->length); - bin_header.flags = GUINT32_TO_LE(h->flags); - bin_header.ack_id = GUINT32_TO_LE(h->ack_id); - bin_header.ack_uid = GUINT32_TO_LE(h->ack_sub_id); - bin_header.ack_size = GUINT64_TO_LE(h->ack_size); - - return (const gchar *)&bin_header; -} - -static void msn_dc_send_cb(gpointer data, gint fd, PurpleInputCondition cond) { MsnDirectConn *dc = data; @@ -502,10 +451,11 @@ { const gchar *h; - h = msn_dc_serialize_binary_header(dc); - memcpy(p->data, h, DC_PACKET_HEADER_SIZE); + h = (gchar*) msn_p2p_header_to_wire(&dc->header); - memcpy(p->data + offsetof(MsnDcContext, ack_id), dc->nonce, 16); + memcpy(p->data, h, P2P_PACKET_HEADER_SIZE); + + memcpy(p->data + offsetof(MsnP2PHeader, ack_id), dc->nonce, 16); msn_dc_enqueue_packet(dc, p); } @@ -515,7 +465,7 @@ { MsnDirectConnPacket *p; - p = msn_dc_new_packet(DC_PACKET_HEADER_SIZE); + p = msn_dc_new_packet(P2P_PACKET_HEADER_SIZE); dc->header.session_id = 0; dc->header.id = dc->slpcall->slplink->slp_seq_id++; @@ -532,7 +482,7 @@ { MsnDirectConnPacket *p; - p = msn_dc_new_packet(DC_PACKET_HEADER_SIZE); + p = msn_dc_new_packet(P2P_PACKET_HEADER_SIZE); dc->header.id = dc->slpcall->slplink->slp_seq_id++; dc->header.length = 0; @@ -546,10 +496,10 @@ guchar nonce[16]; gchar nonce_hash[37]; - if (packet_length != DC_PACKET_HEADER_SIZE) + if (packet_length != P2P_PACKET_HEADER_SIZE) return FALSE; - memcpy(nonce, dc->in_buffer + 4 + offsetof(MsnDcContext, ack_id), 16); + memcpy(nonce, dc->in_buffer + 4 + offsetof(MsnP2PHeader, ack_id), 16); if (dc->nonce_type == DC_NONCE_PLAIN) { if (memcmp(dc->nonce, nonce, 16) == 0) { @@ -589,6 +539,14 @@ static void msn_dc_send_packet_cb(MsnDirectConnPacket *p) { + if (p->part != NULL && p->part->ack_cb != NULL) + p->part->ack_cb(p->part, p->part->ack_data); +} + +#if 0 +static void +msn_dc_send_packet_cb(MsnDirectConnPacket *p) +{ if (p->msg != NULL && p->msg->ack_cb != NULL) p->msg->ack_cb(p->msg, p->msg->ack_data); } @@ -599,17 +557,36 @@ MsnDirectConnPacket *p; guint32 length; - length = msg->body_len + DC_PACKET_HEADER_SIZE; + length = msg->body_len + P2P_PACKET_HEADER_SIZE; p = msn_dc_new_packet(length); - memcpy(p->data, &msg->msnslp_header, DC_PACKET_HEADER_SIZE); - memcpy(p->data + DC_PACKET_HEADER_SIZE, msg->body, msg->body_len); + memcpy(p->data, msg->slpmsg->header, P2P_PACKET_HEADER_SIZE); + memcpy(p->data + P2P_PACKET_HEADER_SIZE, msg->body, msg->body_len); p->sent_cb = msn_dc_send_packet_cb; p->msg = msn_message_ref(msg); msn_dc_enqueue_packet(dc, p); } +#endif + +void +msn_dc_enqueue_part(MsnDirectConn *dc, MsnSlpMessagePart *part) +{ + MsnDirectConnPacket *p; + guint32 length; + + length = part->size + P2P_PACKET_HEADER_SIZE; + p = msn_dc_new_packet(length); + + memcpy(p->data, part->header, P2P_PACKET_HEADER_SIZE); + memcpy(p->data + P2P_PACKET_HEADER_SIZE, part->buffer, part->size); + + p->sent_cb = msn_dc_send_packet_cb; + p->part = part; + + msn_dc_enqueue_packet(dc, p); +} static int msn_dc_process_packet(MsnDirectConn *dc, guint32 packet_length) @@ -653,7 +630,7 @@ msn_slplink_process_msg( dc->slplink, &dc->header, - dc->in_buffer + 4 + DC_PACKET_HEADER_SIZE, + dc->in_buffer + 4 + P2P_PACKET_HEADER_SIZE, dc->header.length ); @@ -727,7 +704,15 @@ return; if (dc->state != DC_STATE_FOO) { - msn_dc_parse_binary_header(dc); + MsnP2PHeader *context; + MsnP2PHeader *h; + + /* Skip packet size */ + context = (MsnP2PHeader *)(dc->in_buffer + 4); + + h = msn_p2p_header_from_wire(context); + memcpy(&dc->header, h, P2P_PACKET_HEADER_SIZE); + g_free(h); } switch (msn_dc_process_packet(dc, packet_length)) {