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;