comparison libpurple/protocols/jabber/jabber.c @ 26524:df9042312063

Switch media to store accounts rather than connections. This for the most part stops it from crashing when ending a session when the connection has been interrupted.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Thu, 09 Apr 2009 21:35:06 +0000
parents 2b8c161c9d7b
children d6a863df7884 d00a8111e479 608493e51182 925a5a7605b6 538b4175fd24 4851546210a1 e57315a062cb
comparison
equal deleted inserted replaced
26523:6a3943412f2d 26524:df9042312063
2612 return TRUE; 2612 return TRUE;
2613 } 2613 }
2614 2614
2615 #ifdef USE_VV 2615 #ifdef USE_VV
2616 typedef struct { 2616 typedef struct {
2617 PurpleConnection *pc; 2617 PurpleAccount *account;
2618 gchar *who; 2618 gchar *who;
2619 PurpleMediaSessionType type; 2619 PurpleMediaSessionType type;
2620 2620
2621 } JabberMediaRequest; 2621 } JabberMediaRequest;
2622 2622
2635 purple_request_fields_get_field(fields, "resource"); 2635 purple_request_fields_get_field(fields, "resource");
2636 int selected_id = purple_request_field_choice_get_value(field); 2636 int selected_id = purple_request_field_choice_get_value(field);
2637 GList *labels = purple_request_field_choice_get_labels(field); 2637 GList *labels = purple_request_field_choice_get_labels(field);
2638 gchar *who = g_strdup_printf("%s/%s", request->who, 2638 gchar *who = g_strdup_printf("%s/%s", request->who,
2639 (gchar*)g_list_nth_data(labels, selected_id)); 2639 (gchar*)g_list_nth_data(labels, selected_id));
2640 jabber_initiate_media(request->pc, who, request->type); 2640 jabber_initiate_media(request->account, who, request->type);
2641 2641
2642 g_free(who); 2642 g_free(who);
2643 g_free(request->who); 2643 g_free(request->who);
2644 g_free(request); 2644 g_free(request);
2645 } 2645 }
2646 #endif 2646 #endif
2647 2647
2648 gboolean 2648 gboolean
2649 jabber_initiate_media(PurpleConnection *gc, const char *who, 2649 jabber_initiate_media(PurpleAccount *account, const char *who,
2650 PurpleMediaSessionType type) 2650 PurpleMediaSessionType type)
2651 { 2651 {
2652 #ifdef USE_VV 2652 #ifdef USE_VV
2653 JabberStream *js = (JabberStream *) gc->proto_data; 2653 JabberStream *js = (JabberStream *)
2654 purple_account_get_connection(account)->proto_data;
2654 JabberBuddy *jb; 2655 JabberBuddy *jb;
2655 JabberBuddyResource *jbr = NULL; 2656 JabberBuddyResource *jbr = NULL;
2656 char *resource; 2657 char *resource;
2657 2658
2658 if (!js) { 2659 if (!js) {
2673 if (type & PURPLE_MEDIA_AUDIO && 2674 if (type & PURPLE_MEDIA_AUDIO &&
2674 !jabber_resource_has_capability(jbr, 2675 !jabber_resource_has_capability(jbr,
2675 JINGLE_APP_RTP_SUPPORT_AUDIO) && 2676 JINGLE_APP_RTP_SUPPORT_AUDIO) &&
2676 jabber_resource_has_capability(jbr, 2677 jabber_resource_has_capability(jbr,
2677 GOOGLE_VOICE_CAP)) 2678 GOOGLE_VOICE_CAP))
2678 return jabber_google_session_initiate( 2679 return jabber_google_session_initiate(js, who, type);
2679 gc->proto_data, who, type);
2680 else 2680 else
2681 return jingle_rtp_initiate_media( 2681 return jingle_rtp_initiate_media(js, who, type);
2682 gc->proto_data, who, type);
2683 } 2682 }
2684 2683
2685 jb = jabber_buddy_find(js, who, FALSE); 2684 jb = jabber_buddy_find(js, who, FALSE);
2686 2685
2687 if(!jb || !jb->resources) { 2686 if(!jb || !jb->resources) {
2696 msg = g_strdup_printf(_("Unable to initiate media with %s: user is not online"), who); 2695 msg = g_strdup_printf(_("Unable to initiate media with %s: user is not online"), who);
2697 } else { 2696 } else {
2698 msg = g_strdup_printf(_("Unable to initiate media with %s: not subscribed to user presence"), who); 2697 msg = g_strdup_printf(_("Unable to initiate media with %s: not subscribed to user presence"), who);
2699 } 2698 }
2700 2699
2701 purple_notify_error(js->gc, _("Media Initiation Failed"), 2700 purple_notify_error(account, _("Media Initiation Failed"),
2702 _("Media Initiation Failed"), msg); 2701 _("Media Initiation Failed"), msg);
2703 g_free(msg); 2702 g_free(msg);
2704 return FALSE; 2703 return FALSE;
2705 } else if(!jb->resources->next) { 2704 } else if(!jb->resources->next) {
2706 /* only 1 resource online (probably our most common case) 2705 /* only 1 resource online (probably our most common case)
2707 * so no need to ask who to initiate with */ 2706 * so no need to ask who to initiate with */
2708 gchar *name; 2707 gchar *name;
2709 gboolean result; 2708 gboolean result;
2710 jbr = jb->resources->data; 2709 jbr = jb->resources->data;
2711 name = g_strdup_printf("%s/%s", who, jbr->name); 2710 name = g_strdup_printf("%s/%s", who, jbr->name);
2712 result = jabber_initiate_media(gc, name, type); 2711 result = jabber_initiate_media(account, name, type);
2713 g_free(name); 2712 g_free(name);
2714 return result; 2713 return result;
2715 } else { 2714 } else {
2716 /* we've got multiple resources, 2715 /* we've got multiple resources,
2717 * we need to pick one to initiate with */ 2716 * we need to pick one to initiate with */
2727 { 2726 {
2728 JabberBuddyResource *ljbr = l->data; 2727 JabberBuddyResource *ljbr = l->data;
2729 PurpleMediaCaps caps; 2728 PurpleMediaCaps caps;
2730 gchar *name; 2729 gchar *name;
2731 name = g_strdup_printf("%s/%s", who, ljbr->name); 2730 name = g_strdup_printf("%s/%s", who, ljbr->name);
2732 caps = jabber_get_media_caps(gc, name); 2731 caps = jabber_get_media_caps(account, name);
2733 g_free(name); 2732 g_free(name);
2734 2733
2735 if ((type & PURPLE_MEDIA_AUDIO) && 2734 if ((type & PURPLE_MEDIA_AUDIO) &&
2736 (type & PURPLE_MEDIA_VIDEO)) { 2735 (type & PURPLE_MEDIA_VIDEO)) {
2737 if (caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO) { 2736 if (caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO) {
2762 field)) <= 1) { 2761 field)) <= 1) {
2763 gchar *name; 2762 gchar *name;
2764 gboolean result; 2763 gboolean result;
2765 purple_request_field_destroy(field); 2764 purple_request_field_destroy(field);
2766 name = g_strdup_printf("%s/%s", who, jbr->name); 2765 name = g_strdup_printf("%s/%s", who, jbr->name);
2767 result = jabber_initiate_media(gc, name, type); 2766 result = jabber_initiate_media(account, name, type);
2768 g_free(name); 2767 g_free(name);
2769 return result; 2768 return result;
2770 } 2769 }
2771 2770
2772 msg = g_strdup_printf(_("Please select the resource of %s with which you would like to start a media session."), who); 2771 msg = g_strdup_printf(_("Please select the resource of %s with which you would like to start a media session."), who);
2773 fields = purple_request_fields_new(); 2772 fields = purple_request_fields_new();
2774 group = purple_request_field_group_new(NULL); 2773 group = purple_request_field_group_new(NULL);
2775 request = g_new0(JabberMediaRequest, 1); 2774 request = g_new0(JabberMediaRequest, 1);
2776 request->pc = gc; 2775 request->account = account;
2777 request->who = g_strdup(who); 2776 request->who = g_strdup(who);
2778 request->type = type; 2777 request->type = type;
2779 2778
2780 purple_request_field_group_add_field(group, field); 2779 purple_request_field_group_add_field(group, field);
2781 purple_request_fields_add_group(fields, group); 2780 purple_request_fields_add_group(fields, group);
2782 purple_request_fields(gc, _("Select a Resource"), msg, NULL, 2781 purple_request_fields(account, _("Select a Resource"), msg,
2783 fields, _("Initiate Media"), 2782 NULL, fields, _("Initiate Media"),
2784 G_CALLBACK(jabber_media_ok_cb), _("Cancel"), 2783 G_CALLBACK(jabber_media_ok_cb), _("Cancel"),
2785 G_CALLBACK(jabber_media_cancel_cb), 2784 G_CALLBACK(jabber_media_cancel_cb),
2786 gc->account, who, NULL, request); 2785 account, who, NULL, request);
2787 2786
2788 g_free(msg); 2787 g_free(msg);
2789 return TRUE; 2788 return TRUE;
2790 } 2789 }
2791 #endif 2790 #endif
2792 return FALSE; 2791 return FALSE;
2793 } 2792 }
2794 2793
2795 PurpleMediaCaps jabber_get_media_caps(PurpleConnection *gc, const char *who) 2794 PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who)
2796 { 2795 {
2797 #ifdef USE_VV 2796 #ifdef USE_VV
2798 JabberStream *js = (JabberStream *) gc->proto_data; 2797 JabberStream *js = (JabberStream *)
2798 purple_account_get_connection(account)->proto_data;
2799 JabberBuddy *jb; 2799 JabberBuddy *jb;
2800 JabberBuddyResource *jbr; 2800 JabberBuddyResource *jbr;
2801 PurpleMediaCaps caps = PURPLE_MEDIA_CAPS_NONE; 2801 PurpleMediaCaps caps = PURPLE_MEDIA_CAPS_NONE;
2802 gchar *resource; 2802 gchar *resource;
2803 2803
2859 } else if(!jb->resources->next) { 2859 } else if(!jb->resources->next) {
2860 /* only 1 resource online (probably our most common case) */ 2860 /* only 1 resource online (probably our most common case) */
2861 gchar *name; 2861 gchar *name;
2862 jbr = jb->resources->data; 2862 jbr = jb->resources->data;
2863 name = g_strdup_printf("%s/%s", who, jbr->name); 2863 name = g_strdup_printf("%s/%s", who, jbr->name);
2864 caps = jabber_get_media_caps(gc, name); 2864 caps = jabber_get_media_caps(account, name);
2865 g_free(name); 2865 g_free(name);
2866 } else { 2866 } else {
2867 /* we've got multiple resources, combine their caps */ 2867 /* we've got multiple resources, combine their caps */
2868 GList *l; 2868 GList *l;
2869 2869
2870 for(l = jb->resources; l; l = l->next) 2870 for(l = jb->resources; l; l = l->next)
2871 { 2871 {
2872 gchar *name; 2872 gchar *name;
2873 jbr = l->data; 2873 jbr = l->data;
2874 name = g_strdup_printf("%s/%s", who, jbr->name); 2874 name = g_strdup_printf("%s/%s", who, jbr->name);
2875 caps |= jabber_get_media_caps(gc, name); 2875 caps |= jabber_get_media_caps(account, name);
2876 g_free(name); 2876 g_free(name);
2877 } 2877 }
2878 } 2878 }
2879 2879
2880 return caps; 2880 return caps;