X-Git-Url: https://git.0d.be/?p=empathy.git;a=blobdiff_plain;f=src%2Fempathy.c;h=85124d1e9156056ed813130780a670dd6bd61552;hp=5da2b25296fc66674c9b4fa9a963b4c1eae6dc8c;hb=2f64117b60d24ba5ad3f4bb1c41d4ea3a91f15a6;hpb=2f64945c0d6bef54f79ba32b8c2a6be692a31bb5 diff --git a/src/empathy.c b/src/empathy.c index 5da2b252..85124d1e 100644 --- a/src/empathy.c +++ b/src/empathy.c @@ -14,9 +14,9 @@ * * 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. - * + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + * * Authors: Xavier Claessens */ @@ -31,22 +31,34 @@ #include #include +#if HAVE_LIBCHAMPLAIN +#include +#endif + #include +#include +#include #include #include #include #include #include +#include #include +#include +#include #include #include +#include +#include #include #include #include #include +#include #include "empathy-accounts-dialog.h" #include "empathy-main-window.h" @@ -56,9 +68,13 @@ #include "empathy-ft-manager.h" #include "bacon-message-connection.h" +#include "extensions/extensions.h" + #define DEBUG_FLAG EMPATHY_DEBUG_OTHER #include +#include + static BaconMessageConnection *connection = NULL; static void @@ -89,10 +105,16 @@ dispatch_cb (EmpathyDispatcher *dispatcher, } if (id) { + EmpathyAccountManager *manager; + TpConnection *connection; McAccount *account; - account = empathy_tp_chat_get_account (tp_chat); + manager = empathy_account_manager_dup_singleton (); + connection = empathy_tp_chat_get_connection (tp_chat); + account = empathy_account_manager_get_account (manager, + connection); chat = empathy_chat_window_find_chat (account, id); + g_object_unref (manager); } if (chat) { @@ -102,32 +124,25 @@ dispatch_cb (EmpathyDispatcher *dispatcher, } empathy_chat_window_present_chat (chat); - g_object_unref (tp_chat); empathy_dispatch_operation_claim (operation); } else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_STREAMED_MEDIA) { - EmpathyTpCall *call; - - call = EMPATHY_TP_CALL ( - empathy_dispatch_operation_get_channel_wrapper (operation)); - - empathy_dispatch_operation_claim (operation); + EmpathyCallFactory *factory; - empathy_call_window_new (call); + factory = empathy_call_factory_get (); + empathy_call_factory_claim_channel (factory, operation); + } else if (channel_type == TP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER) { + EmpathyFTFactory *factory; - g_object_unref (call); + factory = empathy_ft_factory_dup_singleton (); - } - else if (channel_type == EMP_IFACE_QUARK_CHANNEL_TYPE_FILE_TRANSFER) { - EmpathyFTManager *ft_manager; - EmpathyTpFile *tp_file; - - ft_manager = empathy_ft_manager_dup_singleton (); - tp_file = EMPATHY_TP_FILE ( - empathy_dispatch_operation_get_channel_wrapper (operation)); - empathy_ft_manager_add_tp_file (ft_manager, tp_file); - g_object_unref (tp_file); - empathy_dispatch_operation_claim (operation); + /* if the operation is not incoming, don't claim it, + * as it might have been triggered by another client, and + * we are observing it. + */ + if (empathy_dispatch_operation_is_incoming (operation)) { + empathy_ft_factory_claim_channel (factory, operation); + } } } @@ -224,7 +239,7 @@ create_salut_account (void) GError *error = NULL; /* Check if we already created a salut account */ - empathy_conf_get_bool (empathy_conf_get(), + empathy_conf_get_bool (empathy_conf_get (), EMPATHY_PREFS_SALUT_ACCOUNT_CREATED, &salut_created); if (salut_created) { @@ -271,13 +286,13 @@ create_salut_account (void) account = mc_account_create (profile); mc_account_set_display_name (account, _("People nearby")); - + nickname = e_contact_get (contact, E_CONTACT_NICKNAME); first_name = e_contact_get (contact, E_CONTACT_GIVEN_NAME); last_name = e_contact_get (contact, E_CONTACT_FAMILY_NAME); email = e_contact_get (contact, E_CONTACT_EMAIL_1); jid = e_contact_get (contact, E_CONTACT_IM_JABBER_HOME_1); - + if (!tp_strdiff (nickname, "nickname")) { g_free (nickname); nickname = NULL; @@ -307,7 +322,7 @@ create_salut_account (void) /* The code that handles single-instance and startup notification is * copied from gedit. * - * Copyright (C) 2005 - Paolo Maggi + * Copyright (C) 2005 - Paolo Maggi */ static void on_bacon_message_received (const char *message, @@ -385,21 +400,104 @@ get_startup_timestamp () return (retval > 0) ? retval : 0; } +static gboolean +show_version_cb (const char *option_name, + const char *value, + gpointer data, + GError **error) +{ + g_print ("%s\n", PACKAGE_STRING); + + exit (EXIT_SUCCESS); + + return FALSE; +} + +static void +new_incoming_transfer_cb (EmpathyFTFactory *factory, + EmpathyFTHandler *handler, + GError *error, + gpointer user_data) +{ + if (error) { + empathy_ft_manager_display_error (handler, error); + } else { + empathy_receive_file_with_file_chooser (handler); + } +} + +static void +new_ft_handler_cb (EmpathyFTFactory *factory, + EmpathyFTHandler *handler, + GError *error, + gpointer user_data) +{ + if (error) { + empathy_ft_manager_display_error (handler, error); + } else { + empathy_ft_manager_add_handler (handler); + } + + g_object_unref (handler); +} + +static void +new_call_handler_cb (EmpathyCallFactory *factory, EmpathyCallHandler *handler, + gboolean outgoing, gpointer user_data) +{ + EmpathyCallWindow *window; + + window = empathy_call_window_new (handler); + gtk_widget_show (GTK_WIDGET (window)); +} + +#ifdef ENABLE_DEBUG +static void +default_log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + g_log_default_handler (log_domain, log_level, message, NULL); + + /* G_LOG_DOMAIN = "empathy". No need to send empathy messages to the + * debugger as they already have in empathy_debug. */ + if (log_level != G_LOG_LEVEL_DEBUG + || tp_strdiff (log_domain, G_LOG_DOMAIN)) { + EmpathyDebugger *dbg; + GTimeVal now; + + dbg = empathy_debugger_get_singleton (); + g_get_current_time (&now); + + empathy_debugger_add_message (dbg, &now, log_domain, + log_level, message); + } +} +#endif /* ENABLE_DEBUG */ + int main (int argc, char *argv[]) { guint32 startup_timestamp; +#if HAVE_GEOCLUE + EmpathyLocationManager *location_manager = NULL; +#endif EmpathyStatusIcon *icon; EmpathyDispatcher *dispatcher; + EmpathyLogManager *log_manager; EmpathyChatroomManager *chatroom_manager; + EmpathyCallFactory *call_factory; + EmpathyFTFactory *ft_factory; GtkWidget *window; MissionControl *mc; EmpathyIdle *idle; gboolean autoconnect = TRUE; - gboolean no_connect = FALSE; + gboolean no_connect = FALSE; gboolean hide_contact_list = FALSE; gboolean accounts_dialog = FALSE; GError *error = NULL; + TpDBusDaemon *dbus_daemon; GOptionEntry options[] = { { "no-connect", 'n', 0, G_OPTION_ARG_NONE, &no_connect, @@ -413,22 +511,40 @@ main (int argc, char *argv[]) 0, G_OPTION_ARG_NONE, &accounts_dialog, N_("Show the accounts dialog"), NULL }, + { "version", 'v', + G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, show_version_cb, NULL, NULL }, { NULL } }; /* Init */ g_thread_init (NULL); + empathy_init (); + if (!gtk_init_with_args (&argc, &argv, - _("- Empathy Instant Messenger"), + N_("- Empathy Instant Messenger"), options, GETTEXT_PACKAGE, &error)) { g_warning ("Error in empathy init: %s", error->message); return EXIT_FAILURE; } + empathy_gtk_init (); - g_set_application_name (PACKAGE_NAME); + g_set_application_name (_(PACKAGE_NAME)); + g_setenv ("PULSE_PROP_media.role", "phone", TRUE); + + gst_init (&argc, &argv); + +#if HAVE_LIBCHAMPLAIN + gtk_clutter_init (&argc, &argv); +#endif + gtk_window_set_default_icon_name ("empathy"); textdomain (GETTEXT_PACKAGE); +#ifdef ENABLE_DEBUG + /* Set up debugger */ + g_log_set_default_handler (default_log_handler, NULL); +#endif + /* Setting up the bacon connection */ startup_timestamp = get_startup_timestamp (); connection = bacon_message_connection_new ("empathy"); @@ -464,8 +580,25 @@ main (int argc, char *argv[]) g_warning ("Cannot create the 'empathy' bacon connection."); } + /* Take well-known name */ + dbus_daemon = tp_dbus_daemon_dup (&error); + if (error == NULL) { + if (!tp_dbus_daemon_request_name (dbus_daemon, + "org.gnome.Empathy", + TRUE, &error)) { + DEBUG ("Failed to request well-known name: %s", + error ? error->message : "no message"); + g_clear_error (&error); + } + g_object_unref (dbus_daemon); + } else { + DEBUG ("Failed to dup dbus daemon: %s", + error ? error->message : "no message"); + g_clear_error (&error); + } + /* Setting up MC */ - mc = empathy_mission_control_new (); + mc = empathy_mission_control_dup_singleton (); g_signal_connect (mc, "ServiceEnded", G_CALLBACK (service_ended_cb), NULL); @@ -493,14 +626,15 @@ main (int argc, char *argv[]) use_nm_notify_cb, idle); /* Autoconnect */ - empathy_conf_get_bool (empathy_conf_get(), + empathy_conf_get_bool (empathy_conf_get (), EMPATHY_PREFS_AUTOCONNECT, &autoconnect); if (autoconnect && ! no_connect && - empathy_idle_get_state (idle) <= MC_PRESENCE_OFFLINE) { + tp_connection_presence_type_cmp_availability (empathy_idle_get_state + (idle), TP_CONNECTION_PRESENCE_TYPE_OFFLINE) <= 0) { empathy_idle_set_state (idle, MC_PRESENCE_AVAILABLE); } - + create_salut_account (); /* Setting up UI */ @@ -518,18 +652,46 @@ main (int argc, char *argv[]) dispatcher = empathy_dispatcher_dup_singleton (); g_signal_connect (dispatcher, "dispatch", G_CALLBACK (dispatch_cb), NULL); + /* Logging */ + log_manager = empathy_log_manager_dup_singleton (); + empathy_log_manager_observe (log_manager, dispatcher); + chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL); empathy_chatroom_manager_observe (chatroom_manager, dispatcher); + notify_init (_(PACKAGE_NAME)); + /* Create the call factory */ + call_factory = empathy_call_factory_initialise (); + g_signal_connect (G_OBJECT (call_factory), "new-call-handler", + G_CALLBACK (new_call_handler_cb), NULL); + /* Create the FT factory */ + ft_factory = empathy_ft_factory_dup_singleton (); + g_signal_connect (ft_factory, "new-ft-handler", + G_CALLBACK (new_ft_handler_cb), NULL); + g_signal_connect (ft_factory, "new-incoming-transfer", + G_CALLBACK (new_incoming_transfer_cb), NULL); + + /* Location mananger */ +#if HAVE_GEOCLUE + location_manager = empathy_location_manager_dup_singleton (); +#endif + gtk_main (); - empathy_idle_set_state (idle, MC_PRESENCE_OFFLINE); + empathy_idle_set_state (idle, TP_CONNECTION_PRESENCE_TYPE_OFFLINE); g_object_unref (mc); g_object_unref (idle); g_object_unref (icon); + g_object_unref (log_manager); g_object_unref (dispatcher); g_object_unref (chatroom_manager); +#if HAVE_GEOCLUE + g_object_unref (location_manager); +#endif + g_object_unref (ft_factory); + + notify_uninit (); return EXIT_SUCCESS; }