--- 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__ */
+