From 8bc105bee6c641c03edf13bb0865d03f1716650b Mon Sep 17 00:00:00 2001 From: Samuel Ortiz Date: Tue, 26 Jun 2012 18:01:02 +0200 Subject: [PATCH] device: Specify service name when pushing NDEFs Depending on the NDEF type, the service name will be different. In particular, Handover NDEFs should be sent to the handover service, not the SNEP one. --- include/device.h | 5 +++++ plugins/handover.c | 2 +- plugins/npp.c | 2 +- plugins/p2p.c | 4 ++-- plugins/snep.c | 2 +- src/device.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++--- src/near.h | 3 ++- 7 files changed, 74 insertions(+), 9 deletions(-) diff --git a/include/device.h b/include/device.h index 5785572..15df8a9 100644 --- a/include/device.h +++ b/include/device.h @@ -37,12 +37,17 @@ struct near_ndef_message; #define NEAR_DEVICE_PRIORITY_DEFAULT 0 #define NEAR_DEVICE_PRIORITY_HIGH 100 +#define NEAR_DEVICE_SN_NPP "com.android.npp" +#define NEAR_DEVICE_SN_SNEP "urn:nfc:sn:snep" +#define NEAR_DEVICE_SN_HANDOVER "urn:nfc:sn:handover" + struct near_device_driver { int priority; int (*listen)(uint32_t adapter_idx, near_device_io_cb cb); int (*push)(uint32_t adapter_idx, uint32_t target_idx, struct near_ndef_message *ndef, + char *service_name, near_device_io_cb cb); }; diff --git a/plugins/handover.c b/plugins/handover.c index 9a5a6a9..f71b8ba 100644 --- a/plugins/handover.c +++ b/plugins/handover.c @@ -362,7 +362,7 @@ static near_bool_t handover_read(int client_fd, struct near_p2p_driver handover_driver = { .name = "Handover", - .service_name = "urn:nfc:sn:handover", + .service_name = NEAR_DEVICE_SN_HANDOVER, .read = handover_read, .close = handover_close, }; diff --git a/plugins/npp.c b/plugins/npp.c index 9d2958f..9f40291 100644 --- a/plugins/npp.c +++ b/plugins/npp.c @@ -143,7 +143,7 @@ static near_bool_t npp_read(int client_fd, struct near_p2p_driver npp_driver = { .name = "NPP", - .service_name = "com.android.npp", + .service_name = NEAR_DEVICE_SN_NPP, .read = npp_read, }; diff --git a/plugins/p2p.c b/plugins/p2p.c index 52004c3..4f77732 100644 --- a/plugins/p2p.c +++ b/plugins/p2p.c @@ -316,7 +316,7 @@ static int p2p_connect(uint32_t adapter_idx, uint32_t target_idx, } static int p2p_push(uint32_t adapter_idx, uint32_t target_idx, - struct near_ndef_message *ndef, + struct near_ndef_message *ndef, char *service_name, near_device_io_cb cb) { int fd; @@ -327,7 +327,7 @@ static int p2p_push(uint32_t adapter_idx, uint32_t target_idx, for (list = driver_list; list != NULL; list = list->next) { struct near_p2p_driver *driver = list->data; - if (strcmp(driver->name, "SNEP") != 0) + if (strcmp(driver->service_name, service_name) != 0) continue; fd = p2p_connect(adapter_idx, target_idx, ndef, cb, driver); diff --git a/plugins/snep.c b/plugins/snep.c index 1850155..ca9dba3 100644 --- a/plugins/snep.c +++ b/plugins/snep.c @@ -524,7 +524,7 @@ error: struct near_p2p_driver snep_driver = { .name = "SNEP", - .service_name = "urn:nfc:sn:snep", + .service_name = NEAR_DEVICE_SN_SNEP, .read = snep_read, .push = snep_push, .close = snep_close, diff --git a/src/device.c b/src/device.c index 949b4ac..644f8ec 100644 --- a/src/device.c +++ b/src/device.c @@ -196,11 +196,63 @@ static void push_cb(uint32_t adapter_idx, uint32_t target_idx, int status) device->push_msg = NULL; } +static char *sn_from_message(DBusMessage *msg) +{ + DBusMessageIter iter; + DBusMessageIter arr_iter; + + DBG(""); + + dbus_message_iter_init(msg, &iter); + dbus_message_iter_recurse(&iter, &arr_iter); + + while (dbus_message_iter_get_arg_type(&arr_iter) != + DBUS_TYPE_INVALID) { + const char *key, *value; + DBusMessageIter ent_iter; + DBusMessageIter var_iter; + + dbus_message_iter_recurse(&arr_iter, &ent_iter); + dbus_message_iter_get_basic(&ent_iter, &key); + + if (g_strcmp0(key, "Type") != 0) { + dbus_message_iter_next(&arr_iter); + continue; + } + + dbus_message_iter_next(&ent_iter); + dbus_message_iter_recurse(&ent_iter, &var_iter); + + switch (dbus_message_iter_get_arg_type(&var_iter)) { + case DBUS_TYPE_STRING: + dbus_message_iter_get_basic(&var_iter, &value); + + if (g_strcmp0(value, "Text") == 0) + return NEAR_DEVICE_SN_SNEP; + else if (g_strcmp0(value, "URI") == 0) + return NEAR_DEVICE_SN_SNEP; + else if (g_strcmp0(value, "SmartPoster") == 0) + return NEAR_DEVICE_SN_SNEP; + else if (g_strcmp0(value, "Handover") == 0) + return NEAR_DEVICE_SN_HANDOVER; + else + return NULL; + + break; + } + + dbus_message_iter_next(&arr_iter); + } + + return NULL; +} + static DBusMessage *push_ndef(DBusConnection *conn, DBusMessage *msg, void *data) { struct near_device *device = data; struct near_ndef_message *ndef; + char *service_name; int err; DBG("conn %p", conn); @@ -210,13 +262,19 @@ static DBusMessage *push_ndef(DBusConnection *conn, device->push_msg = dbus_message_ref(msg); + service_name = sn_from_message(msg); + if (service_name == NULL) { + err = -EINVAL; + goto error; + } + ndef = __ndef_build_from_message(msg); if (ndef == NULL) { err = -EINVAL; goto error; } - err = __near_device_push(device, ndef, push_cb); + err = __near_device_push(device, ndef, service_name, push_cb); if (err < 0) { g_free(ndef->data); g_free(ndef); @@ -367,7 +425,8 @@ int __near_device_listen(struct near_device *device, near_device_io_cb cb) } int __near_device_push(struct near_device *device, - struct near_ndef_message *ndef, near_device_io_cb cb) + struct near_ndef_message *ndef, char *service_name, + near_device_io_cb cb) { GSList *list; @@ -377,7 +436,7 @@ int __near_device_push(struct near_device *device, struct near_device_driver *driver = list->data; return driver->push(device->adapter_idx, device->target_idx, - ndef, cb); + ndef, service_name, cb); } return 0; diff --git a/src/near.h b/src/near.h index fa1af2c..c3b83fd 100644 --- a/src/near.h +++ b/src/near.h @@ -133,7 +133,8 @@ struct near_device *__near_device_add(uint32_t idx, uint32_t target_idx, void __near_device_remove(struct near_device *device); int __near_device_listen(struct near_device *device, near_device_io_cb cb); int __near_device_push(struct near_device *device, - struct near_ndef_message *ndef, near_device_io_cb cb); + struct near_ndef_message *ndef, char *service_name, + near_device_io_cb cb); #include -- 2.7.4