[gnome-online-accounts] telepathy: add methods to instantiate the provider with the right values



commit 5dce10d05cf3f807086b84b1f3e84684cfdac6fd
Author: Marco Barisione <marco barisione collabora co uk>
Date:   Wed Jul 24 17:02:38 2013 +0100

    telepathy: add methods to instantiate the provider with the right values
    
    https://bugzilla.gnome.org/show_bug.cgi?id=696267

 src/goabackend/goatelepathyprovider.c |  148 ++++++++++++++++++++++++++++++++-
 src/goabackend/goatelepathyprovider.h |    4 +
 2 files changed, 151 insertions(+), 1 deletions(-)
---
diff --git a/src/goabackend/goatelepathyprovider.c b/src/goabackend/goatelepathyprovider.c
index e763b26..94c41f0 100644
--- a/src/goabackend/goatelepathyprovider.c
+++ b/src/goabackend/goatelepathyprovider.c
@@ -28,6 +28,23 @@
 #include "goaprovider-priv.h"
 #include "goatelepathyprovider.h"
 
+typedef struct _GoaTelepathyProviderPrivate GoaTelepathyProviderPrivate;
+
+struct _GoaTelepathyProviderPrivate
+{
+  TpawProtocol *protocol;
+  gchar *protocol_name;
+  gchar *provider_type;
+};
+
+enum {
+  PROP_0,
+  PROP_PROTOCOL,
+  PROP_PROTOCOL_NAME,
+  NUM_PROPERTIES
+};
+
+static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 
 /**
  * GoaTelepathyProvider:
@@ -39,6 +56,7 @@ struct _GoaTelepathyProvider
 {
   /*< private >*/
   GoaProvider parent_instance;
+  GoaTelepathyProviderPrivate *priv;
 };
 
 typedef struct _GoaTelepathyProviderClass GoaTelepathyProviderClass;
@@ -202,14 +220,111 @@ show_account (GoaProvider         *provider,
 
 /* ---------------------------------------------------------------------------------------------------- */
 
+GoaTelepathyProvider *
+goa_telepathy_provider_new_from_protocol_name (const gchar *protocol_name)
+{
+  g_return_val_if_fail (protocol_name != NULL, NULL);
+
+  return g_object_new (GOA_TYPE_TELEPATHY_PROVIDER,
+                       "protocol-name", protocol_name,
+                       NULL);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+GoaTelepathyProvider *
+goa_telepathy_provider_new_from_protocol (TpawProtocol *protocol)
+{
+  g_return_val_if_fail (TPAW_IS_PROTOCOL (protocol), NULL);
+
+  return g_object_new (GOA_TYPE_TELEPATHY_PROVIDER,
+                       "protocol", protocol,
+                       NULL);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static void
+goa_telepathy_provider_get_property (GObject *object,
+                                     guint property_id,
+                                     GValue *value,
+                                     GParamSpec *pspec)
+{
+    GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
+
+    switch (property_id) {
+    case PROP_PROTOCOL:
+        g_value_set_object (value, priv->protocol);
+        break;
+    case PROP_PROTOCOL_NAME:
+        g_value_set_string (value, priv->protocol_name);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+goa_telepathy_provider_set_property (GObject *object,
+                                     guint property_id,
+                                     const GValue *value,
+                                     GParamSpec *pspec)
+{
+    GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
+
+    switch (property_id) {
+    case PROP_PROTOCOL:
+        priv->protocol = g_value_dup_object (value);
+        break;
+    case PROP_PROTOCOL_NAME:
+        priv->protocol_name = g_value_dup_string (value);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
 static void
 goa_telepathy_provider_init (GoaTelepathyProvider *provider)
 {
+  provider->priv = G_TYPE_INSTANCE_GET_PRIVATE (provider,
+        GOA_TYPE_TELEPATHY_PROVIDER, GoaTelepathyProviderPrivate);
+}
+
+static void
+goa_telepathy_provider_constructed (GObject *object)
+{
+  GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
+
+  G_OBJECT_CLASS (goa_telepathy_provider_parent_class)->constructed (object);
+
+  if (priv->protocol != NULL)
+    {
+      if (priv->protocol_name != NULL)
+        g_error ("You cannot set \"protocol-name\" if you set \"protocol\"");
+      priv->protocol_name = g_strdup (tpaw_protocol_get_protocol_name (priv->protocol));
+    }
+  else
+    {
+      if (priv->protocol_name == NULL)
+        g_error ("You must set \"protocol-name\" or \"protocol\" on GoaTelepathyProvider");
+    }
+
+  priv->provider_type = g_strdup_printf ("%s/%s",
+      GOA_TELEPATHY_PROVIDER_BASE_TYPE, priv->protocol_name);
 }
 
 static void
 goa_telepathy_provider_finalize (GObject *object)
 {
+  GoaTelepathyProviderPrivate *priv = GOA_TELEPATHY_PROVIDER (object)->priv;
+
+  g_clear_object (&priv->protocol);
+  g_free (priv->protocol_name);
+  g_free (priv->provider_type);
+
   (G_OBJECT_CLASS (goa_telepathy_provider_parent_class)->finalize) (object);
 }
 
@@ -219,7 +334,10 @@ goa_telepathy_provider_class_init (GoaTelepathyProviderClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GoaProviderClass *provider_class = GOA_PROVIDER_CLASS (klass);
 
-  object_class->finalize = goa_telepathy_provider_finalize;
+  object_class->constructed  = goa_telepathy_provider_constructed;
+  object_class->finalize     = goa_telepathy_provider_finalize;
+  object_class->get_property = goa_telepathy_provider_get_property;
+  object_class->set_property = goa_telepathy_provider_set_property;
 
   provider_class->get_provider_type     = get_provider_type;
   provider_class->get_provider_name     = get_provider_name;
@@ -229,4 +347,32 @@ goa_telepathy_provider_class_init (GoaTelepathyProviderClass *klass)
   provider_class->refresh_account       = refresh_account;
   provider_class->build_object          = build_object;
   provider_class->show_account          = show_account;
+
+  g_type_class_add_private (object_class, sizeof (GoaTelepathyProviderPrivate));
+
+  /**
+   * GoaTelepathyProvider:protocol
+   *
+   * A #TpawProtocol associated to this provider (or NULL).
+   */
+  properties[PROP_PROTOCOL] =
+    g_param_spec_object ("protocol",
+        "Protocol",
+        "A #TpawProtocol associated to the provider (or NULL)",
+        TPAW_TYPE_PROTOCOL,
+        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  /**
+   * GoaTelepathyProvider:protocol-name
+   *
+   * The name of the protocol associated to the provider.
+   */
+  properties[PROP_PROTOCOL_NAME] =
+    g_param_spec_string ("protocol-name",
+        "Protocol name",
+        "The name of the protocol associated to the provider",
+        NULL,
+        G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
 }
diff --git a/src/goabackend/goatelepathyprovider.h b/src/goabackend/goatelepathyprovider.h
index 8c92bba..7187b4d 100644
--- a/src/goabackend/goatelepathyprovider.h
+++ b/src/goabackend/goatelepathyprovider.h
@@ -29,6 +29,7 @@
 #define __GOA_TELEPATHY_PROVIDER_H__
 
 #include <glib-object.h>
+#include <tp-account-widgets/tpaw-protocol.h>
 
 G_BEGIN_DECLS
 
@@ -43,6 +44,9 @@ typedef struct _GoaTelepathyProvider GoaTelepathyProvider;
 
 GType                    goa_telepathy_provider_get_type                (void) G_GNUC_CONST;
 
+GoaTelepathyProvider    *goa_telepathy_provider_new_from_protocol_name  (const gchar  *protocol_name);
+GoaTelepathyProvider    *goa_telepathy_provider_new_from_protocol       (TpawProtocol *protocol);
+
 G_END_DECLS
 
 #endif /* __GOA_TELEPATHY_PROVIDER_H__ */


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