Mercurial > pidgin
comparison libpurple/protocols/msn/msg.c @ 30773:fbb44d46c7a6
Use convenient p2p functions to avoid code here. There is a lot more code duplication to fix here.
author | masca@cpw.pidgin.im |
---|---|
date | Fri, 04 Jun 2010 00:21:00 +0000 |
parents | e5e712cf9f7e |
children | 64e2fe53acc2 |
comparison
equal
deleted
inserted
replaced
30772:1059e5d29cd9 | 30773:fbb44d46c7a6 |
---|---|
26 #include "debug.h" | 26 #include "debug.h" |
27 | 27 |
28 #include "msn.h" | 28 #include "msn.h" |
29 #include "msg.h" | 29 #include "msg.h" |
30 #include "msnutils.h" | 30 #include "msnutils.h" |
31 #include "p2p.h" | |
31 | 32 |
32 MsnMessage * | 33 MsnMessage * |
33 msn_message_new(MsnMsgType type) | 34 msn_message_new(MsnMsgType type) |
34 { | 35 { |
35 MsnMessage *msg; | 36 MsnMessage *msg; |
161 } | 162 } |
162 | 163 |
163 void | 164 void |
164 msn_message_parse_slp_body(MsnMessage *msg, const char *body, size_t len) | 165 msn_message_parse_slp_body(MsnMessage *msg, const char *body, size_t len) |
165 { | 166 { |
166 MsnP2PHeader header; | 167 MsnP2PHeader *header; |
168 MsnP2PHeader wire; | |
167 const char *tmp; | 169 const char *tmp; |
168 int body_len; | 170 int body_len; |
169 | 171 |
170 tmp = body; | 172 tmp = body; |
171 | 173 |
172 if (len < sizeof(header)) { | 174 if (len < sizeof(wire)) { |
173 g_return_if_reached(); | 175 g_return_if_reached(); |
174 } | 176 } |
175 | 177 |
176 /* Extract the binary SLP header */ | 178 /* Extract the binary SLP header */ |
177 memcpy(&header, tmp, sizeof(header)); | 179 memcpy(&wire, tmp, sizeof(wire)); |
178 tmp += sizeof(header); | 180 tmp += sizeof(wire); |
179 | 181 |
180 msg->msnslp_header.session_id = GUINT32_FROM_LE(header.session_id); | 182 header = msn_p2p_header_from_wire(&wire); |
181 msg->msnslp_header.id = GUINT32_FROM_LE(header.id); | 183 |
182 msg->msnslp_header.offset = GUINT64_FROM_LE(header.offset); | 184 memcpy(&msg->msnslp_header, (char*)header, sizeof(*header)); |
183 msg->msnslp_header.total_size = GUINT64_FROM_LE(header.total_size); | 185 |
184 msg->msnslp_header.length = GUINT32_FROM_LE(header.length); | 186 g_free(header); |
185 msg->msnslp_header.flags = GUINT32_FROM_LE(header.flags); | |
186 msg->msnslp_header.ack_id = GUINT32_FROM_LE(header.ack_id); | |
187 msg->msnslp_header.ack_sub_id = GUINT32_FROM_LE(header.ack_sub_id); | |
188 msg->msnslp_header.ack_size = GUINT64_FROM_LE(header.ack_size); | |
189 | 187 |
190 /* Extract the body */ | 188 /* Extract the body */ |
191 body_len = len - (tmp - body); | 189 body_len = len - (tmp - body); |
192 /* msg->body_len = msg->msnslp_header.length; */ | 190 /* msg->body_len = msg->msnslp_header.length; */ |
193 | 191 |
296 content_type = msn_message_get_content_type(msg); | 294 content_type = msn_message_get_content_type(msg); |
297 | 295 |
298 if (content_type != NULL && | 296 if (content_type != NULL && |
299 !strcmp(content_type, "application/x-msnmsgrp2p")) | 297 !strcmp(content_type, "application/x-msnmsgrp2p")) |
300 { | 298 { |
301 MsnP2PHeader header; | 299 MsnP2PHeader *header; |
300 MsnP2PHeader wire; | |
302 MsnP2PFooter footer; | 301 MsnP2PFooter footer; |
303 int body_len; | 302 int body_len; |
304 | 303 |
305 if (payload_len - (tmp - tmp_base) < sizeof(header)) { | 304 if (payload_len - (tmp - tmp_base) < sizeof(header)) { |
306 g_free(tmp_base); | 305 g_free(tmp_base); |
308 } | 307 } |
309 | 308 |
310 msg->msnslp_message = TRUE; | 309 msg->msnslp_message = TRUE; |
311 | 310 |
312 /* Extract the binary SLP header */ | 311 /* Extract the binary SLP header */ |
313 memcpy(&header, tmp, sizeof(header)); | 312 memcpy(&wire, tmp, sizeof(wire)); |
314 tmp += sizeof(header); | 313 tmp += sizeof(wire); |
315 | 314 |
316 msg->msnslp_header.session_id = GUINT32_FROM_LE(header.session_id); | 315 header = msn_p2p_header_from_wire(&wire); |
317 msg->msnslp_header.id = GUINT32_FROM_LE(header.id); | 316 |
318 msg->msnslp_header.offset = GUINT64_FROM_LE(header.offset); | 317 memcpy(&msg->msnslp_header, (char*)header, sizeof(*header)); |
319 msg->msnslp_header.total_size = GUINT64_FROM_LE(header.total_size); | 318 |
320 msg->msnslp_header.length = GUINT32_FROM_LE(header.length); | 319 g_free(header); |
321 msg->msnslp_header.flags = GUINT32_FROM_LE(header.flags); | |
322 msg->msnslp_header.ack_id = GUINT32_FROM_LE(header.ack_id); | |
323 msg->msnslp_header.ack_sub_id = GUINT32_FROM_LE(header.ack_sub_id); | |
324 msg->msnslp_header.ack_size = GUINT64_FROM_LE(header.ack_size); | |
325 | 320 |
326 body_len = payload_len - (tmp - tmp_base) - sizeof(footer); | 321 body_len = payload_len - (tmp - tmp_base) - sizeof(footer); |
327 | 322 |
328 /* Extract the body */ | 323 /* Extract the body */ |
329 if (body_len > 0) { | 324 if (body_len > 0) { |
382 } | 377 } |
383 | 378 |
384 char * | 379 char * |
385 msn_message_gen_slp_body(MsnMessage *msg, size_t *ret_size) | 380 msn_message_gen_slp_body(MsnMessage *msg, size_t *ret_size) |
386 { | 381 { |
387 MsnP2PHeader header; | 382 MsnP2PHeader *header; |
388 | 383 |
389 char *tmp, *base; | 384 char *tmp, *base; |
390 const void *body; | 385 const void *body; |
391 size_t len, body_len; | 386 size_t len, body_len; |
392 | 387 |
396 | 391 |
397 base = tmp = g_malloc(len + 1); | 392 base = tmp = g_malloc(len + 1); |
398 | 393 |
399 body = msn_message_get_bin_data(msg, &body_len); | 394 body = msn_message_get_bin_data(msg, &body_len); |
400 | 395 |
401 header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id); | 396 header = msn_p2p_header_to_wire(&(msg->msnslp_header)); |
402 header.id = GUINT32_TO_LE(msg->msnslp_header.id); | 397 |
403 header.offset = GUINT64_TO_LE(msg->msnslp_header.offset); | 398 memcpy(tmp, header, 48); |
404 header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size); | |
405 header.length = GUINT32_TO_LE(msg->msnslp_header.length); | |
406 header.flags = GUINT32_TO_LE(msg->msnslp_header.flags); | |
407 header.ack_id = GUINT32_TO_LE(msg->msnslp_header.ack_id); | |
408 header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id); | |
409 header.ack_size = GUINT64_TO_LE(msg->msnslp_header.ack_size); | |
410 | |
411 memcpy(tmp, &header, 48); | |
412 tmp += 48; | 399 tmp += 48; |
400 | |
401 g_free(header); | |
413 | 402 |
414 if (body != NULL) | 403 if (body != NULL) |
415 { | 404 { |
416 memcpy(tmp, body, body_len); | 405 memcpy(tmp, body, body_len); |
417 tmp += body_len; | 406 tmp += body_len; |
473 | 462 |
474 body = msn_message_get_bin_data(msg, &body_len); | 463 body = msn_message_get_bin_data(msg, &body_len); |
475 | 464 |
476 if (msg->msnslp_message) | 465 if (msg->msnslp_message) |
477 { | 466 { |
478 MsnP2PHeader header; | 467 MsnP2PHeader *header; |
479 MsnP2PFooter footer; | 468 MsnP2PFooter footer; |
480 | 469 |
481 header.session_id = GUINT32_TO_LE(msg->msnslp_header.session_id); | 470 header = msn_p2p_header_to_wire(&(msg->msnslp_header)); |
482 header.id = GUINT32_TO_LE(msg->msnslp_header.id); | 471 |
483 header.offset = GUINT64_TO_LE(msg->msnslp_header.offset); | 472 memcpy(n, header, 48); |
484 header.total_size = GUINT64_TO_LE(msg->msnslp_header.total_size); | |
485 header.length = GUINT32_TO_LE(msg->msnslp_header.length); | |
486 header.flags = GUINT32_TO_LE(msg->msnslp_header.flags); | |
487 header.ack_id = GUINT32_TO_LE(msg->msnslp_header.ack_id); | |
488 header.ack_sub_id = GUINT32_TO_LE(msg->msnslp_header.ack_sub_id); | |
489 header.ack_size = GUINT64_TO_LE(msg->msnslp_header.ack_size); | |
490 | |
491 memcpy(n, &header, 48); | |
492 n += 48; | 473 n += 48; |
474 | |
475 g_free(header); | |
493 | 476 |
494 if (body != NULL) | 477 if (body != NULL) |
495 { | 478 { |
496 memcpy(n, body, body_len); | 479 memcpy(n, body, body_len); |
497 | 480 |