comparison libpurple/protocols/msn/slplink.c @ 30831:210feb895031

Move file request up in the stack.
author masca@cpw.pidgin.im
date Thu, 24 Jun 2010 00:41:07 +0000
parents e935d15725c3
children f86ebed1930a
comparison
equal deleted inserted replaced
30830:e935d15725c3 30831:210feb895031
439 439
440 msn_slplink_send_slpmsg(slplink, slpmsg); 440 msn_slplink_send_slpmsg(slplink, slpmsg);
441 msn_slpmsg_destroy(slpmsg); 441 msn_slpmsg_destroy(slpmsg);
442 } 442 }
443 443
444 static void
445 send_file_cb(MsnSlpCall *slpcall)
446 {
447 MsnSlpMessage *slpmsg;
448 PurpleXfer *xfer;
449
450 xfer = (PurpleXfer *)slpcall->xfer;
451 if (purple_xfer_get_status(xfer) >= PURPLE_XFER_STATUS_STARTED)
452 return;
453
454 purple_xfer_ref(xfer);
455 purple_xfer_start(xfer, -1, NULL, 0);
456 if (purple_xfer_get_status(xfer) != PURPLE_XFER_STATUS_STARTED) {
457 purple_xfer_unref(xfer);
458 return;
459 }
460 purple_xfer_unref(xfer);
461
462 slpmsg = msn_slpmsg_file_new(slpcall, purple_xfer_get_size(xfer));
463 msn_slpmsg_set_slplink(slpmsg, slpcall->slplink);
464
465 msn_slplink_send_slpmsg(slpcall->slplink, slpmsg);
466 }
467
468 static MsnSlpMessage * 444 static MsnSlpMessage *
469 msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id) 445 msn_slplink_message_find(MsnSlpLink *slplink, long session_id, long id)
470 { 446 {
471 GList *e; 447 GList *e;
472 448
650 if (!slpcall->wait_for_socket && slpcall->wasted) 626 if (!slpcall->wait_for_socket && slpcall->wasted)
651 msn_slpcall_destroy(slpcall); 627 msn_slpcall_destroy(slpcall);
652 } 628 }
653 } 629 }
654 630
655 static gchar *
656 gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path)
657 {
658 gsize size = 0;
659 MsnFileContext *header;
660 gchar *u8 = NULL;
661 gchar *ret;
662 gunichar2 *uni = NULL;
663 glong currentChar = 0;
664 glong len = 0;
665 const char *preview;
666 gsize preview_len;
667
668 size = purple_xfer_get_size(xfer);
669
670 purple_xfer_prepare_thumbnail(xfer, "png");
671
672 if (!file_name) {
673 gchar *basename = g_path_get_basename(file_path);
674 u8 = purple_utf8_try_convert(basename);
675 g_free(basename);
676 file_name = u8;
677 }
678
679 uni = g_utf8_to_utf16(file_name, -1, NULL, &len, NULL);
680
681 if (u8) {
682 g_free(u8);
683 file_name = NULL;
684 u8 = NULL;
685 }
686
687 preview = purple_xfer_get_thumbnail(xfer, &preview_len);
688 header = g_malloc(sizeof(MsnFileContext) + preview_len);
689
690 header->length = GUINT32_TO_LE(sizeof(MsnFileContext) - 1);
691 header->version = GUINT32_TO_LE(2); /* V.3 contains additional unnecessary data */
692 header->file_size = GUINT64_TO_LE(size);
693 if (preview)
694 header->type = GUINT32_TO_LE(0);
695 else
696 header->type = GUINT32_TO_LE(1);
697
698 len = MIN(len, MAX_FILE_NAME_LEN);
699 for (currentChar = 0; currentChar < len; currentChar++) {
700 header->file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]);
701 }
702 memset(&header->file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2);
703
704 memset(&header->unknown1, 0, sizeof(header->unknown1));
705 header->unknown2 = GUINT32_TO_LE(0xffffffff);
706 if (preview) {
707 memcpy(&header->preview, preview, preview_len);
708 }
709 header->preview[preview_len] = '\0';
710
711 g_free(uni);
712 ret = purple_base64_encode((const guchar *)header, sizeof(MsnFileContext) + preview_len);
713 g_free(header);
714 return ret;
715 }
716
717 void
718 msn_slplink_request_ft(MsnSlpLink *slplink, PurpleXfer *xfer)
719 {
720 MsnSlpCall *slpcall;
721 char *context;
722 const char *fn;
723 const char *fp;
724
725 fn = purple_xfer_get_filename(xfer);
726 fp = purple_xfer_get_local_filename(xfer);
727
728 g_return_if_fail(slplink != NULL);
729 g_return_if_fail(fp != NULL);
730
731 slpcall = msn_slpcall_new(slplink);
732 msn_slpcall_init(slpcall, MSN_SLPCALL_DC);
733
734 slpcall->session_init_cb = send_file_cb;
735 slpcall->end_cb = msn_xfer_end_cb;
736 slpcall->cb = msn_xfer_completed_cb;
737 slpcall->xfer = xfer;
738 purple_xfer_ref(slpcall->xfer);
739
740 slpcall->pending = TRUE;
741
742 purple_xfer_set_cancel_send_fnc(xfer, msn_xfer_cancel);
743 purple_xfer_set_read_fnc(xfer, msn_xfer_read);
744 purple_xfer_set_write_fnc(xfer, msn_xfer_write);
745
746 xfer->data = slpcall;
747
748 context = gen_context(xfer, fn, fp);
749
750 msn_slpcall_invite(slpcall, MSN_FT_GUID, 2, context);
751
752 g_free(context);
753 }
754
755 void 631 void
756 msn_slplink_request_object(MsnSlpLink *slplink, 632 msn_slplink_request_object(MsnSlpLink *slplink,
757 const char *info, 633 const char *info,
758 MsnSlpCb cb, 634 MsnSlpCb cb,
759 MsnSlpEndCb end_cb, 635 MsnSlpEndCb end_cb,