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