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