Mercurial > pidgin.yaz
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)); |