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
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.
Diff: RecordType/RecordVCard.cpp
- Revision:
- 2:760e36ba9c23
- Child:
- 4:eaf6c49a86e4
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RecordType/RecordVCard.cpp Thu Nov 26 09:04:44 2015 +0000 @@ -0,0 +1,133 @@ +/* + * RecordVCard.cpp + * + * Created on: Nov 16, 2015 + * Author: giovanni visentini + */ +#include <cstring> +#include "RecordVCard.h" + +namespace NDefLib { + + const std::string RecordVCard::sEmptyTagContent(""); + const std::string RecordVCard::sVcardMimeType("text/vcard"); + const std::string RecordVCard::sStartVCardTag("BEGIN:VCARD\nVERSION:3.0\n"); + const std::string RecordVCard::sStartFieldTag[] = { + "ADR:", + "ADR;TYPE=home:", + "ADR;TYPE=work:", + "AGENT:", + "BDAY:", + "CATEGORIES:", + "EMAIL:", + "EMAIL;TYPE=home:", + "EMAIL;TYPE=work:", + "FN:", + "GEO:", + "IMPP:", + "KEY;TYPE=PGP:", + "KEY;TYPE=PGP;ENCODING=B:", + "LOGO;VALUE=uri:", + "LOGO;ENCODING=B;", + "N:", + "NICKNAME:", + "NOTE:", + "ORG:", + "PHOTO;VALUE=uri:", + "PHOTO;ENCODING=B;", + "REV:", + "SOURCE:", + "TEL;TYPE=HOME:", + "TEL;TYPE=WORK:", + "TEL;TYPE=CELL:", + "TITLE:", + "URL:", +}; + + const std::string RecordVCard::sEndFieldTag("\n"); + const std::string RecordVCard::sEndVCardTag("END:VCARD"); + +RecordVCard::RecordVCard(const VCardInfo_t &info): + RecordMimeType(sVcardMimeType,buildCardContent(info)), + mCardInfo(info){ + +} + +//TODO return a pointer +std::string RecordVCard::buildCardContent(const VCardInfo_t &info){ + std::string content(sStartVCardTag); + + VCardInfo_t::const_iterator it = info.begin(); + VCardInfo_t::const_iterator end = info.end(); + + for(; it!=end; ++it){ + content+=sStartFieldTag[it->first]; + content+=it->second; + content+=sEndFieldTag; + }//for + + content+=sEndVCardTag; + return content; +} + +uint16_t RecordVCard::findVCardFieldDataLenght(const std::string &content,uint16_t offset){ + std::size_t pos = content.find(sEndFieldTag,offset); + if(pos==std::string::npos){ //if we don't find the end, lets consume all the content + return content.size()-offset; + }//else + return content.find(sEndFieldTag,offset)-offset; +}//findVCardFieldDataLenght + +int8_t RecordVCard::findVCardFieldType(const std::string &content,uint16_t offset){ + const uint32_t nFieldTag =sizeof(sStartFieldTag)/sizeof(sStartFieldTag[0]); + for(uint32_t i =0 ;i < nFieldTag;i++){ + if(content.find(sStartFieldTag[i],offset)!=std::string::npos) + return i; + }//for + return -1; +}//findVCardFieldType + + +RecordVCard* RecordVCard::parse(const Record::RecordHeader &header, + const uint8_t* buffer){ + if(header.getFNT()!=RecordHeader::Mime_media_type || + header.getTypeLenght()!=sVcardMimeType.size()){ + return NULL; + }//else + if(sVcardMimeType.compare(0,sVcardMimeType.size(),(const char*)buffer,sVcardMimeType.size())!=0){ + return NULL; + } + buffer+=header.getTypeLenght(); + //we are at the start of the vcard data + if(sStartVCardTag.compare(0,sStartVCardTag.size(), + (const char*)(buffer), sStartVCardTag.size())!=0) + return NULL; + //the version is ok + const std::string vCardContent((const char*)buffer+sStartVCardTag.size(), + header.getPlayloadLenght()-sStartVCardTag.size()); + uint16_t offset=0; + buffer+=sStartVCardTag.size(); // for debug + VCardInfo_t info; + do{ + const int8_t type = findVCardFieldType(vCardContent,offset); + + if(type>=0){//if is a valid type + const VCardField_t fieldType =(VCardField_t)type; + offset+= sStartFieldTag[fieldType].size(); // skip the tag name + //search the tag size + const uint16_t length = findVCardFieldDataLenght(vCardContent,offset); + info[fieldType]=vCardContent.substr(offset,length); + offset+=length+sEndFieldTag.size(); + }else{ + //unknow field, skip until next one + offset+=findVCardFieldDataLenght(vCardContent,offset)+sEndFieldTag.size(); + } + + + }while(offset<vCardContent.size()); + + return new RecordVCard(info); +} + +} /* namespace NDefLib */ +