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.

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 */
+