]> git.0d.be Git - empathy.git/blobdiff - src/empathy.c
Make use of tp-glib debug system.
[empathy.git] / src / empathy.c
index 38060912ce41b027f363cdbe9b6a9c51429ec3ee..f28eae9599d7497141962ea735eeecdb758e79eb 100644 (file)
 
 #include <telepathy-glib/util.h>
 #include <libmissioncontrol/mc-account.h>
-#include <libmissioncontrol/mc-account-monitor.h>
 #include <libmissioncontrol/mission-control.h>
 
 #include <libempathy/empathy-idle.h>
-#include <libempathy/empathy-tp-chat.h>
-#include <libempathy/empathy-tp-chatroom.h>
-#include <libempathy/empathy-chandler.h>
 #include <libempathy/empathy-utils.h>
-#include <libempathy/empathy-debug.h>
 
 #include <libempathy-gtk/empathy-conf.h>
-#include <libempathy-gtk/empathy-preferences.h>
-#include <libempathy-gtk/empathy-main-window.h>
-#include <libempathy-gtk/empathy-status-icon.h>
-#include <libempathy-gtk/empathy-chat.h>
-#include <libempathy-gtk/empathy-private-chat.h>
-#include <libempathy-gtk/empathy-group-chat.h>
-
-#include "empathy-chat-window.h"
+
+#include "empathy-main-window.h"
+#include "empathy-status-icon.h"
 #include "bacon-message-connection.h"
 
-#define DEBUG_DOMAIN "EmpathyMain"
-#define BUS_NAME "org.gnome.Empathy.ChatChandler"
-#define OBJECT_PATH "/org/gnome/Empathy/ChatChandler"
+#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
+#include <libempathy/empathy-debug.h>
 
 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_window_present_chat (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_window_present_chat (chat);
-
-       g_object_unref (chat);
-       g_object_unref (account);
-       g_object_unref (tp_chat);
-}
-
 static void
 service_ended_cb (MissionControl *mc,
                  gpointer        user_data)
 {
-       empathy_debug (DEBUG_DOMAIN, "Mission Control stopped");
+       DEBUG ("Mission Control stopped");
 }
 
 static void
@@ -132,33 +63,66 @@ operation_error_cb (MissionControl *mc,
                    guint           error_code,
                    gpointer        user_data)
 {
-       empathy_debug (DEBUG_DOMAIN, "Error code %d during operation %d",
-                     error_code,
-                     operation_id);
-}
-
-static void
-start_mission_control (EmpathyIdle *idle)
-{
-       McPresence presence;
-
-       presence = empathy_idle_get_state (idle);
-
-       if (presence > MC_PRESENCE_OFFLINE) {
-               /* MC is already running and online, nothing to do */
-               return;
+       const gchar *message;
+
+       switch (error_code) {
+       case MC_DISCONNECTED_ERROR:
+               message = _("Disconnected");
+               break;
+       case MC_INVALID_HANDLE_ERROR:
+               message = _("Invalid handle");
+               break;
+       case MC_NO_MATCHING_CONNECTION_ERROR:
+               message = _("No matching connection");
+               break;
+       case MC_INVALID_ACCOUNT_ERROR:
+               message = _("Invalid account");
+               break;
+       case MC_PRESENCE_FAILURE_ERROR:
+               message = _("Presence failure");
+               break;
+       case MC_NO_ACCOUNTS_ERROR:
+               message = _("No accounts");
+               break;
+       case MC_NETWORK_ERROR:
+               message = _("Network error");
+               break;
+       case MC_CONTACT_DOES_NOT_SUPPORT_VOICE_ERROR:
+               message = _("Contact does not support voice");
+               break;
+       case MC_LOWMEM_ERROR:
+               message = _("Lowmem");
+               break;
+       case MC_CHANNEL_REQUEST_GENERIC_ERROR:
+               message = _("Channel request generic error");
+               break;
+       case MC_CHANNEL_BANNED_ERROR:
+               message = _("Channel banned");
+               break;
+       case MC_CHANNEL_FULL_ERROR:
+               message = _("Channel full");
+               break;
+       case MC_CHANNEL_INVITE_ONLY_ERROR:
+               message = _("Channel invite only");
+               break;
+       default:
+               message = _("Unknown error code");
        }
 
-       empathy_idle_set_state (idle, MC_PRESENCE_AVAILABLE);
+       DEBUG ("Error during operation %d: %s", operation_id, message);
 }
 
 static void
-account_enabled_cb (McAccountMonitor *monitor,
-                   gchar            *unique_name,
-                   EmpathyIdle      *idle)
+use_nm_notify_cb (EmpathyConf *conf,
+                 const gchar *key,
+                 gpointer     user_data)
 {
-       empathy_debug (DEBUG_DOMAIN, "Account enabled: %s", unique_name);
-       start_mission_control (idle);
+       EmpathyIdle *idle = user_data;
+       gboolean     use_nm;
+
+       if (empathy_conf_get_bool (conf, key, &use_nm)) {
+               empathy_idle_set_use_nm (idle, use_nm);
+       }
 }
 
 static void
@@ -176,6 +140,7 @@ create_salut_account (void)
        gchar      *last_name = NULL;
        gchar      *email = NULL;
        gchar      *jid = NULL;
+       GError     *error = NULL;
 
        /* Check if we already created a salut account */
        empathy_conf_get_bool (empathy_conf_get(),
@@ -185,21 +150,23 @@ create_salut_account (void)
                return;
        }
 
-       empathy_debug (DEBUG_DOMAIN, "Try to add a salut account...");
+       DEBUG ("Try to add a salut account...");
 
        /* Check if the salut CM is installed */
        profile = mc_profile_lookup ("salut");
        protocol = mc_profile_get_protocol (profile);
        if (!protocol) {
-               empathy_debug (DEBUG_DOMAIN, "Salut not installed");
+               DEBUG ("Salut not installed");
                g_object_unref (profile);
                return;
        }
        g_object_unref (protocol);
 
        /* Get self EContact from EDS */
-       if (!e_book_get_self (&contact, &book, NULL)) {
-               empathy_debug (DEBUG_DOMAIN, "Failed to get self econtact");
+       if (!e_book_get_self (&contact, &book, &error)) {
+               DEBUG ("Failed to get self econtact: %s",
+                       error ? error->message : "No error given");
+               g_clear_error (&error);
                g_object_unref (profile);
                return;
        }
@@ -211,7 +178,7 @@ create_salut_account (void)
        /* Check if there is already a salut account */
        accounts = mc_accounts_list_by_profile (profile);
        if (accounts) {
-               empathy_debug (DEBUG_DOMAIN, "There is already a salut account");
+               DEBUG ("There is already a salut account");
                mc_accounts_list_free (accounts);
                g_object_unref (profile);
                return;
@@ -231,13 +198,9 @@ create_salut_account (void)
                nickname = NULL;
        }
 
-       empathy_debug (DEBUG_DOMAIN, "Salut account created:\n"
-                                    "  nickname=%s\n"
-                                    "  first-name=%s\n"
-                                    "  last-name=%s\n"
-                                    "  email=%s\n"
-                                    "  jid=%s\n",
-                      nickname, first_name, last_name, email, jid);
+       DEBUG ("Salut account created:\nnickname=%s\nfirst-name=%s\n"
+               "last-name=%s\nemail=%s\njid=%s\n",
+               nickname, first_name, last_name, email, jid);
 
        mc_account_set_param_string (account, "nickname", nickname ? nickname : "");
        mc_account_set_param_string (account, "first-name", first_name ? first_name : "");
@@ -270,9 +233,8 @@ on_bacon_message_received (const char *message,
 
        g_return_if_fail (message != NULL);
 
-       empathy_debug (DEBUG_DOMAIN,
-                      "Other instance launched, presenting the main window "
-                      "(message is '%s')", message);
+       DEBUG ("Other instance launched, presenting the main window. message='%s'",
+               message);
 
        startup_timestamp = atoi (message);
 
@@ -283,7 +245,7 @@ on_bacon_message_received (const char *message,
         * has been realized otherwise it will not work. lame. */
        if (startup_timestamp == 0) {
                /* Work if launched from the terminal */
-               empathy_debug (DEBUG_DOMAIN, "Using X server timestamp as a fallback");
+               DEBUG ("Using X server timestamp as a fallback");
 
                if (!GTK_WIDGET_REALIZED (window)) {
                        gtk_widget_realize (GTK_WIDGET (window));
@@ -340,13 +302,17 @@ main (int argc, char *argv[])
        EmpathyStatusIcon *icon;
        GtkWidget         *window;
        MissionControl    *mc;
-       McAccountMonitor  *monitor;
        EmpathyIdle       *idle;
-       EmpathyChandler   *chandler;
        gboolean           autoconnect = TRUE;
+       gboolean           no_connect = FALSE; 
        GError            *error = NULL;
-
-       empathy_debug_set_log_file_from_env ();
+       GOptionEntry       options[] = {
+               { "no-connect", 'n',
+                 0, G_OPTION_ARG_NONE, &no_connect,
+                 N_("Don't connect on startup"),
+                 NULL },
+               { NULL }
+       };
 
        bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
@@ -356,11 +322,17 @@ main (int argc, char *argv[])
 
        if (!gtk_init_with_args (&argc, &argv,
                                 _("- Empathy Instant Messenger"),
-                                NULL, GETTEXT_PACKAGE, &error)) {
-               empathy_debug (DEBUG_DOMAIN, error->message);
+                                options, GETTEXT_PACKAGE, &error)) {
+               g_warning ("Error in gtk init: %s", error->message);
                return EXIT_FAILURE;
        }
 
+       if (g_getenv ("EMPATHY_TIMING") != NULL) {
+               g_log_set_default_handler (tp_debug_timestamped_log_handler, NULL);
+       }
+       empathy_debug_set_flags (g_getenv ("EMPATHY_DEBUG"));
+       tp_debug_divert_messages (g_getenv ("EMPATHY_LOGFILE"));
+
        g_set_application_name (PACKAGE_NAME);
 
        gtk_window_set_default_icon_name ("empathy");
@@ -373,7 +345,7 @@ main (int argc, char *argv[])
                if (!bacon_message_connection_get_is_server (connection)) {
                        gchar *message;
 
-                       empathy_debug (DEBUG_DOMAIN, "Activating existing instance");
+                       DEBUG ("Activating existing instance");
 
                        message = g_strdup_printf ("%" G_GUINT32_FORMAT,
                                                   startup_timestamp);
@@ -393,12 +365,7 @@ main (int argc, char *argv[])
        }
 
        /* Setting up MC */
-       monitor = mc_account_monitor_new ();
        mc = empathy_mission_control_new ();
-       idle = empathy_idle_new ();
-       g_signal_connect (monitor, "account-enabled",
-                         G_CALLBACK (account_enabled_cb),
-                         idle);
        g_signal_connect (mc, "ServiceEnded",
                          G_CALLBACK (service_ended_cb),
                          NULL);
@@ -406,12 +373,20 @@ main (int argc, char *argv[])
                          G_CALLBACK (operation_error_cb),
                          NULL);
 
+       /* Setting up Idle */
+       idle = empathy_idle_new ();
+       empathy_idle_set_auto_away (idle, TRUE);
+       use_nm_notify_cb (empathy_conf_get (), EMPATHY_PREFS_USE_NM, idle);
+       empathy_conf_notify_add (empathy_conf_get (), EMPATHY_PREFS_USE_NM,
+                                use_nm_notify_cb, idle);
+
+       /* Autoconnect */
        empathy_conf_get_bool (empathy_conf_get(),
                               EMPATHY_PREFS_AUTOCONNECT,
                               &autoconnect);
-                              
-       if (autoconnect) {
-               start_mission_control (idle);
+       if (autoconnect && ! no_connect &&
+           empathy_idle_get_state (idle) <= MC_PRESENCE_OFFLINE) {
+               empathy_idle_set_state (idle, MC_PRESENCE_AVAILABLE);
        }
        
        create_salut_account ();
@@ -427,19 +402,10 @@ 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);
        g_object_unref (icon);