[PATCH 4/4] Call registered callbacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Chen Ganir <chen.ganir@xxxxxx>

On Property Changed, call the registered callbacks, with the event
data payload.
---
 src/device.c |   59 +++++++++++++++++++++++++++++++++++++++++++++++
 src/device.h |   72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 130 insertions(+), 1 deletions(-)

diff --git a/src/device.c b/src/device.c
index dbabd87..4e7685e 100644
--- a/src/device.c
+++ b/src/device.c
@@ -128,6 +128,13 @@ struct att_callbacks {
 struct prop_changed_cb {
 	guint id;
 	dev_property_changed_cb cb;
+	struct btd_device *device;
+};
+
+struct prop_changed_cb_data {
+	uint16_t property;
+	uint16_t len;
+	void *data;
 };
 
 struct btd_device {
@@ -205,6 +212,13 @@ const char *property_name[] = { "Address",
 								"Adapter",
 								"LegacyPairing"};
 
+static void property_changed_update_cb(struct prop_changed_cb *cb,
+						struct prop_changed_cb_data *data)
+{
+	if (cb->cb != NULL)
+		(cb->cb)(data->property, data->data, data->len,cb->device);
+}
+
 static void notify_property_changed(struct btd_device *device,
 					DBusConnection *conn,
 					const char *path,
@@ -213,12 +227,56 @@ static void notify_property_changed(struct btd_device *device,
 {
 	const char *interface = DEVICE_INTERFACE;
 	const char *name = "";
+	struct prop_changed_cb_data *cb_data = NULL;
 
 	if (property > 0 && property <= DEVICE_PROPERTY_CHANGED_LEGACYPAIRING)
 		name = property_name[property-1];
 	else
 		name = "UNKNOWN";
 
+	cb_data = g_new0(struct prop_changed_cb_data, 1);
+
+	if (cb_data != NULL) {
+		cb_data->property = property;
+
+		switch (property) {
+		case DEVICE_PROPERTY_CHANGED_CONNECTED:
+		{
+			struct property_changed_connected *p = g_new0(struct property_changed_connected,1);
+			p->connected = *(gboolean*)value;
+			cb_data->data = p;
+			cb_data->len = sizeof(struct property_changed_connected);
+			break;
+		}
+		case DEVICE_PROPERTY_CHANGED_ADDRESS:
+		case DEVICE_PROPERTY_CHANGED_NAME:
+		case DEVICE_PROPERTY_CHANGED_VENDOR:
+		case DEVICE_PROPERTY_CHANGED_PRODUCT:
+		case DEVICE_PROPERTY_CHANGED_VERSION:
+		case DEVICE_PROPERTY_CHANGED_ICON:
+		case DEVICE_PROPERTY_CHANGED_CLASS:
+		case DEVICE_PROPERTY_CHANGED_UUIDS:
+		case DEVICE_PROPERTY_CHANGED_SERVICES:
+		case DEVICE_PROPERTY_CHANGED_PAIRED:
+		case DEVICE_PROPERTY_CHANGED_TRUSTED:
+		case DEVICE_PROPERTY_CHANGED_BLOCKED:
+		case DEVICE_PROPERTY_CHANGED_ALIAS:
+		case DEVICE_PROPERTY_CHANGED_NODES:
+		case DEVICE_PROPERTY_CHANGED_ADAPTER:
+		case DEVICE_PROPERTY_CHANGED_LEGACYPAIRING:
+		default:
+			break;
+		}
+
+		if (cb_data != NULL && cb_data->len > 0 && cb_data->data != NULL) {
+			g_slist_foreach(device->cb_list, (GFunc) property_changed_update_cb, cb_data);
+		}
+
+		g_free(cb_data->data);
+		g_free(cb_data);
+	}
+
+
 	if (num == 0)
 		emit_property_changed(conn, path,
 					interface, name,
@@ -3067,6 +3125,7 @@ guint btd_device_add_prop_changed_cb(struct btd_device *device, dev_property_cha
 	cb = g_new0(struct prop_changed_cb, 1);
 	cb->id = ++cb_id;
 	cb->cb = cbfunc;
+	cb->device = device;
 
 	device->cb_list = g_slist_append(device->cb_list, cb);
 
diff --git a/src/device.h b/src/device.h
index ce0a83a..3c54255 100644
--- a/src/device.h
+++ b/src/device.h
@@ -26,25 +26,95 @@
 
 struct btd_device;
 
-typedef void (*dev_property_changed_cb)(uint16_t property, uint8_t *value, uint16_t len);
+typedef void (*dev_property_changed_cb)(uint16_t property, uint8_t *value, uint16_t len,struct btd_device *device);
 
 #define DEVICE_PROPERTY_CHANGED_ADDRESS			0x01
+struct property_changed_address {
+	char *address;
+};
+
 #define DEVICE_PROPERTY_CHANGED_NAME			0x02
+struct property_changed_name {
+	char *name;
+};
+
 #define DEVICE_PROPERTY_CHANGED_VENDOR			0x03
+struct propery_changed_vendor {
+	uint16_t vendor;
+};
+
 #define DEVICE_PROPERTY_CHANGED_PRODUCT			0x04
+struct propery_changed_product {
+	uint16_t product;
+};
+
 #define DEVICE_PROPERTY_CHANGED_VERSION			0x05
+struct propery_changed_version {
+	uint16_t version;
+};
+
 #define DEVICE_PROPERTY_CHANGED_ICON			0x06
+struct property_changed_icon {
+	char *icon;
+};
+
 #define DEVICE_PROPERTY_CHANGED_CLASS			0x07
+struct propery_changed_class {
+	uint32_t class;
+};
+
 #define DEVICE_PROPERTY_CHANGED_UUIDS			0x08
+struct propery_changed_uuid {
+	uint16_t count;
+	char *uuid[];
+};
+
 #define DEVICE_PROPERTY_CHANGED_SERVICES		0x09
+struct propery_changed_services {
+	uint16_t count;
+	char *services[];
+};
+
 #define DEVICE_PROPERTY_CHANGED_PAIRED			0x0A
+struct propery_changed_paired {
+	gboolean paired;
+};
+
 #define DEVICE_PROPERTY_CHANGED_CONNECTED       0x0B
+struct property_changed_connected {
+	gboolean connected;
+};
+
 #define DEVICE_PROPERTY_CHANGED_TRUSTED			0x0C
+struct propery_changed_trusted {
+	gboolean trusted;
+};
+
 #define DEVICE_PROPERTY_CHANGED_BLOCKED			0x0D
+struct propery_changed_blocked {
+	gboolean blocked;
+};
+
 #define DEVICE_PROPERTY_CHANGED_ALIAS			0x0E
+struct property_changed_alias {
+	char *alias;
+};
+
 #define DEVICE_PROPERTY_CHANGED_NODES			0x0F
+struct propery_changed_nodes {
+	uint16_t count;
+	char *nodes[];
+};
+
 #define DEVICE_PROPERTY_CHANGED_ADAPTER			0x10
+struct propery_changed_adapter {
+	char adapter;
+};
+
 #define DEVICE_PROPERTY_CHANGED_LEGACYPAIRING	0x11
+struct propery_changed_legacy_pairing {
+	gboolean legacy_pairing;
+};
 
 typedef enum {
 	AUTH_TYPE_PINCODE,
-- 
1.7.4.1

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux