--- a/libpurple/protocols/msn/p2p.c Sat May 07 07:49:25 2011 +0000
+++ b/libpurple/protocols/msn/p2p.c Sat May 07 08:43:31 2011 +0000
@@ -313,11 +313,28 @@
-msn_p2p_msg_is_data(const MsnP2PHeaderFlag flags)
+msn_p2p_msg_is_data(const MsnP2PInfo *info) - return (flags == P2P_MSN_OBJ_DATA ||
- flags == (P2P_WLM2009_COMP | P2P_MSN_OBJ_DATA) ||
- flags == P2P_FILE_DATA);
+ switch (info->version) { + case MSN_P2P_VERSION_ONE: { + guint32 flags = info->header.v1.flags; + data = (flags == P2P_MSN_OBJ_DATA || + flags == (P2P_WLM2009_COMP | P2P_MSN_OBJ_DATA) || + flags == P2P_FILE_DATA); + case MSN_P2P_VERSION_TWO: + data = info->header.v2.message_len > 0; + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); @@ -417,7 +434,7 @@
guint32 flags = msn_p2p_info_get_flags(info);
ret = flags == P2P_NO_FLAG || flags == P2P_WLM2009_COMP ||
- msn_p2p_msg_is_data(flags);
+ msn_p2p_msg_is_data(info); @@ -432,6 +449,46 @@
+msn_p2p_info_is_ack(MsnP2PInfo *info) + switch (info->version) { + case MSN_P2P_VERSION_ONE: { + ret = msn_p2p_info_get_flags(info) == P2P_ACK; + case MSN_P2P_VERSION_TWO: + ret = msn_tlv_gettlv(info->header.v2.header_tlv, P2P_TLV_TYPE_ACK, 1) != NULL; + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); +msn_p2p_info_init_first(MsnP2PInfo *info, MsnP2PInfo *old_info) + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.session_id = old_info->header.v1.session_id; + info->header.v1.flags = old_info->header.v1.flags; + case MSN_P2P_VERSION_TWO: + info->header.v2.data_tf = TF_FIRST; + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); msn_p2p_info_get_session_id(MsnP2PInfo *info)
@@ -548,7 +605,7 @@
case MSN_P2P_VERSION_TWO:
+ flags = info->header.v2.data_tf; @@ -723,7 +780,7 @@
case MSN_P2P_VERSION_TWO:
+ info->header.v2.data_tf = flags; --- a/libpurple/protocols/msn/p2p.h Sat May 07 07:49:25 2011 +0000
+++ b/libpurple/protocols/msn/p2p.h Sat May 07 08:43:31 2011 +0000
@@ -183,7 +183,7 @@
msn_p2p_info_to_string(MsnP2PInfo *info, GString *str);
-msn_p2p_msg_is_data(const MsnP2PHeaderFlag flags);
+msn_p2p_msg_is_data(const MsnP2PInfo *info); msn_p2p_info_is_valid(MsnP2PInfo *info);
@@ -197,6 +197,12 @@
msn_p2p_info_require_ack(MsnP2PInfo *info);
+msn_p2p_info_is_ack(MsnP2PInfo *info); +msn_p2p_info_init_first(MsnP2PInfo *new_info, MsnP2PInfo *old_info); msn_p2p_info_get_session_id(MsnP2PInfo *info);
--- a/libpurple/protocols/msn/slpcall.c Sat May 07 07:49:25 2011 +0000
+++ b/libpurple/protocols/msn/slpcall.c Sat May 07 08:43:31 2011 +0000
@@ -1130,7 +1130,7 @@
- else if (msn_p2p_msg_is_data(flags))
+ else if (msn_p2p_msg_is_data(slpmsg->p2p_info)) slpcall = msn_slplink_find_slp_call_with_session_id(slplink, session_id);
@@ -1147,7 +1147,7 @@
- else if (flags == P2P_ACK)
+ else if (msn_p2p_info_is_ack(slpmsg->p2p_info)) /* Acknowledgement of previous message. Don't do anything currently. */
--- a/libpurple/protocols/msn/slplink.c Sat May 07 07:49:25 2011 +0000
+++ b/libpurple/protocols/msn/slplink.c Sat May 07 08:43:31 2011 +0000
@@ -292,7 +292,7 @@
part = msn_slpmsgpart_new(msn_p2p_info_dup(info));
- real_size = (msn_p2p_info_get_flags(info) == P2P_ACK) ? 0 : slpmsg->size;
+ real_size = msn_p2p_info_is_ack(info) ? 0 : slpmsg->size; offset = msn_p2p_info_get_offset(info);
@@ -330,8 +330,7 @@
msn_slplink_send_part(slplink, part);
- if (msn_p2p_msg_is_data(msn_p2p_info_get_flags(info)) &&
- (slpmsg->slpcall != NULL))
+ if (msn_p2p_msg_is_data(info) && slpmsg->slpcall != NULL) slpmsg->slpcall->progress = TRUE;
@@ -358,7 +357,7 @@
msn_p2p_info_set_ack_id(info, rand() % 0xFFFFFF00);
- else if (msn_p2p_msg_is_data(flags))
+ else if (msn_p2p_msg_is_data(info)) slpcall = slpmsg->slpcall;
@@ -447,22 +446,19 @@
slpmsg = msn_slpmsg_new(slplink);
slpmsg->id = msn_p2p_info_get_id(info);
session_id = msn_p2p_info_get_session_id(info);
- msn_p2p_info_set_session_id(slpmsg->p2p_info, session_id);
slpmsg->size = msn_p2p_info_get_total_size(info);
- flags = msn_p2p_info_get_flags(info);
- msn_p2p_info_set_flags(slpmsg->p2p_info, flags);
+ msn_p2p_info_init_first(slpmsg->p2p_info, info); slpmsg->slpcall = msn_slplink_find_slp_call_with_session_id(slplink, session_id);
if (slpmsg->slpcall != NULL)
- if (msn_p2p_msg_is_data(flags))
+ if (msn_p2p_msg_is_data(info)) PurpleXfer *xfer = slpmsg->slpcall->xfer;
@@ -601,8 +597,7 @@
slpmsg_add_part(slpmsg, part);
- if (msn_p2p_msg_is_data(msn_p2p_info_get_flags(slpmsg->p2p_info)) &&
- (slpmsg->slpcall != NULL))
+ if (msn_p2p_msg_is_data(slpmsg->p2p_info) && slpmsg->slpcall != NULL) slpmsg->slpcall->progress = TRUE;
--- a/libpurple/protocols/msn/slpmsg_part.c Sat May 07 07:49:25 2011 +0000
+++ b/libpurple/protocols/msn/slpmsg_part.c Sat May 07 08:43:31 2011 +0000
@@ -175,7 +175,7 @@
- real_size = (msn_p2p_info_get_flags(slpmsg->p2p_info) == P2P_ACK) ? 0 : slpmsg->size;
+ real_size = msn_p2p_info_is_ack(slpmsg->p2p_info) ? 0 : slpmsg->size; offset = msn_p2p_info_get_offset(slpmsg->p2p_info);
offset += msn_p2p_info_get_length(part->info);
@@ -197,7 +197,7 @@
/* The whole message has been sent */
- if (msn_p2p_msg_is_data(msn_p2p_info_get_flags(slpmsg->p2p_info)))
+ if (msn_p2p_msg_is_data(slpmsg->p2p_info)) if (slpmsg->slpcall != NULL)