Mercurial > pidgin.yaz
diff src/protocols/msn/msg.c @ 6701:b7e113a59b51
[gaim-migrate @ 7227]
Updated to MSN Protocol 9.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Tue, 02 Sep 2003 04:32:16 +0000 |
parents | 29fef9695c4d |
children | cebd49f42b56 |
line wrap: on
line diff
--- a/src/protocols/msn/msg.c Tue Sep 02 04:28:34 2003 +0000 +++ b/src/protocols/msn/msg.c Tue Sep 02 04:32:16 2003 +0000 @@ -4,7 +4,7 @@ * gaim * * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -72,7 +72,7 @@ msn_message_new_from_str(MsnSession *session, const char *str) { MsnMessage *msg; - char *tmp_base, *tmp, *field1, *field2, *c; + char *tmp_base, *msg_base, *tmp, *field1, *field2, *c; g_return_val_if_fail(str != NULL, NULL); g_return_val_if_fail(!g_ascii_strncasecmp(str, "MSG", 3), NULL); @@ -127,6 +127,8 @@ msg->flag = *field2; } + msg_base = tmp; + /* Back to the parsination. */ while (*tmp != '\r') { char *key, *value; @@ -164,7 +166,49 @@ tmp += 2; /* Now we *should* be at the body. */ - msn_message_set_body(msg, tmp); + if (!strcmp(msn_message_get_content_type(msg), "application/x-msnmsgrp2p")) + { + msn_message_set_body(msg, tmp); + } + else + { + char header[48]; + char footer[4]; + + msg->msnslp_message = TRUE; + + memcpy(header, tmp, 48); + + tmp += 48; + + msg->body = g_memdup(tmp, msg->size - (tmp - msg_base) + 1); + + tmp++; + + memcpy(footer, tmp, 4); + + /* Import the header. */ + memcpy(&msg->msnslp_header.session_id, tmp, 4); tmp += 4; + memcpy(&msg->msnslp_header.id, tmp, 4); tmp += 4; + memcpy(&msg->msnslp_header.offset, tmp, 4); tmp += 8; + memcpy(&msg->msnslp_header.total_size, tmp, 4); tmp += 8; + memcpy(&msg->msnslp_header.length, tmp, 4); tmp += 4; + memcpy(&msg->msnslp_header.flags, tmp, 4); tmp += 4; + memcpy(&msg->msnslp_header.prev_id, tmp, 4); tmp += 4; + memcpy(&msg->msnslp_header.prev_f9, tmp, 4); tmp += 4; + memcpy(&msg->msnslp_header.prev_total_size, tmp, 4); tmp += 8; + + /* Convert to the right endianness */ + msg->msnslp_header.session_id = ntohs(msg->msnslp_header.session_id); + msg->msnslp_header.id = ntohs(msg->msnslp_header.id); + msg->msnslp_header.length = ntohs(msg->msnslp_header.length); + msg->msnslp_header.flags = ntohs(msg->msnslp_header.flags); + msg->msnslp_header.prev_id = ntohs(msg->msnslp_header.prev_id); + msg->msnslp_header.prev_f9 = ntohs(msg->msnslp_header.prev_f9); + + /* Import the footer. */ + msg->msnslp_footer.app_id = (long)footer; + } g_free(tmp_base); @@ -303,9 +347,53 @@ g_strlcat(str, buf, len); } - g_snprintf(buf, sizeof(buf), "\r\n%s", msn_message_get_body(msg)); + if (msg->msnslp_message) + { + char *c; + char blank[4]; + int session_id, id, offset, total_size, length, flags; + int prev_id, prev_f9, prev_total_size; + + memcpy(blank, 0, 4); + + c = str + strlen(str); + + session_id = htons(msg->msnslp_header.session_id); + id = htons(msg->msnslp_header.id); + offset = htons(msg->msnslp_header.offset); + total_size = htons(msg->msnslp_header.total_size); + length = htons(msg->msnslp_header.length); + flags = htons(msg->msnslp_header.flags); + prev_id = htons(msg->msnslp_header.prev_id); + prev_f9 = htons(msg->msnslp_header.prev_f9); + prev_total_size = htons(msg->msnslp_header.prev_total_size); - g_strlcat(str, buf, len); + memcpy(c, &session_id, 4); c += 4; + memcpy(c, &id, 4); c += 4; + memcpy(c, &offset, 4); c += 4; + memcpy(c, blank, 4); c += 4; + memcpy(c, &total_size, 4); c += 4; + memcpy(c, blank, 4); c += 4; + memcpy(c, &length, 4); c += 4; + memcpy(c, &flags, 4); c += 4; + memcpy(c, &prev_id, 4); c += 4; + memcpy(c, &prev_f9, 4); c += 4; + memcpy(c, &prev_total_size, 4); c += 4; + memcpy(c, blank, 4); c += 4; + + strncpy(c, msn_message_get_body(msg), len); + + c += strlen(msn_message_get_body(msg)); + + memcpy(c, blank, 1); c++; + memcpy(c, &msg->msnslp_footer.app_id, 4); c += 4; + } + else + { + g_snprintf(buf, sizeof(buf), "\r\n%s", msn_message_get_body(msg)); + + g_strlcat(str, buf, len); + } if (msg->size != strlen(msg_start)) { gaim_debug(GAIM_DEBUG_ERROR, "msn",