EmpathyAccountSettings *
empathy_protocol_chooser_create_account_settings (EmpathyProtocolChooser *self)
{
  EmpathyAccountSettings *settings;
  gchar *str;
  const gchar *display_name;
  TpConnectionManager *cm;
  TpConnectionManagerProtocol *proto;
  gchar *service;

  cm = empathy_protocol_chooser_dup_selected (self, &proto, &service);
  if (cm == NULL || proto == NULL)
    return NULL;

  if (service != NULL)
    display_name = empathy_service_name_to_display_name (service);
  else
    display_name = empathy_protocol_name_to_display_name (proto->name);

  /* Create account */
  /* To translator: %s is the name of the protocol, such as "Google Talk" or
   * "Yahoo!"
   */
  str = g_strdup_printf (_("New %s account"), display_name);
  settings = empathy_account_settings_new (cm->name, proto->name, service, str);

  g_free (str);

  if (!tp_strdiff (service, "google-talk"))
    {
      gchar *fallback_servers[] = {
          "talkx.l.google.com",
          "talkx.l.google.com:443,oldssl",
          "talkx.l.google.com:80",
          NULL};

      empathy_account_settings_set_icon_name_async (settings, "im-google-talk",
          NULL, NULL);

      empathy_account_settings_set_strv (settings, "fallback-servers",
          fallback_servers);
    }
  else if (!tp_strdiff (service, "facebook"))
    {
      empathy_account_settings_set_icon_name_async (settings, "im-facebook",
          NULL, NULL);

      empathy_account_settings_set_string (settings, "server",
          "chat.facebook.com");
    }

  g_object_unref (cm);
  g_free (service);
  return settings;
}
static void
protocol_choosers_add_cm (EmpathyProtocolChooser *chooser,
    TpConnectionManager *cm)
{
  EmpathyProtocolChooserPriv *priv = GET_PRIV (chooser);
  const TpConnectionManagerProtocol * const *iter;

  for (iter = cm->protocols; iter != NULL && *iter != NULL; iter++)
    {
      const TpConnectionManagerProtocol *proto = *iter;
      gchar *icon_name;
      const gchar *display_name;
      const gchar *saved_cm_name;

      saved_cm_name = g_hash_table_lookup (priv->protocols, proto->name);

      if (!tp_strdiff (cm->name, "haze") && saved_cm_name != NULL &&
          tp_strdiff (saved_cm_name, "haze"))
        /* the CM we're adding is a haze implementation of something we already
         * have; drop it.
         */
        continue;

      if (!tp_strdiff (cm->name, "haze") &&
          !tp_strdiff (proto->name, "facebook"))
        /* Facebook now supports XMPP so drop the purple facebook plugin; user
         * should use Gabble */
        continue;

      if (!tp_strdiff (cm->name, "haze") &&
          !tp_strdiff (proto->name, "sip"))
        /* Haze's SIP implementation is pretty useless (bgo #629736) */
        continue;

      if (tp_strdiff (cm->name, "haze") && !tp_strdiff (saved_cm_name, "haze"))
        {
          GtkTreeIter titer;
          gboolean valid;
          TpConnectionManager *haze_cm;

          /* let's this CM replace the haze implementation */
          valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->store),
              &titer);

          while (valid)
            {
              gchar *haze_proto_name = NULL;

              gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &titer,
                  COL_PROTOCOL_NAME, &haze_proto_name,
                  COL_CM, &haze_cm, -1);

              if (haze_cm == NULL)
                continue;

              if (!tp_strdiff (haze_cm->name, "haze") &&
                  !tp_strdiff (haze_proto_name, proto->name))
                {
                  gtk_list_store_remove (priv->store, &titer);
                  g_object_unref (haze_cm);
                  g_free (haze_proto_name);
                  break;
                }

              g_object_unref (haze_cm);
              g_free (haze_proto_name);
              valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store),
                  &titer);
            }
        }

      g_hash_table_insert (priv->protocols,
          g_strdup (proto->name), g_strdup (cm->name));

      icon_name = empathy_protocol_icon_name (proto->name);

      display_name = empathy_protocol_name_to_display_name (proto->name);

      gtk_list_store_insert_with_values (priv->store,
          NULL, 0,
          COL_ICON, icon_name,
          COL_LABEL, display_name,
          COL_CM, cm,
          COL_PROTOCOL_NAME, proto->name,
          -1);

      if (!tp_strdiff (proto->name, "jabber") &&
          !tp_strdiff (cm->name, "gabble"))
        {
          display_name = empathy_service_name_to_display_name ("google-talk");
          gtk_list_store_insert_with_values (priv->store,
             NULL, 0,
             COL_ICON, "im-google-talk",
             COL_LABEL, display_name,
             COL_CM, cm,
             COL_PROTOCOL_NAME, proto->name,
             COL_SERVICE, "google-talk",
             -1);

          display_name = empathy_service_name_to_display_name ("facebook");
          gtk_list_store_insert_with_values (priv->store,
             NULL, 0,
             COL_ICON, "im-facebook",
             COL_LABEL, display_name,
             COL_CM, cm,
             COL_PROTOCOL_NAME, proto->name,
             COL_SERVICE, "facebook",
             -1);
        }

      g_free (icon_name);
    }
}
EmpathyAccountSettings *
empathy_protocol_chooser_create_account_settings (EmpathyProtocolChooser *self)
{
  EmpathyAccountSettings *settings = NULL;
  gchar *str;
  const gchar *display_name;
  TpConnectionManager *cm;
  TpConnectionManagerProtocol *proto;
  gchar *service = NULL;

  cm = empathy_protocol_chooser_dup_selected (self, &proto, &service);
  if (cm == NULL || proto == NULL)
    goto out;

  if (service != NULL)
    display_name = empathy_service_name_to_display_name (service);
  else
    display_name = empathy_protocol_name_to_display_name (proto->name);

  /* Create account */
  /* To translator: %s is the name of the protocol, such as "Google Talk" or
   * "Yahoo!"
   */
  str = g_strdup_printf (_("New %s account"), display_name);
  settings = empathy_account_settings_new (cm->name, proto->name, service, str);

  g_free (str);

  if (!tp_strdiff (service, "google-talk"))
    {
      gchar *fallback_servers[] = {
          "talkx.l.google.com",
          "talkx.l.google.com:443,oldssl",
          "talkx.l.google.com:80",
          NULL};

      gchar *extra_certificate_identities[] = {
          "talk.google.com",
          NULL};

      empathy_account_settings_set_icon_name_async (settings, "im-google-talk",
          NULL, NULL);
      empathy_account_settings_set_string (settings, "server",
          extra_certificate_identities[0]);
      empathy_account_settings_set_boolean (settings, "require-encryption",
          TRUE);
      empathy_account_settings_set_strv (settings, "fallback-servers",
          fallback_servers);

      if (empathy_account_settings_have_tp_param (settings,
              "extra-certificate-identities"))
        {
          empathy_account_settings_set_strv (settings,
              "extra-certificate-identities", extra_certificate_identities);
        }
    }
  else if (!tp_strdiff (service, "facebook"))
    {
      empathy_account_settings_set_icon_name_async (settings, "im-facebook",
          NULL, NULL);
      empathy_account_settings_set_boolean (settings, "require-encryption",
          TRUE);
      empathy_account_settings_set_string (settings, "server",
          "chat.facebook.com");
    }

out:
  tp_clear_object (&cm);
  g_free (service);
  return settings;
}