static void
account_widget_handle_params_valist (McAccount   *account,
				     GtkBuilder  *gui,
				     const gchar *first_widget,
				     va_list      args)
{
	GObject *object;
	const gchar *name;

	for (name = first_widget; name; name = va_arg (args, const gchar *)) {
		const gchar *param_name;

		param_name = va_arg (args, const gchar *);
		object = gtk_builder_get_object (gui, name);

		if (!object) {
			g_warning ("Builder is missing object '%s'.", name);
			continue;
		}

		account_widget_setup_widget (GTK_WIDGET (object), account, param_name);
	}
}
static void
account_widget_handle_params_valist (EmpathyAccountWidget *self,
    const gchar *first_widget,
    va_list args)
{
  GObject *object;
  const gchar *name;

  for (name = first_widget; name; name = va_arg (args, const gchar *))
    {
      const gchar *param_name;

      param_name = va_arg (args, const gchar *);
      object = gtk_builder_get_object (self->ui_details->gui, name);

      if (!object)
        {
          g_warning ("Builder is missing object '%s'.", name);
          continue;
        }

      account_widget_setup_widget (self, GTK_WIDGET (object), param_name);
    }
}
static void
account_widget_handle_params_valist (McAccount   *account,
				     GladeXML    *gui,
				     const gchar *first_widget_name,
				     va_list      args)
{
	GtkWidget   *widget;
	const gchar *widget_name;

	for (widget_name = first_widget_name; widget_name; widget_name = va_arg (args, gchar*)) {
		const gchar *param_name;

		param_name = va_arg (args, gchar*);

		widget = glade_xml_get_widget (gui, widget_name);

		if (!widget) {
			g_warning ("Glade is missing widget '%s'.", widget_name);
			continue;
		}

		account_widget_setup_widget (widget, account, param_name);
	}
}
static void
accounts_widget_generic_setup (EmpathyAccountWidget *self,
    GtkWidget *table_common_settings,
    GtkWidget *table_advanced_settings)
{
  TpConnectionManagerParam *params, *param;
  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);

  params = empathy_account_settings_get_tp_params (priv->settings);

  for (param = params; param != NULL && param->name != NULL; param++)
    {
      GtkWidget       *table_settings;
      guint            n_rows = 0;
      GtkWidget       *widget = NULL;
      gchar           *param_name_formatted;

      if (param->flags & TP_CONN_MGR_PARAM_FLAG_REQUIRED)
        table_settings = table_common_settings;
      else if (priv->simple)
        return;
      else
        table_settings = table_advanced_settings;

      param_name_formatted = account_widget_generic_format_param_name
        (param->name);
      g_object_get (table_settings, "n-rows", &n_rows, NULL);
      gtk_table_resize (GTK_TABLE (table_settings), ++n_rows, 2);

      if (param->dbus_signature[0] == 's')
        {
          gchar *str;

          str = g_strdup_printf (_("%s:"), param_name_formatted);
          widget = gtk_label_new (str);
          gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
          g_free (str);

          gtk_table_attach (GTK_TABLE (table_settings),
              widget,
              0, 1,
              n_rows - 1, n_rows,
              GTK_FILL, 0,
              0, 0);
          gtk_widget_show (widget);

          widget = gtk_entry_new ();
          if (strcmp (param->name, "account") == 0)
            {
              g_signal_connect (widget, "realize",
                  G_CALLBACK (gtk_widget_grab_focus),
                  NULL);
            }
          gtk_table_attach (GTK_TABLE (table_settings),
              widget,
              1, 2,
              n_rows - 1, n_rows,
              GTK_FILL | GTK_EXPAND, 0,
              0, 0);
          gtk_widget_show (widget);
        }
      /* int types: ynqiuxt. double type is 'd' */
      else if (param->dbus_signature[0] == 'y' ||
          param->dbus_signature[0] == 'n' ||
          param->dbus_signature[0] == 'q' ||
          param->dbus_signature[0] == 'i' ||
          param->dbus_signature[0] == 'u' ||
          param->dbus_signature[0] == 'x' ||
          param->dbus_signature[0] == 't' ||
          param->dbus_signature[0] == 'd')
        {
          gchar   *str = NULL;
          gdouble  minint = 0;
          gdouble  maxint = 0;
          gdouble  step = 1;

          switch (param->dbus_signature[0])
            {
            case 'y': minint = G_MININT8;  maxint = G_MAXINT8;   break;
            case 'n': minint = G_MININT16; maxint = G_MAXINT16;  break;
            case 'q': minint = 0;          maxint = G_MAXUINT16; break;
            case 'i': minint = G_MININT32; maxint = G_MAXINT32;  break;
            case 'u': minint = 0;          maxint = G_MAXUINT32; break;
            case 'x': minint = G_MININT64; maxint = G_MAXINT64;  break;
            case 't': minint = 0;          maxint = G_MAXUINT64; break;
            case 'd': minint = G_MININT32; maxint = G_MAXINT32;
              step = 0.1; break;
            }

          str = g_strdup_printf (_("%s:"), param_name_formatted);
          widget = gtk_label_new (str);
          gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
          g_free (str);

          gtk_table_attach (GTK_TABLE (table_settings),
              widget,
              0, 1,
              n_rows - 1, n_rows,
              GTK_FILL, 0,
              0, 0);
          gtk_widget_show (widget);

          widget = gtk_spin_button_new_with_range (minint, maxint, step);
          gtk_table_attach (GTK_TABLE (table_settings),
              widget,
              1, 2,
              n_rows - 1, n_rows,
              GTK_FILL | GTK_EXPAND, 0,
              0, 0);
          gtk_widget_show (widget);
        }
      else if (param->dbus_signature[0] == 'b')
        {
          widget = gtk_check_button_new_with_label (param_name_formatted);
          gtk_table_attach (GTK_TABLE (table_settings),
              widget,
              0, 2,
              n_rows - 1, n_rows,
              GTK_FILL | GTK_EXPAND, 0,
              0, 0);
          gtk_widget_show (widget);
        }
      else
        {
          DEBUG ("Unknown signature for param %s: %s",
              param_name_formatted, param->dbus_signature);
        }

      if (widget)
        account_widget_setup_widget (self, widget, param->name);

      g_free (param_name_formatted);
    }
}
static void
accounts_widget_generic_setup (McAccount *account,
			       GtkWidget *table_common_settings,
			       GtkWidget *table_advanced_settings)
{
	McProtocol *protocol;
	McProfile  *profile;
	GSList     *params, *l;

	profile = mc_account_get_profile (account);
	protocol = mc_profile_get_protocol (profile);

	if (!protocol) {
		/* The CM is not installed, MC shouldn't list them
		 * see SF bug #1688779
		 * FIXME: We should display something asking the user to
		 * install the CM
		 */
		g_object_unref (profile);
		return;
	}

	params = mc_protocol_get_params (protocol);

	for (l = params; l; l = l->next) {
		McProtocolParam *param;
		GtkWidget       *table_settings;
		guint            n_rows = 0;
		GtkWidget       *widget = NULL;
		gchar           *param_name_formatted;

		param = l->data;
		if (param->flags & MC_PROTOCOL_PARAM_REQUIRED) {
			table_settings = table_common_settings;
		} else {
			table_settings = table_advanced_settings;
		}
		param_name_formatted = account_widget_generic_format_param_name (param->name);
		g_object_get (table_settings, "n-rows", &n_rows, NULL);
		gtk_table_resize (GTK_TABLE (table_settings), ++n_rows, 2);

		if (param->signature[0] == 's') {
			gchar *str;

			str = g_strdup_printf (_("%s:"), param_name_formatted);
			widget = gtk_label_new (str);
			gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
			g_free (str);

			gtk_table_attach (GTK_TABLE (table_settings),
					  widget,
					  0, 1,
					  n_rows - 1, n_rows,
					  GTK_FILL, 0,
					  0, 0);
			gtk_widget_show (widget);

			widget = gtk_entry_new ();
			if (strcmp (param->name, "account") == 0) {
				g_signal_connect (widget, "realize",
						  G_CALLBACK (account_widget_default_entry_realized_cb),
						  NULL);
			}
			gtk_table_attach (GTK_TABLE (table_settings),
					  widget,
					  1, 2,
					  n_rows - 1, n_rows,
					  GTK_FILL | GTK_EXPAND, 0,
					  0, 0);
			gtk_widget_show (widget);
		}
		/* int types: ynqiuxt. double type is 'd' */
		else if (param->signature[0] == 'y' ||
			 param->signature[0] == 'n' ||
			 param->signature[0] == 'q' ||
			 param->signature[0] == 'i' ||
			 param->signature[0] == 'u' ||
			 param->signature[0] == 'x' ||
			 param->signature[0] == 't' ||
			 param->signature[0] == 'd') {
			gchar   *str = NULL;
			gdouble  minint = 0;
			gdouble  maxint = 0;
			gdouble  step = 1;

			switch (param->signature[0]) {
			case 'y': minint = G_MININT8;  maxint = G_MAXINT8;   break;
			case 'n': minint = G_MININT16; maxint = G_MAXINT16;  break;
			case 'q': minint = 0;          maxint = G_MAXUINT16; break;
			case 'i': minint = G_MININT32; maxint = G_MAXINT32;  break;
			case 'u': minint = 0;          maxint = G_MAXUINT32; break;
			case 'x': minint = G_MININT64; maxint = G_MAXINT64;  break;
			case 't': minint = 0;          maxint = G_MAXUINT64; break;
			case 'd': minint = G_MININT32; maxint = G_MAXINT32; step = 0.1; break;
			}

			str = g_strdup_printf (_("%s:"), param_name_formatted);
			widget = gtk_label_new (str);
			gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
			g_free (str);

			gtk_table_attach (GTK_TABLE (table_settings),
					  widget,
					  0, 1,
					  n_rows - 1, n_rows,
					  GTK_FILL, 0,
					  0, 0);
			gtk_widget_show (widget);

			widget = gtk_spin_button_new_with_range (minint, maxint, step);
			gtk_table_attach (GTK_TABLE (table_settings),
					  widget,
					  1, 2,
					  n_rows - 1, n_rows,
					  GTK_FILL | GTK_EXPAND, 0,
					  0, 0);
			gtk_widget_show (widget);
		}
		else if (param->signature[0] == 'b') {
			widget = gtk_check_button_new_with_label (param_name_formatted);
			gtk_table_attach (GTK_TABLE (table_settings),
					  widget,
					  0, 2,
					  n_rows - 1, n_rows,
					  GTK_FILL | GTK_EXPAND, 0,
					  0, 0);
			gtk_widget_show (widget);
		} else {
			DEBUG ("Unknown signature for param %s: %s",
				param_name_formatted, param->signature);
		}

		if (widget) {
			account_widget_setup_widget (widget, account, param->name);
		}

		g_free (param_name_formatted);
	}

	g_slist_free (params);
	g_object_unref (profile);
	g_object_unref (protocol);
}