AppNearMe µNFC stack for the NXP PN532 chip License: You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Dependents:   IOT_sensor_nfc AppNearMe_MuNFC_PN532_Test p2p_nfc_test NFCMoodLamp ... more

License

You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Committer:
AppNearMe
Date:
Thu Jul 26 09:13:04 2012 +0000
Revision:
1:1074716d0111
Parent:
0:480387549d89
Child:
3:0b949b2d3b55
Fixed null-terminating char issue in TLVList::getString()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AppNearMe 0:480387549d89 1 /*
AppNearMe 0:480387549d89 2 TLVList.cpp
AppNearMe 0:480387549d89 3 Copyright (c) Donatien Garnier 2012
AppNearMe 0:480387549d89 4 donatien.garnier@appnearme.com
AppNearMe 0:480387549d89 5 http://www.appnearme.com/
AppNearMe 0:480387549d89 6 */
AppNearMe 0:480387549d89 7
AppNearMe 0:480387549d89 8 #include "TLVList.h"
AppNearMe 0:480387549d89 9
AppNearMe 0:480387549d89 10 #include "munfc/core/fwk.h"
AppNearMe 0:480387549d89 11 #include "munfc/ndef/appnearme_ndef_tlv.h"
AppNearMe 0:480387549d89 12
AppNearMe 0:480387549d89 13 #include <cstring> //For memcpy, strlen
AppNearMe 0:480387549d89 14 using std::memcpy;
AppNearMe 0:480387549d89 15 using std::strlen;
AppNearMe 0:480387549d89 16
AppNearMe 0:480387549d89 17 TLVList::TLVList() : m_tlvList(NULL)
AppNearMe 0:480387549d89 18 {
AppNearMe 0:480387549d89 19
AppNearMe 0:480387549d89 20 }
AppNearMe 0:480387549d89 21
AppNearMe 0:480387549d89 22 void TLVList::wrap(tlv_list* payload)
AppNearMe 0:480387549d89 23 {
AppNearMe 0:480387549d89 24 m_tlvList = payload;
AppNearMe 0:480387549d89 25 m_space = true;
AppNearMe 0:480387549d89 26 m_type = NONE;
AppNearMe 0:480387549d89 27 }
AppNearMe 0:480387549d89 28
AppNearMe 0:480387549d89 29
AppNearMe 0:480387549d89 30
AppNearMe 0:480387549d89 31 /* Getters */
AppNearMe 0:480387549d89 32
AppNearMe 0:480387549d89 33 /** Iterate to next item
AppNearMe 0:480387549d89 34 * @return type if next item exists, NONE otherwise
AppNearMe 0:480387549d89 35 */
AppNearMe 0:480387549d89 36 TLVList::TLVType TLVList::getNext()
AppNearMe 0:480387549d89 37 {
AppNearMe 0:480387549d89 38 if(!m_tlvList)
AppNearMe 0:480387549d89 39 {
AppNearMe 0:480387549d89 40 return NONE;
AppNearMe 0:480387549d89 41 }
AppNearMe 0:480387549d89 42
AppNearMe 0:480387549d89 43 m_type = (TLVList::TLVType) appnearme_ndef_tlv_next_type(m_tlvList); //Explicit cast, this is the same enum
AppNearMe 0:480387549d89 44 switch(m_type)
AppNearMe 0:480387549d89 45 {
AppNearMe 0:480387549d89 46 case UINT8:
AppNearMe 0:480387549d89 47 m_arrayLen = 0;
AppNearMe 0:480387549d89 48 m_uint8 = appnearme_ndef_tlv_get_uint8(m_tlvList);
AppNearMe 0:480387549d89 49 break;
AppNearMe 0:480387549d89 50 case UINT32:
AppNearMe 0:480387549d89 51 m_arrayLen = 0;
AppNearMe 0:480387549d89 52 m_uint32 = appnearme_ndef_tlv_get_uint32(m_tlvList);
AppNearMe 0:480387549d89 53 break;
AppNearMe 0:480387549d89 54 case UINT8_ARRAY:
AppNearMe 0:480387549d89 55 //In this order, otherwise would break state-machine
AppNearMe 0:480387549d89 56 m_arrayLen = appnearme_ndef_tlv_get_array_length(m_tlvList);
AppNearMe 0:480387549d89 57 m_array = appnearme_ndef_tlv_get_array(m_tlvList);
AppNearMe 0:480387549d89 58 break;
AppNearMe 0:480387549d89 59 case STRING:
AppNearMe 0:480387549d89 60 //In this order, otherwise would break state-machine
AppNearMe 0:480387549d89 61 m_strLen = appnearme_ndef_tlv_get_string_length(m_tlvList);
AppNearMe 0:480387549d89 62 m_str = appnearme_ndef_tlv_get_string(m_tlvList);
AppNearMe 0:480387549d89 63 break;
AppNearMe 0:480387549d89 64 }
AppNearMe 0:480387549d89 65 return m_type;
AppNearMe 0:480387549d89 66 }
AppNearMe 0:480387549d89 67
AppNearMe 0:480387549d89 68 /** Get uint8_t value
AppNearMe 0:480387549d89 69 * If the current item's type is uint32_t, the value will be masked with 0xFF
AppNearMe 0:480387549d89 70 * @return uint8_t value OR 0 if the type is incompatible
AppNearMe 0:480387549d89 71 */
AppNearMe 0:480387549d89 72 uint8_t TLVList::getUInt8()
AppNearMe 0:480387549d89 73 {
AppNearMe 0:480387549d89 74 switch(m_type)
AppNearMe 0:480387549d89 75 {
AppNearMe 0:480387549d89 76 case UINT8:
AppNearMe 0:480387549d89 77 return m_uint8;
AppNearMe 0:480387549d89 78 case UINT32:
AppNearMe 0:480387549d89 79 return m_uint32 & 0xFF;
AppNearMe 0:480387549d89 80 default:
AppNearMe 0:480387549d89 81 return 0;
AppNearMe 0:480387549d89 82 }
AppNearMe 0:480387549d89 83 }
AppNearMe 0:480387549d89 84
AppNearMe 0:480387549d89 85 /** Get uint32_t value
AppNearMe 0:480387549d89 86 * If the current item's type is uint8_t, the value will be casted to uint32_t
AppNearMe 0:480387549d89 87 * @return uint32_t value OR 0 if the type is incompatible
AppNearMe 0:480387549d89 88 */
AppNearMe 0:480387549d89 89 uint32_t TLVList::getUInt32()
AppNearMe 0:480387549d89 90 {
AppNearMe 0:480387549d89 91 switch(m_type)
AppNearMe 0:480387549d89 92 {
AppNearMe 0:480387549d89 93 case UINT32:
AppNearMe 0:480387549d89 94 return m_uint32;
AppNearMe 0:480387549d89 95 case UINT8:
AppNearMe 0:480387549d89 96 return m_uint8 & 0xFF;
AppNearMe 0:480387549d89 97 default:
AppNearMe 0:480387549d89 98 return 0;
AppNearMe 0:480387549d89 99 }
AppNearMe 0:480387549d89 100 }
AppNearMe 0:480387549d89 101
AppNearMe 0:480387549d89 102 /** Get array length
AppNearMe 0:480387549d89 103 * @return bytes array length
AppNearMe 0:480387549d89 104 */
AppNearMe 0:480387549d89 105 size_t TLVList::getArrayLength()
AppNearMe 0:480387549d89 106 {
AppNearMe 0:480387549d89 107 switch(m_type)
AppNearMe 0:480387549d89 108 {
AppNearMe 0:480387549d89 109 case UINT8_ARRAY:
AppNearMe 0:480387549d89 110 return m_arrayLen;
AppNearMe 0:480387549d89 111 default:
AppNearMe 0:480387549d89 112 return 0;
AppNearMe 0:480387549d89 113 }
AppNearMe 0:480387549d89 114 }
AppNearMe 0:480387549d89 115
AppNearMe 0:480387549d89 116 /** Get array
AppNearMe 0:480387549d89 117 * @param buf pointer to buffer's start
AppNearMe 0:480387549d89 118 * @param maxLen maximum number of bytes to copy
AppNearMe 0:480387549d89 119 * @return number of copied bytes
AppNearMe 0:480387549d89 120 */
AppNearMe 0:480387549d89 121 size_t TLVList::getArray(uint8_t* buf, size_t maxLen)
AppNearMe 0:480387549d89 122 {
AppNearMe 0:480387549d89 123 if(m_type != UINT8_ARRAY)
AppNearMe 0:480387549d89 124 {
AppNearMe 0:480387549d89 125 return 0;
AppNearMe 0:480387549d89 126 }
AppNearMe 0:480387549d89 127 size_t len = MIN(maxLen, m_arrayLen);
AppNearMe 0:480387549d89 128 memcpy(buf, m_array, len);
AppNearMe 0:480387549d89 129 return len;
AppNearMe 0:480387549d89 130 }
AppNearMe 0:480387549d89 131
AppNearMe 0:480387549d89 132 /** Get string length
AppNearMe 0:480387549d89 133 * @return string length
AppNearMe 0:480387549d89 134 */
AppNearMe 0:480387549d89 135 size_t TLVList::getStringLength()
AppNearMe 0:480387549d89 136 {
AppNearMe 0:480387549d89 137 switch(m_type)
AppNearMe 0:480387549d89 138 {
AppNearMe 0:480387549d89 139 case STRING:
AppNearMe 0:480387549d89 140 return m_strLen;
AppNearMe 0:480387549d89 141 default:
AppNearMe 0:480387549d89 142 return 0;
AppNearMe 0:480387549d89 143 }
AppNearMe 0:480387549d89 144 }
AppNearMe 0:480387549d89 145
AppNearMe 0:480387549d89 146
AppNearMe 0:480387549d89 147 /** Get string
AppNearMe 0:480387549d89 148 * Copy string to buffer (including null-terminating char)
AppNearMe 0:480387549d89 149 * @param str pointer to string's start
AppNearMe 0:480387549d89 150 * @param maxLen maximum number of chars to copy (not including null-terminating char)
AppNearMe 0:480387549d89 151 * @return number of copied chars
AppNearMe 0:480387549d89 152 */
AppNearMe 0:480387549d89 153 size_t TLVList::getString(char* str, size_t maxLen)
AppNearMe 0:480387549d89 154 {
AppNearMe 0:480387549d89 155 if(m_type != STRING)
AppNearMe 0:480387549d89 156 {
AppNearMe 0:480387549d89 157 return 0;
AppNearMe 0:480387549d89 158 }
AppNearMe 0:480387549d89 159 size_t len = MIN(maxLen, m_strLen);
AppNearMe 0:480387549d89 160 memcpy(str, m_str, len);
AppNearMe 1:1074716d0111 161 str[len] = '\0'; //Add null-terminating char
AppNearMe 0:480387549d89 162 return len;
AppNearMe 0:480387549d89 163 }
AppNearMe 0:480387549d89 164
AppNearMe 0:480387549d89 165 /* Setters */
AppNearMe 0:480387549d89 166
AppNearMe 0:480387549d89 167 /** Check whether there is space left in list
AppNearMe 0:480387549d89 168 * @return true if there is space left, false otherwise
AppNearMe 0:480387549d89 169 */
AppNearMe 0:480387549d89 170 bool TLVList::isSpace()
AppNearMe 0:480387549d89 171 {
AppNearMe 0:480387549d89 172 return m_space;
AppNearMe 0:480387549d89 173 }
AppNearMe 0:480387549d89 174
AppNearMe 0:480387549d89 175 /** Put uint8_t value
AppNearMe 0:480387549d89 176 * @param value uint8_t value
AppNearMe 0:480387549d89 177 * @return true on success, false if there is not enough space in buffer
AppNearMe 0:480387549d89 178 */
AppNearMe 0:480387549d89 179 bool TLVList::putUInt8(uint8_t value)
AppNearMe 0:480387549d89 180 {
AppNearMe 0:480387549d89 181 int res = appnearme_ndef_tlv_put_uint8(m_tlvList, value);
AppNearMe 0:480387549d89 182 if( !res )
AppNearMe 0:480387549d89 183 {
AppNearMe 0:480387549d89 184 m_space = false;
AppNearMe 0:480387549d89 185 return false;
AppNearMe 0:480387549d89 186 }
AppNearMe 0:480387549d89 187 return true;
AppNearMe 0:480387549d89 188 }
AppNearMe 0:480387549d89 189
AppNearMe 0:480387549d89 190 /** Put uint32_t value
AppNearMe 0:480387549d89 191 * @param value uint32_t value
AppNearMe 0:480387549d89 192 * @return true on success, false if there is not enough space in buffer
AppNearMe 0:480387549d89 193 */
AppNearMe 0:480387549d89 194 bool TLVList::putUInt32(uint32_t value)
AppNearMe 0:480387549d89 195 {
AppNearMe 0:480387549d89 196 int res = appnearme_ndef_tlv_put_uint32(m_tlvList, value);
AppNearMe 0:480387549d89 197 if( !res )
AppNearMe 0:480387549d89 198 {
AppNearMe 0:480387549d89 199 m_space = false;
AppNearMe 0:480387549d89 200 return false;
AppNearMe 0:480387549d89 201 }
AppNearMe 0:480387549d89 202 return true;
AppNearMe 0:480387549d89 203 }
AppNearMe 0:480387549d89 204
AppNearMe 0:480387549d89 205 /** Put array
AppNearMe 0:480387549d89 206 * @param buf pointer to buffer's start
AppNearMe 0:480387549d89 207 * @param len number of bytes to copy
AppNearMe 0:480387549d89 208 * @return number of copied bytes
AppNearMe 0:480387549d89 209 */
AppNearMe 0:480387549d89 210 size_t TLVList::putArray(uint8_t* buf, size_t len)
AppNearMe 0:480387549d89 211 {
AppNearMe 0:480387549d89 212 int res = appnearme_ndef_tlv_put_array(m_tlvList, buf, len);
AppNearMe 0:480387549d89 213 if( !res )
AppNearMe 0:480387549d89 214 {
AppNearMe 0:480387549d89 215 m_space = false;
AppNearMe 0:480387549d89 216 return 0;
AppNearMe 0:480387549d89 217 }
AppNearMe 0:480387549d89 218 return len;
AppNearMe 0:480387549d89 219 }
AppNearMe 0:480387549d89 220
AppNearMe 0:480387549d89 221 /** Put string
AppNearMe 0:480387549d89 222 * @param str pointer to null-terminated string's start
AppNearMe 0:480387549d89 223 * @return number of copied bytes
AppNearMe 0:480387549d89 224 */
AppNearMe 0:480387549d89 225 size_t TLVList::putString(char* str)
AppNearMe 0:480387549d89 226 {
AppNearMe 0:480387549d89 227 int res = appnearme_ndef_tlv_put_string(m_tlvList, str);
AppNearMe 0:480387549d89 228 if( !res )
AppNearMe 0:480387549d89 229 {
AppNearMe 0:480387549d89 230 m_space = false;
AppNearMe 0:480387549d89 231 return 0;
AppNearMe 0:480387549d89 232 }
AppNearMe 0:480387549d89 233 return strlen(str);
AppNearMe 0:480387549d89 234 }
AppNearMe 0:480387549d89 235