summaryrefslogtreecommitdiff
path: root/src/ndef.c
diff options
context:
space:
mode:
authorLouis Yung-Chieh Lo <yjlou@google.com>2013-07-02 10:16:47 -0700
committerSamuel Ortiz <sameo@linux.intel.com>2013-07-02 19:49:56 +0200
commitbb6f7b043a9cab1764832b299319386075601193 (patch)
treeb0876bd37190ca8b3d19904b30c10c7468f9e5c4 /src/ndef.c
parent45e83de0ac116b5b1c2e3c23a40c6cde3be1f844 (diff)
downloadneard-bb6f7b043a9cab1764832b299319386075601193.tar.gz
neard-bb6f7b043a9cab1764832b299319386075601193.tar.bz2
neard-bb6f7b043a9cab1764832b299319386075601193.zip
ndef: Add raw MIME payload support
Additional to wifi_wsc MIME type, raw parameter is provided for sending raw MIME payload as NDEF. See test/push-device for usage.
Diffstat (limited to 'src/ndef.c')
-rw-r--r--src/ndef.c78
1 files changed, 77 insertions, 1 deletions
diff --git a/src/ndef.c b/src/ndef.c
index 4d5d4c3..b8cbb33 100644
--- a/src/ndef.c
+++ b/src/ndef.c
@@ -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);