From de24c820d141079b880de18e3ff6c28955588732 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Mon, 3 Dec 2007 15:12:05 +0000 Subject: [PATCH] Cleanup chat objects API and request a new Text channel if account gets 2007-12-03 Xavier Claessens * libempathy-gtk/empathy-chat-window.c: * libempathy-gtk/empathy-chat.c: * libempathy-gtk/empathy-chat.h: * libempathy-gtk/empathy-group-chat.c: * libempathy-gtk/empathy-group-chat.h: * libempathy-gtk/empathy-private-chat.c: * libempathy-gtk/empathy-private-chat.h: * libempathy/empathy-tp-chat.c: * libempathy/empathy-tp-chat.h: * python/pyempathy/pyempathy.defs: * python/pyempathygtk/pyempathygtk.defs: * src/empathy-chat-chandler.c: Cleanup chat objects API and request a new Text channel if account gets reconnected. svn path=/trunk/; revision=461 --- ChangeLog | 16 +++ libempathy-gtk/empathy-chat-window.c | 50 +++++---- libempathy-gtk/empathy-chat.c | 141 ++++++++++++++++++++++++-- libempathy-gtk/empathy-chat.h | 77 +++++++------- libempathy-gtk/empathy-group-chat.c | 19 ++-- libempathy-gtk/empathy-group-chat.h | 18 ++-- libempathy-gtk/empathy-private-chat.c | 125 +++++++++-------------- libempathy-gtk/empathy-private-chat.h | 13 +-- libempathy/empathy-tp-chat.c | 55 +++------- libempathy/empathy-tp-chat.h | 2 +- python/pyempathy/pyempathy.defs | 8 -- python/pyempathygtk/pyempathygtk.defs | 8 -- src/empathy-chat-chandler.c | 24 +++-- 13 files changed, 310 insertions(+), 246 deletions(-) diff --git a/ChangeLog b/ChangeLog index 13781d4f..d89ee9ca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2007-12-03 Xavier Claessens + + * libempathy-gtk/empathy-chat-window.c: + * libempathy-gtk/empathy-chat.c: + * libempathy-gtk/empathy-chat.h: + * libempathy-gtk/empathy-group-chat.c: + * libempathy-gtk/empathy-group-chat.h: + * libempathy-gtk/empathy-private-chat.c: + * libempathy-gtk/empathy-private-chat.h: + * libempathy/empathy-tp-chat.c: + * libempathy/empathy-tp-chat.h: + * python/pyempathy/pyempathy.defs: + * python/pyempathygtk/pyempathygtk.defs: + * src/empathy-chat-chandler.c: Cleanup chat objects API and request a + new Text channel if account gets reconnected. + 2007-12-03 Xavier Claessens * libempathy/empathy-debug.c: Call tp_debug_set_flags to get tp-glib diff --git a/libempathy-gtk/empathy-chat-window.c b/libempathy-gtk/empathy-chat-window.c index 49950d3e..b4475ff7 100644 --- a/libempathy-gtk/empathy-chat-window.c +++ b/libempathy-gtk/empathy-chat-window.c @@ -34,6 +34,8 @@ #include #include +#include + #include #include #include @@ -749,8 +751,8 @@ chat_window_update_menu (EmpathyChatWindow *window) * connected to the room? */ chatroom = empathy_chatroom_manager_find (priv->chatroom_manager, - priv->current_chat->account, - empathy_chat_get_id (priv->current_chat)); + empathy_chat_get_account (priv->current_chat), + empathy_chat_get_id (priv->current_chat)); gtk_widget_set_sensitive (priv->menu_room_add, chatroom == NULL); gtk_widget_set_sensitive (priv->menu_conv_insert_smiley, is_connected); @@ -881,10 +883,10 @@ chat_window_log_activate_cb (GtkWidget *menuitem, priv = GET_PRIV (window); - empathy_log_window_show (priv->current_chat->account, - empathy_chat_get_id (priv->current_chat), - empathy_chat_is_group_chat (priv->current_chat), - GTK_WINDOW (priv->dialog)); + empathy_log_window_show (empathy_chat_get_account (priv->current_chat), + empathy_chat_get_id (priv->current_chat), + empathy_chat_is_group_chat (priv->current_chat), + GTK_WINDOW (priv->dialog)); } static void @@ -960,7 +962,7 @@ chat_window_conv_activate_cb (GtkWidget *menuitem, manager = empathy_log_manager_new (); log_exists = empathy_log_manager_exists (manager, - priv->current_chat->account, + empathy_chat_get_account (priv->current_chat), empathy_chat_get_id (priv->current_chat), empathy_chat_is_group_chat (priv->current_chat)); g_object_unref (manager); @@ -1077,10 +1079,10 @@ chat_window_room_add_activate_cb (GtkWidget *menuitem, return; } - chatroom = empathy_chatroom_new_full (priv->current_chat->account, - empathy_chat_get_id (priv->current_chat), - empathy_chat_get_name (priv->current_chat), - FALSE); + chatroom = empathy_chatroom_new_full (empathy_chat_get_account (priv->current_chat), + empathy_chat_get_id (priv->current_chat), + empathy_chat_get_name (priv->current_chat), + FALSE); manager = empathy_chatroom_manager_new (); empathy_chatroom_manager_add (manager, chatroom); @@ -1571,7 +1573,6 @@ chat_window_drag_data_received (GtkWidget *widget, guint time, EmpathyChatWindow *window) { - /* FIXME: DnD of contact do not seems to work... */ if (info == DND_DRAG_TYPE_CONTACT_ID) { EmpathyContactFactory *factory; EmpathyContact *contact = NULL; @@ -1607,17 +1608,25 @@ chat_window_drag_data_received (GtkWidget *widget, account = empathy_contact_get_account (contact); chat = empathy_chat_window_find_chat (account, id); - if (chat) { - g_object_ref (chat); - } else { - chat = EMPATHY_CHAT (empathy_private_chat_new_with_contact (contact)); + + if (!chat) { + MissionControl *mc; + + mc = empathy_mission_control_new (); + mission_control_request_channel (mc, + empathy_contact_get_account (contact), + TP_IFACE_CHANNEL_TYPE_TEXT, + empathy_contact_get_handle (contact), + TP_HANDLE_TYPE_CONTACT, + NULL, NULL); + g_object_unref (mc); + return; } - old_window = empathy_chat_get_window (chat); - + + old_window = empathy_chat_get_window (chat); if (old_window) { if (old_window == window) { gtk_drag_finish (context, TRUE, FALSE, time); - g_object_unref (chat); return; } @@ -1635,7 +1644,6 @@ chat_window_drag_data_received (GtkWidget *widget, * anyway with add_chat() and remove_chat(). */ gtk_drag_finish (context, TRUE, FALSE, time); - g_object_unref (chat); } else if (info == DND_DRAG_TYPE_TAB) { EmpathyChat *chat = NULL; @@ -1873,7 +1881,7 @@ empathy_chat_window_find_chat (McAccount *account, chat = ll->data; - if (empathy_account_equal (account, chat->account) && + if (empathy_account_equal (account, empathy_chat_get_account (chat)) && strcmp (id, empathy_chat_get_id (chat)) == 0) { return chat; } diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c index 1ea2985c..d07b84b0 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -34,6 +34,8 @@ #include #include +#include + #include #include #include @@ -65,7 +67,9 @@ struct _EmpathyChatPriv { EmpathyLogManager *log_manager; EmpathyTpChat *tp_chat; - EmpathyChatWindow *window; + EmpathyChatWindow *window; + McAccount *account; + MissionControl *mc; guint composing_stop_timeout_id; gboolean sensitive; gchar *id; @@ -75,6 +79,7 @@ struct _EmpathyChatPriv { guint scroll_idle_id; gboolean first_tp_chat; time_t last_log_timestamp; + gboolean is_first_char; /* Used to automatically shrink a window that has temporarily * grown due to long input. */ @@ -155,10 +160,89 @@ enum { LAST_SIGNAL }; +enum { + PROP_0, + PROP_TP_CHAT +}; + static guint signals[LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (EmpathyChat, empathy_chat, G_TYPE_OBJECT); +static void +chat_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + EmpathyChatPriv *priv = GET_PRIV (object); + + switch (param_id) { + case PROP_TP_CHAT: + g_value_set_object (value, priv->tp_chat); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + }; +} + +static void +chat_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + EmpathyChat *chat = EMPATHY_CHAT (object); + + switch (param_id) { + case PROP_TP_CHAT: + empathy_chat_set_tp_chat (chat, + EMPATHY_TP_CHAT (g_value_get_object (value))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + }; +} + +static void +chat_status_changed_cb (MissionControl *mc, + TpConnectionStatus status, + McPresence presence, + TpConnectionStatusReason reason, + const gchar *unique_name, + EmpathyChat *chat) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + McAccount *account; + + account = mc_account_lookup (unique_name); + + if (status == TP_CONNECTION_STATUS_CONNECTED && !priv->tp_chat && + empathy_account_equal (account, priv->account)) { + TpHandleType handle_type; + + empathy_debug (DEBUG_DOMAIN, + "Account reconnected, request a new Text channel"); + + if (empathy_chat_is_group_chat (chat)) { + handle_type = TP_HANDLE_TYPE_ROOM; + } else { + handle_type = TP_HANDLE_TYPE_CONTACT; + } + + mission_control_request_channel_with_string_handle (mc, + priv->account, + TP_IFACE_CHANNEL_TYPE_TEXT, + priv->id, + handle_type, + NULL, NULL); + } + + g_object_unref (account); +} + static void empathy_chat_class_init (EmpathyChatClass *klass) { @@ -167,6 +251,17 @@ empathy_chat_class_init (EmpathyChatClass *klass) object_class = G_OBJECT_CLASS (klass); object_class->finalize = chat_finalize; + object_class->get_property = chat_get_property; + object_class->set_property = chat_set_property; + + g_object_class_install_property (object_class, + PROP_TP_CHAT, + g_param_spec_object ("tp-chat", + "Empathy tp chat", + "The tp chat object", + EMPATHY_TYPE_TP_CHAT, + G_PARAM_CONSTRUCT | + G_PARAM_READWRITE)); signals[COMPOSING] = g_signal_new ("composing", @@ -214,13 +309,13 @@ empathy_chat_class_init (EmpathyChatClass *klass) static void empathy_chat_init (EmpathyChat *chat) { - EmpathyChatPriv *priv; + EmpathyChatPriv *priv = GET_PRIV (chat); GtkTextBuffer *buffer; chat->view = empathy_chat_view_new (); chat->input_text_view = gtk_text_view_new (); - chat->is_first_char = TRUE; + priv->is_first_char = TRUE; g_object_set (chat->input_text_view, "pixels-above-lines", 2, @@ -231,8 +326,6 @@ empathy_chat_init (EmpathyChat *chat) "wrap-mode", GTK_WRAP_WORD_CHAR, NULL); - priv = GET_PRIV (chat); - priv->log_manager = empathy_log_manager_new (); priv->default_window_height = -1; priv->vscroll_visible = FALSE; @@ -240,6 +333,11 @@ empathy_chat_init (EmpathyChat *chat) priv->sent_messages = NULL; priv->sent_messages_index = -1; priv->first_tp_chat = TRUE; + priv->mc = empathy_mission_control_new (); + + dbus_g_proxy_connect_signal (DBUS_G_PROXY (priv->mc), "AccountStatusChanged", + G_CALLBACK (chat_status_changed_cb), + chat, NULL); g_signal_connect (chat->input_text_view, "key_press_event", @@ -296,13 +394,22 @@ chat_finalize (GObject *object) g_list_free (priv->compositors); chat_composing_remove_timeout (chat); - g_object_unref (chat->account); g_object_unref (priv->log_manager); + dbus_g_proxy_disconnect_signal (DBUS_G_PROXY (priv->mc), "AccountStatusChanged", + G_CALLBACK (chat_status_changed_cb), + chat); + g_object_unref (priv->mc); + + if (priv->tp_chat) { g_object_unref (priv->tp_chat); } + if (priv->account) { + g_object_unref (priv->account); + } + if (priv->scroll_idle_id) { g_source_remove (priv->scroll_idle_id); } @@ -386,7 +493,7 @@ chat_input_text_view_send (EmpathyChat *chat) g_free (msg); - chat->is_first_char = TRUE; + priv->is_first_char = TRUE; } static void @@ -683,7 +790,7 @@ chat_input_text_buffer_changed_cb (GtkTextBuffer *buffer, EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED, &spell_checker); - if (chat->is_first_char) { + if (priv->is_first_char) { GtkRequisition req; gint window_height; GtkWidget *dialog; @@ -702,7 +809,7 @@ chat_input_text_buffer_changed_cb (GtkTextBuffer *buffer, priv->last_input_height = req.height; priv->padding_height = window_height - req.height - allocation->height; - chat->is_first_char = FALSE; + priv->is_first_char = FALSE; } gtk_text_buffer_get_start_iter (buffer, &start); @@ -1150,7 +1257,7 @@ chat_add_logs (EmpathyChat *chat) /* Add messages from last conversation */ messages = empathy_log_manager_get_last_messages (priv->log_manager, - chat->account, + priv->account, empathy_chat_get_id (chat), empathy_chat_is_group_chat (chat)); num_messages = g_list_length (messages); @@ -1360,10 +1467,14 @@ empathy_chat_set_tp_chat (EmpathyChat *chat, chat); g_object_unref (priv->tp_chat); } + if (priv->account) { + g_object_unref (priv->account); + } g_free (priv->id); priv->tp_chat = g_object_ref (tp_chat); priv->id = g_strdup (empathy_tp_chat_get_id (tp_chat)); + priv->account = g_object_ref (empathy_tp_chat_get_account (tp_chat)); if (priv->first_tp_chat) { chat_add_logs (chat); @@ -1401,6 +1512,8 @@ empathy_chat_set_tp_chat (EmpathyChat *chat, if (EMPATHY_CHAT_GET_CLASS (chat)->set_tp_chat) { EMPATHY_CHAT_GET_CLASS (chat)->set_tp_chat (chat, tp_chat); } + + g_object_notify (G_OBJECT (chat), "tp-chat"); } const gchar * @@ -1413,6 +1526,14 @@ empathy_chat_get_id (EmpathyChat *chat) return priv->id; } +McAccount * +empathy_chat_get_account (EmpathyChat *chat) +{ + EmpathyChatPriv *priv = GET_PRIV (chat); + + return priv->account; +} + void empathy_chat_clear (EmpathyChat *chat) { diff --git a/libempathy-gtk/empathy-chat.h b/libempathy-gtk/empathy-chat.h index c030dd29..5bf456e4 100644 --- a/libempathy-gtk/empathy-chat.h +++ b/libempathy-gtk/empathy-chat.h @@ -56,11 +56,8 @@ struct _EmpathyChat { GObject parent; /* Protected */ - EmpathyChatView *view; - EmpathyTpChat *tp_chat; + EmpathyChatView *view; GtkWidget *input_text_view; - gboolean is_first_char; - McAccount *account; }; struct _EmpathyChatClass { @@ -78,47 +75,47 @@ struct _EmpathyChatClass { GdkEventKey *event); }; -GType empathy_chat_get_type (void); +GType empathy_chat_get_type (void); EmpathyChatView * empathy_chat_get_view (EmpathyChat *chat); EmpathyChatWindow *empathy_chat_get_window (EmpathyChat *chat); -void empathy_chat_set_window (EmpathyChat *chat, - EmpathyChatWindow *window); -void empathy_chat_present (EmpathyChat *chat); -void empathy_chat_clear (EmpathyChat *chat); -void empathy_chat_scroll_down (EmpathyChat *chat); -void empathy_chat_cut (EmpathyChat *chat); -void empathy_chat_copy (EmpathyChat *chat); -void empathy_chat_paste (EmpathyChat *chat); -const gchar * empathy_chat_get_name (EmpathyChat *chat); -gchar * empathy_chat_get_tooltip (EmpathyChat *chat); -const gchar * empathy_chat_get_status_icon_name (EmpathyChat *chat); -GtkWidget * empathy_chat_get_widget (EmpathyChat *chat); -gboolean empathy_chat_is_group_chat (EmpathyChat *chat); -gboolean empathy_chat_is_connected (EmpathyChat *chat); - -void empathy_chat_save_geometry (EmpathyChat *chat, - gint x, - gint y, - gint w, - gint h); -void empathy_chat_load_geometry (EmpathyChat *chat, - gint *x, - gint *y, - gint *w, - gint *h); -void empathy_chat_set_tp_chat (EmpathyChat *chat, - EmpathyTpChat *tp_chat); -const gchar * empathy_chat_get_id (EmpathyChat *chat); +void empathy_chat_set_window (EmpathyChat *chat, + EmpathyChatWindow *window); +void empathy_chat_present (EmpathyChat *chat); +void empathy_chat_clear (EmpathyChat *chat); +void empathy_chat_scroll_down (EmpathyChat *chat); +void empathy_chat_cut (EmpathyChat *chat); +void empathy_chat_copy (EmpathyChat *chat); +void empathy_chat_paste (EmpathyChat *chat); +const gchar * empathy_chat_get_name (EmpathyChat *chat); +gchar * empathy_chat_get_tooltip (EmpathyChat *chat); +const gchar * empathy_chat_get_status_icon_name (EmpathyChat *chat); +GtkWidget * empathy_chat_get_widget (EmpathyChat *chat); +gboolean empathy_chat_is_group_chat (EmpathyChat *chat); +gboolean empathy_chat_is_connected (EmpathyChat *chat); +void empathy_chat_save_geometry (EmpathyChat *chat, + gint x, + gint y, + gint w, + gint h); +void empathy_chat_load_geometry (EmpathyChat *chat, + gint *x, + gint *y, + gint *w, + gint *h); +void empathy_chat_set_tp_chat (EmpathyChat *chat, + EmpathyTpChat *tp_chat); +const gchar * empathy_chat_get_id (EmpathyChat *chat); +McAccount * empathy_chat_get_account (EmpathyChat *chat); /* For spell checker dialog to correct the misspelled word. */ -gboolean empathy_chat_get_is_command (const gchar *str); -void empathy_chat_correct_word (EmpathyChat *chat, - GtkTextIter start, - GtkTextIter end, - const gchar *new_word); -gboolean empathy_chat_should_play_sound (EmpathyChat *chat); -gboolean empathy_chat_should_highlight_nick (EmpathyMessage *message); +gboolean empathy_chat_get_is_command (const gchar *str); +void empathy_chat_correct_word (EmpathyChat *chat, + GtkTextIter start, + GtkTextIter end, + const gchar *new_word); +gboolean empathy_chat_should_play_sound (EmpathyChat *chat); +gboolean empathy_chat_should_highlight_nick (EmpathyMessage *message); G_END_DECLS diff --git a/libempathy-gtk/empathy-group-chat.c b/libempathy-gtk/empathy-group-chat.c index 948f728e..77751465 100644 --- a/libempathy-gtk/empathy-group-chat.c +++ b/libempathy-gtk/empathy-group-chat.c @@ -175,22 +175,15 @@ group_chat_finalize (GObject *object) } EmpathyGroupChat * -empathy_group_chat_new (McAccount *account, - TpChan *tp_chan) +empathy_group_chat_new (EmpathyTpChatroom *tp_chat) { - EmpathyGroupChat *chat; - EmpathyGroupChatPriv *priv; - - g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL); - g_return_val_if_fail (TELEPATHY_IS_CHAN (tp_chan), NULL); + EmpathyGroupChat *chat; - chat = g_object_new (EMPATHY_TYPE_GROUP_CHAT, NULL); - - priv = GET_PRIV (chat); + g_return_val_if_fail (EMPATHY_IS_TP_CHAT (tp_chat), NULL); - EMPATHY_CHAT (chat)->account = g_object_ref (account); - priv->tp_chat = empathy_tp_chatroom_new (account, tp_chan); - empathy_chat_set_tp_chat (EMPATHY_CHAT (chat), EMPATHY_TP_CHAT (priv->tp_chat)); + chat = g_object_new (EMPATHY_TYPE_GROUP_CHAT, + "tp-chat", tp_chat, + NULL); return chat; } diff --git a/libempathy-gtk/empathy-group-chat.h b/libempathy-gtk/empathy-group-chat.h index fc756785..e0ce7946 100644 --- a/libempathy-gtk/empathy-group-chat.h +++ b/libempathy-gtk/empathy-group-chat.h @@ -29,9 +29,8 @@ G_BEGIN_DECLS -#include - -#include +#include +#include #define EMPATHY_TYPE_GROUP_CHAT (empathy_group_chat_get_type ()) #define EMPATHY_GROUP_CHAT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EMPATHY_TYPE_GROUP_CHAT, EmpathyGroupChat)) @@ -56,13 +55,12 @@ struct _EmpathyGroupChatClass { EmpathyChatClass parent_class; }; -GType empathy_group_chat_get_type (void) G_GNUC_CONST; -EmpathyGroupChat *empathy_group_chat_new (McAccount *account, - TpChan *tp_chan); -gboolean empathy_group_chat_get_show_contacts (EmpathyGroupChat *chat); -void empathy_group_chat_set_show_contacts (EmpathyGroupChat *chat, - gboolean show); -void empathy_group_chat_set_topic (EmpathyGroupChat *chat); +GType empathy_group_chat_get_type (void) G_GNUC_CONST; +EmpathyGroupChat *empathy_group_chat_new (EmpathyTpChatroom *tp_chat); +gboolean empathy_group_chat_get_show_contacts (EmpathyGroupChat *chat); +void empathy_group_chat_set_show_contacts (EmpathyGroupChat *chat, + gboolean show); +void empathy_group_chat_set_topic (EmpathyGroupChat *chat); G_END_DECLS diff --git a/libempathy-gtk/empathy-private-chat.c b/libempathy-gtk/empathy-private-chat.c index 81b804d0..9af94417 100644 --- a/libempathy-gtk/empathy-private-chat.c +++ b/libempathy-gtk/empathy-private-chat.c @@ -81,6 +81,49 @@ static GtkWidget * private_chat_get_widget (EmpathyChat G_DEFINE_TYPE (EmpathyPrivateChat, empathy_private_chat, EMPATHY_TYPE_CHAT); + +static GObject * +private_chat_constructor (GType type, + guint n_props, + GObjectConstructParam *props) +{ + GObject *chat; + EmpathyPrivateChatPriv *priv; + EmpathyTpChat *tp_chat; + TpChan *tp_chan; + McAccount *account; + + chat = G_OBJECT_CLASS (empathy_private_chat_parent_class)->constructor (type, n_props, props); + + priv = GET_PRIV (chat); + + g_object_get (chat, "tp-chat", &tp_chat, NULL); + tp_chan = empathy_tp_chat_get_channel (tp_chat); + account = empathy_tp_chat_get_account (tp_chat); + + priv->factory = empathy_contact_factory_new (); + priv->contact = empathy_contact_factory_get_from_handle (priv->factory, + account, + tp_chan->handle); + + priv->name = g_strdup (empathy_contact_get_name (priv->contact)); + + g_signal_connect (priv->contact, + "notify::name", + G_CALLBACK (private_chat_contact_updated_cb), + chat); + g_signal_connect (priv->contact, + "notify::presence", + G_CALLBACK (private_chat_contact_presence_updated_cb), + chat); + + priv->is_online = empathy_contact_is_online (priv->contact); + + g_object_unref (tp_chat); + + return chat; +} + static void empathy_private_chat_class_init (EmpathyPrivateChatClass *klass) { @@ -88,6 +131,7 @@ empathy_private_chat_class_init (EmpathyPrivateChatClass *klass) EmpathyChatClass *chat_class = EMPATHY_CHAT_CLASS (klass); object_class->finalize = private_chat_finalize; + object_class->constructor = private_chat_constructor; chat_class->get_name = private_chat_get_name; chat_class->get_tooltip = private_chat_get_tooltip; @@ -101,12 +145,6 @@ empathy_private_chat_class_init (EmpathyPrivateChatClass *klass) static void empathy_private_chat_init (EmpathyPrivateChat *chat) { - EmpathyPrivateChatPriv *priv; - - priv = GET_PRIV (chat); - - priv->is_online = FALSE; - private_chat_create_ui (chat); } @@ -317,79 +355,16 @@ private_chat_get_widget (EmpathyChat *chat) return priv->widget; } -static void -private_chat_setup (EmpathyPrivateChat *chat, - EmpathyContact *contact, - EmpathyTpChat *tp_chat) -{ - EmpathyPrivateChatPriv *priv; - - priv = GET_PRIV (chat); - - EMPATHY_CHAT (chat)->account = g_object_ref (empathy_contact_get_account (contact)); - priv->contact = g_object_ref (contact); - priv->name = g_strdup (empathy_contact_get_name (contact)); - - empathy_chat_set_tp_chat (EMPATHY_CHAT (chat), tp_chat); - - g_signal_connect (priv->contact, - "notify::name", - G_CALLBACK (private_chat_contact_updated_cb), - chat); - g_signal_connect (priv->contact, - "notify::presence", - G_CALLBACK (private_chat_contact_presence_updated_cb), - chat); - - priv->is_online = empathy_contact_is_online (priv->contact); -} - EmpathyPrivateChat * -empathy_private_chat_new (McAccount *account, - TpChan *tp_chan) +empathy_private_chat_new (EmpathyTpChat *tp_chat) { - EmpathyPrivateChat *chat; - EmpathyPrivateChatPriv *priv; - EmpathyTpChat *tp_chat; - EmpathyContact *contact; + EmpathyPrivateChat *chat; - g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL); - g_return_val_if_fail (TELEPATHY_IS_CHAN (tp_chan), NULL); + g_return_val_if_fail (EMPATHY_IS_TP_CHAT (tp_chat), NULL); - chat = g_object_new (EMPATHY_TYPE_PRIVATE_CHAT, NULL); - priv = GET_PRIV (chat); - - priv->factory = empathy_contact_factory_new (); - contact = empathy_contact_factory_get_from_handle (priv->factory, - account, - tp_chan->handle); - - tp_chat = empathy_tp_chat_new (account, tp_chan); - private_chat_setup (chat, contact, tp_chat); - - g_object_unref (tp_chat); - g_object_unref (contact); - - return chat; -} - -EmpathyPrivateChat * -empathy_private_chat_new_with_contact (EmpathyContact *contact) -{ - EmpathyPrivateChat *chat; - EmpathyPrivateChatPriv *priv; - EmpathyTpChat *tp_chat; - - g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); - - chat = g_object_new (EMPATHY_TYPE_PRIVATE_CHAT, NULL); - - priv = GET_PRIV (chat); - priv->factory = empathy_contact_factory_new (); - - tp_chat = empathy_tp_chat_new_with_contact (contact); - private_chat_setup (chat, contact, tp_chat); - g_object_unref (tp_chat); + chat = g_object_new (EMPATHY_TYPE_PRIVATE_CHAT, + "tp-chat", tp_chat, + NULL); return chat; } diff --git a/libempathy-gtk/empathy-private-chat.h b/libempathy-gtk/empathy-private-chat.h index b13eede7..169809bb 100644 --- a/libempathy-gtk/empathy-private-chat.h +++ b/libempathy-gtk/empathy-private-chat.h @@ -28,10 +28,7 @@ #ifndef __EMPATHY_PRIVATE_CHAT_H__ #define __EMPATHY_PRIVATE_CHAT_H__ -#include - -#include - +#include #include G_BEGIN_DECLS @@ -57,11 +54,9 @@ struct _EmpathyPrivateChatClass { EmpathyChatClass parent; }; -GType empathy_private_chat_get_type (void); -EmpathyPrivateChat * empathy_private_chat_new (McAccount *account, - TpChan *tp_chan); -EmpathyPrivateChat * empathy_private_chat_new_with_contact (EmpathyContact *contact); -EmpathyContact * empathy_private_chat_get_contact (EmpathyPrivateChat *chat); +GType empathy_private_chat_get_type (void); +EmpathyPrivateChat * empathy_private_chat_new (EmpathyTpChat *tp_chat); +EmpathyContact * empathy_private_chat_get_contact (EmpathyPrivateChat *chat); G_END_DECLS diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c index 6a871822..68a0af17 100644 --- a/libempathy/empathy-tp-chat.c +++ b/libempathy/empathy-tp-chat.c @@ -561,49 +561,6 @@ empathy_tp_chat_new (McAccount *account, NULL); } -EmpathyTpChat * -empathy_tp_chat_new_with_contact (EmpathyContact *contact) -{ - EmpathyTpChat *chat; - MissionControl *mc; - McAccount *account; - TpConn *tp_conn; - TpChan *text_chan; - const gchar *bus_name; - guint handle; - - g_return_val_if_fail (EMPATHY_IS_CONTACT (contact), NULL); - - mc = empathy_mission_control_new (); - account = empathy_contact_get_account (contact); - - if (mission_control_get_connection_status (mc, account, NULL) != 0) { - /* The account is not connected, nothing to do. */ - return NULL; - } - - tp_conn = mission_control_get_connection (mc, account, NULL); - g_return_val_if_fail (tp_conn != NULL, NULL); - bus_name = dbus_g_proxy_get_bus_name (DBUS_G_PROXY (tp_conn)); - handle = empathy_contact_get_handle (contact); - - text_chan = tp_conn_new_channel (tp_get_bus (), - tp_conn, - bus_name, - TP_IFACE_CHANNEL_TYPE_TEXT, - TP_HANDLE_TYPE_CONTACT, - handle, - TRUE); - - chat = empathy_tp_chat_new (account, text_chan); - - g_object_unref (tp_conn); - g_object_unref (text_chan); - g_object_unref (mc); - - return chat; -} - gboolean empathy_tp_chat_get_acknowledge (EmpathyTpChat *chat) { @@ -642,6 +599,18 @@ empathy_tp_chat_get_channel (EmpathyTpChat *chat) return priv->tp_chan; } +McAccount * +empathy_tp_chat_get_account (EmpathyTpChat *chat) +{ + EmpathyTpChatPriv *priv; + + g_return_val_if_fail (EMPATHY_IS_TP_CHAT (chat), NULL); + + priv = GET_PRIV (chat); + + return priv->account; +} + GList * empathy_tp_chat_get_pendings (EmpathyTpChat *chat) { diff --git a/libempathy/empathy-tp-chat.h b/libempathy/empathy-tp-chat.h index cd807c98..7f5ef212 100644 --- a/libempathy/empathy-tp-chat.h +++ b/libempathy/empathy-tp-chat.h @@ -57,10 +57,10 @@ struct _EmpathyTpChatClass { GType empathy_tp_chat_get_type (void) G_GNUC_CONST; EmpathyTpChat *empathy_tp_chat_new (McAccount *account, TpChan *tp_chan); -EmpathyTpChat *empathy_tp_chat_new_with_contact (EmpathyContact *contact); gboolean empathy_tp_chat_get_acknowledge (EmpathyTpChat *chat); void empathy_tp_chat_set_acknowledge (EmpathyTpChat *chat, gboolean acknowledge); +McAccount * empathy_tp_chat_get_account (EmpathyTpChat *chat); TpChan * empathy_tp_chat_get_channel (EmpathyTpChat *chat); GList * empathy_tp_chat_get_pendings (EmpathyTpChat *chat); void empathy_tp_chat_send (EmpathyTpChat *chat, diff --git a/python/pyempathy/pyempathy.defs b/python/pyempathy/pyempathy.defs index f9c032cf..d3329ff2 100644 --- a/python/pyempathy/pyempathy.defs +++ b/python/pyempathy/pyempathy.defs @@ -1338,14 +1338,6 @@ ) ) -(define-function empathy_tp_chat_new_with_contact - (c-name "empathy_tp_chat_new_with_contact") - (return-type "EmpathyTpChat*") - (parameters - '("EmpathyContact*" "contact") - ) -) - (define-method get_acknowledge (of-object "EmpathyTpChat") (c-name "empathy_tp_chat_get_acknowledge") diff --git a/python/pyempathygtk/pyempathygtk.defs b/python/pyempathygtk/pyempathygtk.defs index e3f87806..c4db6014 100644 --- a/python/pyempathygtk/pyempathygtk.defs +++ b/python/pyempathygtk/pyempathygtk.defs @@ -1150,14 +1150,6 @@ ) ) -(define-function empathy_private_chat_new_with_contact - (c-name "empathy_private_chat_new_with_contact") - (return-type "EmpathyPrivateChat*") - (parameters - '("EmpathyContact*" "contact") - ) -) - (define-method get_contact (of-object "EmpathyPrivateChat") (c-name "empathy_private_chat_get_contact") diff --git a/src/empathy-chat-chandler.c b/src/empathy-chat-chandler.c index 2064f16d..dc2eb60f 100644 --- a/src/empathy-chat-chandler.c +++ b/src/empathy-chat-chandler.c @@ -54,9 +54,10 @@ chat_chandler_new_channel_cb (EmpathyChandler *chandler, TpChan *tp_chan, MissionControl *mc) { - McAccount *account; - EmpathyChat *chat; - gchar *id; + EmpathyTpChat *tp_chat; + McAccount *account; + EmpathyChat *chat; + gchar *id; account = mission_control_get_account_for_connection (mc, tp_conn, NULL); id = empathy_inspect_channel (account, tp_chan); @@ -66,8 +67,6 @@ chat_chandler_new_channel_cb (EmpathyChandler *chandler, if (chat) { /* The chat already exists */ if (!empathy_chat_is_connected (chat)) { - EmpathyTpChat *tp_chat; - /* The chat died, give him the new text channel */ if (empathy_chat_is_group_chat (chat)) { tp_chat = EMPATHY_TP_CHAT (empathy_tp_chatroom_new (account, tp_chan)); @@ -85,17 +84,26 @@ chat_chandler_new_channel_cb (EmpathyChandler *chandler, if (tp_chan->handle_type == TP_HANDLE_TYPE_CONTACT) { /* We have a new private chat channel */ - chat = EMPATHY_CHAT (empathy_private_chat_new (account, tp_chan)); + tp_chat = empathy_tp_chat_new (account, tp_chan); + chat = EMPATHY_CHAT (empathy_private_chat_new (tp_chat)); } else if (tp_chan->handle_type == TP_HANDLE_TYPE_ROOM) { /* We have a new group chat channel */ - chat = EMPATHY_CHAT (empathy_group_chat_new (account, tp_chan)); + tp_chat = EMPATHY_TP_CHAT (empathy_tp_chatroom_new (account, tp_chan)); + chat = EMPATHY_CHAT (empathy_group_chat_new (EMPATHY_TP_CHATROOM (tp_chat))); + } else { + empathy_debug (DEBUG_DOMAIN, + "Unknown handle type (%d) for Text channel", + tp_chan->handle_type); + g_object_unref (account); + return; } - empathy_chat_present (EMPATHY_CHAT (chat)); + empathy_chat_present (chat); g_object_unref (chat); g_object_unref (account); + g_object_unref (tp_chat); } int -- 2.39.2