Mercurial > pidgin.yaz
comparison libpurple/protocols/msn/directconn.c @ 31213:dbe448a9bfa1
Use p2p functions in directconn too.
author | masca@cpw.pidgin.im |
---|---|
date | Sat, 05 Jun 2010 01:27:07 +0000 |
parents | e5e712cf9f7e |
children | 23b7b1b817c8 |
comparison
equal
deleted
inserted
replaced
31212:62538a3f90f0 | 31213:dbe448a9bfa1 |
---|---|
336 } | 336 } |
337 msn_slplink_unref(slplink); | 337 msn_slplink_unref(slplink); |
338 } | 338 } |
339 | 339 |
340 static void | 340 static void |
341 msn_dc_parse_binary_header(MsnDirectConn *dc) | |
342 { | |
343 MsnP2PHeader *h; | |
344 MsnP2PHeader *context; | |
345 | |
346 g_return_if_fail(dc != NULL); | |
347 | |
348 h = &dc->header; | |
349 /* Skip packet size */ | |
350 context = (MsnP2PHeader *)(dc->in_buffer + 4); | |
351 | |
352 h->session_id = GUINT32_FROM_LE(context->session_id); | |
353 h->id = GUINT32_FROM_LE(context->id); | |
354 h->offset = GUINT64_FROM_LE(context->offset); | |
355 h->total_size = GUINT64_FROM_LE(context->total_size); | |
356 h->length = GUINT32_FROM_LE(context->length); | |
357 h->flags = GUINT32_FROM_LE(context->flags); | |
358 h->ack_id = GUINT32_FROM_LE(context->ack_id); | |
359 h->ack_sub_id = GUINT32_FROM_LE(context->ack_sub_id); | |
360 h->ack_size = GUINT64_FROM_LE(context->ack_size); | |
361 } | |
362 | |
363 static const gchar * | |
364 msn_dc_serialize_binary_header(MsnDirectConn *dc) { | |
365 MsnP2PHeader *h; | |
366 static MsnP2PHeader bin_header; | |
367 | |
368 g_return_val_if_fail(dc != NULL, NULL); | |
369 | |
370 h = &dc->header; | |
371 | |
372 bin_header.session_id = GUINT32_TO_LE(h->session_id); | |
373 bin_header.id = GUINT32_TO_LE(h->id); | |
374 bin_header.offset = GUINT64_TO_LE(h->offset); | |
375 bin_header.total_size = GUINT64_TO_LE(h->total_size); | |
376 bin_header.length = GUINT32_TO_LE(h->length); | |
377 bin_header.flags = GUINT32_TO_LE(h->flags); | |
378 bin_header.ack_id = GUINT32_TO_LE(h->ack_id); | |
379 bin_header.ack_sub_id = GUINT32_TO_LE(h->ack_sub_id); | |
380 bin_header.ack_size = GUINT64_TO_LE(h->ack_size); | |
381 | |
382 return (const gchar *)&bin_header; | |
383 } | |
384 | |
385 static void | |
386 msn_dc_send_cb(gpointer data, gint fd, PurpleInputCondition cond) | 341 msn_dc_send_cb(gpointer data, gint fd, PurpleInputCondition cond) |
387 { | 342 { |
388 MsnDirectConn *dc = data; | 343 MsnDirectConn *dc = data; |
389 MsnDirectConnPacket *p; | 344 MsnDirectConnPacket *p; |
390 int bytes_to_send; | 345 int bytes_to_send; |
475 static void | 430 static void |
476 msn_dc_send_handshake_with_nonce(MsnDirectConn *dc, MsnDirectConnPacket *p) | 431 msn_dc_send_handshake_with_nonce(MsnDirectConn *dc, MsnDirectConnPacket *p) |
477 { | 432 { |
478 const gchar *h; | 433 const gchar *h; |
479 | 434 |
480 h = msn_dc_serialize_binary_header(dc); | 435 h = (gchar*) msn_p2p_header_to_wire(&dc->header); |
436 | |
481 memcpy(p->data, h, P2P_PACKET_HEADER_SIZE); | 437 memcpy(p->data, h, P2P_PACKET_HEADER_SIZE); |
482 | 438 |
483 memcpy(p->data + offsetof(MsnP2PHeader, ack_id), dc->nonce, 16); | 439 memcpy(p->data + offsetof(MsnP2PHeader, ack_id), dc->nonce, 16); |
484 | 440 |
485 msn_dc_enqueue_packet(dc, p); | 441 msn_dc_enqueue_packet(dc, p); |
700 /* Wait for the whole packet to arrive */ | 656 /* Wait for the whole packet to arrive */ |
701 if (dc->in_pos < 4 + packet_length) | 657 if (dc->in_pos < 4 + packet_length) |
702 return; | 658 return; |
703 | 659 |
704 if (dc->state != DC_STATE_FOO) { | 660 if (dc->state != DC_STATE_FOO) { |
705 msn_dc_parse_binary_header(dc); | 661 MsnP2PHeader *context; |
662 MsnP2PHeader *h; | |
663 | |
664 /* Skip packet size */ | |
665 context = (MsnP2PHeader *)(dc->in_buffer + 4); | |
666 | |
667 h = msn_p2p_header_from_wire(context); | |
668 memcpy(&dc->header, h, P2P_PACKET_HEADER_SIZE); | |
669 g_free(h); | |
706 } | 670 } |
707 | 671 |
708 switch (msn_dc_process_packet(dc, packet_length)) { | 672 switch (msn_dc_process_packet(dc, packet_length)) { |
709 case DC_PROCESS_CLOSE: | 673 case DC_PROCESS_CLOSE: |
710 return; | 674 return; |