comparison 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
comparison
equal deleted inserted replaced
6700:57161e3abbb5 6701:b7e113a59b51
2 * @file msg.c Message functions 2 * @file msg.c Message functions
3 * 3 *
4 * gaim 4 * gaim
5 * 5 *
6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org> 6 * Copyright (C) 2003 Christian Hammond <chipx86@gnupdate.org>
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by 9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or 10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version. 11 * (at your option) any later version.
12 * 12 *
70 70
71 MsnMessage * 71 MsnMessage *
72 msn_message_new_from_str(MsnSession *session, const char *str) 72 msn_message_new_from_str(MsnSession *session, const char *str)
73 { 73 {
74 MsnMessage *msg; 74 MsnMessage *msg;
75 char *tmp_base, *tmp, *field1, *field2, *c; 75 char *tmp_base, *msg_base, *tmp, *field1, *field2, *c;
76 76
77 g_return_val_if_fail(str != NULL, NULL); 77 g_return_val_if_fail(str != NULL, NULL);
78 g_return_val_if_fail(!g_ascii_strncasecmp(str, "MSG", 3), NULL); 78 g_return_val_if_fail(!g_ascii_strncasecmp(str, "MSG", 3), NULL);
79 79
80 msg = msn_message_new(); 80 msg = msn_message_new();
125 else { 125 else {
126 msg->tid = atoi(field1); 126 msg->tid = atoi(field1);
127 msg->flag = *field2; 127 msg->flag = *field2;
128 } 128 }
129 129
130 msg_base = tmp;
131
130 /* Back to the parsination. */ 132 /* Back to the parsination. */
131 while (*tmp != '\r') { 133 while (*tmp != '\r') {
132 char *key, *value; 134 char *key, *value;
133 135
134 key = tmp; 136 key = tmp;
162 164
163 /* "\r\n" */ 165 /* "\r\n" */
164 tmp += 2; 166 tmp += 2;
165 167
166 /* Now we *should* be at the body. */ 168 /* Now we *should* be at the body. */
167 msn_message_set_body(msg, tmp); 169 if (!strcmp(msn_message_get_content_type(msg), "application/x-msnmsgrp2p"))
170 {
171 msn_message_set_body(msg, tmp);
172 }
173 else
174 {
175 char header[48];
176 char footer[4];
177
178 msg->msnslp_message = TRUE;
179
180 memcpy(header, tmp, 48);
181
182 tmp += 48;
183
184 msg->body = g_memdup(tmp, msg->size - (tmp - msg_base) + 1);
185
186 tmp++;
187
188 memcpy(footer, tmp, 4);
189
190 /* Import the header. */
191 memcpy(&msg->msnslp_header.session_id, tmp, 4); tmp += 4;
192 memcpy(&msg->msnslp_header.id, tmp, 4); tmp += 4;
193 memcpy(&msg->msnslp_header.offset, tmp, 4); tmp += 8;
194 memcpy(&msg->msnslp_header.total_size, tmp, 4); tmp += 8;
195 memcpy(&msg->msnslp_header.length, tmp, 4); tmp += 4;
196 memcpy(&msg->msnslp_header.flags, tmp, 4); tmp += 4;
197 memcpy(&msg->msnslp_header.prev_id, tmp, 4); tmp += 4;
198 memcpy(&msg->msnslp_header.prev_f9, tmp, 4); tmp += 4;
199 memcpy(&msg->msnslp_header.prev_total_size, tmp, 4); tmp += 8;
200
201 /* Convert to the right endianness */
202 msg->msnslp_header.session_id = ntohs(msg->msnslp_header.session_id);
203 msg->msnslp_header.id = ntohs(msg->msnslp_header.id);
204 msg->msnslp_header.length = ntohs(msg->msnslp_header.length);
205 msg->msnslp_header.flags = ntohs(msg->msnslp_header.flags);
206 msg->msnslp_header.prev_id = ntohs(msg->msnslp_header.prev_id);
207 msg->msnslp_header.prev_f9 = ntohs(msg->msnslp_header.prev_f9);
208
209 /* Import the footer. */
210 msg->msnslp_footer.app_id = (long)footer;
211 }
168 212
169 g_free(tmp_base); 213 g_free(tmp_base);
170 214
171 /* Done! */ 215 /* Done! */
172 216
301 g_snprintf(buf, sizeof(buf), "%s: %s\r\n", key, value); 345 g_snprintf(buf, sizeof(buf), "%s: %s\r\n", key, value);
302 346
303 g_strlcat(str, buf, len); 347 g_strlcat(str, buf, len);
304 } 348 }
305 349
306 g_snprintf(buf, sizeof(buf), "\r\n%s", msn_message_get_body(msg)); 350 if (msg->msnslp_message)
307 351 {
308 g_strlcat(str, buf, len); 352 char *c;
353 char blank[4];
354 int session_id, id, offset, total_size, length, flags;
355 int prev_id, prev_f9, prev_total_size;
356
357 memcpy(blank, 0, 4);
358
359 c = str + strlen(str);
360
361 session_id = htons(msg->msnslp_header.session_id);
362 id = htons(msg->msnslp_header.id);
363 offset = htons(msg->msnslp_header.offset);
364 total_size = htons(msg->msnslp_header.total_size);
365 length = htons(msg->msnslp_header.length);
366 flags = htons(msg->msnslp_header.flags);
367 prev_id = htons(msg->msnslp_header.prev_id);
368 prev_f9 = htons(msg->msnslp_header.prev_f9);
369 prev_total_size = htons(msg->msnslp_header.prev_total_size);
370
371 memcpy(c, &session_id, 4); c += 4;
372 memcpy(c, &id, 4); c += 4;
373 memcpy(c, &offset, 4); c += 4;
374 memcpy(c, blank, 4); c += 4;
375 memcpy(c, &total_size, 4); c += 4;
376 memcpy(c, blank, 4); c += 4;
377 memcpy(c, &length, 4); c += 4;
378 memcpy(c, &flags, 4); c += 4;
379 memcpy(c, &prev_id, 4); c += 4;
380 memcpy(c, &prev_f9, 4); c += 4;
381 memcpy(c, &prev_total_size, 4); c += 4;
382 memcpy(c, blank, 4); c += 4;
383
384 strncpy(c, msn_message_get_body(msg), len);
385
386 c += strlen(msn_message_get_body(msg));
387
388 memcpy(c, blank, 1); c++;
389 memcpy(c, &msg->msnslp_footer.app_id, 4); c += 4;
390 }
391 else
392 {
393 g_snprintf(buf, sizeof(buf), "\r\n%s", msn_message_get_body(msg));
394
395 g_strlcat(str, buf, len);
396 }
309 397
310 if (msg->size != strlen(msg_start)) { 398 if (msg->size != strlen(msg_start)) {
311 gaim_debug(GAIM_DEBUG_ERROR, "msn", 399 gaim_debug(GAIM_DEBUG_ERROR, "msn",
312 "Outgoing message size (%d) and string length (%d) " 400 "Outgoing message size (%d) and string length (%d) "
313 "do not match!\n", msg->size, strlen(msg_start)); 401 "do not match!\n", msg->size, strlen(msg_start));