static EmpathyDispatcher * setup_dispatcher (void) { EmpathyDispatcher *d; GPtrArray *filters; struct { const gchar *channeltype; TpHandleType handletype; } types[] = { /* Text channels with handle types none, contact and room */ { TP_IFACE_CHANNEL_TYPE_TEXT, TP_HANDLE_TYPE_NONE }, { TP_IFACE_CHANNEL_TYPE_TEXT, TP_HANDLE_TYPE_CONTACT }, { TP_IFACE_CHANNEL_TYPE_TEXT, TP_HANDLE_TYPE_ROOM }, /* file transfer to contacts */ { TP_IFACE_CHANNEL_TYPE_FILE_TRANSFER, TP_HANDLE_TYPE_CONTACT }, /* stream media to contacts */ { TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, TP_HANDLE_TYPE_CONTACT }, /* stream tubes to contacts and rooms */ { TP_IFACE_CHANNEL_TYPE_STREAM_TUBE, TP_HANDLE_TYPE_CONTACT }, { TP_IFACE_CHANNEL_TYPE_STREAM_TUBE, TP_HANDLE_TYPE_ROOM }, /* d-bus tubes to contacts and rooms */ { TP_IFACE_CHANNEL_TYPE_DBUS_TUBE, TP_HANDLE_TYPE_CONTACT }, { TP_IFACE_CHANNEL_TYPE_DBUS_TUBE, TP_HANDLE_TYPE_ROOM }, /* roomlists */ { TP_IFACE_CHANNEL_TYPE_ROOM_LIST, TP_HANDLE_TYPE_NONE }, }; gchar *capabilities[] = { "org.freedesktop.Telepathy.Channel.Interface.MediaSignalling/ice-udp", "org.freedesktop.Telepathy.Channel.Interface.MediaSignalling/gtalk-p2p", NULL }; GHashTable *asv; guint i; /* Setup the basic Client.Handler that matches our client filter */ filters = g_ptr_array_new (); asv = tp_asv_new ( TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_TEXT, TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_INT, TP_HANDLE_TYPE_CONTACT, NULL); g_ptr_array_add (filters, asv); d = empathy_dispatcher_new (PACKAGE_NAME, filters, NULL); g_ptr_array_foreach (filters, (GFunc) g_hash_table_destroy, NULL); g_ptr_array_free (filters, TRUE); /* Setup the an extended Client.Handler that matches everything we can do */ filters = g_ptr_array_new (); for (i = 0 ; i < G_N_ELEMENTS (types); i++) { asv = tp_asv_new ( TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING, types[i].channeltype, TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_INT, types[i].handletype, NULL); g_ptr_array_add (filters, asv); } asv = tp_asv_new ( TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_INT, TP_HANDLE_TYPE_CONTACT, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialAudio", G_TYPE_BOOLEAN, TRUE, NULL); g_ptr_array_add (filters, asv); asv = tp_asv_new ( TP_IFACE_CHANNEL ".ChannelType", G_TYPE_STRING, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA, TP_IFACE_CHANNEL ".TargetHandleType", G_TYPE_INT, TP_HANDLE_TYPE_CONTACT, TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA ".InitialVideo", G_TYPE_BOOLEAN, TRUE, NULL); g_ptr_array_add (filters, asv); empathy_dispatcher_add_handler (d, PACKAGE_NAME"MoreThanMeetsTheEye", filters, capabilities); g_ptr_array_foreach (filters, (GFunc) g_hash_table_destroy, NULL); g_ptr_array_free (filters, TRUE); return d; }
int main (int argc, char *argv[]) { guint32 startup_timestamp; EmpathyStatusIcon *icon; EmpathyDispatcher *dispatcher; GtkWidget *window; MissionControl *mc; EmpathyIdle *idle; gboolean autoconnect = TRUE; gboolean no_connect = FALSE; gboolean hide_contact_list = FALSE; GError *error = NULL; GOptionEntry options[] = { { "no-connect", 'n', 0, G_OPTION_ARG_NONE, &no_connect, N_("Don't connect on startup"), NULL }, { "hide-contact-list", 'h', 0, G_OPTION_ARG_NONE, &hide_contact_list, N_("Don't show the contact list on startup"), NULL }, { NULL } }; bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); startup_timestamp = get_startup_timestamp (); if (!gtk_init_with_args (&argc, &argv, _("- Empathy Instant Messenger"), 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"); gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), PKGDATADIR G_DIR_SEPARATOR_S "icons"); /* Setting up the bacon connection */ connection = bacon_message_connection_new ("empathy"); if (connection != NULL) { if (!bacon_message_connection_get_is_server (connection)) { gchar *message; DEBUG ("Activating existing instance"); message = g_strdup_printf ("%" G_GUINT32_FORMAT, startup_timestamp); bacon_message_connection_send (connection, message); /* We never popup a window, so tell startup-notification * that we are done. */ gdk_notify_startup_complete (); g_free (message); bacon_message_connection_free (connection); return EXIT_SUCCESS; } } else { g_warning ("Cannot create the 'empathy' bacon connection."); } /* Setting up MC */ mc = empathy_mission_control_new (); g_signal_connect (mc, "ServiceEnded", G_CALLBACK (service_ended_cb), NULL); g_signal_connect (mc, "Error", 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 && ! no_connect && empathy_idle_get_state (idle) <= MC_PRESENCE_OFFLINE) { empathy_idle_set_state (idle, MC_PRESENCE_AVAILABLE); } create_salut_account (); /* Setting up UI */ window = empathy_main_window_show (); icon = empathy_status_icon_new (GTK_WINDOW (window), hide_contact_list); if (connection) { /* We se the callback here because we need window */ bacon_message_connection_set_callback (connection, on_bacon_message_received, window); } /* Handle channels */ dispatcher = empathy_dispatcher_new (); g_signal_connect (dispatcher, "dispatch-channel", G_CALLBACK (dispatch_channel_cb), NULL); gtk_main (); empathy_idle_set_state (idle, MC_PRESENCE_OFFLINE); g_object_unref (mc); g_object_unref (idle); g_object_unref (icon); g_object_unref (dispatcher); return EXIT_SUCCESS; }