diff options
author | Xavier Claessens <xclaesse@gmail.com> | 2007-12-03 23:12:05 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2007-12-03 23:12:05 +0800 |
commit | de24c820d141079b880de18e3ff6c28955588732 (patch) | |
tree | e74bf299ff2fde4a7fce370a2714b90b4b9389cd /libempathy-gtk | |
parent | 1fe7346f60e911fa37a22361c34efc6baa946bf8 (diff) | |
download | gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.tar gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.tar.gz gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.tar.bz2 gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.tar.lz gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.tar.xz gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.tar.zst gsoc2013-empathy-de24c820d141079b880de18e3ff6c28955588732.zip |
Cleanup chat objects API and request a new Text channel if account gets
2007-12-03 Xavier Claessens <xclaesse@gmail.com>
* 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
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-chat-window.c | 50 | ||||
-rw-r--r-- | libempathy-gtk/empathy-chat.c | 141 | ||||
-rw-r--r-- | libempathy-gtk/empathy-chat.h | 77 | ||||
-rw-r--r-- | libempathy-gtk/empathy-group-chat.c | 19 | ||||
-rw-r--r-- | libempathy-gtk/empathy-group-chat.h | 18 | ||||
-rw-r--r-- | libempathy-gtk/empathy-private-chat.c | 125 | ||||
-rw-r--r-- | libempathy-gtk/empathy-private-chat.h | 13 |
7 files changed, 265 insertions, 178 deletions
diff --git a/libempathy-gtk/empathy-chat-window.c b/libempathy-gtk/empathy-chat-window.c index 49950d3ea..b4475ff7a 100644 --- a/libempathy-gtk/empathy-chat-window.c +++ b/libempathy-gtk/empathy-chat-window.c @@ -34,6 +34,8 @@ #include <glade/glade.h> #include <glib/gi18n.h> +#include <libmissioncontrol/mission-control.h> + #include <libempathy/empathy-contact-factory.h> #include <libempathy/empathy-contact-list.h> #include <libempathy/empathy-log-manager.h> @@ -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 1ea2985ce..d07b84b07 100644 --- a/libempathy-gtk/empathy-chat.c +++ b/libempathy-gtk/empathy-chat.c @@ -34,6 +34,8 @@ #include <glib/gi18n.h> #include <gtk/gtk.h> +#include <libmissioncontrol/mission-control.h> + #include <libempathy/empathy-contact-manager.h> #include <libempathy/empathy-log-manager.h> #include <libempathy/empathy-debug.h> @@ -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,11 +160,90 @@ 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) { GObjectClass *object_class; @@ -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 c030dd292..5bf456e48 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 948f728e5..777514652 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 fc7567856..e0ce79462 100644 --- a/libempathy-gtk/empathy-group-chat.h +++ b/libempathy-gtk/empathy-group-chat.h @@ -29,9 +29,8 @@ G_BEGIN_DECLS -#include <libtelepathy/tp-chan.h> - -#include <libmissioncontrol/mc-account.h> +#include <libempathy/empathy-tp-chatroom.h> +#include <libempathy/empathy-contact.h> #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 81b804d05..9af944174 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 b13eede7f..169809bb0 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 <libtelepathy/tp-chan.h> - -#include <libmissioncontrol/mc-account.h> - +#include <libempathy/empathy-tp-chat.h> #include <libempathy/empathy-contact.h> 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 |