tlv: Simplify tlv parsing API
authorSamuel Ortiz <sameo@linux.intel.com>
Mon, 6 Feb 2012 15:06:16 +0000 (16:06 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Mon, 6 Feb 2012 15:06:16 +0000 (16:06 +0100)
The parsing API should read the tag's data.

include/tlv.h
plugins/nfctype1.c
plugins/nfctype2.c
plugins/npp.c
plugins/snep.c
src/tlv.c

index 69eb28f..6cac79d 100644 (file)
@@ -32,6 +32,6 @@
 uint16_t near_tlv_length(uint8_t *tlv);
 uint8_t *near_tlv_next(uint8_t *tlv);
 uint8_t *near_tlv_data(uint8_t *tlv);
-int near_tlv_parse(struct near_tag *tag, near_tag_io_cb cb, uint8_t *data, uint16_t length);
+int near_tlv_parse(struct near_tag *tag, near_tag_io_cb cb);
 
 #endif
index b9c8124..bf2e56a 100644 (file)
@@ -150,11 +150,9 @@ static int segment_read_recv(uint8_t *resp, int length, void *data)
                if (err < 0)
                        goto out_err;
        } else { /* This is the end */
-               DBG("READ Static complete");
-               err = near_tlv_parse(t1_tag->tag,
-                                       t1_tag->cb,
-                                       tagdata,
-                                       t1_tag->data_read);
+               DBG("READ complete");
+
+               err = near_tlv_parse(t1_tag->tag, t1_tag->cb);
 
                /* free memory */
                g_free(t1_tag);
@@ -268,10 +266,17 @@ static int meta_recv(uint8_t *resp, int length, void *data)
 
        /* Check Static or Dynamic memory model */
        if (resp[OFFSET_HEADER_ROM] == HR0_TYPE1_STATIC) {
+               uint8_t *tagdata;
+               size_t data_length;
+
                DBG("READ Static complete");
+
+               tagdata = near_tag_get_data(t1_tag->tag, &data_length);
+               memcpy(tagdata, cc + LEN_CC_BYTES, TAG_T1_DATA_LENGTH(cc));
+
                near_tag_set_memory_layout(tag, NEAR_TAG_MEMORY_STATIC);
-               err = near_tlv_parse(t1_tag->tag, t1_tag->cb,
-                       cc + LEN_CC_BYTES, TAG_T1_DATA_LENGTH(cc));
+
+               err = near_tlv_parse(t1_tag->tag, t1_tag->cb);
                if (err < 0)
                        goto out_err;
 
index df209f3..1c0ca82 100644 (file)
@@ -127,7 +127,7 @@ static int data_recv(uint8_t *resp, int length, void *data)
 
                DBG("Done reading");
 
-               near_tlv_parse(tag->tag, tag->cb, nfc_data, data_length);
+               near_tlv_parse(tag->tag, tag->cb);
 
                g_free(tag);
 
index 4178ac4..eea4ece 100644 (file)
@@ -132,7 +132,7 @@ static int npp_read(int client_fd, uint32_t adapter_idx, uint32_t target_idx,
        nfc_data = near_tag_get_data(tag, &tag_length);
        memcpy(nfc_data, ndefs, total_ndef_length);
 
-       near_tlv_parse(tag, cb, nfc_data, total_ndef_length);
+       near_tlv_parse(tag, cb);
 
        g_free(ndefs);
 
index e4d0570..6e3e782 100644 (file)
@@ -144,7 +144,7 @@ static void snep_read_ndef(int client_fd,
                nfc_data = near_tag_get_data(tag, &tag_length);
                memcpy(nfc_data, snep_data.nfc_data, tag_length);
 
-               near_tlv_parse(tag, cb, nfc_data, tag_length);
+               near_tlv_parse(tag, cb);
                g_free(snep_data.nfc_data);
        } else {
                snep_response_noinfo(client_fd, SNEP_RESP_CONTINUE);
index b43b398..9538591 100644 (file)
--- a/src/tlv.c
+++ b/src/tlv.c
@@ -73,15 +73,18 @@ uint8_t *near_tlv_data(uint8_t *tlv)
        return tlv + 1 + l_length;
 }
 
-int near_tlv_parse(struct near_tag *tag, near_tag_io_cb cb,
-                       uint8_t *data, uint16_t length)
+int near_tlv_parse(struct near_tag *tag, near_tag_io_cb cb)
 {
-       uint8_t *tlv = data, t;
+       uint8_t *tlv, *data, t;
+       size_t tlv_length;
        uint32_t adapter_idx = near_tag_get_adapter_idx(tag);
        uint32_t target_idx = near_tag_get_target_idx(tag);
 
        DBG("");
 
+       tlv = near_tag_get_data(tag, &tlv_length);
+       data = tlv;
+
        while(1) {
                t = tlv[0];
 
@@ -104,7 +107,7 @@ int near_tlv_parse(struct near_tag *tag, near_tag_io_cb cb,
 
                tlv = near_tlv_next(tlv);
 
-               if (tlv - data >= length)
+               if (tlv - data >= (uint16_t) tlv_length)
                        break;
        }