Made LmResolver an object for subclassing instead of an interface
authorMikael Hallendal <micke@imendio.com>
Sun, 13 Jul 2008 23:22:42 +0200
changeset 453 deebf7d6750b
parent 452 ad59c48027f2
child 454 18ffac09f030
Made LmResolver an object for subclassing instead of an interface
loudmouth/lm-resolver.c
loudmouth/lm-resolver.h
--- a/loudmouth/lm-resolver.c	Sun Jul 13 19:22:27 2008 +0200
+++ b/loudmouth/lm-resolver.c	Sun Jul 13 23:22:42 2008 +0200
@@ -23,75 +23,163 @@
 #include "lm-marshal.h"
 #include "lm-resolver.h"
 
-static void    resolver_base_init (LmResolverIface *iface);
+#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), LM_TYPE_RESOLVER, LmResolverPriv))
+
+typedef struct LmResolverPriv LmResolverPriv;
+struct LmResolverPriv {
+        LmResolverCallback  callback;
+        gpointer            user_data;
+
+        /* Properties */
+        gchar              *host;
+        gchar              *domain;
+        gchar              *srv;
+};
+
+static void     resolver_finalize            (GObject           *object);
+static void     resolver_get_property        (GObject           *object,
+					   guint              param_id,
+					   GValue            *value,
+					   GParamSpec        *pspec);
+static void     resolver_set_property        (GObject           *object,
+					   guint              param_id,
+					   const GValue      *value,
+					   GParamSpec        *pspec);
+
+G_DEFINE_TYPE (LmResolver, lm_resolver, G_TYPE_OBJECT)
 
 enum {
-        READABLE,
-        WRITABLE,
-        DISCONNECTED,
-        LAST_SIGNAL
+	PROP_0,
+        PROP_HOST,
+        PROP_DOMAIN,
+        PROP_SRV
+};
+
+enum {
+        SIGNAL_NAME,
+	LAST_SIGNAL
 };
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-GType
-lm_resolver_get_type (void)
+static void
+lm_resolver_class_init (LmResolverClass *class)
 {
-	static GType iface_type = 0;
+	GObjectClass *object_class = G_OBJECT_CLASS (class);
+
+	object_class->finalize     = resolver_finalize;
+	object_class->get_property = resolver_get_property;
+	object_class->set_property = resolver_set_property;
+
+        g_object_class_install_property (object_class,
+                                         PROP_HOST,
+					 g_param_spec_string ("host",
+							      "Host",
+							      "Host to lookup",
+                                                              NULL,
+                                                              G_PARAM_READWRITE));
+
+        g_object_class_install_property (object_class,
+                                         PROP_DOMAIN,
+					 g_param_spec_string ("domain",
+							      "Domain",
+							      "Domain to lookup",
+                                                              NULL,
+                                                              G_PARAM_READWRITE));
 
-	if (!iface_type) {
-		static const GTypeInfo iface_info = {
-			sizeof (LmResolverIface),
-			(GBaseInitFunc)     resolver_base_init,
-			(GBaseFinalizeFunc) NULL,
-		};
+        g_object_class_install_property (object_class,
+                                         PROP_SRV,
+					 g_param_spec_string ("srv",
+							      "Srv",
+							      "Service to lookup",
+                                                              NULL,
+                                                              G_PARAM_READWRITE));
 
-		iface_type = g_type_register_static (G_TYPE_INTERFACE,
-						     "LmResolverIface",
-						     &iface_info,
-						     0);
+	signals[SIGNAL_NAME] = 
+		g_signal_new ("signal-name",
+			      G_OBJECT_CLASS_TYPE (object_class),
+			      G_SIGNAL_RUN_LAST,
+			      0,
+			      NULL, NULL,
+			      lm_marshal_VOID__INT,
+			      G_TYPE_NONE, 
+			      1, G_TYPE_INT);
+	
+	g_type_class_add_private (object_class, sizeof (LmResolverPriv));
+}
 
-		g_type_interface_add_prerequisite (iface_type, G_TYPE_OBJECT);
-	}
+static void
+lm_resolver_init (LmResolver *resolver)
+{
+	LmResolverPriv *priv;
 
-	return iface_type;
+	priv = GET_PRIV (resolver);
+
 }
 
 static void
-resolver_base_init (LmResolverIface *iface)
+resolver_finalize (GObject *object)
 {
-	static gboolean initialized = FALSE;
+	LmResolverPriv *priv;
+
+	priv = GET_PRIV (object);
+
+	(G_OBJECT_CLASS (lm_resolver_parent_class)->finalize) (object);
+}
+
+static void
+resolver_get_property (GObject    *object,
+                       guint       param_id,
+                       GValue     *value,
+                       GParamSpec *pspec)
+{
+	LmResolverPriv *priv;
+
+	priv = GET_PRIV (object);
 
-	if (!initialized) {
-                signals[READABLE] =
-                        g_signal_new ("readable",
-                                      LM_TYPE_RESOLVER,
-                                      G_SIGNAL_RUN_LAST,
-                                      0,
-                                      NULL, NULL,
-                                      lm_marshal_VOID__VOID,
-                                      G_TYPE_NONE,
-                                      0);
-                signals[WRITABLE] = 
-                        g_signal_new ("writable",
-                                      LM_TYPE_RESOLVER,
-                                      G_SIGNAL_RUN_LAST,
-                                      0,
-                                      NULL, NULL,
-                                      lm_marshal_VOID__VOID,
-                                      G_TYPE_NONE,
-                                      0);
-                signals[DISCONNECTED] =
-                        g_signal_new ("disconnected",
-                                      LM_TYPE_RESOLVER,
-                                      G_SIGNAL_RUN_LAST,
-                                      0,
-                                      NULL, NULL,
-                                      lm_marshal_VOID__VOID,
-                                      G_TYPE_NONE,
-                                      0);
-		initialized = TRUE;
-	}
+	switch (param_id) {
+        case PROP_HOST:
+		g_value_set_string (value, priv->host);
+		break;
+	case PROP_DOMAIN:
+		g_value_set_string (value, priv->domain);
+		break;
+        case PROP_SRV:
+		g_value_set_string (value, priv->srv);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
+}
+
+static void
+resolver_set_property (GObject      *object,
+                       guint         param_id,
+                       const GValue *value,
+                       GParamSpec   *pspec)
+{
+	LmResolverPriv *priv;
+
+	priv = GET_PRIV (object);
+
+	switch (param_id) {
+        case PROP_HOST:
+                g_free (priv->host);
+		priv->host = g_value_dup_string (value);
+		break;
+	case PROP_DOMAIN:
+                g_free (priv->domain);
+		priv->domain = g_value_dup_string (value);
+		break;
+	case PROP_SRV:
+                g_free (priv->srv);
+                priv->srv = g_value_dup_string (value);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+		break;
+	};
 }
 
 LmResolver *
@@ -100,20 +188,43 @@
         return NULL;
 }
 
-void 
-lm_resolver_lookup_host (LmResolver  *resolver, const gchar *host)
+void
+lm_resolver_lookup_host (LmResolver *resolver, const gchar *host)
 {
+
+        g_object_set (resolver, "host", host, NULL);
+
+        if (!LM_RESOLVER_GET_CLASS(resolver)) {
+                g_assert_not_reached ();
+        }
+
+        LM_RESOLVER_GET_CLASS(resolver)->lookup_host (resolver, host);
 }
 
-void 
+void
 lm_resolver_lookup_srv (LmResolver  *resolver,
                         const gchar *domain,
                         const gchar *srv)
 {
+        g_object_set (resolver, 
+                      "domain", domain,
+                      "srv", srv,
+                      NULL);
+
+        if (!LM_RESOLVER_GET_CLASS(resolver)->lookup_srv) {
+                g_assert_not_reached ();
+        }
+
+        LM_RESOLVER_GET_CLASS(resolver)->lookup_srv (resolver, domain, srv);
 }
 
-void 
+void
 lm_resolver_cancel (LmResolver *resolver)
 {
+        if (!LM_RESOLVER_GET_CLASS(resolver)->cancel) {
+                g_assert_not_reached ();
+        }
+
+        LM_RESOLVER_GET_CLASS(resolver)->cancel (resolver);
 }
 
--- a/loudmouth/lm-resolver.h	Sun Jul 13 19:22:27 2008 +0200
+++ b/loudmouth/lm-resolver.h	Sun Jul 13 23:22:42 2008 +0200
@@ -25,32 +25,36 @@
 
 G_BEGIN_DECLS
 
-#define LM_TYPE_RESOLVER             (lm_resolver_get_type())
-#define LM_RESOLVER(o)               (G_TYPE_CHECK_INSTANCE_CAST((o), LM_TYPE_RESOLVER, LmResolver))
-#define LM_IS_RESOLVER(o)            (G_TYPE_CHECK_INSTANCE_TYPE((o), LM_TYPE_RESOLVER))
-#define LM_RESOLVER_GET_IFACE(o)     (G_TYPE_INSTANCE_GET_INTERFACE((o), LM_TYPE_RESOLVER, LmResolverIface))
-
-typedef struct _LmResolver      LmResolver;
-typedef struct _LmResolverIface LmResolverIface;
+#define LM_TYPE_RESOLVER            (lm_resolver_get_type ())
+#define LM_RESOLVER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), LM_TYPE_RESOLVER, LmResolver))
+#define LM_RESOLVER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), LM_TYPE_RESOLVER, LmResolverClass))
+#define LM_IS_RESOLVER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LM_TYPE_RESOLVER))
+#define LM_IS_RESOLVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), LM_TYPE_RESOLVER))
+#define LM_RESOLVER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), LM_TYPE_RESOLVER, LmResolverClass))
 
-struct _LmResolverIface {
-	GTypeInterface parent;
+typedef struct LmResolver      LmResolver;
+typedef struct LmResolverClass LmResolverClass;
 
-	/* <vtable> */
-        void     (*lookup_host)       (LmResolver  *resolver,
-                                       const gchar *host);
-        void     (*lookup_srv)        (LmResolver  *resolver,
-                                       const gchar *domain,
-                                       const gchar *srv);
-        void     (*cancel)            (LmResolver  *resolver);
+struct LmResolver {
+	GObject parent;
 };
 
-typedef void  (*LmResolverCallback)  (LmResolver  *resolver,
-                                      guint        status_code,
-                                      gpointer     user_data);
+struct LmResolverClass {
+	GObjectClass parent_class;
+	
+	/* <vtable> */
+        void (*lookup_host)  (LmResolver  *resolver,
+                              const gchar *host);
+        void (*lookup_srv)   (LmResolver  *resolver,
+                              const gchar *domain,
+                              const gchar *srv);
+        void (*cancel)       (LmResolver  *resolver);
+};
+
+typedef void (*LmResolverCallback) (LmResolver *resolver,
+                                    gpointer    user_data);
 
 GType          lm_resolver_get_type          (void);
-
 LmResolver *   lm_resolver_new               (LmResolverCallback  callback,
                                               gpointer            user_data);
 void           lm_resolver_lookup_host       (LmResolver         *resolver,
@@ -63,3 +67,4 @@
 G_END_DECLS
 
 #endif /* __LM_RESOLVER_H__ */
+