>From bec1b83fad9eba5981055416cba1ffa09401eae0 Mon Sep 17 00:00:00 2001
From: Bastien Nocera <hadess@hadess.net>
Date: Mon, 9 Jun 2008 12:23:10 +0100
Subject: [PATCH] Export driver support to HAL

Add an exported (but not public) function to
list all the drivers, and create an fdi file for
HAL to tag fingerprint devices in its tree.
---
 libfprint/Makefile.am            |   12 ++++++++++
 libfprint/core.c                 |   18 ++++++++++++++
 libfprint/fp_internal.h          |    2 +
 libfprint/fprint-list-hal-info.c |   46 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 78 insertions(+), 0 deletions(-)
 create mode 100644 libfprint/fprint-list-hal-info.c

diff --git a/libfprint/Makefile.am b/libfprint/Makefile.am
index 8ed5732..ede9ac3 100644
--- a/libfprint/Makefile.am
+++ b/libfprint/Makefile.am
@@ -1,5 +1,7 @@
 lib_LTLIBRARIES = libfprint.la
 
+noinst_PROGRAMS = fprint-list-hal-info
+
 UPEKTS_SRC = drivers/upekts.c
 UPEKTC_SRC = drivers/upektc.c
 URU4000_SRC = drivers/uru4000.c
@@ -53,6 +55,16 @@ libfprint_la_CFLAGS = -fvisibility=hidden -I$(srcdir)/nbis/include $(LIBUSB_CFLA
 libfprint_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
 libfprint_la_LIBADD = -lm $(LIBUSB_LIBS) $(GLIB_LIBS) $(IMAGEMAGICK_LIBS) $(CRYPTO_LIBS)
 
+fprint_list_hal_info_SOURCES = fprint-list-hal-info.c
+fprint_list_hal_info_CFLAGS = -fvisibility=hidden -I$(srcdir)/nbis/include $(LIBUSB_CFLAGS) $(GLIB_CFLAGS) $(IMAGEMAGICK_CFLAGS) $(CRYPTO_CFLAGS) $(AM_CFLAGS)
+fprint_list_hal_info_LDADD = $(builddir)/libfprint.la
+
+hal_fdi_DATA = 10-fingerprint-reader-fprint.fdi
+hal_fdidir = $(datadir)/hal/fdi/information/20thirdparty/
+
+$(hal_fdi_DATA): fprint-list-hal-info
+	$(builddir)/fprint-list-hal-info > $@
+
 libfprint_la_SOURCES =	\
 	fp_internal.h	\
 	async.c		\
diff --git a/libfprint/core.c b/libfprint/core.c
index 2b57ca7..da484d7 100644
--- a/libfprint/core.c
+++ b/libfprint/core.c
@@ -353,6 +353,24 @@ static void register_drivers(void)
 	}
 }
 
+API_EXPORTED struct fp_driver **fprint_get_drivers (void)
+{
+	GPtrArray *array;
+	unsigned int i;
+
+	array = g_ptr_array_new ();
+	for (i = 0; i < G_N_ELEMENTS(primitive_drivers); i++)
+		g_ptr_array_add (array, primitive_drivers[i]);
+
+	for (i = 0; i < G_N_ELEMENTS(img_drivers); i++)
+		g_ptr_array_add (array, &(img_drivers[i]->driver));
+
+	/* Add a null item terminating the array */
+	g_ptr_array_add (array, NULL);
+
+	return (struct fp_driver **) g_ptr_array_free (array, FALSE);
+}
+
 static struct fp_driver *find_supporting_driver(libusb_device *udev,
 	const struct usb_id **usb_id)
 {
diff --git a/libfprint/fp_internal.h b/libfprint/fp_internal.h
index 7eb87f1..3aef690 100644
--- a/libfprint/fp_internal.h
+++ b/libfprint/fp_internal.h
@@ -91,6 +91,8 @@ enum fp_dev_state {
 	DEV_STATE_IDENTIFY_STOPPING,
 };
 
+struct fp_driver **fprint_get_drivers (void);
+
 struct fp_dev {
 	struct fp_driver *drv;
 	libusb_device_handle *udev;
diff --git a/libfprint/fprint-list-hal-info.c b/libfprint/fprint-list-hal-info.c
new file mode 100644
index 0000000..36d9628
--- /dev/null
+++ b/libfprint/fprint-list-hal-info.c
@@ -0,0 +1,46 @@
+
+#include "config.h"
+
+#include <stdio.h>
+#include "fp_internal.h"
+
+static void
+print_driver (struct fp_driver *driver)
+{
+	int i;
+
+	for (i = 0; driver->id_table[i].vendor != 0; i++) {
+		printf ("    <match key=\"usb.vendor_id\" int=\"%d\">\n", driver->id_table[i].vendor);
+		printf ("     <match key=\"usb.product_id\" int=\"%d\">\n", driver->id_table[i].product);
+		printf ("      <merge key=\"info.category\" type=\"string\">biometric.fingerprint-reader</merge>\n");
+		printf ("      <append key=\"info.capabilities\" type=\"strlist\">biometric</append>\n");
+		printf ("      <merge key=\"info.capabilities\" type=\"strlist\">fingerprint-reader</merge>\n");
+		printf ("      <merge key=\"fingerprint-reader.fprint.driver\" type=\"bool\">%s</merge>\n", driver->name);
+		printf ("      <merge key=\"fingerprint-reader.fprint.support\" type=\"bool\">true</merge>\n");
+		printf ("     </match>\n");
+		printf ("    </match>\n");
+		printf ("\n");
+	}
+}
+
+int main (int argc, char **argv)
+{
+	struct fp_driver **list;
+	guint i;
+
+	list = fprint_get_drivers ();
+
+	printf ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+	printf ("<!-- Created from libfprint %s -->\n", VERSION);
+	printf ("<deviceinfo version=\"0.2\">\n");
+
+	for (i = 0; list[i] != NULL; i++) {
+		print_driver (list[i]);
+	}
+
+	printf ("</deviceinfo>\n");
+
+	return 0;
+}
+
+
-- 
1.5.5.1

