ndef: Add raw MIME payload support
authorLouis Yung-Chieh Lo <yjlou@google.com>
Tue, 2 Jul 2013 17:16:47 +0000 (10:16 -0700)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 2 Jul 2013 17:49:56 +0000 (19:49 +0200)
Additional to wifi_wsc MIME type, raw parameter is provided for
sending raw MIME payload as NDEF.
See test/push-device for usage.

src/ndef.c
test/push-device

index 4d5d4c3..b8cbb33 100644 (file)
@@ -3355,6 +3355,66 @@ struct near_ndef_message *near_ndef_prepare_wsc_record(char *ssid,
        return mime;
 }
 
+static char *get_mime_payload_data(DBusMessageIter iter,
+                               char **payload, int *payload_len)
+{
+       DBG("");
+
+       if (payload == NULL || payload_len == NULL) {
+               near_error("Payload %p payload_len %p", payload, payload_len);
+               return NULL;
+       }
+
+       while (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_INVALID) {
+               const char *key;
+               DBusMessageIter ent_iter;
+               DBusMessageIter var_iter;
+               DBusMessageIter arr_iter;
+
+               dbus_message_iter_recurse(&iter, &ent_iter);
+               dbus_message_iter_get_basic(&ent_iter, &key);
+               dbus_message_iter_next(&ent_iter);
+               dbus_message_iter_recurse(&ent_iter, &var_iter);
+
+               if (g_strcmp0(key, "Payload") == 0) {
+                       if (dbus_message_iter_get_arg_type(&var_iter) ==
+                                                       DBUS_TYPE_ARRAY &&
+                           dbus_message_iter_get_element_type(&var_iter) ==
+                                                       DBUS_TYPE_BYTE) {
+                                       dbus_message_iter_recurse(&var_iter,
+                                                                &arr_iter);
+                                       dbus_message_iter_get_fixed_array(
+                                                       &arr_iter, payload,
+                                                       payload_len);
+                       } else {
+                               near_error("Unexpected payload type");
+                               return NULL;
+                       }
+               }
+               dbus_message_iter_next(&iter);
+       }
+
+       return *payload;
+}
+
+static struct near_ndef_message *near_ndef_prepare_mime_payload_record(
+                               char *type, char *payload, int payload_len)
+{
+       struct near_ndef_message *mime;
+
+       DBG("Payload %*s", payload_len, payload);
+       mime = ndef_message_alloc_complete(type, payload_len, NULL, 0,
+                                               RECORD_TNF_MIME, TRUE, TRUE);
+       if (mime == NULL) {
+               near_error("Failed to alloc NDEF message");
+               return NULL;
+       }
+
+       memcpy(mime->data + mime->offset, payload, payload_len);
+
+       return mime;
+}
+
 static struct near_ndef_message *build_mime_record(DBusMessage *msg)
 {
        DBusMessageIter iter, arr_iter;
@@ -3411,8 +3471,24 @@ static struct near_ndef_message *build_mime_record(DBusMessage *msg)
                                g_free(carrier);
 
                                return mime;
-                       }
+                       } else {
+                               /*
+                                * Expect data is set in the Payload field of
+                                * message.
+                                */
+                               DBusMessageIter payload_iter;
+                               char *payload;
+                               int payload_len;
+
+                               DBG("mime string %s", mime_str);
+                               dbus_message_iter_recurse(&iter, &payload_iter);
+                               if (get_mime_payload_data(payload_iter,
+                                               &payload, &payload_len) == NULL)
+                                       return NULL;
 
+                               return near_ndef_prepare_mime_payload_record(
+                                       mime_str, payload, payload_len);
+                       }
                }
 
                dbus_message_iter_next(&arr_iter);
index b0b0c55..1354e6c 100755 (executable)
@@ -10,13 +10,15 @@ def help_text():
        print "         If type is SmartPoster, parameters are <uri>"
        print "         If type is Handover, parameters are <carrier>"
        print "         If type is StaticHandover, parameters are <carrier>"
-       print "         If type is MIME, parameters are <mime_type> (only wifi_wsc)"
+       print "         If type is MIME, parameters are <mime_type> (only wifi_wsc and raw)"
+       print "                    raw is for sending raw payload, parameters are <mime_type> <payload>"
        print "e.g. < %s /org/neard/nfc0/device0 Text UTF-8 en-US hello,Type2! >" % (sys.argv[0])
        print "e.g. < %s /org/neard/nfc0/device0 URI http://www.nfc-forum.com >" % (sys.argv[0])
        print "e.g. < %s /org/neard/nfc0/device0 SmartPoster http://www.nfc-forum.com >" % (sys.argv[0])
        print "e.g. < %s /org/neard/nfc0/device0 Handover bluetooth,wifi >" % (sys.argv[0])
        print "e.g. < %s /org/neard/nfc0/device0 StaticHandover bluetooth,wifi >" % (sys.argv[0])
        print "e.g. < %s /org/neard/nfc0/device0 MIME wifi_wsc>" % (sys.argv[0])
+       print "e.g. < %s /org/neard/nfc0/device0 MIME raw application/xml '<your><xml tags></your>' >" % (sys.argv[0])
        sys.exit(1)
 
 if len(sys.argv) < 2:
@@ -33,6 +35,13 @@ if len(sys.argv) == 6:
                                "Encoding" : sys.argv[3],
                                "Language" : sys.argv[4],
                                "Representation" : sys.argv[5] }))
+       elif sys.argv[2] in ["MIME"]:
+               if sys.argv[3] in ["raw"]:
+                       device.Push(({ "Type" : "MIME",
+                                      "MIME" : sys.argv[4],
+                                      "Payload" : dbus.ByteArray(sys.argv[5]) }))
+               else:
+                       help_text()
        else:
                help_text()