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.

Message.cpp

Committer:
giovannivisentini
Date:
2015-11-24
Revision:
1:a0eeb478a45a
Parent:
0:04b82ae7aa43
Child:
4:eaf6c49a86e4

File content as of revision 1:a0eeb478a45a:

/*
 * Message.cpp
 *
 *  Created on: Nov 6, 2015
 *      Author: giovanni visentini
 */

#include <cstdlib>
#include "NDefLib/Message.h"
#include "RecordType/EmptyRecord.h"
#include "RecordType/RecordText.h"
#include "RecordType/RecordAAR.h"
#include "RecordType/RecordMimeType.h"
#include "RecordType/RecordURI.h"

namespace NDefLib {

uint16_t Message::getByteLenght()const{
	uint16_t lenght=2; //length size

	if(mRecords.size()==0)
		return lenght+EmptyRecord().getByteLenght();

	std::vector<Record*>::const_iterator it = mRecords.begin();
	const std::vector<Record*>::const_iterator end = mRecords.end();

	for(;it!=end;++it){
		lenght+= (*it)->getByteLenght();
	}//for

	return lenght;
}//getByteLenght

uint16_t Message::write(uint8_t *buffer) const {

	const uint16_t length =getByteLenght()-2;
	uint16_t offset=0;
	buffer[offset++]=(uint8_t)((length & 0xFF00)>>8);
	buffer[offset++]=(uint8_t)((length & 0x00FF));

	const uint32_t nRecord = mRecords.size();

	if(mRecords.size()==0){
		offset += EmptyRecord().write(buffer+offset);
		return offset;
	}//else

	for(uint32_t i=0;i<nRecord; i++){
		Record *r = mRecords[i];

		r->setAsMiddleRecord();
		if(i==0)
			r->setAsFirstRecord();
		if(i==nRecord-1)
			r->setAsLastRecord();

		offset+= r->write(buffer+offset);
	}//for

	return offset;
}//write

void Message::parseMessage(const uint8_t *const rawNdefFile,
		const uint8_t length,Message *msg){
	uint16_t offset=0;
	Record *r;

	Record::RecordHeader header;
	do{
		const uint8_t headerLenght = header.loadHeader(rawNdefFile+offset);
		r = RecordText::parse(header,rawNdefFile+offset+headerLenght);
		if(r==NULL)
			r = RecordAAR::parse(header,rawNdefFile+offset+headerLenght);
		if(r==NULL)
			r = RecordMimeType::parse(header,rawNdefFile+offset+headerLenght);
		if(r==NULL)
			r = RecordURI::parse(header,rawNdefFile+offset+headerLenght);

		offset += header.getRecordLength();
		msg->addRecord(r);
	}while(offset<length);

}


} /* namespace NDefLib */