]> git.0d.be Git - empathy.git/blobdiff - src/empathy-import-widget.c
EmpathySmileyManager: use the proper Unicode characters
[empathy.git] / src / empathy-import-widget.c
index 17f19622986b1b2f5d3836bce992fe0993ca0704..708370bae6ea4e08d1f019ee14635f6b5bee0f48 100644 (file)
 
 /* empathy-import-widget.c */
 
-#include "empathy-import-dialog.h"
+#include "config.h"
 #include "empathy-import-widget.h"
-#include "empathy-import-pidgin.h"
 
-#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
-#include <libempathy/empathy-debug.h>
-#include <libempathy/empathy-account.h>
-#include <libempathy/empathy-account-manager.h>
-#include <libempathy/empathy-connection-managers.h>
-#include <libempathy/empathy-utils.h>
-
-#include <libempathy-gtk/empathy-ui-utils.h>
+#include <glib/gi18n-lib.h>
+#include <tp-account-widgets/tpaw-builder.h>
+#include <tp-account-widgets/tpaw-utils.h>
+#include <telepathy-glib/telepathy-glib-dbus.h>
 
-#include <telepathy-glib/util.h>
+#include "empathy-ui-utils.h"
+#include "empathy-utils.h"
 
-#include <glib/gi18n.h>
+#define DEBUG_FLAG EMPATHY_DEBUG_OTHER
+#include "empathy-debug.h"
 
 G_DEFINE_TYPE (EmpathyImportWidget, empathy_import_widget, G_TYPE_OBJECT)
 
@@ -54,17 +51,19 @@ enum
 };
 
 enum {
-  PROP_APPLICATION_ID = 1
+  PROP_APPLICATION_ID = 1,
+  PROP_CMS
 };
 
 typedef struct {
   GtkWidget *vbox;
   GtkWidget *treeview;
+  GtkWidget *scrolledwindow;
 
   GList *accounts;
   EmpathyImportApplication app_id;
 
-  EmpathyConnectionManagers *cms;
+  TpawConnectionManagers *cms;
 
   gboolean dispose_run;
 } EmpathyImportWidgetPriv;
@@ -77,63 +76,30 @@ import_widget_account_id_in_list (GList *accounts,
 
   for (l = accounts; l; l = l->next)
     {
-      EmpathyAccount *account = l->data;
-      const gchar *account_string;
-      GValue *value;
-      gboolean result;
+      TpAccount *account = l->data;
       const GHashTable *parameters;
 
-      parameters = empathy_account_get_parameters (account);
-
-      value = g_hash_table_lookup ((GHashTable *) parameters, "account");
-
-      if (value == NULL)
-        continue;
+      parameters = tp_account_get_parameters (account);
 
-      account_string = g_value_get_string (value);
-
-      result = tp_strdiff (account_string, account_id);
-
-      if (!result)
+      if (!tp_strdiff (tp_asv_get_string (parameters, "account"), account_id))
         return TRUE;
     }
 
   return FALSE;
 }
 
-static gboolean
-protocol_is_supported (EmpathyImportWidget *self,
-    EmpathyImportAccountData *data)
-{
-  EmpathyImportWidgetPriv *priv = GET_PRIV (self);
-  GList *cms = empathy_connection_managers_get_cms (priv->cms);
-  GList *l;
-  gboolean proto_is_supported = FALSE;
-
-  for (l = cms; l; l = l->next)
-    {
-      TpConnectionManager *tp_cm = l->data;
-      const gchar *cm_name = tp_connection_manager_get_name (tp_cm);
-      if (tp_connection_manager_has_protocol (tp_cm,
-          (const gchar*) data->protocol))
-        {
-          data->connection_manager = g_strdup (cm_name);
-          proto_is_supported = TRUE;
-          break;
-        }
-    }
-
-  return proto_is_supported;
-}
+#define MAX_TREEVIEW_HEIGHT 300
 
 static void
 import_widget_add_accounts_to_model (EmpathyImportWidget *self)
 {
+  TpAccountManager *manager;
   GtkTreeModel *model;
-  GtkTreeIter iter;
   GList *l;
   EmpathyImportWidgetPriv *priv = GET_PRIV (self);
-  EmpathyAccountManager *manager = empathy_account_manager_dup_singleton ();
+  gint min, natural;
+
+  manager = tp_account_manager_dup ();
 
   model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
 
@@ -143,33 +109,40 @@ import_widget_add_accounts_to_model (EmpathyImportWidget *self)
       EmpathyImportAccountData *data = l->data;
       gboolean import;
       GList *accounts;
+      TpConnectionManager *cm = NULL;
 
-      if (!protocol_is_supported (self, data))
+      if (!empathy_import_protocol_is_supported (data->protocol, &cm))
         continue;
 
+      data->connection_manager = g_strdup (
+          tp_connection_manager_get_name (cm));
+
       value = g_hash_table_lookup (data->settings, "account");
 
-      accounts = empathy_account_manager_dup_accounts (manager);
+      accounts = tp_account_manager_dup_valid_accounts (manager);
 
       /* Only set the "Import" cell to be active if there isn't already an
        * account set up with the same account id. */
       import = !import_widget_account_id_in_list (accounts,
           g_value_get_string (value));
 
-      g_list_foreach (accounts, (GFunc) g_object_unref, NULL);
-      g_list_free (accounts);
-
-      gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+      g_list_free_full (accounts, g_object_unref);
 
-      gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+      gtk_list_store_insert_with_values (GTK_LIST_STORE (model), NULL, -1,
           COL_IMPORT, import,
           COL_PROTOCOL, data->protocol,
           COL_NAME, g_value_get_string (value),
           COL_SOURCE, data->source,
           COL_ACCOUNT_DATA, data,
           -1);
+
     }
 
+  /* Display as much rows as possible */
+  gtk_widget_get_preferred_height (priv->treeview, &min, &natural);
+  gtk_widget_set_size_request (priv->scrolledwindow, -1,
+      MIN (natural, MAX_TREEVIEW_HEIGHT));
+
   g_object_unref (manager);
 }
 
@@ -178,12 +151,13 @@ import_widget_create_account_cb (GObject *source,
   GAsyncResult *result,
   gpointer user_data)
 {
-  EmpathyAccount *account;
+  TpAccountManager *account_manager;
+  TpAccount *account;
   GError *error = NULL;
   EmpathyImportWidget *self = user_data;
 
-  account = empathy_account_manager_create_account_finish (
-    EMPATHY_ACCOUNT_MANAGER (source), result, &error);
+  account = tp_account_manager_create_account_finish (
+    TP_ACCOUNT_MANAGER (source), result, &error);
 
   if (account == NULL)
     {
@@ -195,6 +169,13 @@ import_widget_create_account_cb (GObject *source,
 
   DEBUG ("account created\n");
 
+  if (tp_account_is_enabled (account))
+    {
+      account_manager = tp_account_manager_dup ();
+      tpaw_connect_new_account (account, account_manager);
+      g_object_unref (account_manager);
+    }
+
   g_object_unref (self);
 }
 
@@ -202,26 +183,41 @@ static void
 import_widget_add_account (EmpathyImportWidget *self,
     EmpathyImportAccountData *data)
 {
-  EmpathyAccountManager *account_manager;
-  gchar *display_name;
+  TpAccountManager *account_manager;
+  gchar *display_name = NULL;
   GHashTable *properties;
   GValue *username;
 
-  account_manager = empathy_account_manager_dup_singleton ();
+  account_manager = tp_account_manager_dup ();
 
   DEBUG ("connection_manager: %s\n", data->connection_manager);
 
   /* Set the display name of the account */
   username = g_hash_table_lookup (data->settings, "account");
-  display_name = g_strdup_printf ("%s (%s)",
-      data->protocol,
-      g_value_get_string (username));
+
+  if (!tp_strdiff (data->protocol, "irc"))
+    {
+      const gchar *server;
+
+      server = tp_asv_get_string (data->settings, "server");
+
+      if (server != NULL)
+        display_name = g_strdup_printf ("%s on %s",
+            g_value_get_string (username), server);
+    }
+
+  if (display_name == NULL)
+    {
+      display_name = g_strdup_printf ("%s (%s)",
+          data->protocol, g_value_get_string (username));
+    }
 
   DEBUG ("display name: %s\n", display_name);
 
-  properties = g_hash_table_new (NULL, NULL);
+  properties = tp_asv_new (NULL, NULL);
+  tp_asv_set_boolean (properties, TP_IFACE_ACCOUNT ".Enabled", data->enabled);
 
-  empathy_account_manager_create_account_async (account_manager,
+  tp_account_manager_create_account_async (account_manager,
       (const gchar*) data->connection_manager, data->protocol, display_name,
       data->settings, properties, import_widget_create_account_cb,
       g_object_ref (self));
@@ -283,6 +279,8 @@ import_widget_set_up_account_list (EmpathyImportWidget *self)
   GtkTreeViewColumn *column;
   GtkCellRenderer *cell;
 
+  priv->accounts = empathy_import_accounts_load (priv->app_id);
+
   store = gtk_list_store_new (COL_COUNT, G_TYPE_BOOLEAN, G_TYPE_STRING,
       G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
 
@@ -344,15 +342,6 @@ import_widget_set_up_account_list (EmpathyImportWidget *self)
   import_widget_add_accounts_to_model (self);
 }
 
-static void
-import_widget_cms_ready_cb (EmpathyConnectionManagers *cms,
-    GParamSpec *pspec,
-    EmpathyImportWidget *self)
-{
-  if (empathy_connection_managers_is_ready (cms))
-    import_widget_set_up_account_list (self);
-}
-
 static void
 import_widget_destroy_cb (GtkWidget *w,
     EmpathyImportWidget *self)
@@ -373,6 +362,9 @@ do_get_property (GObject *object,
     case PROP_APPLICATION_ID:
       g_value_set_int (value, priv->app_id);
       break;
+    case PROP_CMS:
+      g_value_set_object (value, priv->cms);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -391,6 +383,9 @@ do_set_property (GObject *object,
     case PROP_APPLICATION_ID:
       priv->app_id = g_value_get_int (value);
       break;
+    case PROP_CMS:
+      priv->cms = g_value_dup_object (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -437,25 +432,20 @@ do_constructed (GObject *obj)
   GtkBuilder *gui;
   gchar *filename;
 
-  priv->accounts = empathy_import_accounts_load (priv->app_id);
-
   filename = empathy_file_lookup ("empathy-import-dialog.ui", "src");
-  gui = empathy_builder_get_file (filename,
+  gui = tpaw_builder_get_file (filename,
       "widget_vbox", &priv->vbox,
       "treeview", &priv->treeview,
+      "scrolledwindow", &priv->scrolledwindow,
       NULL);
 
   g_free (filename);
-  empathy_builder_unref_and_keep_widget (gui, priv->vbox);
+  tpaw_builder_unref_and_keep_widget (gui, priv->vbox);
 
   g_signal_connect (priv->vbox, "destroy",
       G_CALLBACK (import_widget_destroy_cb), self);
 
-  if (empathy_connection_managers_is_ready (priv->cms))
-    import_widget_set_up_account_list (self);
-  else
-    g_signal_connect (priv->cms, "notify::ready",
-        G_CALLBACK (import_widget_cms_ready_cb), self);
+  import_widget_set_up_account_list (self);
 }
 
 static void
@@ -476,6 +466,12 @@ empathy_import_widget_class_init (EmpathyImportWidgetClass *klass)
       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
   g_object_class_install_property (oclass, PROP_APPLICATION_ID, param_spec);
 
+  param_spec = g_param_spec_object ("cms",
+      "TpawConnectionManagers", "TpawConnectionManagers",
+      TPAW_TYPE_CONNECTION_MANAGERS,
+      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
+  g_object_class_install_property (oclass, PROP_CMS, param_spec);
+
   g_type_class_add_private (klass, sizeof (EmpathyImportWidgetPriv));
 }
 
@@ -487,14 +483,18 @@ empathy_import_widget_init (EmpathyImportWidget *self)
         EmpathyImportWidgetPriv);
 
   self->priv = priv;
-
-  priv->cms = empathy_connection_managers_dup_singleton ();
 }
 
 EmpathyImportWidget *
-empathy_import_widget_new (EmpathyImportApplication id)
+empathy_import_widget_new (EmpathyImportApplication id,
+    TpawConnectionManagers *cms)
 {
-  return g_object_new (EMPATHY_TYPE_IMPORT_WIDGET, "application-id", id, NULL);
+  g_return_val_if_fail (TPAW_IS_CONNECTION_MANAGERS (cms), NULL);
+
+  return g_object_new (EMPATHY_TYPE_IMPORT_WIDGET,
+      "application-id", id,
+      "cms", cms,
+      NULL);
 }
 
 GtkWidget *