[empathy: 2/26] add empathy-irc-network-chooser



commit 4b08cbd1605f1671a9d90ffa7f3a3a1776e5a61a
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Mon Aug 23 17:24:59 2010 +0200

    add empathy-irc-network-chooser

 libempathy-gtk/Makefile.am                   |    2 +
 libempathy-gtk/empathy-irc-network-chooser.c |  299 ++++++++++++++++++++++++++
 libempathy-gtk/empathy-irc-network-chooser.h |   61 ++++++
 3 files changed, 362 insertions(+), 0 deletions(-)
---
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index de6cba2..15e187c 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -63,6 +63,7 @@ libempathy_gtk_handwritten_source =            	\
 	empathy-individual-store.c		\
 	empathy-individual-view.c		\
 	empathy-individual-widget.c		\
+	empathy-irc-network-chooser.c \
 	empathy-irc-network-dialog.c		\
 	empathy-kludge-label.c			\
 	empathy-log-window.c			\
@@ -123,6 +124,7 @@ libempathy_gtk_headers =			\
 	empathy-individual-store.h		\
 	empathy-individual-view.h		\
 	empathy-individual-widget.h		\
+	empathy-irc-network-chooser.h \
 	empathy-irc-network-dialog.h		\
 	empathy-kludge-label.h			\
 	empathy-log-window.h			\
diff --git a/libempathy-gtk/empathy-irc-network-chooser.c b/libempathy-gtk/empathy-irc-network-chooser.c
new file mode 100644
index 0000000..768abe2
--- /dev/null
+++ b/libempathy-gtk/empathy-irc-network-chooser.c
@@ -0,0 +1,299 @@
+/*
+ * Copyright (C) 2007-2008 Guillaume Desmottes
+ * Copyright (C) 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Authors: Guillaume Desmottes <gdesmott gnome org>
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#include <glib/gi18n-lib.h>
+#include <gtk/gtk.h>
+
+#include <libempathy/empathy-utils.h>
+#include <libempathy/empathy-irc-network-manager.h>
+
+#include "empathy-irc-network-dialog.h"
+#include "empathy-ui-utils.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
+#include <libempathy/empathy-debug.h>
+
+#include "empathy-irc-network-chooser.h"
+
+#define DEFAULT_IRC_NETWORK "irc.gimp.org"
+
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIrcNetworkChooser)
+
+enum {
+    PROP_SETTINGS = 1
+};
+
+typedef struct {
+    EmpathyAccountSettings *settings;
+
+    EmpathyIrcNetworkManager *network_manager;
+    /* Displayed network */
+    EmpathyIrcNetwork *network;
+} EmpathyIrcNetworkChooserPriv;
+
+G_DEFINE_TYPE (EmpathyIrcNetworkChooser, empathy_irc_network_chooser,
+    GTK_TYPE_BUTTON);
+
+static void
+empathy_irc_network_chooser_set_property (GObject *object,
+    guint prop_id,
+    const GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (object);
+
+  switch (prop_id)
+    {
+      case PROP_SETTINGS:
+        priv->settings = g_value_dup_object (value);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+empathy_irc_network_chooser_get_property (GObject *object,
+    guint prop_id,
+    GValue *value,
+    GParamSpec *pspec)
+{
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (object);
+
+  switch (prop_id)
+    {
+      case PROP_SETTINGS:
+        g_value_set_object (value, priv->settings);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+        break;
+    }
+}
+
+static void
+unset_server_params (EmpathyIrcNetworkChooser *self)
+{
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
+
+  DEBUG ("Unset server, port and use-ssl");
+  empathy_account_settings_unset (priv->settings, "server");
+  empathy_account_settings_unset (priv->settings, "port");
+  empathy_account_settings_unset (priv->settings, "use-ssl");
+}
+
+static void
+update_server_params (EmpathyIrcNetworkChooser *self)
+{
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
+  GSList *servers;
+  gchar *charset;
+
+  g_assert (priv->network != NULL);
+
+  g_object_get (priv->network, "charset", &charset, NULL);
+  DEBUG ("Setting charset to %s", charset);
+  empathy_account_settings_set_string (priv->settings, "charset", charset);
+  g_free (charset);
+
+  servers = empathy_irc_network_get_servers (priv->network);
+  if (g_slist_length (servers) > 0)
+    {
+      /* set the first server as CM server */
+      EmpathyIrcServer *server = servers->data;
+      gchar *address;
+      guint port;
+      gboolean ssl;
+
+      g_object_get (server,
+          "address", &address,
+          "port", &port,
+          "ssl", &ssl,
+          NULL);
+
+      DEBUG ("Setting server to %s", address);
+      empathy_account_settings_set_string (priv->settings, "server", address);
+      DEBUG ("Setting port to %u", port);
+      empathy_account_settings_set_uint32 (priv->settings, "port", port);
+      DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
+      empathy_account_settings_set_boolean (priv->settings, "use-ssl", ssl);
+
+      g_free (address);
+    }
+  else
+    {
+      /* No server. Unset values */
+      unset_server_params (self);
+    }
+
+  g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
+  g_slist_free (servers);
+}
+
+static void
+set_label (EmpathyIrcNetworkChooser *self)
+{
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
+  gchar *name;
+
+  g_assert (priv->network != NULL);
+  g_object_get (priv->network, "name", &name, NULL);
+
+  gtk_button_set_label (GTK_BUTTON (self), name);
+  g_free (name);
+}
+
+static void
+set_label_from_settings (EmpathyIrcNetworkChooser *self)
+{
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
+  const gchar *server;
+
+  tp_clear_object (&priv->network);
+
+  server = empathy_account_settings_get_string (priv->settings, "server");
+
+  if (server != NULL)
+    {
+      EmpathyIrcServer *srv;
+      gint port;
+      gboolean ssl;
+
+      priv->network = empathy_irc_network_manager_find_network_by_address (
+          priv->network_manager, server);
+
+      if (priv->network != NULL)
+        {
+          /* The network is known */
+          g_object_ref (priv->network);
+          set_label (self);
+          return;
+        }
+
+      /* We don't have this network. Let's create it */
+      port = empathy_account_settings_get_uint32 (priv->settings, "port");
+      ssl = empathy_account_settings_get_boolean (priv->settings,
+          "use-ssl");
+
+      DEBUG ("Create a network %s", server);
+      priv->network = empathy_irc_network_new (server);
+      srv = empathy_irc_server_new (server, port, ssl);
+
+      empathy_irc_network_append_server (priv->network, srv);
+      empathy_irc_network_manager_add (priv->network_manager, priv->network);
+
+      set_label (self);
+
+      g_object_unref (srv);
+      return;
+    }
+
+  /* Set default network */
+  priv->network = empathy_irc_network_manager_find_network_by_address (
+          priv->network_manager, DEFAULT_IRC_NETWORK);
+  g_assert (priv->network != NULL);
+
+  set_label (self);
+  update_server_params (self);
+  g_object_ref (priv->network);
+}
+
+static void
+clicked_cb (GtkButton *button,
+    gpointer user_data)
+{
+  /* TODO: open edit dialog */
+}
+
+static void
+empathy_irc_network_chooser_constructed (GObject *object)
+{
+  EmpathyIrcNetworkChooser *self = (EmpathyIrcNetworkChooser *) object;
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
+
+  g_assert (priv->settings != NULL);
+
+  set_label_from_settings (self);
+
+  g_signal_connect (self, "clicked", G_CALLBACK (clicked_cb), self);
+}
+
+static void
+empathy_irc_network_chooser_dispose (GObject *object)
+{
+  EmpathyIrcNetworkManager *self = (EmpathyIrcNetworkManager *) object;
+  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
+
+  tp_clear_object (&priv->settings);
+  tp_clear_object (&priv->network_manager);
+  tp_clear_object (&priv->network);
+
+  if (G_OBJECT_CLASS (empathy_irc_network_chooser_parent_class)->dispose)
+    G_OBJECT_CLASS (empathy_irc_network_chooser_parent_class)->dispose (object);
+}
+
+static void
+empathy_irc_network_chooser_class_init (EmpathyIrcNetworkChooserClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->get_property = empathy_irc_network_chooser_get_property;
+  object_class->set_property = empathy_irc_network_chooser_set_property;
+  object_class->constructed = empathy_irc_network_chooser_constructed;
+  object_class->dispose = empathy_irc_network_chooser_dispose;
+
+  g_object_class_install_property (object_class, PROP_SETTINGS,
+    g_param_spec_object ("settings",
+      "Settings",
+      "The EmpathyAccountSettings to show and edit",
+      EMPATHY_TYPE_ACCOUNT_SETTINGS,
+      G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
+  g_type_class_add_private (object_class,
+      sizeof (EmpathyIrcNetworkChooserPriv));
+}
+
+static void
+empathy_irc_network_chooser_init (EmpathyIrcNetworkChooser *self)
+{
+  EmpathyIrcNetworkChooserPriv *priv;
+
+  priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+      EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooserPriv);
+  self->priv = priv;
+
+  priv->network_manager = empathy_irc_network_manager_dup_default ();
+}
+
+GtkWidget *
+empathy_irc_network_chooser_new (EmpathyAccountSettings *settings)
+{
+  return g_object_new (EMPATHY_TYPE_IRC_NETWORK_CHOOSER,
+      "settings", settings,
+      NULL);
+}
diff --git a/libempathy-gtk/empathy-irc-network-chooser.h b/libempathy-gtk/empathy-irc-network-chooser.h
new file mode 100644
index 0000000..442ac2d
--- /dev/null
+++ b/libempathy-gtk/empathy-irc-network-chooser.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2007-2008 Guillaume Desmottes
+ * Copyright (C) 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Authors: Guillaume Desmottes <gdesmott gnome org>
+ */
+
+#ifndef __EMPATHY_IRC_NETWORK_CHOOSER_H__
+#define __EMPATHY_IRC_NETWORK_CHOOSER_H__
+
+#include <gtk/gtk.h>
+
+#include <libempathy/empathy-account-settings.h>
+
+G_BEGIN_DECLS
+
+#define EMPATHY_TYPE_IRC_NETWORK_CHOOSER (empathy_irc_network_chooser_get_type ())
+#define EMPATHY_IRC_NETWORK_CHOOSER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \
+    EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooser))
+#define EMPATHY_IRC_NETWORK_CHOOSER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), \
+    EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooserClass))
+#define EMPATHY_IS_IRC_NETWORK_CHOOSER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
+    EMPATHY_TYPE_IRC_NETWORK_CHOOSER))
+#define EMPATHY_IS_IRC_NETWORK_CHOOSER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), \
+    EMPATHY_TYPE_IRC_NETWORK_CHOOSER))
+#define EMPATHY_IRC_NETWORK_CHOOSER_GET_CLASS(o) ( \
+    G_TYPE_INSTANCE_GET_CLASS ((o), EMPATHY_TYPE_IRC_NETWORK_CHOOSER, \
+        EmpathyIrcNetworkChooserClass))
+
+typedef struct {
+  GtkButton parent;
+
+  /*<private>*/
+  gpointer priv;
+} EmpathyIrcNetworkChooser;
+
+typedef struct {
+  GtkButtonClass parent_class;
+} EmpathyIrcNetworkChooserClass;
+
+GType empathy_irc_network_chooser_get_type (void) G_GNUC_CONST;
+
+GtkWidget * empathy_irc_network_chooser_new (EmpathyAccountSettings *settings);
+
+G_END_DECLS
+
+#endif /* __EMPATHY_IRC_NETWORK_CHOOSER_H__ */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]