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-12-01
Revision:
4:eaf6c49a86e4
Parent:
1:a0eeb478a45a
Child:
6:739e3211749d

File content as of revision 4:eaf6c49a86e4:

/*
 * 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::getByteLength() const {
	uint16_t lenght = 2; //length size

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

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

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

	return lenght;
} //getByteLenght

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

	const uint16_t length = getByteLength() - 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;

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