Added protocol for srv lookups
authorMikael Hallendal <micke@imendio.com>
Mon, 14 Jul 2008 01:10:57 +0200
changeset 461 f7c5f4b5dadd
parent 460 4d978afca525
child 462 11f85004aa32
Added protocol for srv lookups
loudmouth/lm-blocking-resolver.c
loudmouth/lm-resolver.c
loudmouth/lm-resolver.h
--- a/loudmouth/lm-blocking-resolver.c	Mon Jul 14 00:48:04 2008 +0200
+++ b/loudmouth/lm-blocking-resolver.c	Mon Jul 14 01:10:57 2008 +0200
@@ -72,14 +72,52 @@
 	(G_OBJECT_CLASS (lm_blocking_resolver_parent_class)->finalize) (object);
 }
 
+static void
+blocking_resolver_lookup_host (LmBlockingResolver *resolver)
+{
+}
+
+static void
+blocking_resolver_lookup_service (LmBlockingResolver *resolver)
+{
+        gchar *domain;
+        gchar *service;
+        gchar *protocol;
+        gchar *srv;
+
+        g_object_get (resolver,
+                      "domain", &domain,
+                      "service", &service,
+                      "protocol", &protocol,
+                      NULL);
+
+        srv = lm_resolver_create_srv_string (domain, service, protocol);
+
+        g_free (srv);
+        g_free (domain);
+        g_free (service);
+        g_free (protocol);
+}
+
 static gboolean
 blocking_resolver_idle_lookup (LmBlockingResolver *resolver) 
 {
         LmBlockingResolverPriv *priv = GET_PRIV (resolver);
+        gint                    type;
 
         /* Start the DNS querying */
 
+        /* Decide if we are going to lookup a srv or host */
+        g_object_get (resolver, "type", &type, NULL);
 
+        switch (type) {
+        case LM_RESOLVER_HOST:
+                blocking_resolver_lookup_host (resolver);
+                break;
+        case LM_RESOLVER_SRV:
+                blocking_resolver_lookup_service (resolver);
+                break;
+        };
 
         /* End of DNS querying */
         priv->idle_id = 0;
--- a/loudmouth/lm-resolver.c	Mon Jul 14 00:48:04 2008 +0200
+++ b/loudmouth/lm-resolver.c	Mon Jul 14 01:10:57 2008 +0200
@@ -30,22 +30,25 @@
         LmResolverCallback  callback;
         gpointer            user_data;
 
-        /* Properties */
+        /* -- Properties -- */
         LmResolverType      type;
         gchar              *host;
+
+        /* For SRV lookups */
         gchar              *domain;
-        gchar              *srv;
+        gchar              *service;
+        gchar              *protocol;
 };
 
 static void     resolver_finalize            (GObject           *object);
 static void     resolver_get_property        (GObject           *object,
-					   guint              param_id,
-					   GValue            *value,
-					   GParamSpec        *pspec);
+                                              guint              param_id,
+                                              GValue            *value,
+                                              GParamSpec        *pspec);
 static void     resolver_set_property        (GObject           *object,
-					   guint              param_id,
-					   const GValue      *value,
-					   GParamSpec        *pspec);
+                                              guint              param_id,
+                                              const GValue      *value,
+                                              GParamSpec        *pspec);
 
 G_DEFINE_TYPE (LmResolver, lm_resolver, G_TYPE_OBJECT)
 
@@ -54,16 +57,10 @@
         PROP_TYPE,
         PROP_HOST,
         PROP_DOMAIN,
-        PROP_SRV
+        PROP_SERVICE,
+        PROP_PROTOCOL
 };
 
-enum {
-        SIGNAL_NAME,
-	LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0 };
-
 static void
 lm_resolver_class_init (LmResolverClass *class)
 {
@@ -100,23 +97,21 @@
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
         g_object_class_install_property (object_class,
-                                         PROP_SRV,
-					 g_param_spec_string ("srv",
-							      "Srv",
+                                         PROP_SERVICE,
+					 g_param_spec_string ("service",
+							      "Service",
 							      "Service to lookup",
                                                               NULL,
                                                               G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
 
-	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_object_class_install_property (object_class,
+                                         PROP_PROTOCOL,
+                                         g_param_spec_string ("protocol",
+							      "Protocol",
+							      "Protocol for SRV lookup",
+                                                              NULL,
+                                                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+
 	g_type_class_add_private (object_class, sizeof (LmResolverPriv));
 }
 
@@ -135,6 +130,11 @@
 
 	priv = GET_PRIV (object);
 
+        g_free (priv->host);
+        g_free (priv->domain);
+        g_free (priv->service);
+        g_free (priv->protocol);
+
 	(G_OBJECT_CLASS (lm_resolver_parent_class)->finalize) (object);
 }
 
@@ -158,8 +158,11 @@
 	case PROP_DOMAIN:
 		g_value_set_string (value, priv->domain);
 		break;
-        case PROP_SRV:
-		g_value_set_string (value, priv->srv);
+        case PROP_SERVICE:
+		g_value_set_string (value, priv->service);
+		break;
+	case PROP_PROTOCOL:
+		g_value_set_string (value, priv->protocol);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -189,9 +192,13 @@
                 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);
+        case PROP_SERVICE:
+                g_free (priv->service);
+                priv->service = g_value_dup_string (value);
+		break;
+	case PROP_PROTOCOL:
+                g_free (priv->protocol);
+                priv->protocol = g_value_dup_string (value);
 		break;
 	default:
 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -204,6 +211,9 @@
                           LmResolverCallback  callback,
                           gpointer            user_data)
 {
+        g_return_val_if_fail (host != NULL, NULL);
+        g_return_val_if_fail (callback != NULL, NULL);
+
         return g_object_new (LM_TYPE_RESOLVER,
                              "type", LM_RESOLVER_HOST,
                              "host", host,
@@ -211,15 +221,22 @@
 }
 
 LmResolver *
-lm_resolver_new_for_srv (const gchar        *domain, 
-                         const gchar        *srv,
-                         LmResolverCallback  callback,
-                         gpointer            user_data)
+lm_resolver_new_for_service (const gchar        *domain, 
+                             const gchar        *service,
+                             const gchar        *protocol,
+                             LmResolverCallback  callback,
+                             gpointer            user_data)
 {
+        g_return_val_if_fail (domain != NULL, NULL);
+        g_return_val_if_fail (service != NULL, NULL);
+        g_return_val_if_fail (protocol != NULL, NULL);
+        g_return_val_if_fail (callback != NULL, NULL);
+
         return g_object_new (LM_TYPE_RESOLVER, 
                              "type", LM_RESOLVER_SRV,
                              "domain", domain,
-                             "srv", srv,
+                             "service", service,
+                             "protocol", protocol,
                              NULL);
 }
 
@@ -243,3 +260,15 @@
         LM_RESOLVER_GET_CLASS(resolver)->cancel (resolver);
 }
 
+gchar *
+lm_resolver_create_srv_string (const gchar *domain, 
+                               const gchar *service, 
+                               const gchar *protocol) 
+{
+        g_return_val_if_fail (domain != NULL, NULL);
+        g_return_val_if_fail (service != NULL, NULL);
+        g_return_val_if_fail (protocol != NULL, NULL);
+
+        return g_strdup_printf ("_%s._%s.%s", service, protocol, domain);
+}
+
--- a/loudmouth/lm-resolver.h	Mon Jul 14 00:48:04 2008 +0200
+++ b/loudmouth/lm-resolver.h	Mon Jul 14 01:10:57 2008 +0200
@@ -59,12 +59,16 @@
 LmResolver *   lm_resolver_new_for_host      (const gchar        *host,
                                               LmResolverCallback  callback,
                                               gpointer            user_data);
-LmResolver *   lm_resolver_new_for_srv       (const gchar        *domain,
-                                              const gchar        *srv,
+LmResolver *   lm_resolver_new_for_service   (const gchar        *domain,
+                                              const gchar        *service,
+                                              const gchar        *protocol,
                                               LmResolverCallback  callback,
                                               gpointer            user_data);
 void           lm_resolver_lookup            (LmResolver         *resolver);
 void           lm_resolver_cancel            (LmResolver         *resolver);
+gchar *        lm_resolver_create_srv_string (const gchar *domain, 
+                                              const gchar *service, 
+                                              const gchar *protocol);
 
 G_END_DECLS