Blame telepathy-account-widgets/tp-account-widgets/tpaw-irc-network-chooser.c

Packit 79f644
/*
Packit 79f644
 * Copyright (C) 2007-2008 Guillaume Desmottes
Packit 79f644
 * Copyright (C) 2010 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: Guillaume Desmottes <gdesmott@gnome.org>
Packit 79f644
 */
Packit 79f644
Packit 79f644
#include "config.h"
Packit 79f644
#include "tpaw-irc-network-chooser.h"
Packit 79f644
Packit 79f644
#include "tpaw-irc-network-chooser-dialog.h"
Packit 79f644
#include "tpaw-irc-network-manager.h"
Packit 79f644
#include "tpaw-utils.h"
Packit 79f644
Packit 79f644
#define DEBUG_FLAG TPAW_DEBUG_ACCOUNT | TPAW_DEBUG_IRC
Packit 79f644
#include "tpaw-debug.h"
Packit 79f644
Packit 79f644
#define DEFAULT_IRC_NETWORK "irc.gimp.org"
Packit 79f644
#define DEFAULT_IRC_PORT 6667
Packit 79f644
#define DEFAULT_IRC_SSL FALSE
Packit 79f644
Packit 79f644
enum {
Packit 79f644
    PROP_SETTINGS = 1
Packit 79f644
};
Packit 79f644
Packit 79f644
enum {
Packit 79f644
    SIG_CHANGED,
Packit 79f644
    LAST_SIGNAL
Packit 79f644
};
Packit 79f644
Packit 79f644
static guint signals[LAST_SIGNAL] = { 0 };
Packit 79f644
Packit 79f644
struct _TpawIrcNetworkChooserPriv {
Packit 79f644
    TpawAccountSettings *settings;
Packit 79f644
Packit 79f644
    TpawIrcNetworkManager *network_manager;
Packit 79f644
    GtkWidget *dialog;
Packit 79f644
    /* Displayed network */
Packit 79f644
    TpawIrcNetwork *network;
Packit 79f644
};
Packit 79f644
Packit 79f644
G_DEFINE_TYPE (TpawIrcNetworkChooser, tpaw_irc_network_chooser,
Packit 79f644
    GTK_TYPE_BUTTON);
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_irc_network_chooser_set_property (GObject *object,
Packit 79f644
    guint prop_id,
Packit 79f644
    const GValue *value,
Packit 79f644
    GParamSpec *pspec)
Packit 79f644
{
Packit 79f644
  TpawIrcNetworkChooser *self = TPAW_IRC_NETWORK_CHOOSER (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
      default:
Packit 79f644
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 79f644
        break;
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_irc_network_chooser_get_property (GObject *object,
Packit 79f644
    guint prop_id,
Packit 79f644
    GValue *value,
Packit 79f644
    GParamSpec *pspec)
Packit 79f644
{
Packit 79f644
  TpawIrcNetworkChooser *self = TPAW_IRC_NETWORK_CHOOSER (object);
Packit 79f644
Packit 79f644
  switch (prop_id)
Packit 79f644
    {
Packit 79f644
      case PROP_SETTINGS:
Packit 79f644
        g_value_set_object (value, self->priv->settings);
Packit 79f644
        break;
Packit 79f644
      default:
Packit 79f644
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 79f644
        break;
Packit 79f644
    }
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
unset_server_params (TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  DEBUG ("Unset server, port and use-ssl");
Packit 79f644
  tpaw_account_settings_unset (self->priv->settings, "server");
Packit 79f644
  tpaw_account_settings_unset (self->priv->settings, "port");
Packit 79f644
  tpaw_account_settings_unset (self->priv->settings, "use-ssl");
Packit 79f644
}
Packit 79f644
Packit 79f644
static gchar *
Packit 79f644
dup_network_service (TpawIrcNetwork *network)
Packit 79f644
{
Packit 79f644
  /* Account.Service has to be a lower case alphanumeric string which may
Packit 79f644
   * also contain '-' but not start with it. */
Packit 79f644
#define VALID G_CSET_a_2_z G_CSET_DIGITS "-"
Packit 79f644
  gchar *service, *tmp;
Packit 79f644
Packit 79f644
  service = g_strdup (tpaw_irc_network_get_name (network));
Packit 79f644
  service = g_strstrip (service);
Packit 79f644
Packit 79f644
  if (tp_str_empty (service))
Packit 79f644
    {
Packit 79f644
      g_free (service);
Packit 79f644
      return NULL;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  tmp = service;
Packit 79f644
  service = g_ascii_strdown (service, -1);
Packit 79f644
  g_free (tmp);
Packit 79f644
Packit 79f644
  service = g_strcanon (service, VALID, '-');
Packit 79f644
Packit 79f644
  if (service[0] == '-')
Packit 79f644
    {
Packit 79f644
      tmp = service;
Packit 79f644
      service = g_strdup (service + 1);
Packit 79f644
Packit 79f644
      g_free (tmp);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  return service;
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
update_server_params (TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  GSList *servers;
Packit 79f644
  const gchar *charset;
Packit 79f644
Packit 79f644
  g_assert (self->priv->network != NULL);
Packit 79f644
Packit 79f644
  charset = tpaw_irc_network_get_charset (self->priv->network);
Packit 79f644
  DEBUG ("Setting charset to %s", charset);
Packit 79f644
  tpaw_account_settings_set (self->priv->settings, "charset",
Packit 79f644
      g_variant_new_string (charset));
Packit 79f644
Packit 79f644
  servers = tpaw_irc_network_get_servers (self->priv->network);
Packit 79f644
  if (g_slist_length (servers) > 0)
Packit 79f644
    {
Packit 79f644
      /* set the first server as CM server */
Packit 79f644
      TpawIrcServer *server = servers->data;
Packit 79f644
      gchar *address;
Packit 79f644
      guint port;
Packit 79f644
      gboolean ssl;
Packit 79f644
      gchar *service;
Packit 79f644
Packit 79f644
      g_object_get (server,
Packit 79f644
          "address", &address,
Packit 79f644
          "port", &port,
Packit 79f644
          "ssl", &ssl,
Packit 79f644
          NULL);
Packit 79f644
Packit 79f644
      DEBUG ("Setting server to %s", address);
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, "server",
Packit 79f644
          g_variant_new_string (address));
Packit 79f644
      DEBUG ("Setting port to %u", port);
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, "port",
Packit 79f644
          g_variant_new_uint32 (port));
Packit 79f644
      DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
Packit 79f644
      tpaw_account_settings_set (self->priv->settings, "use-ssl",
Packit 79f644
          g_variant_new_boolean (ssl));
Packit 79f644
Packit 79f644
      /* Set Account.Service */
Packit 79f644
      service = dup_network_service (self->priv->network);
Packit 79f644
      DEBUG ("Setting Service to %s", service);
Packit 79f644
      tpaw_account_settings_set_service (self->priv->settings, service);
Packit 79f644
Packit 79f644
      g_free (address);
Packit 79f644
      g_free (service);
Packit 79f644
    }
Packit 79f644
  else
Packit 79f644
    {
Packit 79f644
      /* No server. Unset values */
Packit 79f644
      unset_server_params (self);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
Packit 79f644
  g_slist_free (servers);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
set_label (TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  g_assert (self->priv->network != NULL);
Packit 79f644
Packit 79f644
  gtk_button_set_label (GTK_BUTTON (self),
Packit 79f644
      tpaw_irc_network_get_name (self->priv->network));
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
set_label_from_settings (TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  gchar *server;
Packit 79f644
Packit 79f644
  tp_clear_object (&self->priv->network);
Packit 79f644
Packit 79f644
  server = tpaw_account_settings_dup_string (self->priv->settings, "server");
Packit 79f644
Packit 79f644
  if (server != NULL)
Packit 79f644
    {
Packit 79f644
      TpawIrcServer *srv;
Packit 79f644
      gint port;
Packit 79f644
      gboolean ssl;
Packit 79f644
Packit 79f644
      self->priv->network =
Packit 79f644
        tpaw_irc_network_manager_find_network_by_address (
Packit 79f644
            self->priv->network_manager, server);
Packit 79f644
Packit 79f644
      if (self->priv->network != NULL)
Packit 79f644
        {
Packit 79f644
          /* The network is known */
Packit 79f644
          g_object_ref (self->priv->network);
Packit 79f644
          set_label (self);
Packit 79f644
          return;
Packit 79f644
        }
Packit 79f644
Packit 79f644
      /* We don't have this network. Let's create it */
Packit 79f644
      port = tpaw_account_settings_get_uint32 (self->priv->settings, "port");
Packit 79f644
      ssl = tpaw_account_settings_get_boolean (self->priv->settings,
Packit 79f644
          "use-ssl");
Packit 79f644
Packit 79f644
      DEBUG ("Create a network %s", server);
Packit 79f644
      self->priv->network = tpaw_irc_network_new (server);
Packit 79f644
      srv = tpaw_irc_server_new (server, port, ssl);
Packit 79f644
Packit 79f644
      tpaw_irc_network_append_server (self->priv->network, srv);
Packit 79f644
      tpaw_irc_network_manager_add (self->priv->network_manager,
Packit 79f644
          self->priv->network);
Packit 79f644
Packit 79f644
      set_label (self);
Packit 79f644
Packit 79f644
      g_object_unref (srv);
Packit 79f644
      g_free (server);
Packit 79f644
      return;
Packit 79f644
    }
Packit 79f644
Packit 79f644
  /* Set default network */
Packit 79f644
  self->priv->network = tpaw_irc_network_manager_find_network_by_address (
Packit 79f644
          self->priv->network_manager, DEFAULT_IRC_NETWORK);
Packit 79f644
Packit 79f644
  if (self->priv->network == NULL)
Packit 79f644
    {
Packit 79f644
      /* Default network is not known, recreate it */
Packit 79f644
      TpawIrcServer *srv;
Packit 79f644
Packit 79f644
      self->priv->network = tpaw_irc_network_new (DEFAULT_IRC_NETWORK);
Packit 79f644
Packit 79f644
      srv = tpaw_irc_server_new (DEFAULT_IRC_NETWORK, DEFAULT_IRC_PORT,
Packit 79f644
          DEFAULT_IRC_SSL);
Packit 79f644
Packit 79f644
      tpaw_irc_network_append_server (self->priv->network, srv);
Packit 79f644
      tpaw_irc_network_manager_add (self->priv->network_manager,
Packit 79f644
          self->priv->network);
Packit 79f644
Packit 79f644
      g_object_unref (srv);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  set_label (self);
Packit 79f644
  update_server_params (self);
Packit 79f644
  g_object_ref (self->priv->network);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
dialog_response_cb (GtkDialog *dialog,
Packit 79f644
    gint response,
Packit 79f644
    TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  TpawIrcNetworkChooserDialog *chooser =
Packit 79f644
    TPAW_IRC_NETWORK_CHOOSER_DIALOG (self->priv->dialog);
Packit 79f644
Packit 79f644
  if (response != GTK_RESPONSE_CLOSE &&
Packit 79f644
      response != GTK_RESPONSE_DELETE_EVENT)
Packit 79f644
    return;
Packit 79f644
Packit 79f644
  if (tpaw_irc_network_chooser_dialog_get_changed (chooser))
Packit 79f644
    {
Packit 79f644
      tp_clear_object (&self->priv->network);
Packit 79f644
Packit 79f644
      self->priv->network = g_object_ref (
Packit 79f644
          tpaw_irc_network_chooser_dialog_get_network (chooser));
Packit 79f644
Packit 79f644
      update_server_params (self);
Packit 79f644
      set_label (self);
Packit 79f644
Packit 79f644
      g_signal_emit (self, signals[SIG_CHANGED], 0);
Packit 79f644
    }
Packit 79f644
Packit 79f644
  gtk_widget_destroy (self->priv->dialog);
Packit 79f644
  self->priv->dialog = NULL;
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
clicked_cb (GtkButton *button,
Packit 79f644
    gpointer user_data)
Packit 79f644
{
Packit 79f644
  TpawIrcNetworkChooser *self = TPAW_IRC_NETWORK_CHOOSER (button);
Packit 79f644
  GtkWindow *window;
Packit 79f644
Packit 79f644
  if (self->priv->dialog != NULL)
Packit 79f644
    goto out;
Packit 79f644
Packit 79f644
  window = tpaw_get_toplevel_window (GTK_WIDGET (button));
Packit 79f644
Packit 79f644
  self->priv->dialog = tpaw_irc_network_chooser_dialog_new (
Packit 79f644
      self->priv->settings, self->priv->network, window);
Packit 79f644
  gtk_widget_show_all (self->priv->dialog);
Packit 79f644
Packit 79f644
  tp_g_signal_connect_object (self->priv->dialog, "response",
Packit 79f644
      G_CALLBACK (dialog_response_cb), button, 0);
Packit 79f644
Packit 79f644
out:
Packit 79f644
  tpaw_window_present (GTK_WINDOW (self->priv->dialog));
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_irc_network_chooser_constructed (GObject *object)
Packit 79f644
{
Packit 79f644
  TpawIrcNetworkChooser *self = (TpawIrcNetworkChooser *) object;
Packit 79f644
Packit 79f644
  G_OBJECT_CLASS (tpaw_irc_network_chooser_parent_class)->constructed (object);
Packit 79f644
Packit 79f644
  g_assert (self->priv->settings != NULL);
Packit 79f644
Packit 79f644
  set_label_from_settings (self);
Packit 79f644
Packit 79f644
  g_signal_connect (self, "clicked", G_CALLBACK (clicked_cb), self);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_irc_network_chooser_dispose (GObject *object)
Packit 79f644
{
Packit 79f644
  TpawIrcNetworkChooser *self = (TpawIrcNetworkChooser *) object;
Packit 79f644
Packit 79f644
  tp_clear_object (&self->priv->settings);
Packit 79f644
  tp_clear_object (&self->priv->network_manager);
Packit 79f644
  tp_clear_object (&self->priv->network);
Packit 79f644
Packit 79f644
  if (G_OBJECT_CLASS (tpaw_irc_network_chooser_parent_class)->dispose)
Packit 79f644
    G_OBJECT_CLASS (tpaw_irc_network_chooser_parent_class)->dispose (object);
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_irc_network_chooser_class_init (TpawIrcNetworkChooserClass *klass)
Packit 79f644
{
Packit 79f644
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 79f644
Packit 79f644
  object_class->get_property = tpaw_irc_network_chooser_get_property;
Packit 79f644
  object_class->set_property = tpaw_irc_network_chooser_set_property;
Packit 79f644
  object_class->constructed = tpaw_irc_network_chooser_constructed;
Packit 79f644
  object_class->dispose = tpaw_irc_network_chooser_dispose;
Packit 79f644
Packit 79f644
  g_object_class_install_property (object_class, PROP_SETTINGS,
Packit 79f644
    g_param_spec_object ("settings",
Packit 79f644
      "Settings",
Packit 79f644
      "The TpawAccountSettings to show and edit",
Packit 79f644
      TPAW_TYPE_ACCOUNT_SETTINGS,
Packit 79f644
      G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
Packit 79f644
Packit 79f644
  signals[SIG_CHANGED] = g_signal_new ("changed",
Packit 79f644
      G_OBJECT_CLASS_TYPE (object_class),
Packit 79f644
      G_SIGNAL_RUN_LAST,
Packit 79f644
      0,
Packit 79f644
      NULL, NULL,
Packit 79f644
      g_cclosure_marshal_generic,
Packit 79f644
      G_TYPE_NONE,
Packit 79f644
      0);
Packit 79f644
Packit 79f644
  g_type_class_add_private (object_class,
Packit 79f644
      sizeof (TpawIrcNetworkChooserPriv));
Packit 79f644
}
Packit 79f644
Packit 79f644
static void
Packit 79f644
tpaw_irc_network_chooser_init (TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
Packit 79f644
      TPAW_TYPE_IRC_NETWORK_CHOOSER, TpawIrcNetworkChooserPriv);
Packit 79f644
Packit 79f644
  self->priv->network_manager = tpaw_irc_network_manager_dup_default ();
Packit 79f644
}
Packit 79f644
Packit 79f644
GtkWidget *
Packit 79f644
tpaw_irc_network_chooser_new (TpawAccountSettings *settings)
Packit 79f644
{
Packit 79f644
  return g_object_new (TPAW_TYPE_IRC_NETWORK_CHOOSER,
Packit 79f644
      "settings", settings,
Packit 79f644
      NULL);
Packit 79f644
}
Packit 79f644
Packit 79f644
TpawIrcNetwork *
Packit 79f644
tpaw_irc_network_chooser_get_network (TpawIrcNetworkChooser *self)
Packit 79f644
{
Packit 79f644
  return self->priv->network;
Packit 79f644
}