# HG changeset patch # User Elliott Sales de Andrade # Date 1298852369 0 # Node ID 9562a7baa9e48cdf4143c9c5740e8fe194007ef0 # Parent cdbca568eaf3241fc5b81d8623c45e2bec9c680c Add P2Pv2 header information to the P2P info struct. Of course, all the v2 stuff does nothing right now. diff -r cdbca568eaf3 -r 9562a7baa9e4 libpurple/protocols/msn/p2p.c --- a/libpurple/protocols/msn/p2p.c Mon Feb 28 00:12:20 2011 +0000 +++ b/libpurple/protocols/msn/p2p.c Mon Feb 28 00:19:29 2011 +0000 @@ -23,72 +23,139 @@ */ #include "internal.h" +#include "debug.h" #include "p2p.h" #include "msnutils.h" MsnP2PInfo * -msn_p2p_info_new(void) +msn_p2p_info_new(MsnP2PVersion version) { - return g_new0(MsnP2PInfo, 1); + MsnP2PInfo *info = g_new0(MsnP2PInfo, 1); + info->version = version; + + switch (version) { + case MSN_P2P_VERSION_ONE: + case MSN_P2P_VERSION_TWO: + /* Nothing to do */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", version); + g_free(info); + info = NULL; + } + + return info; } MsnP2PInfo * msn_p2p_info_dup(MsnP2PInfo *info) { MsnP2PInfo *new_info = g_new0(MsnP2PInfo, 1); - *new_info = *info; + + new_info->version = info->version; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + case MSN_P2P_VERSION_TWO: + *new_info = *info; + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + g_free(new_info); + new_info = NULL; + } + return new_info; } void msn_p2p_info_free(MsnP2PInfo *info) { + switch (info->version) { + case MSN_P2P_VERSION_ONE: + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + g_free(info); } size_t msn_p2p_header_from_wire(MsnP2PInfo *info, const char *wire) { - MsnP2PHeader *header; + size_t len; - header = &info->header; + switch (info->version) { + case MSN_P2P_VERSION_ONE: { + MsnP2PHeader *header = &info->header.v1; - header->session_id = msn_pop32le(wire); - header->id = msn_pop32le(wire); - header->offset = msn_pop64le(wire); - header->total_size = msn_pop64le(wire); - header->length = msn_pop32le(wire); - header->flags = msn_pop32le(wire); - header->ack_id = msn_pop32le(wire); - header->ack_sub_id = msn_pop32le(wire); - header->ack_size = msn_pop64le(wire); + header->session_id = msn_pop32le(wire); + header->id = msn_pop32le(wire); + header->offset = msn_pop64le(wire); + header->total_size = msn_pop64le(wire); + header->length = msn_pop32le(wire); + header->flags = msn_pop32le(wire); + header->ack_id = msn_pop32le(wire); + header->ack_sub_id = msn_pop32le(wire); + header->ack_size = msn_pop64le(wire); - return P2P_PACKET_HEADER_SIZE; + len = P2P_PACKET_HEADER_SIZE; + break; + } + + case MSN_P2P_VERSION_TWO: + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return len; } char * msn_p2p_header_to_wire(MsnP2PInfo *info, size_t *len) { - MsnP2PHeader *header; - char *wire; + char *wire = NULL; char *tmp; - header = &info->header; - tmp = wire = g_new(char, P2P_PACKET_HEADER_SIZE); + switch (info->version) { + case MSN_P2P_VERSION_ONE: { + MsnP2PHeader *header = &info->header.v1; + tmp = wire = g_new(char, P2P_PACKET_HEADER_SIZE); + + msn_push32le(tmp, header->session_id); + msn_push32le(tmp, header->id); + msn_push64le(tmp, header->offset); + msn_push64le(tmp, header->total_size); + msn_push32le(tmp, header->length); + msn_push32le(tmp, header->flags); + msn_push32le(tmp, header->ack_id); + msn_push32le(tmp, header->ack_sub_id); + msn_push64le(tmp, header->ack_size); - msn_push32le(tmp, header->session_id); - msn_push32le(tmp, header->id); - msn_push64le(tmp, header->offset); - msn_push64le(tmp, header->total_size); - msn_push32le(tmp, header->length); - msn_push32le(tmp, header->flags); - msn_push32le(tmp, header->ack_id); - msn_push32le(tmp, header->ack_sub_id); - msn_push64le(tmp, header->ack_size); + if (len) + *len = P2P_PACKET_HEADER_SIZE; + + break; + } - if (len) - *len = P2P_PACKET_HEADER_SIZE; + case MSN_P2P_VERSION_TWO: + if (len) + *len = 0; + + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } return wire; @@ -127,15 +194,30 @@ void msn_p2p_info_to_string(MsnP2PInfo *info, GString *str) { - g_string_append_printf(str, "Session ID: %u\r\n", info->header.session_id); - g_string_append_printf(str, "ID: %u\r\n", info->header.id); - g_string_append_printf(str, "Offset: %" G_GUINT64_FORMAT "\r\n", info->header.offset); - g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", info->header.total_size); - g_string_append_printf(str, "Length: %u\r\n", info->header.length); - g_string_append_printf(str, "Flags: 0x%x\r\n", info->header.flags); - g_string_append_printf(str, "ACK ID: %u\r\n", info->header.ack_id); - g_string_append_printf(str, "SUB ID: %u\r\n", info->header.ack_sub_id); - g_string_append_printf(str, "ACK Size: %" G_GUINT64_FORMAT "\r\n", info->header.ack_size); + switch (info->version) { + case MSN_P2P_VERSION_ONE: { + MsnP2PHeader *header = &info->header.v1; + g_string_append_printf(str, "Session ID: %u\r\n", header->session_id); + g_string_append_printf(str, "ID: %u\r\n", header->id); + g_string_append_printf(str, "Offset: %" G_GUINT64_FORMAT "\r\n", header->offset); + g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", header->total_size); + g_string_append_printf(str, "Length: %u\r\n", header->length); + g_string_append_printf(str, "Flags: 0x%x\r\n", header->flags); + g_string_append_printf(str, "ACK ID: %u\r\n", header->ack_id); + g_string_append_printf(str, "SUB ID: %u\r\n", header->ack_sub_id); + g_string_append_printf(str, "ACK Size: %" G_GUINT64_FORMAT "\r\n", header->ack_size); + + break; + } + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + g_string_append_printf(str, "Footer: 0x%08X\r\n", info->footer.value); } @@ -150,67 +232,232 @@ gboolean msn_p2p_info_is_valid(MsnP2PInfo *info) { - return info->header.total_size >= info->header.length; + gboolean valid = FALSE; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + valid = info->header.v1.total_size >= info->header.v1.length; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return valid; } gboolean msn_p2p_info_is_final(MsnP2PInfo *info) { - return info->header.offset + info->header.length >= info->header.total_size; + gboolean final = FALSE; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + final = info->header.v1.offset + info->header.v1.length >= info->header.v1.total_size; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return final; } guint32 msn_p2p_info_get_session_id(MsnP2PInfo *info) { - return info->header.session_id; + guint32 session_id = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + session_id = info->header.v1.session_id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return session_id; } guint32 msn_p2p_info_get_id(MsnP2PInfo *info) { - return info->header.id; + guint32 id = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + id = info->header.v1.id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return id; } guint64 msn_p2p_info_get_offset(MsnP2PInfo *info) { - return info->header.offset; + guint64 offset = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + offset = info->header.v1.offset; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return offset; } guint64 msn_p2p_info_get_total_size(MsnP2PInfo *info) { - return info->header.total_size; + guint64 total_size = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + total_size = info->header.v1.total_size; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return total_size; } guint32 msn_p2p_info_get_length(MsnP2PInfo *info) { - return info->header.length; + guint32 length = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + length = info->header.v1.length; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return length; } guint32 msn_p2p_info_get_flags(MsnP2PInfo *info) { - return info->header.flags; + guint32 flags = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + flags = info->header.v1.flags; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return flags; } guint32 msn_p2p_info_get_ack_id(MsnP2PInfo *info) { - return info->header.ack_id; + guint32 ack_id = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + ack_id = info->header.v1.ack_id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return ack_id; } guint32 msn_p2p_info_get_ack_sub_id(MsnP2PInfo *info) { - return info->header.ack_sub_id; + guint32 ack_sub_id = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + ack_sub_id = info->header.v1.ack_sub_id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return ack_sub_id; } guint64 msn_p2p_info_get_ack_size(MsnP2PInfo *info) { - return info->header.ack_size; + guint64 ack_size = 0; + + switch (info->version) { + case MSN_P2P_VERSION_ONE: + ack_size = info->header.v1.ack_size; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + + return ack_size; } guint32 @@ -222,55 +469,156 @@ void msn_p2p_info_set_session_id(MsnP2PInfo *info, guint32 session_id) { - info->header.session_id = session_id; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.session_id = session_id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + } void msn_p2p_info_set_id(MsnP2PInfo *info, guint32 id) { - info->header.id = id; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.id = id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } + } void msn_p2p_info_set_offset(MsnP2PInfo *info, guint64 offset) { - info->header.offset = offset; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.offset = offset; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void msn_p2p_info_set_total_size(MsnP2PInfo *info, guint64 total_size) { - info->header.total_size = total_size; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.total_size = total_size; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void msn_p2p_info_set_length(MsnP2PInfo *info, guint32 length) { - info->header.length = length; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.length = length; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void msn_p2p_info_set_flags(MsnP2PInfo *info, guint32 flags) { - info->header.flags = flags; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.flags = flags; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void msn_p2p_info_set_ack_id(MsnP2PInfo *info, guint32 ack_id) { - info->header.ack_id = ack_id; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.ack_id = ack_id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void msn_p2p_info_set_ack_sub_id(MsnP2PInfo *info, guint32 ack_sub_id) { - info->header.ack_sub_id = ack_sub_id; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.ack_sub_id = ack_sub_id; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void msn_p2p_info_set_ack_size(MsnP2PInfo *info, guint64 ack_size) { - info->header.ack_size = ack_size; + switch (info->version) { + case MSN_P2P_VERSION_ONE: + info->header.v1.ack_size = ack_size; + break; + + case MSN_P2P_VERSION_TWO: + /* Nothing to do! */ + break; + + default: + purple_debug_error("msn", "Invalid P2P Info version: %d\n", info->version); + } } void diff -r cdbca568eaf3 -r 9562a7baa9e4 libpurple/protocols/msn/p2p.h --- a/libpurple/protocols/msn/p2p.h Mon Feb 28 00:12:20 2011 +0000 +++ b/libpurple/protocols/msn/p2p.h Mon Feb 28 00:19:29 2011 +0000 @@ -58,8 +58,18 @@ } MsnP2PFooter; #define P2P_PACKET_FOOTER_SIZE (1 * 4) +typedef enum +{ + MSN_P2P_VERSION_ONE = 0, + MSN_P2P_VERSION_TWO = 1, +} MsnP2PVersion; + typedef struct { - MsnP2PHeader header; + MsnP2PVersion version; + union { + MsnP2PHeader v1; + MsnP2Pv2Header v2; + } header; MsnP2PFooter footer; } MsnP2PInfo; @@ -94,7 +104,7 @@ } MsnP2PAppId; MsnP2PInfo * -msn_p2p_info_new(void); +msn_p2p_info_new(MsnP2PVersion version); MsnP2PInfo * msn_p2p_info_dup(MsnP2PInfo *info); diff -r cdbca568eaf3 -r 9562a7baa9e4 libpurple/protocols/msn/slpmsg.c --- a/libpurple/protocols/msn/slpmsg.c Mon Feb 28 00:12:20 2011 +0000 +++ b/libpurple/protocols/msn/slpmsg.c Mon Feb 28 00:19:29 2011 +0000 @@ -48,7 +48,7 @@ else slpmsg->slplink = NULL; - slpmsg->p2p_info = msn_p2p_info_new(); + slpmsg->p2p_info = msn_p2p_info_new(MSN_P2P_VERSION_ONE); return slpmsg; } diff -r cdbca568eaf3 -r 9562a7baa9e4 libpurple/protocols/msn/slpmsg_part.c --- a/libpurple/protocols/msn/slpmsg_part.c Mon Feb 28 00:12:20 2011 +0000 +++ b/libpurple/protocols/msn/slpmsg_part.c Mon Feb 28 00:19:29 2011 +0000 @@ -54,7 +54,7 @@ } part = msn_slpmsgpart_new(NULL); - part->info = msn_p2p_info_new(); + part->info = msn_p2p_info_new(MSN_P2P_VERSION_ONE); /* Extract the binary SLP header */ len = msn_p2p_header_from_wire(part->info, data);