+ uint8_t utf, language_length;
+ char *encoding, *language, *value;
+
+ DBG("");
+
+ utf = (record->payload[0] & 0x80) >> 7;
+ if (utf == 0)
+ encoding = "UTF-8";
+ else
+ encoding = "UTF-16";
+
+ DBG("encoding %s", encoding);
+
+ language_length = record->payload[0] & 0x1f;
+ language = g_strndup((char *)&record->payload[1], language_length);
+
+ DBG("language %s", language);
+
+ value = g_strndup((char *)&record->payload[1 + language_length],
+ record->payload_length - 1 -language_length);
+
+ DBG("value %s", value);
+
+ near_dbus_dict_append_basic(dict, "Encoding",
+ DBUS_TYPE_STRING, &encoding);
+
+ near_dbus_dict_append_basic(dict, "Language",
+ DBUS_TYPE_STRING, &language);
+
+ near_dbus_dict_append_basic(dict, "Representation",
+ DBUS_TYPE_STRING, &value);
+
+ g_free(language);
+ g_free(value);
+}
+
+static void append_rtd_uri(struct near_ndef_record *record,
+ DBusMessageIter *dict)
+{
+ char *prefix, *value, *uri;
+
+ switch (record->payload[0]) {
+ case 0x0:
+ prefix = NULL;
+ break;
+ case 0x1:
+ prefix = "http://www.";
+ break;
+ case 0x2:
+ prefix = "https://www.";
+ break;
+ case 0x3:
+ prefix = "http://";
+ break;
+ case 0x4:
+ prefix = "https://";
+ break;
+ case 0x5:
+ prefix = "tel:";
+ break;
+ case 0x6:
+ prefix = "mailto:";
+ break;
+ case 0x7:
+ prefix = "ftp://anonymous:anonymous@";
+ break;
+ case 0x8:
+ prefix = "ftp://ftp.";
+ break;
+ case 0x9:
+ prefix = "ftps://";
+ break;
+ }
+
+ uri = g_strndup((char *)&record->payload[1],
+ record->payload_length - 1);
+ value = g_strdup_printf("%s%s", prefix, uri);
+
+ DBG("value %s", value);
+
+ near_dbus_dict_append_basic(dict, "Representation",
+ DBUS_TYPE_STRING, &value);
+
+ g_free(uri);
+ g_free(value);
+}
+
+static void append_rtd(struct near_ndef_record *record, DBusMessageIter *dict)
+{
+ char *type = (char *) record->type;
+ char *dbus_type = NULL;
+
+ DBG("");
+
+ if (record->type_length == 1) {
+ switch (record->type[0]) {
+ case RECORD_TNF_WKT_TEXT:
+ dbus_type = "Text";
+ append_rtd_text(record, dict);
+ break;
+ case RECORD_TNF_WKT_URI:
+ dbus_type = "URI";
+ append_rtd_uri(record, dict);
+ break;
+ case RECORD_TNF_WKT_SIZE:
+ dbus_type = "Size";
+ break;
+ case RECORD_TNF_WKT_TYPE:
+ dbus_type = "MIME Type";
+ break;
+ }
+ } else if (record->type_length == 2) {
+ if (strncmp(type, RECORD_TNF_WKT_SMART_POSTER, 2))
+ dbus_type = "Smart Poster";
+ if (strncmp(type, RECORD_TNF_WKT_HANDOVER_REQUEST, 2))
+ dbus_type = "Hand Over Request";
+ if (strncmp(type, RECORD_TNF_WKT_HANDOVER_SELECT, 2))
+ dbus_type = "Hand Over Select";
+ if (strncmp(type, RECORD_TNF_WKT_HANDOVER_CARRIER, 2))
+ dbus_type = "Hand Over Carrier";
+ } else if (record->type_length == 3)
+ if (strncmp(type, RECORD_TNF_WKT_REC_ACTION, 3))
+ dbus_type = "Recommended Action";
+
+ if (dbus_type != NULL)
+ near_dbus_dict_append_basic(dict, "Type",
+ DBUS_TYPE_STRING, &dbus_type);
+
+}
+
+static void append_record(struct near_ndef_record *record,
+ DBusMessageIter *dict)
+{
+ char *type = NULL;
+ gboolean representable = FALSE;
+
+ if (record->tnf == RECORD_TNF_WELLKNOWN)
+ return append_rtd(record, dict);
+
+ switch (record->tnf) {
+ case RECORD_TNF_EMPTY:
+ type = "Empty";
+
+ case RECORD_TNF_MIME:
+ type = "MIME";
+ representable = TRUE;
+
+ case RECORD_TNF_URI:
+ type = "URI";
+ representable = TRUE;
+ case RECORD_TNF_EXTERNAL:
+ type = "NFC Forum External";
+ case RECORD_TNF_UNKNOWN:
+ type = "Unknown";
+ case RECORD_TNF_UNCHANGED:
+ type = "Unchanged";
+
+ }
+
+ near_dbus_dict_append_basic(dict, "Type",
+ DBUS_TYPE_STRING, &type);
+
+ if (representable == TRUE) {
+ char *value;
+
+ value = g_strndup((char *)record->payload,
+ record->payload_length);
+
+ near_dbus_dict_append_basic(dict, "Representation",
+ DBUS_TYPE_STRING, &value);