From ab2a4adf50fda468b9dce80c883a406802acd570 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Thu, 13 Mar 2008 17:40:56 +0000 Subject: Move chat chandler into the same process than contact list svn path=/trunk/; revision=788 --- src/Makefile.am | 8 +- src/empathy-chat-chandler.c | 155 ---------------------------------- src/empathy.c | 76 +++++++++++++++++ src/org.gnome.Empathy.Chat.service.in | 2 +- 4 files changed, 79 insertions(+), 162 deletions(-) delete mode 100644 src/empathy-chat-chandler.c diff --git a/src/Makefile.am b/src/Makefile.am index 31fb41724..e064945e8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,16 +19,12 @@ bin_PROGRAMS = \ empathy-accounts \ empathy-logs -libexec_PROGRAMS = \ - empathy-chat-chandler - empathy_SOURCES = \ empathy.c \ bacon-message-connection.c \ bacon-message-connection.h empathy_accounts_SOURCES = empathy-accounts.c empathy_logs_SOURCES = empathy-logs.c -empathy_chat_chandler_SOURCES = empathy-chat-chandler.c # Dbus service files servicedir = $(datadir)/dbus-1/services @@ -36,7 +32,7 @@ service_DATA = \ org.gnome.Empathy.Chat.service %.service: %.service.in Makefile - @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@ + @sed -e "s|\@libexecdir\@|$(libexecdir)|" $< | sed -e "s|\@bindir\@|$(bindir)|" > $@ chandlerdir = $(datadir)/telepathy/managers chandler_DATA = \ @@ -54,7 +50,7 @@ EXTRA_DIST = \ CLEANFILES = $(BUILT_SOURCES) if HAVE_VOIP -libexec_PROGRAMS += empathy-call-chandler +libexec_PROGRAMS = empathy-call-chandler empathy_call_chandler_SOURCES = empathy-call-chandler.c service_DATA += org.gnome.Empathy.Call.service chandler_DATA += empathy-call.chandler diff --git a/src/empathy-chat-chandler.c b/src/empathy-chat-chandler.c deleted file mode 100644 index febea756d..000000000 --- a/src/empathy-chat-chandler.c +++ /dev/null @@ -1,155 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * Copyright (C) 2007-2008 Collabora Ltd. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public - * License along with this program; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - * Authors: Xavier Claessens - */ - -#include - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define DEBUG_DOMAIN "EmpathyChat" - -#define BUS_NAME "org.gnome.Empathy.ChatChandler" -#define OBJECT_PATH "/org/gnome/Empathy/ChatChandler" - -static guint nb_chats = 0; - -static void -chat_chandler_weak_notify (gpointer data, - GObject *where_the_object_was) -{ - nb_chats--; - if (nb_chats == 0) { - empathy_debug (DEBUG_DOMAIN, "No more chats, leaving..."); - gtk_main_quit (); - } -} - -static void -chat_chandler_new_channel_cb (EmpathyChandler *chandler, - TpConn *tp_conn, - TpChan *tp_chan, - MissionControl *mc) -{ - 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); - chat = empathy_chat_window_find_chat (account, id); - g_free (id); - - if (chat) { - /* The chat already exists */ - if (!empathy_chat_is_connected (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)); - } else { - tp_chat = empathy_tp_chat_new (account, tp_chan); - } - empathy_chat_set_tp_chat (chat, tp_chat); - g_object_unref (tp_chat); - } - empathy_chat_present (chat); - - g_object_unref (account); - return; - } - - if (tp_chan->handle_type == TP_HANDLE_TYPE_CONTACT) { - /* We have a new private chat channel */ - 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 */ - 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; - } - - nb_chats++; - g_object_weak_ref (G_OBJECT (chat), chat_chandler_weak_notify, NULL); - empathy_chat_present (chat); - - g_object_unref (chat); - g_object_unref (account); - g_object_unref (tp_chat); -} - -int -main (int argc, char *argv[]) -{ - EmpathyChandler *chandler; - MissionControl *mc; - - empathy_debug_set_log_file_from_env (); - - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - gtk_init (&argc, &argv); - - gtk_window_set_default_icon_name ("empathy"); - gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), - PKGDATADIR G_DIR_SEPARATOR_S "icons"); - - mc = empathy_mission_control_new (); - chandler = empathy_chandler_new (BUS_NAME, OBJECT_PATH); - g_signal_connect (chandler, "new-channel", - G_CALLBACK (chat_chandler_new_channel_cb), - mc); - - empathy_debug (DEBUG_DOMAIN, "Ready to handle new text channels"); - - gtk_main (); - - g_object_unref (chandler); - g_object_unref (mc); - - return EXIT_SUCCESS; -} - diff --git a/src/empathy.c b/src/empathy.c index 850144e97..d261cd54b 100644 --- a/src/empathy.c +++ b/src/empathy.c @@ -38,6 +38,9 @@ #include #include +#include +#include +#include #include #include @@ -45,13 +48,77 @@ #include #include #include +#include +#include +#include +#include #include "bacon-message-connection.h" #define DEBUG_DOMAIN "EmpathyMain" +#define BUS_NAME "org.gnome.Empathy.ChatChandler" +#define OBJECT_PATH "/org/gnome/Empathy/ChatChandler" static BaconMessageConnection *connection = NULL; +static void +new_text_channel_cb (EmpathyChandler *chandler, + TpConn *tp_conn, + TpChan *tp_chan, + MissionControl *mc) +{ + 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); + chat = empathy_chat_window_find_chat (account, id); + g_free (id); + + if (chat) { + /* The chat already exists */ + if (!empathy_chat_is_connected (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)); + } else { + tp_chat = empathy_tp_chat_new (account, tp_chan); + } + empathy_chat_set_tp_chat (chat, tp_chat); + g_object_unref (tp_chat); + } + empathy_chat_present (chat); + + g_object_unref (account); + return; + } + + if (tp_chan->handle_type == TP_HANDLE_TYPE_CONTACT) { + /* We have a new private chat channel */ + 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 */ + 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 (chat); + + g_object_unref (chat); + g_object_unref (account); + g_object_unref (tp_chat); +} + static void service_ended_cb (MissionControl *mc, gpointer user_data) @@ -275,6 +342,7 @@ main (int argc, char *argv[]) MissionControl *mc; McAccountMonitor *monitor; EmpathyIdle *idle; + EmpathyChandler *chandler; gboolean autoconnect = TRUE; GError *error = NULL; @@ -359,10 +427,18 @@ main (int argc, char *argv[]) window); } + /* Handle text channels */ + chandler = empathy_chandler_new (BUS_NAME, OBJECT_PATH); + g_signal_connect (chandler, "new-channel", + G_CALLBACK (new_text_channel_cb), + mc); + empathy_debug (DEBUG_DOMAIN, "Ready to handle new text channels"); + gtk_main (); empathy_idle_set_state (idle, MC_PRESENCE_OFFLINE); + g_object_unref (chandler); g_object_unref (monitor); g_object_unref (mc); g_object_unref (idle); diff --git a/src/org.gnome.Empathy.Chat.service.in b/src/org.gnome.Empathy.Chat.service.in index 291e95f96..2e614d9a2 100644 --- a/src/org.gnome.Empathy.Chat.service.in +++ b/src/org.gnome.Empathy.Chat.service.in @@ -1,3 +1,3 @@ [D-BUS Service] Name=org.gnome.Empathy.ChatChandler -Exec=@libexecdir@/empathy-chat-chandler +Exec=@bindir@/empathy -- cgit v1.2.3