device: Specify service name when pushing NDEFs
authorSamuel Ortiz <sameo@linux.intel.com>
Tue, 26 Jun 2012 16:01:02 +0000 (18:01 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 26 Jun 2012 16:01:02 +0000 (18:01 +0200)
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
plugins/handover.c
plugins/npp.c
plugins/p2p.c
plugins/snep.c
src/device.c
src/near.h

index 5785572..15df8a9 100644 (file)
@@ -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);
 };
 
index 9a5a6a9..f71b8ba 100644 (file)
@@ -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,
 };
index 9d2958f..9f40291 100644 (file)
@@ -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,
 };
 
index 52004c3..4f77732 100644 (file)
@@ -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);
index 1850155..ca9dba3 100644 (file)
@@ -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,
index 949b4ac..644f8ec 100644 (file)
@@ -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;
index fa1af2c..c3b83fd 100644 (file)
@@ -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 <near/tlv.h>