comparison libpurple/protocols/jabber/jingle/rtp.c @ 32672:3828a61c44da

A boring and large patch so I can merge heads.
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Fri, 23 Dec 2011 08:21:58 +0000
parents a8cc50c2279f
children
comparison
equal deleted inserted replaced
32671:0e69949b3e61 32672:3828a61c44da
575 JingleTransport *transport; 575 JingleTransport *transport;
576 GParameter *params = NULL; 576 GParameter *params = NULL;
577 guint num_params; 577 guint num_params;
578 578
579 /* maybe this create ought to just be in initiate and handle initiate */ 579 /* maybe this create ought to just be in initiate and handle initiate */
580 if (media == NULL) 580 if (media == NULL) {
581 media = jingle_rtp_create_media(content); 581 media = jingle_rtp_create_media(content);
582 582
583 if (media == NULL) 583 if (media == NULL)
584 return FALSE; 584 return FALSE;
585 }
585 586
586 name = jingle_content_get_name(content); 587 name = jingle_content_get_name(content);
587 media_type = jingle_rtp_get_media_type(content); 588 media_type = jingle_rtp_get_media_type(content);
588 remote_jid = jingle_session_get_remote_jid(session); 589 remote_jid = jingle_session_get_remote_jid(session);
589 senders = jingle_content_get_senders(content); 590 senders = jingle_content_get_senders(content);
590 transport = jingle_content_get_transport(content); 591 transport = jingle_content_get_transport(content);
592
593 if (media_type == NULL) {
594 g_free(name);
595 g_free(remote_jid);
596 g_free(senders);
597 g_free(params);
598 g_object_unref(transport);
599 g_object_unref(session);
600 return FALSE;
601 }
591 602
592 if (JINGLE_IS_RAWUDP(transport)) 603 if (JINGLE_IS_RAWUDP(transport))
593 transmitter = "rawudp"; 604 transmitter = "rawudp";
594 else if (JINGLE_IS_ICEUDP(transport)) 605 else if (JINGLE_IS_ICEUDP(transport))
595 transmitter = "nice"; 606 transmitter = "nice";
596 else 607 else
597 transmitter = "notransmitter"; 608 transmitter = "notransmitter";
598 g_object_unref(transport); 609 g_object_unref(transport);
599 610
600 is_audio = !strcmp(media_type, "audio"); 611 is_audio = g_str_equal(media_type, "audio");
601 612
602 if (!strcmp(senders, "both")) 613 if (purple_strequal(senders, "both"))
603 type = is_audio == TRUE ? PURPLE_MEDIA_AUDIO 614 type = is_audio ? PURPLE_MEDIA_AUDIO
604 : PURPLE_MEDIA_VIDEO; 615 : PURPLE_MEDIA_VIDEO;
605 else if ((strcmp(senders, "initiator") == 0) == 616 else if (purple_strequal(senders, "initiator") ==
606 jingle_session_is_initiator(session)) 617 jingle_session_is_initiator(session))
607 type = is_audio == TRUE ? PURPLE_MEDIA_SEND_AUDIO 618 type = is_audio ? PURPLE_MEDIA_SEND_AUDIO
608 : PURPLE_MEDIA_SEND_VIDEO; 619 : PURPLE_MEDIA_SEND_VIDEO;
609 else 620 else
610 type = is_audio == TRUE ? PURPLE_MEDIA_RECV_AUDIO 621 type = is_audio ? PURPLE_MEDIA_RECV_AUDIO
611 : PURPLE_MEDIA_RECV_VIDEO; 622 : PURPLE_MEDIA_RECV_VIDEO;
612 623
613 params = 624 params =
614 jingle_get_params(jingle_session_get_js(session), NULL, 0, 0, 0, 625 jingle_get_params(jingle_session_get_js(session), NULL, 0, 0, 0,
615 NULL, NULL, &num_params); 626 NULL, NULL, &num_params);
616 627
617 creator = jingle_content_get_creator(content); 628 creator = jingle_content_get_creator(content);
618 if (!strcmp(creator, "initiator")) 629 if (creator == NULL) {
630 g_free(name);
631 g_free(media_type);
632 g_free(remote_jid);
633 g_free(senders);
634 g_free(params);
635 g_object_unref(session);
636 return FALSE;
637 }
638
639 if (g_str_equal(creator, "initiator"))
619 is_creator = jingle_session_is_initiator(session); 640 is_creator = jingle_session_is_initiator(session);
620 else 641 else
621 is_creator = !jingle_session_is_initiator(session); 642 is_creator = !jingle_session_is_initiator(session);
622 g_free(creator); 643 g_free(creator);
623 644
624 if(!purple_media_add_stream(media, name, remote_jid, 645 if(!purple_media_add_stream(media, name, remote_jid,
625 type, is_creator, transmitter, num_params, params)) { 646 type, is_creator, transmitter, num_params, params)) {
626 purple_media_end(media, NULL, NULL); 647 purple_media_end(media, NULL, NULL);
648 /* TODO: How much clean-up is necessary here? (does calling
649 purple_media_end lead to cleaning up Jingle structs?) */
627 return FALSE; 650 return FALSE;
628 } 651 }
629 652
630 g_free(name); 653 g_free(name);
631 g_free(media_type); 654 g_free(media_type);
643 GList *codecs = NULL; 666 GList *codecs = NULL;
644 xmlnode *codec_element = NULL; 667 xmlnode *codec_element = NULL;
645 const char *encoding_name,*id, *clock_rate; 668 const char *encoding_name,*id, *clock_rate;
646 PurpleMediaCodec *codec; 669 PurpleMediaCodec *codec;
647 const gchar *media = xmlnode_get_attrib(description, "media"); 670 const gchar *media = xmlnode_get_attrib(description, "media");
648 PurpleMediaSessionType type = 671 PurpleMediaSessionType type;
649 !strcmp(media, "video") ? PURPLE_MEDIA_VIDEO : 672
650 !strcmp(media, "audio") ? PURPLE_MEDIA_AUDIO : 0; 673 if (media == NULL) {
674 purple_debug_warning("jingle-rtp", "missing media type\n");
675 return NULL;
676 }
677
678 if (g_str_equal(media, "video")) {
679 type = PURPLE_MEDIA_VIDEO;
680 } else if (g_str_equal(media, "audio")) {
681 type = PURPLE_MEDIA_AUDIO;
682 } else {
683 purple_debug_warning("jingle-rtp", "unknown media type: %s\n",
684 media);
685 return NULL;
686 }
651 687
652 for (codec_element = xmlnode_get_child(description, "payload-type") ; 688 for (codec_element = xmlnode_get_child(description, "payload-type") ;
653 codec_element ; 689 codec_element ;
654 codec_element = xmlnode_get_next_twin(codec_element)) { 690 codec_element = xmlnode_get_next_twin(codec_element)) {
655 xmlnode *param; 691 xmlnode *param;
766 jingle_rtp_handle_action_internal(JingleContent *content, xmlnode *xmlcontent, JingleActionType action) 802 jingle_rtp_handle_action_internal(JingleContent *content, xmlnode *xmlcontent, JingleActionType action)
767 { 803 {
768 switch (action) { 804 switch (action) {
769 case JINGLE_SESSION_ACCEPT: 805 case JINGLE_SESSION_ACCEPT:
770 case JINGLE_SESSION_INITIATE: { 806 case JINGLE_SESSION_INITIATE: {
771 JingleSession *session = jingle_content_get_session(content); 807 JingleSession *session;
772 JingleTransport *transport = jingle_transport_parse( 808 JingleTransport *transport;
773 xmlnode_get_child(xmlcontent, "transport")); 809 xmlnode *description;
774 xmlnode *description = xmlnode_get_child(xmlcontent, "description"); 810 GList *candidates;
775 GList *candidates = jingle_rtp_transport_to_candidates(transport); 811 GList *codecs;
776 GList *codecs = jingle_rtp_parse_codecs(description); 812 gchar *name;
777 gchar *name = jingle_content_get_name(content); 813 gchar *remote_jid;
778 gchar *remote_jid =
779 jingle_session_get_remote_jid(session);
780 PurpleMedia *media; 814 PurpleMedia *media;
781 815
816 session = jingle_content_get_session(content);
817
782 if (action == JINGLE_SESSION_INITIATE && 818 if (action == JINGLE_SESSION_INITIATE &&
783 jingle_rtp_init_media(content) == FALSE) { 819 !jingle_rtp_init_media(content)) {
784 /* XXX: send error */ 820 /* XXX: send error */
785 jabber_iq_send(jingle_session_terminate_packet( 821 jabber_iq_send(jingle_session_terminate_packet(
786 session, "general-error")); 822 session, "general-error"));
787 g_object_unref(session); 823 g_object_unref(session);
788 break; 824 break;
789 } 825 }
826
827 transport = jingle_transport_parse(
828 xmlnode_get_child(xmlcontent, "transport"));
829 description = xmlnode_get_child(xmlcontent, "description");
830 candidates = jingle_rtp_transport_to_candidates(transport);
831 codecs = jingle_rtp_parse_codecs(description);
832 name = jingle_content_get_name(content);
833 remote_jid = jingle_session_get_remote_jid(session);
790 834
791 media = jingle_rtp_get_media(session); 835 media = jingle_rtp_get_media(session);
792 purple_media_set_remote_codecs(media, 836 purple_media_set_remote_codecs(media,
793 name, remote_jid, codecs); 837 name, remote_jid, codecs);
794 purple_media_add_remote_candidates(media, 838 purple_media_add_remote_candidates(media,