libmapper: Add function to call GetSubTreePaths

Call the dbus method GetSubTreePaths to look for the
specified interface.

Change-Id: If266fc0db2c10582eeb9438e91f9556dcb525e39
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
diff --git a/libmapper/mapper.c b/libmapper/mapper.c
index 56fa5b8..8865bc7 100644
--- a/libmapper/mapper.c
+++ b/libmapper/mapper.c
@@ -75,7 +75,9 @@
 	sd_event *loop;
 	sd_bus *conn;
 	sd_bus_slot *slot;
+	sd_event_source *event_source;
 	int op;
+	int retry;
 };
 
 static int async_wait_match_introspection_complete(sd_bus_message *, void *,
@@ -88,6 +90,9 @@
 
 static int async_subtree_match_callback(sd_bus_message *, void *,
 		sd_bus_error *);
+static int async_subtree_getpaths(mapper_async_subtree *);
+static int async_subtree_getpaths_callback(sd_bus_message *,
+		void *, sd_bus_error *);
 
 static int sarraylen(char *array[])
 {
@@ -394,6 +399,40 @@
 	return r;
 }
 
+static int async_subtree_getpaths_callback(sd_bus_message *m,
+		void *userdata,
+		sd_bus_error *e)
+{
+	return 0;
+}
+
+static int async_subtree_getpaths(mapper_async_subtree *subtree)
+{
+	int r = 0;
+
+	subtree->retry = 0;
+	subtree->event_source = NULL;
+	r = sd_bus_call_method_async(
+			subtree->conn,
+			NULL,
+			MAPPER_BUSNAME,
+			MAPPER_PATH,
+			MAPPER_INTERFACE,
+			"GetSubTreePaths",
+			async_subtree_getpaths_callback,
+			subtree,
+			"sias",
+			subtree->namespace,
+			0, 1,
+			subtree->interface);
+	if (r < 0) {
+		fprintf(stderr, "Error invoking method: %s\n", strerror(-r));
+		return r;
+	}
+
+	return 0;
+}
+
 static int async_subtree_match_callback(sd_bus_message *m,
 		void *t,
 		sd_bus_error *e)
@@ -444,6 +483,13 @@
 		goto free_subtree;
 	}
 
+	r = async_subtree_getpaths(subtree);
+	if(r < 0) {
+		fprintf(stderr, "Error calling method: %s\n",
+				strerror(-r));
+		goto unref_slot;
+	}
+
 	*t = subtree;
 
 	return 0;