--- 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 @@ } gboolean -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); + gboolean data = FALSE; + + 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); + break; + } + + case MSN_P2P_VERSION_TWO: + data = info->header.v2.message_len > 0; + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return data; } gboolean @@ -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); break; } @@ -432,6 +449,46 @@ return ret; } +gboolean +msn_p2p_info_is_ack(MsnP2PInfo *info) +{ + gboolean ret = FALSE; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: { + ret = msn_p2p_info_get_flags(info) == P2P_ACK; + break; + } + + case MSN_P2P_VERSION_TWO: + ret = msn_tlv_gettlv(info->header.v2.header_tlv, P2P_TLV_TYPE_ACK, 1) != NULL; + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return ret; +} + +void +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; + break; + + case MSN_P2P_VERSION_TWO: + info->header.v2.data_tf = TF_FIRST; + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } +} + guint32 msn_p2p_info_get_session_id(MsnP2PInfo *info) { @@ -548,7 +605,7 @@ break; case MSN_P2P_VERSION_TWO: - /* Nothing to do! */ + flags = info->header.v2.data_tf; break; default: @@ -723,7 +780,7 @@ break; case MSN_P2P_VERSION_TWO: - /* Nothing to do! */ + info->header.v2.data_tf = flags; break; default: