Blame telepathy-account-widgets/tp-account-widgets/tpaw-account-widget.c

Packit 79f644
/*
Packit 79f644
 * Copyright (C) 2006-2007 Imendio AB
Packit 79f644
 * Copyright (C) 2007-2009 Collabora Ltd.
Packit 79f644
 *
Packit 79f644
 * This library is free software; you can redistribute it and/or
Packit 79f644
 * modify it under the terms of the GNU Lesser General Public
Packit 79f644
 * License as published by the Free Software Foundation; either
Packit 79f644
 * version 2.1 of the License, or (at your option) any later version.
Packit 79f644
 *
Packit 79f644
 * This library is distributed in the hope that it will be useful,
Packit 79f644
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 79f644
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 79f644
 * Lesser General Public License for more details.
Packit 79f644
 *
Packit 79f644
 * You should have received a copy of the GNU Lesser General Public
Packit 79f644
 * License along with this library; if not, write to the Free Software
Packit 79f644
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit 79f644
 *
Packit 79f644
 * Authors: Xavier Claessens <xclaesse@gmail.com>
Packit 79f644
 *          Martyn Russell <martyn@imendio.com>
Packit 79f644
 *          Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
Packit 79f644
 *          Jonathan Tellier <jonathan.tellier@gmail.com>
Packit 79f644
 *          Danielle Madeley <danielle.madeley@collabora.co.uk>
Packit 79f644
 */
Packit 79f644
Packit 79f644
#include "config.h"
Packit 79f644
#include "tpaw-account-widget.h"
Packit 79f644
#include "tpaw-account-widget-private.h"
Packit 79f644
Packit 79f644
#include <glib/gi18n-lib.h>
Packit 79f644
#include <dbus/dbus-protocol.h>
Packit 79f644
Packit 79f644
#include "tpaw-account-widget-irc.h"
Packit 79f644
#include "tpaw-account-widget-private.h"
Packit 79f644
#include "tpaw-account-widget-sip.h"
Packit 79f644
#include "tpaw-builder.h"
Packit 79f644
#include "tpaw-utils.h"
Packit 79f644
Packit 79f644
#define DEBUG_FLAG TPAW_DEBUG_ACCOUNT
Packit 79f644
#include "tpaw-debug.h"
Packit 79f644
Packit 79f644
G_DEFINE_TYPE (TpawAccountWidget, tpaw_account_widget, GTK_TYPE_BOX)
Packit 79f644
Packit 79f644
typedef enum
Packit 79f644
{
Packit 79f644
  NO_SERVICE = 0,
Packit 79f644
  GTALK_SERVICE,
Packit 79f644
  N_SERVICES
Packit 79f644
} Service;
Packit 79f644
Packit 79f644
typedef struct
Packit 79f644
{
Packit 79f644
  const gchar *label_username_example;
Packit 79f644
  gboolean show_advanced;
Packit 79f644
} ServiceInfo;
Packit 79f644
Packit 79f644
static ServiceInfo services_infos[N_SERVICES] = {
Packit 79f644
    { "label_username_example", TRUE },
Packit 79f644
    { "label_username_g_example", FALSE },
Packit 79f644
};
Packit 79f644
Packit 79f644
struct _TpawAccountWidgetPriv {
Packit 79f644
  TpawAccountSettings *settings;
Packit 79f644
Packit 79f644
  GtkWidget *grid_common_settings;
Packit 79f644
  GtkWidget *apply_button;
Packit 79f644
  GtkWidget *cancel_button;
Packit 79f644
  GtkWidget *entry_password;
Packit 79f644
  GtkWidget *spinbutton_port;
Packit 79f644
  GtkWidget *dialog;
Packit 79f644
Packit 79f644
  gboolean simple;
Packit 79f644
Packit 79f644
  gboolean contains_pending_changes;
Packit 79f644
Packit 79f644
  /* Whether the action area is part of an external dialog or it's an
Packit 79f644
   * internal one we created ourselves */
Packit 79f644
  gboolean external_action_area;
Packit 79f644
Packit 79f644
  /* An TpawAccountWidget can be used to either create an account or
Packit 79f644
   * modify it. When we are creating an account, this member is set to TRUE */
Packit 79f644
  gboolean creating_account;
Packit 79f644
Packit 79f644
  /* whether there are any other real accounts. Necessary so we know whether
Packit 79f644
   * it's safe to dismiss this widget in some cases (eg, whether the Cancel
Packit 79f644
   * button should be sensitive) */
Packit 79f644
  gboolean other_accounts_exist;
Packit 79f644
Packit 79f644
  /* if TRUE, the GTK+ destroy signal has been fired and so the widgets
Packit 79f644
   * embedded in this account widget can't be used any more
Packit 79f644
   * workaround because some async callbacks can be called after the
Packit 79f644
   * widget has been destroyed */
Packit 79f644
  gboolean destroyed;
Packit 79f644
Packit 79f644
  TpAccountManager *account_manager;
Packit 79f644
Packit 79f644
  GtkWidget *param_account_widget;
Packit 79f644
  GtkWidget *param_password_widget;
Packit 79f644
Packit 79f644
  gboolean automatic_change;
Packit 79f644
  GtkWidget *remember_password_widget;
Packit 79f644
Packit 79f644
  /* Used only for IRC accounts */
Packit 79f644
  TpawIrcNetworkChooser *irc_network_chooser;
Packit 79f644
};
Packit 79f644
Packit 79f644
enum {
Packit 79f644
  PROP_PROTOCOL = 1,
Packit 79f644
  PROP_SETTINGS,
Packit 79f644
  PROP_SIMPLE,
Packit 79f644
  PROP_CREATING_ACCOUNT,
Packit 79f644
  PROP_OTHER_ACCOUNTS_EXIST,
Packit 79f644
  PROP_DIALOG,
Packit 79f644
};
Packit 79f644
Packit 79f644
enum {
Packit 79f644
  HANDLE_APPLY,
Packit 79f644
  ACCOUNT_CREATED,
Packit 79f644
  CANCELLED,
Packit 79f644
  CLOSE,
Packit 79f644
  LAST_SIGNAL
Packit 79f644
};
Packit 79f644
Packit 79f644
enum {
Packit 79f644
  RESPONSE_LAUNCH
Packit 79f644
};
Packit 79f644
Packit 79f644
static guint signals[LAST_SIGNAL] = { 0 };
Packit 79f644
Packit 79f644
#define CHANGED_TIMEOUT 300
Packit 79f644
Packit 79f644
#define DIGIT             "0-9"
Packit 79f644
#define DIGITS            "(["DIGIT"]+)"
Packit 79f644
#define ALPHA             "a-zA-Z"
Packit 79f644
#define ALPHAS            "(["ALPHA"]+)"
Packit 79f644
#define ALPHADIGIT        ALPHA DIGIT
Packit 79f644
#define ALPHADIGITS       "(["ALPHADIGIT"]+)"
Packit 79f644
#define ALPHADIGITDASH    ALPHA DIGIT "-"
Packit 79f644
#define ALPHADIGITDASHS   "(["ALPHADIGITDASH"]*)"
Packit 79f644
Packit 79f644
#define HOSTNUMBER        "("DIGITS"\\."DIGITS"\\."DIGITS"\\."DIGITS")"
Packit 79f644
#define TOPLABEL          "("ALPHAS \
Packit 79f644
                            "| (["ALPHA"]"ALPHADIGITDASHS "["ALPHADIGIT"]))"
Packit 79f644
#define DOMAINLABEL       "("ALPHADIGITS"|(["ALPHADIGIT"]" ALPHADIGITDASHS \
Packit 79f644
                                       "["ALPHADIGIT"]))"
Packit 79f644
#define HOSTNAME          "((" DOMAINLABEL "\\.)+" TOPLABEL ")"
Packit 79f644
/* Based on http://www.ietf.org/rfc/rfc1738.txt (section 5) */
Packit 79f644
#define HOST              "("HOSTNAME "|" HOSTNUMBER")"
Packit 79f644
/* Based on http://www.ietf.org/rfc/rfc0822.txt (appendix D) */
Packit 79f644
#define EMAIL_LOCALPART   "([^\\(\\)<>@,;:\\\\\"\\[\\]\\s]+)"
Packit 79f644
Packit 79f644
/* UIN is digital according to the unofficial specification:
Packit 79f644
 * http://iserverd.khstu.ru/docum_ext/icqv5.html#CTS
Packit 79f644
 * 5 digits minimum according to http://en.wikipedia.org/wiki/ICQ#UIN
Packit 79f644
 * According to an user, we can also provide an email address instead of the
Packit 79f644
 * ICQ UIN. */
Packit 79f644
#define ICQ_USER_NAME     "((["DIGIT"]{5,})|"EMAIL_LOCALPART"@"HOST")"
Packit 79f644
Packit 79f644
/* Based on http://www.ietf.org/rfc/rfc2812.txt (section 2.3.1) */
Packit 79f644
#define IRC_SPECIAL       "_\\[\\]{}\\\\|`^"
Packit 79f644
#define IRC_NICK_NAME     "(["ALPHA IRC_SPECIAL"]["ALPHADIGITDASH IRC_SPECIAL"]*)"
Packit 79f644
Packit 79f644
/* Based on http://www.ietf.org/rfc/rfc4622.txt (section 2.2)
Packit 79f644
 * We just exclude invalid characters to avoid ucschars and other redundant
Packit 79f644
 * complexity */
Packit 79f644
#define JABBER_USER_NAME  "([^@:'\"<>&\\s]+)"
Packit 79f644
/* ID is an email according to the unofficial specification:
Packit 79f644
 * http://www.hypothetic.org/docs/msn/general/names.php */
Packit 79f644
#define MSN_USER_NAME     EMAIL_LOCALPART
Packit 79f644
/* Based on the official help:
Packit 79f644
 * http://help.yahoo.com/l/us/yahoo/edit/registration/edit-01.html
Packit 79f644
 * Looks like an email address can be used as well (bgo #655959)
Packit 79f644
 * */
Packit 79f644
#define YAHOO_USER_NAME   "(["ALPHA"]["ALPHADIGIT"_\\.]{3,31})|("EMAIL_LOCALPART"@"HOST")"
Packit 79f644
Packit 79f644
#define ACCOUNT_REGEX_ICQ      "^"ICQ_USER_NAME"$"
Packit 79f644
#define ACCOUNT_REGEX_IRC      "^"IRC_NICK_NAME"$"
Packit 79f644
#define ACCOUNT_REGEX_JABBER   "^"JABBER_USER_NAME"@[^@/]+"
Packit 79f644
#define ACCOUNT_REGEX_MSN      "^"MSN_USER_NAME"@"HOST"$"
Packit 79f644
#define ACCOUNT_REGEX_YAHOO    "^"YAHOO_USER_NAME"$"
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_set_control_buttons_sensitivity (TpawAccountWidget *self,
Packit 79f644
    gboolean sensitive)
Packit 79f644
{
Packit 79f644
  /* we hit this case because of the 'other-accounts-exist' property handler
Packit 79f644
   * being called during init (before constructed()) */
Packit 79f644
  if (self->priv->apply_button == NULL || self->priv->cancel_button == NULL)
Packit 79f644
    return;
Packit 79f644
Packit 79f644
  gtk_widget_set_sensitive (self->priv->apply_button, sensitive);
Packit 79f644
Packit 79f644
  if (sensitive && self->priv->dialog == NULL)
Packit 79f644
    {
Packit 79f644
      /* We can't grab default if the widget hasn't be packed in a
Packit 79f644
       * window */
Packit 79f644
      GtkWidget *window;
Packit 79f644
Packit 79f644
      window = gtk_widget_get_toplevel (self->priv->apply_button);
Packit 79f644
      if (window != NULL &&
Packit 79f644
          gtk_widget_is_toplevel (window))
Packit 79f644
        {
Packit 79f644
          gtk_widget_set_can_default (self->priv->apply_button, TRUE);
Packit 79f644
          gtk_widget_grab_default (self->priv->apply_button);
Packit 79f644
        }
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_set_entry_highlighting (GtkEntry *entry,
Packit 79f644
    gboolean highlight)
Packit 79f644
{
Packit 79f644
  GtkStyleContext *style;
Packit 79f644
Packit 79f644
  g_return_if_fail (GTK_IS_ENTRY (entry));
Packit 79f644
Packit 79f644
  style = gtk_widget_get_style_context (GTK_WIDGET (entry));
Packit 79f644
Packit 79f644
  if (highlight)
Packit 79f644
    {
Packit 79f644
      gtk_style_context_add_class (style, GTK_STYLE_CLASS_ERROR);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      gtk_style_context_remove_class (style, GTK_STYLE_CLASS_ERROR);
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_handle_control_buttons_sensitivity (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  gboolean is_valid;
Packit 79f644
Packit 79f644
  is_valid = tpaw_account_settings_is_valid (self->priv->settings);
Packit 79f644
Packit 79f644
  account_widget_set_control_buttons_sensitivity (self, is_valid);
Packit 79f644
Packit 79f644
  g_signal_emit (self, signals[HANDLE_APPLY], 0, is_valid);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_entry_changed_common (TpawAccountWidget *self,
Packit 79f644
    GtkEntry *entry, gboolean focus)
Packit 79f644
{
Packit 79f644
  const gchar *str;
Packit 79f644
  const gchar *param_name;
Packit 79f644
  gboolean prev_status;
Packit 79f644
  gboolean curr_status;
Packit 79f644
Packit 79f644
  str = gtk_entry_get_text (entry);
Packit 79f644
  param_name = g_object_get_data (G_OBJECT (entry), "param_name");
Packit 79f644
  prev_status = tpaw_account_settings_parameter_is_valid (
Packit 79f644
      self->priv->settings, param_name);
Packit 79f644
Packit 79f644
  if (TPAW_STR_EMPTY (str))
Packit 79f644
    {
Packit 79f644
      tpaw_account_settings_unset (self->priv->settings, param_name);
Packit 79f644
Packit 79f644
      if (focus)
Packit 79f644
        {
Packit 79f644
          gchar *value;
Packit 79f644
Packit 79f644
          value = tpaw_account_settings_dup_string (self->priv->settings,
Packit 79f644
              param_name);
Packit 79f644
Packit 79f644
          DEBUG ("Unset %s and restore to %s", param_name, value);
Packit 79f644
          gtk_entry_set_text (entry, value ? value : "");
Packit 79f644
          g_free (value);
Packit 79f644
        }
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      DEBUG ("Setting %s to %s", param_name,
Packit 79f644
          tp_strdiff (param_name, "password") ? str : "***");
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_string (str));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  curr_status = tpaw_account_settings_parameter_is_valid (
Packit 79f644
      self->priv->settings, param_name);
Packit 79f644
Packit 79f644
  if (curr_status != prev_status)
Packit 79f644
    account_widget_set_entry_highlighting (entry, !curr_status);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_entry_changed_cb (GtkEditable *entry,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  if (self->priv->automatic_change)
Packit 79f644
    return;
Packit 79f644
Packit 79f644
  account_widget_entry_changed_common (self, GTK_ENTRY (entry), FALSE);
Packit 79f644
  tpaw_account_widget_changed (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_entry_map_cb (GtkEntry *entry,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  const gchar *param_name;
Packit 79f644
  gboolean is_valid;
Packit 79f644
Packit 79f644
  /* need to initialize input highlighting */
Packit 79f644
  param_name = g_object_get_data (G_OBJECT (entry), "param_name");
Packit 79f644
  is_valid = tpaw_account_settings_parameter_is_valid (self->priv->settings,
Packit 79f644
      param_name);
Packit 79f644
  account_widget_set_entry_highlighting (entry, !is_valid);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_int_changed_cb (GtkWidget *widget,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  const gchar *param_name;
Packit 79f644
  gint value;
Packit 79f644
  const gchar *signature;
Packit 79f644
Packit 79f644
  value = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget));
Packit 79f644
  param_name = g_object_get_data (G_OBJECT (widget), "param_name");
Packit 79f644
Packit 79f644
  signature = tpaw_account_settings_get_dbus_signature (self->priv->settings,
Packit 79f644
    param_name);
Packit 79f644
  g_return_if_fail (signature != NULL);
Packit 79f644
Packit 79f644
  DEBUG ("Setting %s to %d", param_name, value);
Packit 79f644
Packit 79f644
  switch ((int)*signature)
Packit 79f644
    {
Packit 79f644
    case DBUS_TYPE_INT16:
Packit 79f644
    case DBUS_TYPE_INT32:
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_int32 (value));
Packit 79f644
      break;
Packit 79f644
    case DBUS_TYPE_INT64:
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_int64 (value));
Packit 79f644
      break;
Packit 79f644
    case DBUS_TYPE_UINT16:
Packit 79f644
    case DBUS_TYPE_UINT32:
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_uint32 (value));
Packit 79f644
      break;
Packit 79f644
    case DBUS_TYPE_UINT64:
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_uint64 (value));
Packit 79f644
      break;
Packit 79f644
    default:
Packit 79f644
      g_return_if_reached ();
Packit 79f644
    }
Packit 79f644
Packit 79f644
  tpaw_account_widget_changed (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_checkbutton_toggled_cb (GtkWidget *widget,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  gboolean     value;
Packit 79f644
  gboolean     default_value;
Packit 79f644
  const gchar *param_name;
Packit 79f644
Packit 79f644
  value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
Packit 79f644
  param_name = g_object_get_data (G_OBJECT (widget), "param_name");
Packit 79f644
Packit 79f644
  /* FIXME: This is ugly! checkbox don't have a "not-set" value so we
Packit 79f644
   * always unset the param and set the value if different from the
Packit 79f644
   * default value. */
Packit 79f644
  tpaw_account_settings_unset (self->priv->settings, param_name);
Packit 79f644
  default_value = tpaw_account_settings_get_boolean (self->priv->settings,
Packit 79f644
      param_name);
Packit 79f644
Packit 79f644
  if (default_value == value)
Packit 79f644
    {
Packit 79f644
      DEBUG ("Unset %s and restore to %d", param_name, default_value);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      DEBUG ("Setting %s to %d", param_name, value);
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_boolean (value));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  tpaw_account_widget_changed (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_jabber_ssl_toggled_cb (GtkWidget *checkbutton_ssl,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  gboolean   value;
Packit 79f644
  gint32       port = 0;
Packit 79f644
Packit 79f644
  value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton_ssl));
Packit 79f644
  port = tpaw_account_settings_get_uint32 (self->priv->settings, "port");
Packit 79f644
Packit 79f644
  if (value)
Packit 79f644
    {
Packit 79f644
      if (port == 5222 || port == 0)
Packit 79f644
        port = 5223;
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      if (port == 5223 || port == 0)
Packit 79f644
        port = 5222;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->priv->spinbutton_port),
Packit 79f644
      port);
Packit 79f644
Packit 79f644
  self->priv->contains_pending_changes = TRUE;
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_combobox_changed_cb (GtkWidget *widget,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  GtkTreeIter iter;
Packit 79f644
  GtkTreeModel *model;
Packit 79f644
  const gchar *value;
Packit 79f644
  GVariant *v;
Packit 79f644
  const gchar *default_value = NULL;
Packit 79f644
  const gchar *param_name;
Packit 79f644
Packit 79f644
  if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter))
Packit 79f644
    return;
Packit 79f644
Packit 79f644
  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
Packit 79f644
  /* the param value is stored in the first column */
Packit 79f644
  gtk_tree_model_get (model, &iter, 0, &value, -1);
Packit 79f644
Packit 79f644
  param_name = g_object_get_data (G_OBJECT (widget), "param_name");
Packit 79f644
Packit 79f644
  v = tpaw_account_settings_dup_default (self->priv->settings, param_name);
Packit 79f644
  if (v != NULL && g_variant_is_of_type (v, G_VARIANT_TYPE_STRING))
Packit 79f644
    default_value = g_variant_get_string (v, NULL);
Packit 79f644
Packit 79f644
  if (!tp_strdiff (value, default_value))
Packit 79f644
    {
Packit 79f644
      DEBUG ("Unset %s and restore to %s", param_name, default_value);
Packit 79f644
      tpaw_account_settings_unset (self->priv->settings, param_name);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      DEBUG ("Setting %s to %s", param_name, value);
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, param_name,
Packit 79f644
          g_variant_new_string (value));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  tpaw_account_widget_changed (self);
Packit 79f644
Packit 79f644
  tp_clear_pointer (&v, g_variant_unref);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
clear_icon_released_cb (GtkEntry *entry,
Packit 79f644
    GtkEntryIconPosition icon_pos,
Packit 79f644
    GdkEvent *event,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  const gchar *param_name;
Packit 79f644
Packit 79f644
  param_name = g_object_get_data (G_OBJECT (entry), "param_name");
Packit 79f644
Packit 79f644
  DEBUG ("Unset %s", param_name);
Packit 79f644
  tpaw_account_settings_unset (self->priv->settings, param_name);
Packit 79f644
  gtk_entry_set_text (entry, "");
Packit 79f644
Packit 79f644
  tpaw_account_widget_changed (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
password_entry_changed_cb (GtkEditable *entry,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  const gchar *str;
Packit 79f644
Packit 79f644
  str = gtk_entry_get_text (GTK_ENTRY (entry));
Packit 79f644
Packit 79f644
  gtk_entry_set_icon_sensitive (GTK_ENTRY (entry),
Packit 79f644
      GTK_ENTRY_ICON_SECONDARY, !TPAW_STR_EMPTY (str));
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
password_entry_activated_cb (GtkEntry *entry,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
    if (gtk_widget_get_sensitive (self->priv->apply_button))
Packit 79f644
        tpaw_account_widget_apply_and_log_in (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_entry_activated_cb (GtkEntry *entry,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
    if (gtk_widget_get_sensitive (self->priv->apply_button))
Packit 79f644
        tpaw_account_widget_apply_and_log_in (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_setup_widget (TpawAccountWidget *self,
Packit 79f644
    GtkWidget *widget,
Packit 79f644
    const gchar *param_name)
Packit 79f644
{
Packit 79f644
  g_object_set_data_full (G_OBJECT (widget), "param_name",
Packit 79f644
      g_strdup (param_name), g_free);
Packit 79f644
Packit 79f644
  if (GTK_IS_SPIN_BUTTON (widget))
Packit 79f644
    {
Packit 79f644
      gint value = 0;
Packit 79f644
      const gchar *signature;
Packit 79f644
Packit 79f644
      signature = tpaw_account_settings_get_dbus_signature (
Packit 79f644
          self->priv->settings, param_name);
Packit 79f644
      g_return_if_fail (signature != NULL);
Packit 79f644
Packit 79f644
      switch ((int)*signature)
Packit 79f644
        {
Packit 79f644
          case DBUS_TYPE_INT16:
Packit 79f644
          case DBUS_TYPE_INT32:
Packit 79f644
            value = tpaw_account_settings_get_int32 (self->priv->settings,
Packit 79f644
              param_name);
Packit 79f644
            break;
Packit 79f644
          case DBUS_TYPE_INT64:
Packit 79f644
            value = tpaw_account_settings_get_int64 (self->priv->settings,
Packit 79f644
              param_name);
Packit 79f644
            break;
Packit 79f644
          case DBUS_TYPE_UINT16:
Packit 79f644
          case DBUS_TYPE_UINT32:
Packit 79f644
            value = tpaw_account_settings_get_uint32 (self->priv->settings,
Packit 79f644
              param_name);
Packit 79f644
            break;
Packit 79f644
          case DBUS_TYPE_UINT64:
Packit 79f644
            value = tpaw_account_settings_get_uint64 (self->priv->settings,
Packit 79f644
                param_name);
Packit 79f644
            break;
Packit 79f644
          default:
Packit 79f644
            g_return_if_reached ();
Packit 79f644
        }
Packit 79f644
Packit 79f644
      gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value);
Packit 79f644
Packit 79f644
      g_signal_connect (widget, "value-changed",
Packit 79f644
          G_CALLBACK (account_widget_int_changed_cb),
Packit 79f644
          self);
Packit 79f644
    }
Packit 79f644
  else if (GTK_IS_ENTRY (widget))
Packit 79f644
    {
Packit 79f644
      gchar *str;
Packit 79f644
Packit 79f644
      str = tpaw_account_settings_dup_string (self->priv->settings,
Packit 79f644
          param_name);
Packit 79f644
      gtk_entry_set_text (GTK_ENTRY (widget), str ? str : "");
Packit 79f644
Packit 79f644
      if (!tp_strdiff (param_name, "account"))
Packit 79f644
        self->priv->param_account_widget = widget;
Packit 79f644
      else if (!tp_strdiff (param_name, "password"))
Packit 79f644
        self->priv->param_password_widget = widget;
Packit 79f644
Packit 79f644
      if (strstr (param_name, "password"))
Packit 79f644
        {
Packit 79f644
          if (self->priv->dialog != NULL)
Packit 79f644
            gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE);
Packit 79f644
Packit 79f644
          gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE);
Packit 79f644
Packit 79f644
          /* Add 'clear' icon */
Packit 79f644
          gtk_entry_set_icon_from_icon_name (GTK_ENTRY (widget),
Packit 79f644
              GTK_ENTRY_ICON_SECONDARY, "edit-clear-symbolic");
Packit 79f644
Packit 79f644
          gtk_entry_set_icon_sensitive (GTK_ENTRY (widget),
Packit 79f644
              GTK_ENTRY_ICON_SECONDARY, !TPAW_STR_EMPTY (str));
Packit 79f644
Packit 79f644
          g_signal_connect (widget, "icon-release",
Packit 79f644
              G_CALLBACK (clear_icon_released_cb), self);
Packit 79f644
          g_signal_connect (widget, "changed",
Packit 79f644
              G_CALLBACK (password_entry_changed_cb), self);
Packit 79f644
          g_signal_connect (widget, "activate",
Packit 79f644
              G_CALLBACK (password_entry_activated_cb), self);
Packit 79f644
        }
Packit 79f644
      else if (strstr (param_name, "account"))
Packit 79f644
        {
Packit 79f644
          if (self->priv->dialog != NULL)
Packit 79f644
            gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE);
Packit 79f644
Packit 79f644
          g_signal_connect (widget, "activate",
Packit 79f644
              G_CALLBACK (account_entry_activated_cb), self);
Packit 79f644
        }
Packit 79f644
Packit 79f644
      g_signal_connect (widget, "changed",
Packit 79f644
          G_CALLBACK (account_widget_entry_changed_cb), self);
Packit 79f644
      g_signal_connect (widget, "map",
Packit 79f644
          G_CALLBACK (account_widget_entry_map_cb), self);
Packit 79f644
Packit 79f644
      g_free (str);
Packit 79f644
    }
Packit 79f644
  else if (GTK_IS_TOGGLE_BUTTON (widget))
Packit 79f644
    {
Packit 79f644
      gboolean value = FALSE;
Packit 79f644
Packit 79f644
      value = tpaw_account_settings_get_boolean (self->priv->settings,
Packit 79f644
          param_name);
Packit 79f644
      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), value);
Packit 79f644
Packit 79f644
      g_signal_connect (widget, "toggled",
Packit 79f644
          G_CALLBACK (account_widget_checkbutton_toggled_cb),
Packit 79f644
          self);
Packit 79f644
    }
Packit 79f644
  else if (GTK_IS_COMBO_BOX (widget))
Packit 79f644
    {
Packit 79f644
      /* The combo box's model has to contain the param value in its first
Packit 79f644
       * column (as a string) */
Packit 79f644
      gchar *str;
Packit 79f644
      GtkTreeModel *model;
Packit 79f644
      GtkTreeIter iter;
Packit 79f644
      gboolean valid;
Packit 79f644
Packit 79f644
      str = tpaw_account_settings_dup_string (self->priv->settings,
Packit 79f644
          param_name);
Packit 79f644
      model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
Packit 79f644
Packit 79f644
      valid = gtk_tree_model_get_iter_first (model, &iter);
Packit 79f644
      while (valid)
Packit 79f644
        {
Packit 79f644
          gchar *name;
Packit 79f644
Packit 79f644
          gtk_tree_model_get (model, &iter, 0, &name, -1);
Packit 79f644
          if (!tp_strdiff (name, str))
Packit 79f644
            {
Packit 79f644
              gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
Packit 79f644
              valid = FALSE;
Packit 79f644
            }
Packit 79f644
          else
Packit 79f644
            {
Packit 79f644
              valid = gtk_tree_model_iter_next (model, &iter);
Packit 79f644
            }
Packit 79f644
Packit 79f644
          g_free (name);
Packit 79f644
        }
Packit 79f644
Packit 79f644
      g_free (str);
Packit 79f644
Packit 79f644
      g_signal_connect (widget, "changed",
Packit 79f644
          G_CALLBACK (account_widget_combobox_changed_cb),
Packit 79f644
          self);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      DEBUG ("Unknown type of widget for param %s", param_name);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  gtk_widget_set_sensitive (widget,
Packit 79f644
      tpaw_account_settings_param_is_supported (self->priv->settings,
Packit 79f644
        param_name));
Packit 79f644
}
Packit 79f644
Packit 79f644
static GHashTable *
Packit 79f644
build_translated_params (void)
Packit 79f644
{
Packit 79f644
  GHashTable *hash;
Packit 79f644
Packit 79f644
  hash = g_hash_table_new (g_str_hash, g_str_equal);
Packit 79f644
  g_hash_table_insert (hash, "account", _("Account"));
Packit 79f644
  g_hash_table_insert (hash, "password", _("Password"));
Packit 79f644
  g_hash_table_insert (hash, "server", _("Server"));
Packit 79f644
  g_hash_table_insert (hash, "port", _("Port"));
Packit 79f644
Packit 79f644
  return hash;
Packit 79f644
}
Packit 79f644
Packit 79f644
static gchar *
Packit 79f644
account_widget_generic_format_param_name (const gchar *param_name)
Packit 79f644
{
Packit 79f644
  gchar *str;
Packit 79f644
  gchar *p;
Packit 79f644
  static GHashTable *translated_params = NULL;
Packit 79f644
Packit 79f644
  g_return_val_if_fail (param_name != NULL, NULL);
Packit 79f644
Packit 79f644
  if (G_UNLIKELY (translated_params == NULL))
Packit 79f644
    translated_params = build_translated_params ();
Packit 79f644
Packit 79f644
  /* Translate most common parameters */
Packit 79f644
  str = g_hash_table_lookup (translated_params, param_name);
Packit 79f644
  if (str != NULL)
Packit 79f644
    return g_strdup (str);
Packit 79f644
Packit 79f644
  str = g_strdup (param_name);
Packit 79f644
Packit 79f644
  if (str && g_ascii_isalpha (str[0]))
Packit 79f644
    str[0] = g_ascii_toupper (str[0]);
Packit 79f644
Packit 79f644
  while ((p = strchr (str, '-')) != NULL)
Packit 79f644
    {
Packit 79f644
      if (p[1] != '\0' && g_ascii_isalpha (p[1]))
Packit 79f644
        {
Packit 79f644
          p[0] = ' ';
Packit 79f644
          p[1] = g_ascii_toupper (p[1]);
Packit 79f644
        }
Packit 79f644
Packit 79f644
      p++;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return str;
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
accounts_widget_generic_setup (TpawAccountWidget *self,
Packit 79f644
    GtkWidget *grid_common_settings,
Packit 79f644
    GtkWidget *grid_advanced_settings)
Packit 79f644
{
Packit 79f644
  GList *params, *l;
Packit 79f644
  guint row_common = 0, row_advanced = 0;
Packit 79f644
Packit 79f644
  params = tpaw_account_settings_dup_tp_params (self->priv->settings);
Packit 79f644
Packit 79f644
  for (l = params; l != NULL; l = g_list_next (l))
Packit 79f644
    {
Packit 79f644
      TpConnectionManagerParam *param = l->data;
Packit 79f644
      GtkWidget       *grid_settings;
Packit 79f644
      guint           row;
Packit 79f644
      GtkWidget       *widget = NULL;
Packit 79f644
      gchar           *param_name_formatted;
Packit 79f644
      const gchar *dbus_signature;
Packit 79f644
Packit 79f644
      if (tp_connection_manager_param_is_required (param))
Packit 79f644
        {
Packit 79f644
          grid_settings = grid_common_settings;
Packit 79f644
          row = row_common++;
Packit 79f644
        }
Packit 79f644
      else if (self->priv->simple)
Packit 79f644
        {
Packit 79f644
          continue;
Packit 79f644
        }
Packit 79f644
      else
Packit 79f644
        {
Packit 79f644
          grid_settings = grid_advanced_settings;
Packit 79f644
          row = row_advanced++;
Packit 79f644
        }
Packit 79f644
Packit 79f644
      param_name_formatted = account_widget_generic_format_param_name (
Packit 79f644
          tp_connection_manager_param_get_name (param));
Packit 79f644
Packit 79f644
      dbus_signature = tp_connection_manager_param_get_dbus_signature (param);
Packit 79f644
Packit 79f644
      if (dbus_signature[0] == 's')
Packit 79f644
        {
Packit 79f644
          gchar *str;
Packit 79f644
Packit 79f644
          str = g_strdup_printf (_("%s"), param_name_formatted);
Packit 79f644
          widget = gtk_label_new (str);
Packit 79f644
          gtk_misc_set_alignment (GTK_MISC (widget), 1., 0.5);
Packit 79f644
          gtk_style_context_add_class (gtk_widget_get_style_context (widget),
Packit 79f644
              GTK_STYLE_CLASS_DIM_LABEL);
Packit 79f644
          g_free (str);
Packit 79f644
Packit 79f644
          gtk_grid_attach (GTK_GRID (grid_settings),
Packit 79f644
              widget, 0, row, 1, 1);
Packit 79f644
Packit 79f644
          gtk_widget_show (widget);
Packit 79f644
Packit 79f644
          widget = gtk_entry_new ();
Packit 79f644
          g_object_set (widget, "hexpand", TRUE, NULL);
Packit 79f644
          if (g_strcmp0 (tp_connection_manager_param_get_name (param),
Packit 79f644
                "account") == 0)
Packit 79f644
            {
Packit 79f644
              g_object_set (widget, "width-request", 280, NULL);
Packit 79f644
              g_signal_connect (widget, "realize",
Packit 79f644
                  G_CALLBACK (gtk_widget_grab_focus),
Packit 79f644
                  NULL);
Packit 79f644
            }
Packit 79f644
Packit 79f644
          gtk_grid_attach (GTK_GRID (grid_settings),
Packit 79f644
              widget, 1, row, 1, 1);
Packit 79f644
Packit 79f644
          gtk_widget_show (widget);
Packit 79f644
        }
Packit 79f644
      /* int types: ynqiuxt. double type is 'd' */
Packit 79f644
      else if (dbus_signature[0] == 'y' ||
Packit 79f644
          dbus_signature[0] == 'n' ||
Packit 79f644
          dbus_signature[0] == 'q' ||
Packit 79f644
          dbus_signature[0] == 'i' ||
Packit 79f644
          dbus_signature[0] == 'u' ||
Packit 79f644
          dbus_signature[0] == 'x' ||
Packit 79f644
          dbus_signature[0] == 't' ||
Packit 79f644
          dbus_signature[0] == 'd')
Packit 79f644
        {
Packit 79f644
          gchar   *str = NULL;
Packit 79f644
          gdouble  minint = 0;
Packit 79f644
          gdouble  maxint = 0;
Packit 79f644
          gdouble  step = 1;
Packit 79f644
Packit 79f644
          switch (dbus_signature[0])
Packit 79f644
            {
Packit 79f644
            case 'y': minint = G_MININT8;  maxint = G_MAXINT8;   break;
Packit 79f644
            case 'n': minint = G_MININT16; maxint = G_MAXINT16;  break;
Packit 79f644
            case 'q': minint = 0;          maxint = G_MAXUINT16; break;
Packit 79f644
            case 'i': minint = G_MININT32; maxint = G_MAXINT32;  break;
Packit 79f644
            case 'u': minint = 0;          maxint = G_MAXUINT32; break;
Packit 79f644
            case 'x': minint = G_MININT64; maxint = G_MAXINT64;  break;
Packit 79f644
            case 't': minint = 0;          maxint = G_MAXUINT64; break;
Packit 79f644
            case 'd': minint = G_MININT32; maxint = G_MAXINT32;
Packit 79f644
              step = 0.1; break;
Packit 79f644
            default: g_assert_not_reached ();
Packit 79f644
            }
Packit 79f644
Packit 79f644
          str = g_strdup_printf (_("%s:"), param_name_formatted);
Packit 79f644
          widget = gtk_label_new (str);
Packit 79f644
          gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
Packit 79f644
          g_free (str);
Packit 79f644
Packit 79f644
          gtk_grid_attach (GTK_GRID (grid_settings),
Packit 79f644
              widget, 0, row, 1, 1);
Packit 79f644
          gtk_widget_show (widget);
Packit 79f644
Packit 79f644
          widget = gtk_spin_button_new_with_range (minint, maxint, step);
Packit 79f644
          gtk_grid_attach (GTK_GRID (grid_settings),
Packit 79f644
              widget, 1, row, 1, 1);
Packit 79f644
          gtk_widget_show (widget);
Packit 79f644
        }
Packit 79f644
      else if (dbus_signature[0] == 'b')
Packit 79f644
        {
Packit 79f644
          widget = gtk_check_button_new_with_label (param_name_formatted);
Packit 79f644
          gtk_grid_attach (GTK_GRID (grid_settings),
Packit 79f644
              widget, 0, row, 2, 1);
Packit 79f644
          gtk_widget_show (widget);
Packit 79f644
        }
Packit 79f644
      else
Packit 79f644
        {
Packit 79f644
          DEBUG ("Unknown signature for param %s: %s",
Packit 79f644
              param_name_formatted, dbus_signature);
Packit 79f644
        }
Packit 79f644
Packit 79f644
      if (widget)
Packit 79f644
        tpaw_account_widget_setup_widget (self, widget,
Packit 79f644
            tp_connection_manager_param_get_name (param));
Packit 79f644
Packit 79f644
      g_free (param_name_formatted);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  g_list_free_full (params, (GDestroyNotify) tp_connection_manager_param_free);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_handle_params_valist (TpawAccountWidget *self,
Packit 79f644
    const gchar *first_widget,
Packit 79f644
    va_list args)
Packit 79f644
{
Packit 79f644
  GObject *object;
Packit 79f644
  const gchar *name;
Packit 79f644
Packit 79f644
  for (name = first_widget; name; name = va_arg (args, const gchar *))
Packit 79f644
    {
Packit 79f644
      const gchar *param_name;
Packit 79f644
Packit 79f644
      param_name = va_arg (args, const gchar *);
Packit 79f644
      object = gtk_builder_get_object (self->ui_details->gui, name);
Packit 79f644
Packit 79f644
      if (!object)
Packit 79f644
        {
Packit 79f644
          g_warning ("Builder is missing object '%s'.", name);
Packit 79f644
          continue;
Packit 79f644
        }
Packit 79f644
Packit 79f644
      tpaw_account_widget_setup_widget (self, GTK_WIDGET (object),
Packit 79f644
          param_name);
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_cancel_clicked_cb (GtkWidget *button,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  g_signal_emit (self, signals[CANCELLED], 0);
Packit 79f644
  g_signal_emit (self, signals[CLOSE], 0, GTK_RESPONSE_CANCEL);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_account_enabled_cb (GObject *source_object,
Packit 79f644
    GAsyncResult *res,
Packit 79f644
    gpointer user_data)
Packit 79f644
{
Packit 79f644
  GError *error = NULL;
Packit 79f644
  TpAccount *account = TP_ACCOUNT (source_object);
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (user_data);
Packit 79f644
Packit 79f644
  tp_account_set_enabled_finish (account, res, &error);
Packit 79f644
Packit 79f644
  if (error != NULL)
Packit 79f644
    {
Packit 79f644
      DEBUG ("Could not enable the account: %s", error->message);
Packit 79f644
      g_error_free (error);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      tpaw_connect_new_account (account, self->priv->account_manager);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  g_signal_emit (self, signals[CLOSE], 0, GTK_RESPONSE_APPLY);
Packit 79f644
Packit 79f644
  /* unref self - part of the workaround */
Packit 79f644
  g_object_unref (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_applied_cb (GObject *source_object,
Packit 79f644
    GAsyncResult *res,
Packit 79f644
    gpointer user_data)
Packit 79f644
{
Packit 79f644
  GError *error = NULL;
Packit 79f644
  TpAccount *account;
Packit 79f644
  TpawAccountSettings *settings = TPAW_ACCOUNT_SETTINGS (source_object);
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (user_data);
Packit 79f644
  gboolean reconnect_required;
Packit 79f644
  gboolean fire_close = TRUE;
Packit 79f644
Packit 79f644
  tpaw_account_settings_apply_finish (settings, res, &reconnect_required,
Packit 79f644
      &error);
Packit 79f644
Packit 79f644
  if (error != NULL)
Packit 79f644
    {
Packit 79f644
      DEBUG ("Could not apply changes to account: %s", error->message);
Packit 79f644
      g_error_free (error);
Packit 79f644
      return;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  account = tpaw_account_settings_get_account (self->priv->settings);
Packit 79f644
Packit 79f644
  if (account != NULL)
Packit 79f644
    {
Packit 79f644
      if (self->priv->creating_account)
Packit 79f644
        {
Packit 79f644
          /* By default, when an account is created, we enable it. */
Packit 79f644
Packit 79f644
          /* workaround to keep self alive during async call */
Packit 79f644
          g_object_ref (self);
Packit 79f644
Packit 79f644
          tp_account_set_enabled_async (account, TRUE,
Packit 79f644
              account_widget_account_enabled_cb, self);
Packit 79f644
          g_signal_emit (self, signals[ACCOUNT_CREATED], 0, account);
Packit 79f644
Packit 79f644
          /* Will be fired in account_widget_account_enabled_cb */
Packit 79f644
          fire_close = FALSE;
Packit 79f644
        }
Packit 79f644
      else
Packit 79f644
        {
Packit 79f644
          /* If the account was offline, we always want to try reconnecting,
Packit 79f644
           * to give it a chance to connect if the previous params were wrong.
Packit 79f644
           * tp_account_reconnect_async() won't do anything if the requested
Packit 79f644
           * presence is offline anyway. */
Packit 79f644
          if (tp_account_get_connection_status (account, NULL) ==
Packit 79f644
              TP_CONNECTION_STATUS_DISCONNECTED)
Packit 79f644
            reconnect_required = TRUE;
Packit 79f644
Packit 79f644
          if (reconnect_required && tp_account_is_enabled (account)
Packit 79f644
              && tp_account_is_enabled (account))
Packit 79f644
            {
Packit 79f644
              /* After having applied changes to a user account, we
Packit 79f644
               * reconnect it if needed. This is done so the new
Packit 79f644
               * information entered by the user is validated on the server. */
Packit 79f644
              tp_account_reconnect_async (account, NULL, NULL);
Packit 79f644
            }
Packit 79f644
        }
Packit 79f644
    }
Packit 79f644
Packit 79f644
  if (!self->priv->destroyed)
Packit 79f644
    account_widget_set_control_buttons_sensitivity (self, FALSE);
Packit 79f644
Packit 79f644
  self->priv->contains_pending_changes = FALSE;
Packit 79f644
Packit 79f644
  if (fire_close)
Packit 79f644
    {
Packit 79f644
      /* announce the widget can be closed */
Packit 79f644
      g_signal_emit (self, signals[CLOSE], 0, GTK_RESPONSE_APPLY);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  /* unref the widget - part of the workaround */
Packit 79f644
  g_object_unref (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_apply_and_log_in (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  gboolean display_name_overridden;
Packit 79f644
Packit 79f644
  g_object_get (self->priv->settings,
Packit 79f644
      "display-name-overridden", &display_name_overridden, NULL);
Packit 79f644
Packit 79f644
  if (self->priv->creating_account || !display_name_overridden)
Packit 79f644
    {
Packit 79f644
      gchar *display_name;
Packit 79f644
Packit 79f644
      /* set default display name for new accounts or update if user didn't
Packit 79f644
       * manually override it. */
Packit 79f644
      display_name = tpaw_account_widget_get_default_display_name (self);
Packit 79f644
Packit 79f644
      tpaw_account_settings_set_display_name_async (self->priv->settings,
Packit 79f644
          display_name, NULL, NULL);
Packit 79f644
Packit 79f644
      g_free (display_name);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  /* workaround to keep widget alive during async call */
Packit 79f644
  g_object_ref (self);
Packit 79f644
  tpaw_account_settings_apply_async (self->priv->settings,
Packit 79f644
      account_widget_applied_cb, self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_apply_clicked_cb (GtkWidget *button,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
    tpaw_account_widget_apply_and_log_in (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_setup_generic (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  GtkWidget *grid_common_settings;
Packit 79f644
  GtkWidget *grid_advanced_settings;
Packit 79f644
Packit 79f644
  grid_common_settings = GTK_WIDGET (gtk_builder_get_object
Packit 79f644
      (self->ui_details->gui, "grid_common_settings"));
Packit 79f644
  grid_advanced_settings = GTK_WIDGET (gtk_builder_get_object
Packit 79f644
      (self->ui_details->gui, "grid_advanced_settings"));
Packit 79f644
Packit 79f644
  accounts_widget_generic_setup (self, grid_common_settings,
Packit 79f644
      grid_advanced_settings);
Packit 79f644
Packit 79f644
  g_object_unref (self->ui_details->gui);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_widget_settings_ready_cb (TpawAccountSettings *settings,
Packit 79f644
    GParamSpec *pspec,
Packit 79f644
    gpointer user_data)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = user_data;
Packit 79f644
Packit 79f644
  if (tpaw_account_settings_is_ready (self->priv->settings))
Packit 79f644
    account_widget_setup_generic (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_generic (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *expander_advanced, *box;
Packit 79f644
Packit 79f644
  self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
      "grid_common_settings", &self->priv->grid_common_settings,
Packit 79f644
      "vbox_generic_settings", &box,
Packit 79f644
      "expander_advanced_settings", &expander_advanced,
Packit 79f644
      NULL);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    gtk_widget_hide (expander_advanced);
Packit 79f644
Packit 79f644
  g_object_ref (self->ui_details->gui);
Packit 79f644
Packit 79f644
  if (tpaw_account_settings_is_ready (self->priv->settings))
Packit 79f644
    account_widget_setup_generic (self);
Packit 79f644
  else
Packit 79f644
    g_signal_connect (self->priv->settings, "notify::ready",
Packit 79f644
        G_CALLBACK (account_widget_settings_ready_cb), self);
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_salut (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *expander_advanced, *box;
Packit 79f644
Packit 79f644
  self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
      "grid_common_settings", &self->priv->grid_common_settings,
Packit 79f644
      "vbox_salut_settings", &box,
Packit 79f644
      "expander_advanced_settings", &expander_advanced,
Packit 79f644
      NULL);
Packit 79f644
Packit 79f644
  tpaw_account_widget_handle_params (self,
Packit 79f644
      "entry_published", "published-name",
Packit 79f644
      "entry_nickname", "nickname",
Packit 79f644
      "entry_first_name", "first-name",
Packit 79f644
      "entry_last_name", "last-name",
Packit 79f644
      "entry_email", "email",
Packit 79f644
      "entry_jid", "jid",
Packit 79f644
      NULL);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    gtk_widget_hide (expander_advanced);
Packit 79f644
Packit 79f644
  self->ui_details->default_focus = g_strdup ("entry_first_name");
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_irc (TpawAccountWidget *self,
Packit 79f644
  const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  tpaw_account_settings_set_regex (self->priv->settings, "account",
Packit 79f644
      ACCOUNT_REGEX_IRC);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->priv->irc_network_chooser = tpaw_account_widget_irc_build_simple
Packit 79f644
        (self, filename, &box);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->priv->irc_network_chooser = tpaw_account_widget_irc_build (self,
Packit 79f644
          filename, &self->priv->grid_common_settings, &box);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_sip (TpawAccountWidget *self,
Packit 79f644
  const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  box = tpaw_account_widget_sip_build (self, filename,
Packit 79f644
    &self->priv->grid_common_settings);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_msn (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  tpaw_account_settings_set_regex (self->priv->settings, "account",
Packit 79f644
      ACCOUNT_REGEX_MSN);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_msn_simple", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id_simple", "account",
Packit 79f644
          "entry_password_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "grid_common_msn_settings", &self->priv->grid_common_settings,
Packit 79f644
          "vbox_msn_settings", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id", "account",
Packit 79f644
          "entry_password", "password",
Packit 79f644
          "entry_server", "server",
Packit 79f644
          "spinbutton_port", "port",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static Service
Packit 79f644
account_widget_get_service (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  const gchar *icon_name, *service;
Packit 79f644
Packit 79f644
  icon_name = tpaw_account_settings_get_icon_name (self->priv->settings);
Packit 79f644
  service = tpaw_account_settings_get_service (self->priv->settings);
Packit 79f644
Packit 79f644
  /* Previous versions of Tpaw didn't set the Service property on gtalk
Packit 79f644
   * account, so we check using the icon name as well. */
Packit 79f644
  if (!tp_strdiff (icon_name, "im-google-talk") ||
Packit 79f644
      !tp_strdiff (service, "google-talk"))
Packit 79f644
    return GTALK_SERVICE;
Packit 79f644
Packit 79f644
  return NO_SERVICE;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_jabber (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *spinbutton_port;
Packit 79f644
  GtkWidget *checkbutton_ssl;
Packit 79f644
  GtkWidget *label_id, *label_password;
Packit 79f644
  GtkWidget *label_example;
Packit 79f644
  GtkWidget *expander_advanced;
Packit 79f644
  GtkWidget *entry_id;
Packit 79f644
  GtkWidget *box;
Packit 79f644
  Service service;
Packit 79f644
Packit 79f644
  service = account_widget_get_service (self);
Packit 79f644
Packit 79f644
  tpaw_account_settings_set_regex (self->priv->settings, "account",
Packit 79f644
      ACCOUNT_REGEX_JABBER);
Packit 79f644
Packit 79f644
  if (self->priv->simple && service == NO_SERVICE)
Packit 79f644
    {
Packit 79f644
      /* Simple widget for XMPP */
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_jabber_simple", &box,
Packit 79f644
          "label_id_simple", &label_id,
Packit 79f644
          "label_password_simple", &label_password,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id_simple", "account",
Packit 79f644
          "entry_password_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else if (self->priv->simple && service == GTALK_SERVICE)
Packit 79f644
    {
Packit 79f644
      /* Simple widget for Google Talk */
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_gtalk_simple", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id_g_simple", "account",
Packit 79f644
          "entry_password_g_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id_g_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_g_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      ServiceInfo info = services_infos[service];
Packit 79f644
Packit 79f644
      /* Full widget for XMPP and Google Talk */
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "grid_common_settings", &self->priv->grid_common_settings,
Packit 79f644
          "vbox_jabber_settings", &box,
Packit 79f644
          "spinbutton_port", &spinbutton_port,
Packit 79f644
          "checkbutton_ssl", &checkbutton_ssl,
Packit 79f644
          info.label_username_example, &label_example,
Packit 79f644
          "expander_advanced", &expander_advanced,
Packit 79f644
          "entry_id", &entry_id,
Packit 79f644
          "label_id", &label_id,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_password", "password",
Packit 79f644
          "entry_resource", "resource",
Packit 79f644
          "entry_server", "server",
Packit 79f644
          "spinbutton_port", "port",
Packit 79f644
          "spinbutton_priority", "priority",
Packit 79f644
          "checkbutton_ssl", "old-ssl",
Packit 79f644
          "checkbutton_ignore_ssl_errors", "ignore-ssl-errors",
Packit 79f644
          "checkbutton_encryption", "require-encryption",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_setup_widget (self, entry_id, "account");
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id");
Packit 79f644
      self->priv->spinbutton_port = spinbutton_port;
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
Packit 79f644
      g_signal_connect (checkbutton_ssl, "toggled",
Packit 79f644
          G_CALLBACK (account_widget_jabber_ssl_toggled_cb),
Packit 79f644
          self);
Packit 79f644
Packit 79f644
      gtk_widget_show (label_example);
Packit 79f644
Packit 79f644
      if (!info.show_advanced)
Packit 79f644
        gtk_widget_hide (expander_advanced);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_icq (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *spinbutton_port;
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  tpaw_account_settings_set_regex (self->priv->settings, "account",
Packit 79f644
      ACCOUNT_REGEX_ICQ);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_icq_simple", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_uin_simple", "account",
Packit 79f644
          "entry_password_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_uin_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "grid_common_settings", &self->priv->grid_common_settings,
Packit 79f644
          "vbox_icq_settings", &box,
Packit 79f644
          "spinbutton_port", &spinbutton_port,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_uin", "account",
Packit 79f644
          "entry_password", "password",
Packit 79f644
          "entry_server", "server",
Packit 79f644
          "spinbutton_port", "port",
Packit 79f644
          "entry_charset", "charset",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_uin");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_aim (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *spinbutton_port, *box;
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_aim_simple", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_screenname_simple", "account",
Packit 79f644
          "entry_password_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_screenname_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "grid_common_settings", &self->priv->grid_common_settings,
Packit 79f644
          "vbox_aim_settings", &box,
Packit 79f644
          "spinbutton_port", &spinbutton_port,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_screenname", "account",
Packit 79f644
          "entry_password", "password",
Packit 79f644
          "entry_server", "server",
Packit 79f644
          "spinbutton_port", "port",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_screenname");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_yahoo (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  tpaw_account_settings_set_regex (self->priv->settings, "account",
Packit 79f644
      ACCOUNT_REGEX_YAHOO);
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_yahoo_simple", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id_simple", "account",
Packit 79f644
          "entry_password_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "grid_common_settings", &self->priv->grid_common_settings,
Packit 79f644
          "vbox_yahoo_settings", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id", "account",
Packit 79f644
          "entry_password", "password",
Packit 79f644
          "entry_locale", "room-list-locale",
Packit 79f644
          "entry_charset", "charset",
Packit 79f644
          "spinbutton_port", "port",
Packit 79f644
          "checkbutton_ignore_invites", "ignore-invites",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
static GtkWidget *
Packit 79f644
account_widget_build_groupwise (TpawAccountWidget *self,
Packit 79f644
    const char *filename)
Packit 79f644
{
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  if (self->priv->simple)
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "vbox_groupwise_simple", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id_simple", "account",
Packit 79f644
          "entry_password_simple", "password",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id_simple");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui,
Packit 79f644
            "remember_password_simple"));
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      self->ui_details->gui = tpaw_builder_get_resource (filename,
Packit 79f644
          "grid_common_groupwise_settings", &self->priv->grid_common_settings,
Packit 79f644
          "vbox_groupwise_settings", &box,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      tpaw_account_widget_handle_params (self,
Packit 79f644
          "entry_id", "account",
Packit 79f644
          "entry_password", "password",
Packit 79f644
          "entry_server", "server",
Packit 79f644
          "spinbutton_port", "port",
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      self->ui_details->default_focus = g_strdup ("entry_id");
Packit 79f644
Packit 79f644
      self->priv->remember_password_widget = GTK_WIDGET (
Packit 79f644
          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return box;
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_set_other_accounts_exist (TpawAccountWidget *self,
Packit 79f644
    gboolean others_exist)
Packit 79f644
{
Packit 79f644
  self->priv->other_accounts_exist = others_exist;
Packit 79f644
Packit 79f644
  if (self->priv->creating_account)
Packit 79f644
    account_widget_handle_control_buttons_sensitivity (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
do_set_property (GObject *object,
Packit 79f644
    guint prop_id,
Packit 79f644
    const GValue *value,
Packit 79f644
    GParamSpec *pspec)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (object);
Packit 79f644
Packit 79f644
  switch (prop_id)
Packit 79f644
    {
Packit 79f644
    case PROP_SETTINGS:
Packit 79f644
      self->priv->settings = g_value_dup_object (value);
Packit 79f644
      break;
Packit 79f644
    case PROP_SIMPLE:
Packit 79f644
      self->priv->simple = g_value_get_boolean (value);
Packit 79f644
      break;
Packit 79f644
    case PROP_CREATING_ACCOUNT:
Packit 79f644
      self->priv->creating_account = g_value_get_boolean (value);
Packit 79f644
      break;
Packit 79f644
    case PROP_OTHER_ACCOUNTS_EXIST:
Packit 79f644
      tpaw_account_widget_set_other_accounts_exist (
Packit 79f644
          TPAW_ACCOUNT_WIDGET (object), g_value_get_boolean (value));
Packit 79f644
      break;
Packit 79f644
    case PROP_DIALOG:
Packit 79f644
      self->priv->dialog = g_value_get_object (value);
Packit 79f644
      if (self->priv->dialog != NULL)
Packit 79f644
        {
Packit 79f644
          g_object_ref_sink (self->priv->dialog);
Packit 79f644
          self->priv->external_action_area = TRUE;
Packit 79f644
        }
Packit 79f644
      break;
Packit 79f644
    default:
Packit 79f644
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
do_get_property (GObject *object,
Packit 79f644
    guint prop_id,
Packit 79f644
    GValue *value,
Packit 79f644
    GParamSpec *pspec)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (object);
Packit 79f644
Packit 79f644
  switch (prop_id)
Packit 79f644
    {
Packit 79f644
    case PROP_PROTOCOL:
Packit 79f644
      g_value_set_string (value,
Packit 79f644
        tpaw_account_settings_get_protocol (self->priv->settings));
Packit 79f644
      break;
Packit 79f644
    case PROP_SETTINGS:
Packit 79f644
      g_value_set_object (value, self->priv->settings);
Packit 79f644
      break;
Packit 79f644
    case PROP_SIMPLE:
Packit 79f644
      g_value_set_boolean (value, self->priv->simple);
Packit 79f644
      break;
Packit 79f644
    case PROP_CREATING_ACCOUNT:
Packit 79f644
      g_value_set_boolean (value, self->priv->creating_account);
Packit 79f644
      break;
Packit 79f644
    case PROP_OTHER_ACCOUNTS_EXIST:
Packit 79f644
      g_value_set_boolean (value, self->priv->other_accounts_exist);
Packit 79f644
      break;
Packit 79f644
    case PROP_DIALOG:
Packit 79f644
      g_value_set_object (value, self->priv->dialog);
Packit 79f644
      break;
Packit 79f644
    default:
Packit 79f644
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
set_apply_button (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  const gchar *stock_image;
Packit 79f644
  GtkWidget *image;
Packit 79f644
Packit 79f644
  if (self->priv->creating_account)
Packit 79f644
    {
Packit 79f644
      gtk_button_set_label (GTK_BUTTON (self->priv->apply_button), _("A_dd"));
Packit 79f644
      stock_image = GTK_STOCK_ADD;
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      /* We can't use the stock button as its accelerator ('A') clashes with the
Packit 79f644
       * Add button. */
Packit 79f644
      gtk_button_set_use_stock (GTK_BUTTON (self->priv->apply_button), FALSE);
Packit 79f644
      gtk_button_set_label (GTK_BUTTON (self->priv->apply_button), _("A_pply"));
Packit 79f644
Packit 79f644
      stock_image = GTK_STOCK_APPLY;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  gtk_button_set_use_underline (GTK_BUTTON (self->priv->apply_button), TRUE);
Packit 79f644
Packit 79f644
  image = gtk_image_new_from_stock (stock_image, GTK_ICON_SIZE_BUTTON);
Packit 79f644
  gtk_button_set_image (GTK_BUTTON (self->priv->apply_button), image);
Packit 79f644
}
Packit 79f644
Packit 79f644
#define WIDGET(cm, proto) \
Packit 79f644
  { #cm, #proto, TPAW_ACCOUNT_WIDGETS_RESOURCES_PREFIX "/tpaw-account-widget-"#proto".ui", \
Packit 79f644
    account_widget_build_##proto }
Packit 79f644
Packit 79f644
static void
Packit 79f644
remember_password_toggled_cb (GtkToggleButton *button,
Packit 79f644
    TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  tpaw_account_settings_set_remember_password (self->priv->settings,
Packit 79f644
      gtk_toggle_button_get_active (button));
Packit 79f644
Packit 79f644
  if (!self->priv->automatic_change)
Packit 79f644
    tpaw_account_widget_changed (self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
account_settings_password_retrieved_cb (GObject *object,
Packit 79f644
    gpointer user_data)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = user_data;
Packit 79f644
  gchar *password;
Packit 79f644
Packit 79f644
  password = tpaw_account_settings_dup_string (
Packit 79f644
      self->priv->settings, "password");
Packit 79f644
Packit 79f644
  /* We have to do this so that when we call gtk_entry_set_text,
Packit 79f644
   * the ::changed callback doesn't think the user made the
Packit 79f644
   * change. This is also used in remember_password_toggled_cb. */
Packit 79f644
  self->priv->automatic_change = TRUE;
Packit 79f644
Packit 79f644
  if (password != NULL)
Packit 79f644
    {
Packit 79f644
      gtk_entry_set_text (GTK_ENTRY (self->priv->param_password_widget),
Packit 79f644
          password);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  gtk_toggle_button_set_active (
Packit 79f644
      GTK_TOGGLE_BUTTON (self->priv->remember_password_widget),
Packit 79f644
      !TPAW_STR_EMPTY (password));
Packit 79f644
Packit 79f644
  self->priv->automatic_change = FALSE;
Packit 79f644
Packit 79f644
  g_free (password);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
do_constructed (GObject *obj)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (obj);
Packit 79f644
  const gchar *display_name;
Packit 79f644
  gchar *default_display_name;
Packit 79f644
  guint i = 0;
Packit 79f644
  struct {
Packit 79f644
    const gchar *cm_name;
Packit 79f644
    const gchar *protocol;
Packit 79f644
    const char *file;
Packit 79f644
    GtkWidget * (*func)(TpawAccountWidget *self, const gchar *filename);
Packit 79f644
  } widgets [] = {
Packit 79f644
    { "salut", "local-xmpp", TPAW_ACCOUNT_WIDGETS_RESOURCES_PREFIX "/tpaw-account-widget-local-xmpp.ui",
Packit 79f644
        account_widget_build_salut },
Packit 79f644
    WIDGET (gabble, jabber),
Packit 79f644
    WIDGET (haze, msn),
Packit 79f644
    WIDGET (haze, icq),
Packit 79f644
    WIDGET (haze, aim),
Packit 79f644
    WIDGET (haze, yahoo),
Packit 79f644
    WIDGET (haze, groupwise),
Packit 79f644
    WIDGET (idle, irc),
Packit 79f644
    WIDGET (sofiasip, sip),
Packit 79f644
  };
Packit 79f644
  const gchar *protocol, *cm_name;
Packit 79f644
  GtkWidget *box;
Packit 79f644
Packit 79f644
  cm_name = tpaw_account_settings_get_cm (self->priv->settings);
Packit 79f644
  protocol = tpaw_account_settings_get_protocol (self->priv->settings);
Packit 79f644
Packit 79f644
  for (i = 0 ; i < G_N_ELEMENTS (widgets); i++)
Packit 79f644
    {
Packit 79f644
      if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
Packit 79f644
          !tp_strdiff (widgets[i].protocol, protocol))
Packit 79f644
        {
Packit 79f644
          box = widgets[i].func (self, widgets[i].file);
Packit 79f644
          break;
Packit 79f644
        }
Packit 79f644
    }
Packit 79f644
Packit 79f644
  if (i == G_N_ELEMENTS (widgets))
Packit 79f644
    {
Packit 79f644
      gchar *filename = TPAW_ACCOUNT_WIDGETS_RESOURCES_PREFIX "/tpaw-account-widget-generic.ui";
Packit 79f644
      box = account_widget_build_generic (self, filename);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  gtk_container_add (GTK_CONTAINER (self), box);
Packit 79f644
Packit 79f644
  /* handle default focus */
Packit 79f644
  if (self->ui_details->default_focus != NULL)
Packit 79f644
    {
Packit 79f644
      GObject *default_focus_entry;
Packit 79f644
Packit 79f644
      default_focus_entry = gtk_builder_get_object
Packit 79f644
        (self->ui_details->gui, self->ui_details->default_focus);
Packit 79f644
      g_signal_connect (default_focus_entry, "realize",
Packit 79f644
          G_CALLBACK (gtk_widget_grab_focus),
Packit 79f644
          NULL);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  /* remember password */
Packit 79f644
  if (self->priv->param_password_widget != NULL
Packit 79f644
      && self->priv->remember_password_widget != NULL
Packit 79f644
      && tpaw_account_settings_supports_sasl (self->priv->settings))
Packit 79f644
    {
Packit 79f644
      if (self->priv->simple)
Packit 79f644
        {
Packit 79f644
          gtk_toggle_button_set_active (
Packit 79f644
              GTK_TOGGLE_BUTTON (self->priv->remember_password_widget), TRUE);
Packit 79f644
        }
Packit 79f644
      else
Packit 79f644
        {
Packit 79f644
          gchar *password;
Packit 79f644
Packit 79f644
          password = tpaw_account_settings_dup_string (self->priv->settings,
Packit 79f644
              "password");
Packit 79f644
Packit 79f644
          /* FIXME: we should enable this checkbox only if the password is
Packit 79f644
           * stored for good in the password storage, not only for the session
Packit 79f644
           * (bgo #683571) */
Packit 79f644
          gtk_toggle_button_set_active (
Packit 79f644
              GTK_TOGGLE_BUTTON (self->priv->remember_password_widget),
Packit 79f644
              !TPAW_STR_EMPTY (password));
Packit 79f644
Packit 79f644
          /* The password might not have been retrieved from the
Packit 79f644
           * keyring yet. We should update the remember password
Packit 79f644
           * toggle button and the password entry when/if it is. */
Packit 79f644
          tp_g_signal_connect_object (self->priv->settings,
Packit 79f644
              "password-retrieved",
Packit 79f644
              G_CALLBACK (account_settings_password_retrieved_cb), self, 0);
Packit 79f644
Packit 79f644
          g_free (password);
Packit 79f644
        }
Packit 79f644
Packit 79f644
      g_signal_connect (self->priv->remember_password_widget, "toggled",
Packit 79f644
          G_CALLBACK (remember_password_toggled_cb), self);
Packit 79f644
Packit 79f644
      self->priv->automatic_change = TRUE;
Packit 79f644
      remember_password_toggled_cb (
Packit 79f644
          GTK_TOGGLE_BUTTON (self->priv->remember_password_widget), self);
Packit 79f644
      self->priv->automatic_change = FALSE;
Packit 79f644
    }
Packit 79f644
  else if (self->priv->remember_password_widget != NULL
Packit 79f644
      && !tpaw_account_settings_supports_sasl (self->priv->settings))
Packit 79f644
    {
Packit 79f644
      gtk_widget_set_visible (self->priv->remember_password_widget, FALSE);
Packit 79f644
      tpaw_account_settings_set_remember_password (self->priv->settings,
Packit 79f644
          TRUE);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  /* dup and init the account-manager */
Packit 79f644
  self->priv->account_manager = tp_account_manager_dup ();
Packit 79f644
  tp_proxy_prepare_async (self->priv->account_manager, NULL, NULL, NULL);
Packit 79f644
Packit 79f644
  if (!self->priv->external_action_area)
Packit 79f644
    {
Packit 79f644
      GtkWidget *button_box;
Packit 79f644
Packit 79f644
      g_assert (self->priv->dialog == NULL);
Packit 79f644
      button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
Packit 79f644
      gtk_button_box_set_layout (GTK_BUTTON_BOX (button_box),
Packit 79f644
          GTK_BUTTONBOX_END);
Packit 79f644
      /* Hard code the default spacing as we cannot easily get this property
Packit 79f644
       * as the widget is not in a GtkDialog yet (and it could end up packed
Packit 79f644
       * in a non-GtkDialog window anyway */
Packit 79f644
      gtk_box_set_spacing (GTK_BOX (button_box), 6);
Packit 79f644
Packit 79f644
      self->priv->cancel_button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
Packit 79f644
      gtk_box_pack_end (GTK_BOX (button_box),
Packit 79f644
          self->priv->cancel_button, TRUE, TRUE, 3);
Packit 79f644
Packit 79f644
      self->priv->apply_button = gtk_button_new ();
Packit 79f644
      gtk_box_pack_end (GTK_BOX (button_box),
Packit 79f644
          self->priv->apply_button, TRUE, TRUE, 3);
Packit 79f644
Packit 79f644
      gtk_box_pack_end (GTK_BOX (self), button_box, FALSE, FALSE, 3);
Packit 79f644
      gtk_widget_show_all (button_box);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      g_assert (self->priv->dialog != NULL);
Packit 79f644
      self->priv->cancel_button = gtk_dialog_add_button (
Packit 79f644
          GTK_DIALOG (self->priv->dialog),
Packit 79f644
          GTK_STOCK_CLOSE,
Packit 79f644
          GTK_RESPONSE_CANCEL);
Packit 79f644
      self->priv->apply_button = gtk_dialog_add_button (
Packit 79f644
          GTK_DIALOG (self->priv->dialog),
Packit 79f644
          "",
Packit 79f644
          GTK_RESPONSE_APPLY);
Packit 79f644
      gtk_dialog_set_default_response (GTK_DIALOG (self->priv->dialog),
Packit 79f644
          GTK_RESPONSE_APPLY);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  set_apply_button (self);
Packit 79f644
Packit 79f644
  g_signal_connect (self->priv->cancel_button, "clicked",
Packit 79f644
      G_CALLBACK (account_widget_cancel_clicked_cb),
Packit 79f644
      self);
Packit 79f644
  g_signal_connect (self->priv->apply_button, "clicked",
Packit 79f644
      G_CALLBACK (account_widget_apply_clicked_cb),
Packit 79f644
      self);
Packit 79f644
Packit 79f644
  if (self->priv->creating_account)
Packit 79f644
    /* When creating an account, the user might have nothing to enter.
Packit 79f644
     * That means that no control interaction might occur,
Packit 79f644
     * so we update the control button sensitivity manually.
Packit 79f644
     */
Packit 79f644
    account_widget_handle_control_buttons_sensitivity (self);
Packit 79f644
  else
Packit 79f644
    account_widget_set_control_buttons_sensitivity (self, FALSE);
Packit 79f644
Packit 79f644
  g_clear_object (&self->ui_details->gui);
Packit 79f644
Packit 79f644
  display_name = tpaw_account_settings_get_display_name (
Packit 79f644
      self->priv->settings);
Packit 79f644
  default_display_name = tpaw_account_widget_get_default_display_name (self);
Packit 79f644
Packit 79f644
  if (tp_strdiff (display_name, default_display_name) &&
Packit 79f644
      !self->priv->creating_account)
Packit 79f644
    {
Packit 79f644
      /* The display name of the account is not the one that we'd assign by
Packit 79f644
       * default; assume that the user changed it manually */
Packit 79f644
      g_object_set (self->priv->settings, "display-name-overridden", TRUE,
Packit 79f644
          NULL);
Packit 79f644
    }
Packit 79f644
  g_free (default_display_name);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
do_dispose (GObject *obj)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (obj);
Packit 79f644
Packit 79f644
  g_clear_object (&self->priv->settings);
Packit 79f644
  g_clear_object (&self->priv->account_manager);
Packit 79f644
  g_clear_object (&self->priv->dialog);
Packit 79f644
Packit 79f644
  if (G_OBJECT_CLASS (tpaw_account_widget_parent_class)->dispose != NULL)
Packit 79f644
    G_OBJECT_CLASS (tpaw_account_widget_parent_class)->dispose (obj);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
do_finalize (GObject *obj)
Packit 79f644
{
Packit 79f644
  TpawAccountWidget *self = TPAW_ACCOUNT_WIDGET (obj);
Packit 79f644
Packit 79f644
  g_free (self->ui_details->default_focus);
Packit 79f644
  g_slice_free (TpawAccountWidgetUIDetails, self->ui_details);
Packit 79f644
Packit 79f644
  if (G_OBJECT_CLASS (tpaw_account_widget_parent_class)->finalize != NULL)
Packit 79f644
    G_OBJECT_CLASS (tpaw_account_widget_parent_class)->finalize (obj);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_account_widget_class_init (TpawAccountWidgetClass *klass)
Packit 79f644
{
Packit 79f644
  GObjectClass *oclass = G_OBJECT_CLASS (klass);
Packit 79f644
  GParamSpec *param_spec;
Packit 79f644
Packit 79f644
  oclass->get_property = do_get_property;
Packit 79f644
  oclass->set_property = do_set_property;
Packit 79f644
  oclass->constructed = do_constructed;
Packit 79f644
  oclass->dispose = do_dispose;
Packit 79f644
  oclass->finalize = do_finalize;
Packit 79f644
Packit 79f644
  param_spec = g_param_spec_string ("protocol",
Packit 79f644
      "protocol", "The protocol of the account",
Packit 79f644
      NULL,
Packit 79f644
      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
Packit 79f644
  g_object_class_install_property (oclass, PROP_PROTOCOL, param_spec);
Packit 79f644
Packit 79f644
  param_spec = g_param_spec_object ("settings",
Packit 79f644
      "settings", "The settings of the account",
Packit 79f644
      TPAW_TYPE_ACCOUNT_SETTINGS,
Packit 79f644
      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
Packit 79f644
  g_object_class_install_property (oclass, PROP_SETTINGS, param_spec);
Packit 79f644
Packit 79f644
  param_spec = g_param_spec_boolean ("simple",
Packit 79f644
      "simple", "Whether the account widget is a simple or an advanced one",
Packit 79f644
      FALSE,
Packit 79f644
      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
Packit 79f644
  g_object_class_install_property (oclass, PROP_SIMPLE, param_spec);
Packit 79f644
Packit 79f644
  param_spec = g_param_spec_boolean ("creating-account",
Packit 79f644
      "creating-account",
Packit 79f644
      "TRUE if we're creating an account, FALSE if we're modifying it",
Packit 79f644
      FALSE,
Packit 79f644
      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
Packit 79f644
  g_object_class_install_property (oclass, PROP_CREATING_ACCOUNT, param_spec);
Packit 79f644
Packit 79f644
  param_spec = g_param_spec_boolean ("other-accounts-exist",
Packit 79f644
      "other-accounts-exist",
Packit 79f644
      "TRUE if there are any other accounts (even if this isn't yet saved)",
Packit 79f644
      FALSE,
Packit 79f644
      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
Packit 79f644
  g_object_class_install_property (oclass, PROP_OTHER_ACCOUNTS_EXIST,
Packit 79f644
                  param_spec);
Packit 79f644
Packit 79f644
  param_spec = g_param_spec_object ("dialog",
Packit 79f644
      "dialog",
Packit 79f644
      "The dialog where to pack the action buttons (or NULL)",
Packit 79f644
      GTK_TYPE_DIALOG,
Packit 79f644
      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
Packit 79f644
  g_object_class_install_property (oclass, PROP_DIALOG,
Packit 79f644
                  param_spec);
Packit 79f644
Packit 79f644
  signals[HANDLE_APPLY] =
Packit 79f644
    g_signal_new ("handle-apply", G_TYPE_FROM_CLASS (klass),
Packit 79f644
        G_SIGNAL_RUN_LAST, 0, NULL, NULL,
Packit 79f644
        g_cclosure_marshal_generic,
Packit 79f644
        G_TYPE_NONE,
Packit 79f644
        1, G_TYPE_BOOLEAN);
Packit 79f644
Packit 79f644
  /* This signal is emitted when an account has been created and enabled. */
Packit 79f644
  signals[ACCOUNT_CREATED] =
Packit 79f644
      g_signal_new ("account-created", G_TYPE_FROM_CLASS (klass),
Packit 79f644
          G_SIGNAL_RUN_LAST, 0, NULL, NULL,
Packit 79f644
          g_cclosure_marshal_generic,
Packit 79f644
          G_TYPE_NONE,
Packit 79f644
          1, G_TYPE_OBJECT);
Packit 79f644
Packit 79f644
  signals[CANCELLED] =
Packit 79f644
      g_signal_new ("cancelled", G_TYPE_FROM_CLASS (klass),
Packit 79f644
          G_SIGNAL_RUN_LAST, 0, NULL, NULL,
Packit 79f644
          g_cclosure_marshal_generic,
Packit 79f644
          G_TYPE_NONE,
Packit 79f644
          0);
Packit 79f644
Packit 79f644
  signals[CLOSE] =
Packit 79f644
    g_signal_new ("close", G_TYPE_FROM_CLASS (klass),
Packit 79f644
        G_SIGNAL_RUN_LAST, 0, NULL, NULL,
Packit 79f644
        g_cclosure_marshal_VOID__INT,
Packit 79f644
        G_TYPE_NONE,
Packit 79f644
        1, G_TYPE_INT);
Packit 79f644
Packit 79f644
  g_type_class_add_private (klass, sizeof (TpawAccountWidgetPriv));
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_account_widget_init (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), TPAW_TYPE_ACCOUNT_WIDGET,
Packit 79f644
        TpawAccountWidgetPriv);
Packit 79f644
Packit 79f644
  self->ui_details = g_slice_new0 (TpawAccountWidgetUIDetails);
Packit 79f644
}
Packit 79f644
Packit 79f644
/* public methods */
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_discard_pending_changes (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  tpaw_account_settings_discard_changes (self->priv->settings);
Packit 79f644
  self->priv->contains_pending_changes = FALSE;
Packit 79f644
}
Packit 79f644
Packit 79f644
gboolean
Packit 79f644
tpaw_account_widget_contains_pending_changes (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  return self->priv->contains_pending_changes;
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_handle_params (TpawAccountWidget *self,
Packit 79f644
    const gchar *first_widget,
Packit 79f644
    ...)
Packit 79f644
{
Packit 79f644
  va_list args;
Packit 79f644
Packit 79f644
  va_start (args, first_widget);
Packit 79f644
  account_widget_handle_params_valist (self, first_widget, args);
Packit 79f644
  va_end (args);
Packit 79f644
}
Packit 79f644
Packit 79f644
TpawAccountWidget *
Packit 79f644
tpaw_account_widget_new_for_protocol (TpawAccountSettings *settings,
Packit 79f644
    GtkDialog *dialog,
Packit 79f644
    gboolean simple)
Packit 79f644
{
Packit 79f644
  g_return_val_if_fail (TPAW_IS_ACCOUNT_SETTINGS (settings), NULL);
Packit 79f644
Packit 79f644
  return g_object_new (TPAW_TYPE_ACCOUNT_WIDGET,
Packit 79f644
        "orientation", GTK_ORIENTATION_VERTICAL,
Packit 79f644
        "settings", settings,
Packit 79f644
        "simple", simple,
Packit 79f644
        "creating-account",
Packit 79f644
          tpaw_account_settings_get_account (settings) == NULL,
Packit 79f644
        "dialog", dialog,
Packit 79f644
        NULL);
Packit 79f644
}
Packit 79f644
Packit 79f644
gchar *
Packit 79f644
tpaw_account_widget_get_default_display_name (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  gchar *login_id;
Packit 79f644
  const gchar *protocol, *p;
Packit 79f644
  gchar *default_display_name;
Packit 79f644
Packit 79f644
  login_id = tpaw_account_settings_dup_string (self->priv->settings,
Packit 79f644
      "account");
Packit 79f644
  protocol = tpaw_account_settings_get_protocol (self->priv->settings);
Packit 79f644
Packit 79f644
  if (login_id != NULL)
Packit 79f644
    {
Packit 79f644
      /* TODO: this should be done in tpaw-account-widget-irc */
Packit 79f644
      if (!tp_strdiff (protocol, "irc"))
Packit 79f644
        {
Packit 79f644
          TpawIrcNetwork *network;
Packit 79f644
Packit 79f644
          network = tpaw_irc_network_chooser_get_network (
Packit 79f644
              self->priv->irc_network_chooser);
Packit 79f644
          g_assert (network != NULL);
Packit 79f644
Packit 79f644
          /* To translators: The first parameter is the login id and the
Packit 79f644
           * second one is the network. The resulting string will be something
Packit 79f644
           * like: "MyUserName on freenode".
Packit 79f644
           * You should reverse the order of these arguments if the
Packit 79f644
           * server should come before the login id in your locale.*/
Packit 79f644
          default_display_name = g_strdup_printf (_("%1$s on %2$s"),
Packit 79f644
              login_id, tpaw_irc_network_get_name (network));
Packit 79f644
        }
Packit 79f644
      else
Packit 79f644
        {
Packit 79f644
          default_display_name = g_strdup (login_id);
Packit 79f644
        }
Packit 79f644
      g_free (login_id);
Packit 79f644
Packit 79f644
      return default_display_name;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  if ((p = tpaw_protocol_name_to_display_name (protocol)) != NULL)
Packit 79f644
    protocol = p;
Packit 79f644
Packit 79f644
  if (protocol != NULL)
Packit 79f644
    {
Packit 79f644
      /* To translators: The parameter is the protocol name. The resulting
Packit 79f644
       * string will be something like: "Jabber Account" */
Packit 79f644
      default_display_name = g_strdup_printf (_("%s Account"), protocol);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      default_display_name = g_strdup (_("New account"));
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return default_display_name;
Packit 79f644
}
Packit 79f644
Packit 79f644
/* Used by subclass to indicate that widget contains pending changes */
Packit 79f644
void
Packit 79f644
tpaw_account_widget_changed (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  account_widget_handle_control_buttons_sensitivity (self);
Packit 79f644
  self->priv->contains_pending_changes = TRUE;
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_set_account_param (TpawAccountWidget *self,
Packit 79f644
    const gchar *account)
Packit 79f644
{
Packit 79f644
  if (self->priv->param_account_widget == NULL)
Packit 79f644
    return;
Packit 79f644
Packit 79f644
  gtk_entry_set_text (GTK_ENTRY (self->priv->param_account_widget), account);
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_set_password_param (TpawAccountWidget *self,
Packit 79f644
    const gchar *account)
Packit 79f644
{
Packit 79f644
  if (self->priv->param_password_widget == NULL)
Packit 79f644
    return;
Packit 79f644
Packit 79f644
  gtk_entry_set_text (GTK_ENTRY (self->priv->param_password_widget), account);
Packit 79f644
}
Packit 79f644
Packit 79f644
TpawAccountSettings *
Packit 79f644
tpaw_account_widget_get_settings (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  return self->priv->settings;
Packit 79f644
}
Packit 79f644
Packit 79f644
void
Packit 79f644
tpaw_account_widget_hide_buttons (TpawAccountWidget *self)
Packit 79f644
{
Packit 79f644
  gtk_widget_hide (self->priv->apply_button);
Packit 79f644
  gtk_widget_hide (self->priv->cancel_button);
Packit 79f644
}