/** * empathy_account_chooser_filter_supports_multichat: * @account: a #TpAccount * @user_data: user data or %NULL * * An #EmpathyAccountChooserFilterFunc that returns accounts that both * support multiuser text chat and are connected. * * Return value: TRUE if @account both supports muc and is connected */ static gboolean empathy_account_chooser_filter_supports_multichat (TpAccount *account, gpointer user_data) { TpConnection *connection; EmpathyDispatcher *dispatcher; GList *classes; if (tp_account_get_connection_status (account, NULL) != TP_CONNECTION_STATUS_CONNECTED) return FALSE; /* check if CM supports multiuser text chat */ connection = tp_account_get_connection (account); if (connection == NULL) return FALSE; dispatcher = empathy_dispatcher_dup_singleton (); classes = empathy_dispatcher_find_requestable_channel_classes (dispatcher, connection, TP_IFACE_CHANNEL_TYPE_TEXT, TP_HANDLE_TYPE_ROOM, NULL); g_object_unref (dispatcher); if (classes == NULL) return FALSE; g_list_free (classes); return TRUE; }
void empathy_call_handler_start_call (EmpathyCallHandler *handler) { EmpathyCallHandlerPriv *priv = GET_PRIV (handler); EmpathyDispatcher *dispatcher; TpConnection *connection; GList *classes; GValue *value; GHashTable *request; if (priv->call != NULL) { empathy_call_handler_start_tpfs (handler); empathy_tp_call_accept_incoming_call (priv->call); return; } g_assert (priv->contact != NULL); dispatcher = empathy_dispatcher_dup_singleton (); connection = empathy_contact_get_connection (priv->contact); classes = empathy_dispatcher_find_requestable_channel_classes (dispatcher, connection, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, TP_HANDLE_TYPE_CONTACT, NULL); if (classes == NULL) return; g_list_free (classes); request = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) tp_g_value_slice_free); /* org.freedesktop.Telepathy.Channel.ChannelType */ value = tp_g_value_slice_new (G_TYPE_STRING); g_value_set_string (value, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA); g_hash_table_insert (request, TP_IFACE_CHANNEL ".ChannelType", value); /* org.freedesktop.Telepathy.Channel.TargetHandleType */ value = tp_g_value_slice_new (G_TYPE_UINT); g_value_set_uint (value, TP_HANDLE_TYPE_CONTACT); g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandleType", value); /* org.freedesktop.Telepathy.Channel.TargetHandle*/ value = tp_g_value_slice_new (G_TYPE_UINT); g_value_set_uint (value, empathy_contact_get_handle (priv->contact)); g_hash_table_insert (request, TP_IFACE_CHANNEL ".TargetHandle", value); empathy_dispatcher_create_channel (dispatcher, connection, request, empathy_call_handler_request_cb, handler); g_object_unref (dispatcher); }
static void new_chatroom_dialog_account_changed_cb (GtkComboBox *combobox, EmpathyNewChatroomDialog *dialog) { EmpathyAccountChooser *account_chooser; gboolean listing = FALSE; gboolean expanded = FALSE; TpConnection *connection; EmpathyDispatcher *dispatcher; GList *classes = NULL; if (dialog->room_list) { g_object_unref (dialog->room_list); dialog->room_list = NULL; } ephy_spinner_stop (EPHY_SPINNER (dialog->throbber)); new_chatroom_dialog_model_clear (dialog); if (dialog->account != NULL) { g_signal_handler_disconnect (dialog->account, dialog->status_changed_id); g_object_unref (dialog->account); } account_chooser = EMPATHY_ACCOUNT_CHOOSER (dialog->account_chooser); dialog->account = empathy_account_chooser_dup_account (account_chooser); connection = empathy_account_chooser_get_connection (account_chooser); if (dialog->account == NULL) goto out; dialog->status_changed_id = g_signal_connect (dialog->account, "status-changed", G_CALLBACK (account_status_changed_cb), dialog); dispatcher = empathy_dispatcher_dup_singleton (); if (connection != NULL) { classes = empathy_dispatcher_find_requestable_channel_classes (dispatcher, connection, TP_IFACE_CHANNEL_TYPE_ROOM_LIST, TP_HANDLE_TYPE_NONE, NULL); } if (classes != NULL) { /* Roomlist channels are supported */ dialog->room_list = empathy_tp_roomlist_new (dialog->account); g_list_free (classes); } else { dialog->room_list = NULL; } g_object_unref (dispatcher); if (dialog->room_list) { g_signal_connect (dialog->room_list, "destroy", G_CALLBACK (new_chatroom_dialog_roomlist_destroy_cb), dialog); g_signal_connect (dialog->room_list, "new-room", G_CALLBACK (new_chatroom_dialog_new_room_cb), dialog); g_signal_connect (dialog->room_list, "notify::is-listing", G_CALLBACK (new_chatroom_dialog_listing_cb), dialog); g_signal_connect (dialog->room_list, "error::start", G_CALLBACK (start_listing_error_cb), dialog); g_signal_connect (dialog->room_list, "error::stop", G_CALLBACK (stop_listing_error_cb), dialog); expanded = gtk_expander_get_expanded (GTK_EXPANDER (dialog->expander_browse)); if (expanded) { gtk_widget_hide (dialog->viewport_error); gtk_widget_set_sensitive (dialog->treeview, TRUE); new_chatroom_dialog_browse_start (dialog); } listing = empathy_tp_roomlist_is_listing (dialog->room_list); if (listing) { ephy_spinner_start (EPHY_SPINNER (dialog->throbber)); } } gtk_widget_set_sensitive (dialog->expander_browse, dialog->room_list != NULL); out: new_chatroom_dialog_update_widgets (dialog); }