--- a/libpurple/protocols/msn/p2p.c Thu Jan 20 06:41:34 2011 +0000 +++ b/libpurple/protocols/msn/p2p.c Thu Jan 20 06:43:45 2011 +0000 @@ -27,12 +27,32 @@ #include "p2p.h" #include "msnutils.h" -MsnP2PHeader * -msn_p2p_header_from_wire(const char *wire) +MsnP2PInfo * +msn_p2p_info_new(void) +{ + return g_new0(MsnP2PInfo, 1); +} + +MsnP2PInfo * +msn_p2p_info_dup(MsnP2PInfo *info) +{ + MsnP2PInfo *new_info = g_new0(MsnP2PInfo, 1); + *new_info = *info; + return new_info; +} + +void +msn_p2p_info_free(MsnP2PInfo *info) +{ + g_free(info); +} + +size_t +msn_p2p_header_from_wire(MsnP2PInfo *info, const char *wire) { MsnP2PHeader *header; - header = g_new(MsnP2PHeader, 1); + header = &info->header; header->session_id = msn_pop32le(wire); header->id = msn_pop32le(wire); @@ -44,15 +64,17 @@ header->ack_sub_id = msn_pop32le(wire); header->ack_size = msn_pop64le(wire); - return header; + return P2P_PACKET_HEADER_SIZE; } char * -msn_p2p_header_to_wire(MsnP2PHeader *header) +msn_p2p_header_to_wire(MsnP2PInfo *info, size_t *len) { + MsnP2PHeader *header; char *wire; char *tmp; + header = &info->header; tmp = wire = g_new(char, P2P_PACKET_HEADER_SIZE); msn_push32le(tmp, header->session_id); @@ -65,35 +87,58 @@ msn_push32le(tmp, header->ack_sub_id); msn_push64le(tmp, header->ack_size); + if (len) + *len = P2P_PACKET_HEADER_SIZE; + return wire; } -MsnP2PFooter * -msn_p2p_footer_from_wire(const char *wire) +size_t +msn_p2p_footer_from_wire(MsnP2PInfo *info, const char *wire) { MsnP2PFooter *footer; - footer = g_new(MsnP2PFooter, 1); + footer = &info->footer; footer->value = msn_pop32be(wire); - return footer; + return P2P_PACKET_FOOTER_SIZE; } char * -msn_p2p_footer_to_wire(MsnP2PFooter *footer) +msn_p2p_footer_to_wire(MsnP2PInfo *info, size_t *len) { + MsnP2PFooter *footer; char *wire; char *tmp; + footer = &info->footer; tmp = wire = g_new(char, P2P_PACKET_FOOTER_SIZE); msn_push32be(tmp, footer->value); + if (len) + *len = P2P_PACKET_FOOTER_SIZE; + return wire; } +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); + g_string_append_printf(str, "Footer: 0x%08X\r\n", info->footer.value); +} + gboolean msn_p2p_msg_is_data(const MsnP2PHeaderFlag flags) { @@ -102,3 +147,135 @@ flags == P2P_FILE_DATA); } +gboolean +msn_p2p_info_is_valid(MsnP2PInfo *info) +{ + return info->header.total_size >= info->header.length; +} + +gboolean +msn_p2p_info_is_final(MsnP2PInfo *info) +{ + return info->header.offset + info->header.length >= info->header.total_size; +} + +guint32 +msn_p2p_info_get_session_id(MsnP2PInfo *info) +{ + return info->header.session_id; +} + +guint32 +msn_p2p_info_get_id(MsnP2PInfo *info) +{ + return info->header.id; +} + +guint64 +msn_p2p_info_get_offset(MsnP2PInfo *info) +{ + return info->header.offset; +} + +guint64 +msn_p2p_info_get_total_size(MsnP2PInfo *info) +{ + return info->header.total_size; +} + +guint32 +msn_p2p_info_get_length(MsnP2PInfo *info) +{ + return info->header.length; +} + +guint32 +msn_p2p_info_get_flags(MsnP2PInfo *info) +{ + return info->header.flags; +} + +guint32 +msn_p2p_info_get_ack_id(MsnP2PInfo *info) +{ + return info->header.ack_id; +} + +guint32 +msn_p2p_info_get_ack_sub_id(MsnP2PInfo *info) +{ + return info->header.ack_sub_id; +} + +guint64 +msn_p2p_info_get_ack_size(MsnP2PInfo *info) +{ + return info->header.ack_size; +} + +guint32 +msn_p2p_info_get_app_id(MsnP2PInfo *info) +{ + return info->footer.value; +} + +void +msn_p2p_info_set_session_id(MsnP2PInfo *info, guint32 session_id) +{ + info->header.session_id = session_id; +} + +void +msn_p2p_info_set_id(MsnP2PInfo *info, guint32 id) +{ + info->header.id = id; +} + +void +msn_p2p_info_set_offset(MsnP2PInfo *info, guint64 offset) +{ + info->header.offset = offset; +} + +void +msn_p2p_info_set_total_size(MsnP2PInfo *info, guint64 total_size) +{ + info->header.total_size = total_size; +} + +void +msn_p2p_info_set_length(MsnP2PInfo *info, guint32 length) +{ + info->header.length = length; +} + +void +msn_p2p_info_set_flags(MsnP2PInfo *info, guint32 flags) +{ + info->header.flags = flags; +} + +void +msn_p2p_info_set_ack_id(MsnP2PInfo *info, guint32 ack_id) +{ + info->header.ack_id = ack_id; +} + +void +msn_p2p_info_set_ack_sub_id(MsnP2PInfo *info, guint32 ack_sub_id) +{ + info->header.ack_sub_id = ack_sub_id; +} + +void +msn_p2p_info_set_ack_size(MsnP2PInfo *info, guint64 ack_size) +{ + info->header.ack_size = ack_size; +} + +void +msn_p2p_info_set_app_id(MsnP2PInfo *info, guint32 app_id) +{ + info->footer.value = app_id; +} +