Mercurial > pidgin
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, |