Utility library to read and write Ndef messages from/to a Type4 NFC tag

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of NDefLib by ST Expansion SW Team

NDEF NFC library

This library provides an abstract API to create NDEF formatted messages and records and to read/write them from/to a Type4 NFC Tag.

Implementations

At the moment, the NDEF API is implemented by X_NUCLEO_NFC01A1 and X_NUCLEO_NFC02A1 Dynamic NFC Tag libraries respectively driving the X-NUCLEO-NFC01A1 and X-NUCLEO-NFC02A1 boards.

Committer:
giovannivisentini
Date:
Tue Dec 01 08:30:27 2015 +0000
Revision:
4:eaf6c49a86e4
Parent:
2:760e36ba9c23
Child:
6:739e3211749d
add the possibility to change the record content + add doc

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 2:760e36ba9c23 1 /*
giovannivisentini 2:760e36ba9c23 2 * RecordVCard.cpp
giovannivisentini 2:760e36ba9c23 3 *
giovannivisentini 2:760e36ba9c23 4 * Created on: Nov 16, 2015
giovannivisentini 2:760e36ba9c23 5 * Author: giovanni visentini
giovannivisentini 2:760e36ba9c23 6 */
giovannivisentini 2:760e36ba9c23 7 #include <cstring>
giovannivisentini 2:760e36ba9c23 8 #include "RecordVCard.h"
giovannivisentini 2:760e36ba9c23 9
giovannivisentini 2:760e36ba9c23 10 namespace NDefLib {
giovannivisentini 2:760e36ba9c23 11
giovannivisentini 4:eaf6c49a86e4 12 const std::string RecordVCard::sEmptyTagContent("");
giovannivisentini 4:eaf6c49a86e4 13 const std::string RecordVCard::sVcardMimeType("text/vcard");
giovannivisentini 4:eaf6c49a86e4 14 const std::string RecordVCard::sStartVCardTag("BEGIN:VCARD\nVERSION:3.0\n");
giovannivisentini 4:eaf6c49a86e4 15 const std::string RecordVCard::sStartFieldTag[] =
giovannivisentini 4:eaf6c49a86e4 16 { "ADR:", "ADR;TYPE=home:", "ADR;TYPE=work:", "AGENT:", "BDAY:",
giovannivisentini 4:eaf6c49a86e4 17 "CATEGORIES:", "EMAIL:", "EMAIL;TYPE=home:", "EMAIL;TYPE=work:",
giovannivisentini 4:eaf6c49a86e4 18 "FN:", "GEO:", "IMPP:", "KEY;TYPE=PGP:",
giovannivisentini 4:eaf6c49a86e4 19 "KEY;TYPE=PGP;ENCODING=B:","LOGO:", "LOGO;VALUE=uri:",
giovannivisentini 4:eaf6c49a86e4 20 "LOGO;ENCODING=B;", "N:", "NICKNAME:", "NOTE:", "ORG:",
giovannivisentini 4:eaf6c49a86e4 21 "PHOTO;VALUE=uri:", "PHOTO;ENCODING=B;", "REV:", "SOURCE:",
giovannivisentini 4:eaf6c49a86e4 22 "TEL:", "TEL;TYPE=HOME:", "TEL;TYPE=WORK:", "TEL;TYPE=CELL:",
giovannivisentini 4:eaf6c49a86e4 23 "TITLE:", "URL:", };
giovannivisentini 4:eaf6c49a86e4 24
giovannivisentini 4:eaf6c49a86e4 25 const std::string RecordVCard::sEndFieldTag("\n");
giovannivisentini 4:eaf6c49a86e4 26 const std::string RecordVCard::sEndVCardTag("END:VCARD");
giovannivisentini 4:eaf6c49a86e4 27
giovannivisentini 4:eaf6c49a86e4 28 RecordVCard::RecordVCard(const VCardInfo_t &info) :
giovannivisentini 4:eaf6c49a86e4 29 RecordMimeType(sVcardMimeType), mCardInfo(info),mContentIsChange(true) {
giovannivisentini 4:eaf6c49a86e4 30 updateContentInfoString();
giovannivisentini 4:eaf6c49a86e4 31 }
giovannivisentini 2:760e36ba9c23 32
giovannivisentini 4:eaf6c49a86e4 33 void RecordVCard::updateContentInfoString() {
giovannivisentini 4:eaf6c49a86e4 34 if(!mContentIsChange)
giovannivisentini 4:eaf6c49a86e4 35 return;
giovannivisentini 4:eaf6c49a86e4 36
giovannivisentini 4:eaf6c49a86e4 37 mCardInfoString = sStartVCardTag;
giovannivisentini 4:eaf6c49a86e4 38
giovannivisentini 4:eaf6c49a86e4 39 VCardInfo_t::const_iterator it = mCardInfo.begin();
giovannivisentini 4:eaf6c49a86e4 40 VCardInfo_t::const_iterator end = mCardInfo.end();
giovannivisentini 2:760e36ba9c23 41
giovannivisentini 4:eaf6c49a86e4 42 for (; it != end; ++it) {
giovannivisentini 4:eaf6c49a86e4 43 mCardInfoString += sStartFieldTag[it->first];
giovannivisentini 4:eaf6c49a86e4 44 mCardInfoString += it->second;
giovannivisentini 4:eaf6c49a86e4 45 mCardInfoString += sEndFieldTag;
giovannivisentini 4:eaf6c49a86e4 46 } //for
giovannivisentini 4:eaf6c49a86e4 47
giovannivisentini 4:eaf6c49a86e4 48 mCardInfoString += sEndVCardTag;
giovannivisentini 4:eaf6c49a86e4 49
giovannivisentini 4:eaf6c49a86e4 50 setMimeDataPointer((uint8_t*)mCardInfoString.data(),mCardInfoString.size());
giovannivisentini 4:eaf6c49a86e4 51
giovannivisentini 4:eaf6c49a86e4 52 mContentIsChange=false;
giovannivisentini 2:760e36ba9c23 53
giovannivisentini 2:760e36ba9c23 54 }
giovannivisentini 2:760e36ba9c23 55
giovannivisentini 4:eaf6c49a86e4 56 uint16_t RecordVCard::findVCardFieldDataLenght(const std::string &content,
giovannivisentini 4:eaf6c49a86e4 57 uint16_t offset) {
giovannivisentini 4:eaf6c49a86e4 58 std::size_t pos = content.find(sEndFieldTag, offset);
giovannivisentini 4:eaf6c49a86e4 59 if (pos == std::string::npos) { //if we don't find the end, lets consume all the content
giovannivisentini 4:eaf6c49a86e4 60 return content.size() - offset;
giovannivisentini 4:eaf6c49a86e4 61 } //else
giovannivisentini 4:eaf6c49a86e4 62 return content.find(sEndFieldTag, offset) - offset;
giovannivisentini 4:eaf6c49a86e4 63 } //findVCardFieldDataLenght
giovannivisentini 2:760e36ba9c23 64
giovannivisentini 4:eaf6c49a86e4 65 int8_t RecordVCard::findVCardFieldType(const std::string &content,
giovannivisentini 4:eaf6c49a86e4 66 uint16_t offset) {
giovannivisentini 4:eaf6c49a86e4 67 const uint32_t nFieldTag = sizeof(sStartFieldTag)
giovannivisentini 4:eaf6c49a86e4 68 / sizeof(sStartFieldTag[0]);
giovannivisentini 4:eaf6c49a86e4 69 for (uint32_t i = 0; i < nFieldTag; i++) {
giovannivisentini 4:eaf6c49a86e4 70 if (content.find(sStartFieldTag[i], offset) != std::string::npos)
giovannivisentini 2:760e36ba9c23 71 return i;
giovannivisentini 4:eaf6c49a86e4 72 } //for
giovannivisentini 2:760e36ba9c23 73 return -1;
giovannivisentini 4:eaf6c49a86e4 74 } //findVCardFieldType
giovannivisentini 2:760e36ba9c23 75
giovannivisentini 4:eaf6c49a86e4 76 RecordVCard* RecordVCard::parse(const RecordHeader &header,
giovannivisentini 4:eaf6c49a86e4 77 const uint8_t* buffer) {
giovannivisentini 4:eaf6c49a86e4 78 if (header.getFNT() != RecordHeader::Mime_media_type
giovannivisentini 4:eaf6c49a86e4 79 || header.getTypeLength() != sVcardMimeType.size()) {
giovannivisentini 2:760e36ba9c23 80 return NULL;
giovannivisentini 4:eaf6c49a86e4 81 } //else
giovannivisentini 4:eaf6c49a86e4 82 if (sVcardMimeType.compare(0, sVcardMimeType.size(), (const char*) buffer,
giovannivisentini 4:eaf6c49a86e4 83 sVcardMimeType.size()) != 0) {
giovannivisentini 2:760e36ba9c23 84 return NULL;
giovannivisentini 2:760e36ba9c23 85 }
giovannivisentini 4:eaf6c49a86e4 86 buffer += header.getTypeLength();
giovannivisentini 2:760e36ba9c23 87 //we are at the start of the vcard data
giovannivisentini 4:eaf6c49a86e4 88 if (sStartVCardTag.compare(0, sStartVCardTag.size(), (const char*) (buffer),
giovannivisentini 4:eaf6c49a86e4 89 sStartVCardTag.size()) != 0)
giovannivisentini 2:760e36ba9c23 90 return NULL;
giovannivisentini 2:760e36ba9c23 91 //the version is ok
giovannivisentini 4:eaf6c49a86e4 92 const std::string vCardContent((const char*) buffer + sStartVCardTag.size(),
giovannivisentini 4:eaf6c49a86e4 93 header.getPlayloadLength() - sStartVCardTag.size());
giovannivisentini 4:eaf6c49a86e4 94 uint16_t offset = 0;
giovannivisentini 4:eaf6c49a86e4 95 buffer += sStartVCardTag.size(); // for debug
giovannivisentini 2:760e36ba9c23 96 VCardInfo_t info;
giovannivisentini 4:eaf6c49a86e4 97 do {
giovannivisentini 4:eaf6c49a86e4 98 const int8_t type = findVCardFieldType(vCardContent, offset);
giovannivisentini 2:760e36ba9c23 99
giovannivisentini 4:eaf6c49a86e4 100 if (type >= 0) { //if is a valid type
giovannivisentini 4:eaf6c49a86e4 101 const VCardField_t fieldType = (VCardField_t) type;
giovannivisentini 4:eaf6c49a86e4 102 offset += sStartFieldTag[fieldType].size(); // skip the tag name
giovannivisentini 2:760e36ba9c23 103 //search the tag size
giovannivisentini 4:eaf6c49a86e4 104 const uint16_t length = findVCardFieldDataLenght(vCardContent,
giovannivisentini 4:eaf6c49a86e4 105 offset);
giovannivisentini 4:eaf6c49a86e4 106 info[fieldType] = vCardContent.substr(offset, length);
giovannivisentini 4:eaf6c49a86e4 107 offset += length + sEndFieldTag.size();
giovannivisentini 4:eaf6c49a86e4 108 } else {
giovannivisentini 2:760e36ba9c23 109 //unknow field, skip until next one
giovannivisentini 4:eaf6c49a86e4 110 offset += findVCardFieldDataLenght(vCardContent, offset)
giovannivisentini 4:eaf6c49a86e4 111 + sEndFieldTag.size();
giovannivisentini 2:760e36ba9c23 112 }
giovannivisentini 2:760e36ba9c23 113
giovannivisentini 4:eaf6c49a86e4 114 } while (offset < vCardContent.size());
giovannivisentini 2:760e36ba9c23 115
giovannivisentini 2:760e36ba9c23 116 return new RecordVCard(info);
giovannivisentini 2:760e36ba9c23 117 }
giovannivisentini 2:760e36ba9c23 118
giovannivisentini 2:760e36ba9c23 119 } /* namespace NDefLib */