# HG changeset patch # User Elliott Sales de Andrade # Date 1304753387 0 # Node ID 968103d932d6bfb868907f56ec1abe0ecdf4648e # Parent c714ccbcdf00155b6db0843832cf4f2b377b6033 Add P2Pv2 ack'ing. diff -r c714ccbcdf00 -r 968103d932d6 libpurple/protocols/msn/p2p.c --- a/libpurple/protocols/msn/p2p.c Sat May 07 07:28:05 2011 +0000 +++ b/libpurple/protocols/msn/p2p.c Sat May 07 07:29:47 2011 +0000 @@ -362,6 +362,51 @@ return final; } +void +msn_p2p_info_create_ack(MsnP2PInfo *old_info, MsnP2PInfo *new_info) +{ + switch (old_info->version) { + case MSN_P2P_VERSION_ONE: { + MsnP2PHeader *old = &old_info->header.v1; + MsnP2PHeader *new = &new_info->header.v1; + + new->session_id = old->session_id; + new->flags = P2P_ACK; + new->ack_id = old->id; + new->ack_sub_id = old->ack_id; + new->ack_size = old->total_size; + break; + } + + case MSN_P2P_VERSION_TWO: { + MsnP2Pv2Header *old = &old_info->header.v2; + MsnP2Pv2Header *new = &new_info->header.v2; + + msn_tlvlist_add_32(&new->header_tlv, P2P_TLV_TYPE_ACK, old->base_id + old->message_len); + new->opcode = P2P_OPCODE_NONE; + + if (old->message_len > 0) { + if (!msn_tlv_gettlv(old->header_tlv, P2P_TLV_TYPE_ACK, 1)) { + if (old->opcode & P2P_OPCODE_SYN) { + msn_tlv_t *ack_tlv; + new->opcode |= P2P_OPCODE_RAK; + + ack_tlv = msn_tlv_gettlv(old->header_tlv, P2P_TLV_TYPE_PEER_INFO, 1); + if (ack_tlv) { + msn_tlvlist_add_tlv(&new->header_tlv, ack_tlv); + new->opcode |= P2P_OPCODE_SYN; + } + } + } + } + break; + } + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", old_info->version); + } +} + guint32 msn_p2p_info_get_session_id(MsnP2PInfo *info) { diff -r c714ccbcdf00 -r 968103d932d6 libpurple/protocols/msn/p2p.h --- a/libpurple/protocols/msn/p2p.h Sat May 07 07:28:05 2011 +0000 +++ b/libpurple/protocols/msn/p2p.h Sat May 07 07:29:47 2011 +0000 @@ -191,6 +191,9 @@ gboolean msn_p2p_info_is_final(MsnP2PInfo *info); +void +msn_p2p_info_create_ack(MsnP2PInfo *old_info, MsnP2PInfo *new_info); + guint32 msn_p2p_info_get_session_id(MsnP2PInfo *info); diff -r c714ccbcdf00 -r 968103d932d6 libpurple/protocols/msn/slpmsg.c --- a/libpurple/protocols/msn/slpmsg.c Sat May 07 07:28:05 2011 +0000 +++ b/libpurple/protocols/msn/slpmsg.c Sat May 07 07:29:47 2011 +0000 @@ -206,12 +206,8 @@ slpmsg = msn_slpmsg_new(NULL); new_info = slpmsg->p2p_info; - msn_p2p_info_set_session_id(new_info, msn_p2p_info_get_session_id(ack_info)); + msn_p2p_info_create_ack(ack_info, new_info); slpmsg->size = msn_p2p_info_get_total_size(ack_info); - msn_p2p_info_set_flags(new_info, P2P_ACK); - msn_p2p_info_set_ack_id(new_info, msn_p2p_info_get_id(ack_info)); - msn_p2p_info_set_ack_sub_id(new_info, msn_p2p_info_get_ack_id(ack_info)); - msn_p2p_info_set_ack_size(new_info, msn_p2p_info_get_total_size(ack_info)); slpmsg->info = "SLP ACK"; return slpmsg;