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:
Thu Nov 26 09:04:44 2015 +0000
Revision:
2:760e36ba9c23
Child:
4:eaf6c49a86e4
implement the VCard record

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