Mercurial > pidgin
diff src/protocols/msn/msg.c @ 8646:1e211dde3cae
[gaim-migrate @ 9398]
Added a patch by shx to clean up the message-handling code and split the
command stuff from it, among a few other things. Also, I fixed a crash in
message parsing, which I think may close a couple bug reports.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Tue, 13 Apr 2004 04:08:22 +0000 |
parents | 06f57183e29f |
children | d16e1bfaf08a |
line wrap: on
line diff
--- a/src/protocols/msn/msg.c Tue Apr 13 03:53:37 2004 +0000 +++ b/src/protocols/msn/msg.c Tue Apr 13 04:08:22 2004 +0000 @@ -130,86 +130,22 @@ return msg; } -MsnMessage * -msn_message_new_from_str(MsnSession *session, const char *str) +void +msn_message_parse_payload(MsnMessage *msg, const char *payload, + size_t payload_len) { - MsnMessage *msg; - char *command_header; - char *tmp_base, *msg_base, *tmp, *field1, *field2, *c; + char *tmp_base, *tmp, *c; const char *content_type; - const char *c2; - - g_return_val_if_fail(str != NULL, NULL); - g_return_val_if_fail(!g_ascii_strncasecmp(str, "MSG", 3), NULL); - - msg = msn_message_new(); - - /* Clear out the old stuff. */ - msn_message_set_attr(msg, "User-Agent", NULL); - msn_message_set_content_type(msg, NULL); - msn_message_set_charset(msg, NULL); - /* - * We need to grab the header and then the size, since this might have - * binary data. - */ - if ((c2 = strchr(str, '\r')) != NULL) - { - tmp = command_header = g_strndup(str, (c2 - str)); - - GET_NEXT(tmp); /* Skip MSG */ - field1 = tmp; - - GET_NEXT(tmp); /* Skip the passport or TID */ - field2 = tmp; - - GET_NEXT(tmp); /* Skip the username or flag */ - msg->size = atoi(tmp); - } - else - { - /* Kind of screwed :) This won't happen. */ - msn_message_destroy(msg); - - return NULL; - } - - tmp_base = g_malloc(msg->size + 1); - memcpy(tmp_base, c2 + 2, msg->size); - tmp_base[msg->size] = '\0'; + tmp_base = g_malloc(payload_len + 1); + memcpy(tmp_base, payload, payload_len); + tmp_base[payload_len] = '\0'; tmp = tmp_base; - /* - * We're going to make sure this is incoming by checking field1. - * If it has any non-numbers in it, it's incoming. Otherwise, outgoing. - */ - msg->incoming = FALSE; - - for (c = field1; *c != '\0'; c++) { - if (*c < '0' || *c > '9') { - msg->incoming = TRUE; - break; - } - } - - if (msg->incoming) { - msg->sender = msn_users_find_with_passport(session->users, field1); - - if (msg->sender == NULL) - msg->sender = msn_user_new(session, field1, field2); - else - msn_user_ref(msg->sender); - } - else { - msg->tid = atoi(field1); - msg->flag = *field2; - } - - msg_base = tmp; - /* Back to the parsination. */ - while (*tmp != '\r') { + while (*tmp != '\r') + { char *key, *value; key = tmp; @@ -223,11 +159,14 @@ if ((c = strchr(key, ':')) != NULL) *c = '\0'; - if (!g_ascii_strcasecmp(key, "Content-Type")) { + if (!g_ascii_strcasecmp(key, "Content-Type")) + { char *charset; - if ((c = strchr(value, ';')) != NULL) { - if ((charset = strchr(c, '=')) != NULL) { + if ((c = strchr(value, ';')) != NULL) + { + if ((charset = strchr(c, '=')) != NULL) + { charset++; msn_message_set_charset(msg, charset); } @@ -261,15 +200,18 @@ tmp += 48; - body_len = msg->size - (tmp - tmp_base) - 5; - msg->body = g_malloc(body_len + 1); + body_len = payload_len - (tmp - tmp_base) - 5; if (body_len > 0) + { + msg->body = g_malloc(body_len + 1); memcpy(msg->body, tmp, body_len); + msg->body[body_len] = '\0'; - msg->body[body_len] = '\0'; - - tmp++; + tmp++; + } + else + msg->body = NULL; memcpy(footer, tmp, 4); @@ -312,7 +254,7 @@ char *tmp2; size_t body_len; - body_len = msg->size - (tmp - tmp_base); + body_len = payload_len - (tmp - tmp_base); tmp2 = g_malloc(body_len + 1); @@ -326,12 +268,9 @@ g_free(tmp2); } - g_free(command_header); g_free(tmp_base); /* Done! */ - - return msg; } void @@ -339,18 +278,13 @@ { g_return_if_fail(msg != NULL); - if (msg->ref_count > 0) { + if (msg->ref_count > 0) + { msn_message_unref(msg); return; } - if (msg->sender != NULL) - msn_user_unref(msg->sender); - - if (msg->receiver != NULL) - msn_user_unref(msg->receiver); - if (msg->body != NULL) g_free(msg->body); @@ -400,10 +334,9 @@ } char * -msn_message_to_string(const MsnMessage *msg, size_t *ret_size) +msn_message_gen_payload(const MsnMessage *msg, size_t *ret_size) { GList *l; - char *msg_start; char *str; char buf[MSN_BUF_LEN]; int len; @@ -419,35 +352,20 @@ */ g_return_val_if_fail(msg != NULL, NULL); - if (msn_message_is_incoming(msg)) { - MsnUser *sender = msn_message_get_sender(msg); - - g_snprintf(buf, sizeof(buf), "MSG %s %s %d\r\n", - msn_user_get_passport(sender), msn_user_get_name(sender), - (int)msg->size); - } - else { - g_snprintf(buf, sizeof(buf), "MSG %d %c %d\r\n", - msn_message_get_transaction_id(msg), - msn_message_get_flag(msg), (int)msg->size); - } - - len = strlen(buf) + msg->size + 1; + len = msg->size + 1; str = g_new0(char, len + 1); - g_strlcpy(str, buf, len); - - msg_start = str + strlen(str); - /* Standard header. */ - if (msg->charset == NULL) { + if (msg->charset == NULL) + { g_snprintf(buf, sizeof(buf), "MIME-Version: 1.0\r\n" "Content-Type: %s\r\n", msg->content_type); } - else { + else + { g_snprintf(buf, sizeof(buf), "MIME-Version: 1.0\r\n" "Content-Type: %s; charset=%s\r\n", @@ -456,7 +374,8 @@ g_strlcat(str, buf, len); - for (l = msg->attr_list; l != NULL; l = l->next) { + for (l = msg->attr_list; l != NULL; l = l->next) + { const char *key = (char *)l->data; const char *value; @@ -522,7 +441,7 @@ if (body != NULL) { - g_strlcpy(c, body, msg->size - (c - msg_start)); + g_strlcpy(c, body, msg->size - (c - str)); c += strlen(body); @@ -533,11 +452,11 @@ c += msn_put32(c, msg->msnslp_footer.app_id); - if (msg->size != (c - msg_start)) + if (msg->size != (c - str)) { gaim_debug(GAIM_DEBUG_ERROR, "msn", "Outgoing message size (%d) and data length (%d) " - "do not match!\n", msg->size, (c - msg_start)); + "do not match!\n", msg->size, (c - str)); } } else @@ -546,10 +465,11 @@ g_strlcat(str, body, len); - if (msg->size != strlen(msg_start)) { + if (msg->size != strlen(str)) + { gaim_debug(GAIM_DEBUG_ERROR, "msn", "Outgoing message size (%d) and string length (%d) " - "do not match!\n", msg->size, strlen(msg_start)); + "do not match!\n", msg->size, strlen(str)); } } @@ -559,80 +479,6 @@ return str; } -gboolean -msn_message_is_outgoing(const MsnMessage *msg) -{ - g_return_val_if_fail(msg != NULL, FALSE); - - return !msg->incoming; -} - -gboolean -msn_message_is_incoming(const MsnMessage *msg) -{ - g_return_val_if_fail(msg != NULL, FALSE); - - return msg->incoming; -} - -void -msn_message_set_sender(MsnMessage *msg, MsnUser *user) -{ - g_return_if_fail(msg != NULL); - g_return_if_fail(user != NULL); - - msg->sender = user; - - msn_user_ref(msg->sender); -} - -MsnUser * -msn_message_get_sender(const MsnMessage *msg) -{ - g_return_val_if_fail(msg != NULL, NULL); - - return msg->sender; -} - -void -msn_message_set_receiver(MsnMessage *msg, MsnUser *user) -{ - g_return_if_fail(msg != NULL); - g_return_if_fail(user != NULL); - - msg->receiver = user; - - if (msg->msnslp_message) - msn_message_set_attr(msg, "P2P-Dest", msn_user_get_passport(user)); - - msn_user_ref(msg->receiver); -} - -MsnUser * -msn_message_get_receiver(const MsnMessage *msg) -{ - g_return_val_if_fail(msg != NULL, NULL); - - return msg->receiver; -} - -void -msn_message_set_transaction_id(MsnMessage *msg, unsigned int tid) -{ - g_return_if_fail(msg != NULL); - g_return_if_fail(tid > 0); - - msg->tid = tid; -} - -unsigned int -msn_message_get_transaction_id(const MsnMessage *msg) -{ - g_return_val_if_fail(msg != NULL, 0); - - return msg->tid; -} - void msn_message_set_flag(MsnMessage *msg, char flag) {