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:
Tue Dec 01 15:59:55 2015 +0000
Revision:
5:f2b7efcc5b6e
Parent:
4:eaf6c49a86e4
Child:
6:739e3211749d
add explicit to the constuctor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 2:760e36ba9c23 1 /*
giovannivisentini 2:760e36ba9c23 2 * RecordVCard.h
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
giovannivisentini 2:760e36ba9c23 8 #ifndef NDEFLIB_RECORDTYPE_RECORDVCARD_H_
giovannivisentini 2:760e36ba9c23 9 #define NDEFLIB_RECORDTYPE_RECORDVCARD_H_
giovannivisentini 2:760e36ba9c23 10
giovannivisentini 2:760e36ba9c23 11 #include <map>
giovannivisentini 2:760e36ba9c23 12 #include <string>
giovannivisentini 2:760e36ba9c23 13 #include "RecordMimeType.h"
giovannivisentini 2:760e36ba9c23 14
giovannivisentini 2:760e36ba9c23 15 namespace NDefLib {
giovannivisentini 2:760e36ba9c23 16
giovannivisentini 2:760e36ba9c23 17 //https://en.wikipedia.org/wiki/VCard
giovannivisentini 2:760e36ba9c23 18
giovannivisentini 4:eaf6c49a86e4 19 /**
giovannivisentini 4:eaf6c49a86e4 20 * Specialize the mimeType record for store a VCard information.
giovannivisentini 4:eaf6c49a86e4 21 * this record handle the VCard version 3 format
giovannivisentini 4:eaf6c49a86e4 22 */
giovannivisentini 2:760e36ba9c23 23 class RecordVCard: public RecordMimeType {
giovannivisentini 2:760e36ba9c23 24 public:
giovannivisentini 4:eaf6c49a86e4 25 /**
giovannivisentini 4:eaf6c49a86e4 26 * type of information that you can store inside the tag
giovannivisentini 4:eaf6c49a86e4 27 */
giovannivisentini 4:eaf6c49a86e4 28 typedef enum {
giovannivisentini 4:eaf6c49a86e4 29 ADDRESS, //!< ADDRESS
giovannivisentini 4:eaf6c49a86e4 30 ADDRESS_HOME, //!< ADDRESS_HOME
giovannivisentini 4:eaf6c49a86e4 31 ADDRESS_WORK, //!< ADDRESS_WORK
giovannivisentini 4:eaf6c49a86e4 32 AGENT, //!< AGENT
giovannivisentini 4:eaf6c49a86e4 33 BIRDAY, //!< BIRDAY
giovannivisentini 4:eaf6c49a86e4 34 CATEGORIES, //!< CATEGORIES
giovannivisentini 4:eaf6c49a86e4 35 EMAIL, //!< EMAIL
giovannivisentini 4:eaf6c49a86e4 36 EMAIL_HOME, //!< EMAIL_HOME
giovannivisentini 4:eaf6c49a86e4 37 EMAIL_WORK, //!< EMAIL_WORK
giovannivisentini 4:eaf6c49a86e4 38 FORMATTED_NAME,//!< FORMATTED_NAME
giovannivisentini 4:eaf6c49a86e4 39 GEO, //!< GEO latitude and longitude ; separated
giovannivisentini 4:eaf6c49a86e4 40 IMPP, //!< IMPP
giovannivisentini 4:eaf6c49a86e4 41 PGPKEY_URL, //!< PGPKEY_URL
giovannivisentini 4:eaf6c49a86e4 42 PGPGKEY_BASE64,//!< PGPGKEY_BASE64
giovannivisentini 4:eaf6c49a86e4 43 LOGO, //!< LOGO
giovannivisentini 4:eaf6c49a86e4 44 LOGO_URI, //!< LOGO_URI
giovannivisentini 4:eaf6c49a86e4 45 LOGO_BASE64, //!< generic hardcoded image add TYPE=XXXX:imagebyte
giovannivisentini 4:eaf6c49a86e4 46 NAME, //!< NAME
giovannivisentini 4:eaf6c49a86e4 47 NICKNAME, //!< NICKNAME
giovannivisentini 4:eaf6c49a86e4 48 NOTE, //!< NOTE
giovannivisentini 4:eaf6c49a86e4 49 ORGANIZATION, //!< ORGANIZATION
giovannivisentini 4:eaf6c49a86e4 50 PHOTO_URI, //!< PHOTO_URI
giovannivisentini 4:eaf6c49a86e4 51 PHOTO_BASE64, //!< generic hardcoded image add TYPE=XXXX:imagebyte
giovannivisentini 4:eaf6c49a86e4 52 REVISION, //!< REVISION
giovannivisentini 4:eaf6c49a86e4 53 SOURCE_URL, //!< SOURCE_URL
giovannivisentini 4:eaf6c49a86e4 54 TEL, //!< TEL
giovannivisentini 4:eaf6c49a86e4 55 TEL_HOME, //!< TEL_HOME
giovannivisentini 4:eaf6c49a86e4 56 TEL_WORK, //!< TEL_WORK
giovannivisentini 4:eaf6c49a86e4 57 TEL_MOBILE, //!< TEL_MOBILE
giovannivisentini 4:eaf6c49a86e4 58 TITLE, //!< TITLE
giovannivisentini 4:eaf6c49a86e4 59 URL, //!< URL
giovannivisentini 4:eaf6c49a86e4 60 } VCardField_t;
giovannivisentini 2:760e36ba9c23 61
giovannivisentini 4:eaf6c49a86e4 62 /**
giovannivisentini 4:eaf6c49a86e4 63 * type used for store the vcard information
giovannivisentini 4:eaf6c49a86e4 64 */
giovannivisentini 4:eaf6c49a86e4 65 typedef std::map<VCardField_t, std::string> VCardInfo_t;
giovannivisentini 2:760e36ba9c23 66
giovannivisentini 4:eaf6c49a86e4 67 /**
giovannivisentini 4:eaf6c49a86e4 68 * create an RecordVCard reading the data from the buffer
giovannivisentini 4:eaf6c49a86e4 69 * @param header record header already read
giovannivisentini 4:eaf6c49a86e4 70 * @param buffer buffer where read the data
giovannivisentini 4:eaf6c49a86e4 71 * @return an object of type RecordVCard or NULL
giovannivisentini 4:eaf6c49a86e4 72 * @par free the pointer return by this function
giovannivisentini 4:eaf6c49a86e4 73 */
giovannivisentini 4:eaf6c49a86e4 74 static RecordVCard* parse(const RecordHeader &header,
giovannivisentini 2:760e36ba9c23 75 const uint8_t* buffer);
giovannivisentini 2:760e36ba9c23 76
giovannivisentini 4:eaf6c49a86e4 77 /**
giovannivisentini 4:eaf6c49a86e4 78 * create a record with the specific information
giovannivisentini 4:eaf6c49a86e4 79 * @param info optional information to store in the record
giovannivisentini 4:eaf6c49a86e4 80 */
giovannivisentini 5:f2b7efcc5b6e 81 explicit RecordVCard(const VCardInfo_t &info=VCardInfo_t());
giovannivisentini 2:760e36ba9c23 82
giovannivisentini 4:eaf6c49a86e4 83 /**
giovannivisentini 4:eaf6c49a86e4 84 * get the specificic information stored in this record
giovannivisentini 4:eaf6c49a86e4 85 * @param type type of information to get
giovannivisentini 4:eaf6c49a86e4 86 * @return if present the information or an empty string
giovannivisentini 4:eaf6c49a86e4 87 */
giovannivisentini 4:eaf6c49a86e4 88 const std::string& operator[](const VCardField_t &type)const {
giovannivisentini 4:eaf6c49a86e4 89 VCardInfo_t::const_iterator elem = mCardInfo.find(type);
giovannivisentini 4:eaf6c49a86e4 90 if (elem == mCardInfo.end())
giovannivisentini 2:760e36ba9c23 91 return sEmptyTagContent;
giovannivisentini 2:760e36ba9c23 92 //else
giovannivisentini 2:760e36ba9c23 93 return elem->second;
giovannivisentini 2:760e36ba9c23 94 }
giovannivisentini 2:760e36ba9c23 95
giovannivisentini 4:eaf6c49a86e4 96 /**
giovannivisentini 4:eaf6c49a86e4 97 * get or set/change an information associated with this record
giovannivisentini 4:eaf6c49a86e4 98 * @param type type of information to change
giovannivisentini 4:eaf6c49a86e4 99 * @return reference to the string information
giovannivisentini 4:eaf6c49a86e4 100 */
giovannivisentini 4:eaf6c49a86e4 101 std::string& operator[](const VCardField_t &type) {
giovannivisentini 4:eaf6c49a86e4 102 mContentIsChange=true;
giovannivisentini 4:eaf6c49a86e4 103 return mCardInfo[type];
giovannivisentini 4:eaf6c49a86e4 104 }
giovannivisentini 4:eaf6c49a86e4 105
giovannivisentini 4:eaf6c49a86e4 106 virtual RecordType_t getType() const {
giovannivisentini 2:760e36ba9c23 107 return TYPE_MIME_VCARD;
giovannivisentini 4:eaf6c49a86e4 108 } //getType
giovannivisentini 4:eaf6c49a86e4 109
giovannivisentini 4:eaf6c49a86e4 110
giovannivisentini 4:eaf6c49a86e4 111 virtual uint16_t getByteLength() {
giovannivisentini 4:eaf6c49a86e4 112 updateContentInfoString();
giovannivisentini 4:eaf6c49a86e4 113 return RecordMimeType::getByteLength();
giovannivisentini 4:eaf6c49a86e4 114 }
giovannivisentini 2:760e36ba9c23 115
giovannivisentini 4:eaf6c49a86e4 116 virtual uint16_t write(uint8_t *buffer){
giovannivisentini 4:eaf6c49a86e4 117 updateContentInfoString();
giovannivisentini 4:eaf6c49a86e4 118 return RecordMimeType::write(buffer);
giovannivisentini 4:eaf6c49a86e4 119 }
giovannivisentini 4:eaf6c49a86e4 120
giovannivisentini 4:eaf6c49a86e4 121 virtual ~RecordVCard() {
giovannivisentini 4:eaf6c49a86e4 122 }
giovannivisentini 2:760e36ba9c23 123
giovannivisentini 2:760e36ba9c23 124 private:
giovannivisentini 4:eaf6c49a86e4 125 VCardInfo_t mCardInfo;
giovannivisentini 4:eaf6c49a86e4 126 //buffer containing the Vcard representation for this record
giovannivisentini 4:eaf6c49a86e4 127 std::string mCardInfoString;
giovannivisentini 2:760e36ba9c23 128
giovannivisentini 4:eaf6c49a86e4 129 bool mContentIsChange;
giovannivisentini 4:eaf6c49a86e4 130
giovannivisentini 4:eaf6c49a86e4 131 void updateContentInfoString();
giovannivisentini 2:760e36ba9c23 132
giovannivisentini 4:eaf6c49a86e4 133 /**
giovannivisentini 4:eaf6c49a86e4 134 * check if in the string that start in position offset, is present a known
giovannivisentini 4:eaf6c49a86e4 135 * vcard file, if yes it return type index, otherwise a negative number
giovannivisentini 4:eaf6c49a86e4 136 * @param content string where search
giovannivisentini 4:eaf6c49a86e4 137 * @param offset offset where start to search
giovannivisentini 4:eaf6c49a86e4 138 * @return index of the field found or a negative number
giovannivisentini 4:eaf6c49a86e4 139 */
giovannivisentini 4:eaf6c49a86e4 140 static int8_t findVCardFieldType(const std::string &content,
giovannivisentini 4:eaf6c49a86e4 141 uint16_t offset);
giovannivisentini 2:760e36ba9c23 142
giovannivisentini 4:eaf6c49a86e4 143 /**
giovannivisentini 4:eaf6c49a86e4 144 * search the end of a vcard field
giovannivisentini 4:eaf6c49a86e4 145 * @param content string where search
giovannivisentini 4:eaf6c49a86e4 146 * @param offset offset where start to search
giovannivisentini 4:eaf6c49a86e4 147 * @return field length
giovannivisentini 4:eaf6c49a86e4 148 * @par this function search the first sEndVCardTag appearance
giovannivisentini 4:eaf6c49a86e4 149 */
giovannivisentini 4:eaf6c49a86e4 150 static uint16_t findVCardFieldDataLenght(const std::string &content,
giovannivisentini 4:eaf6c49a86e4 151 uint16_t offset);
giovannivisentini 2:760e36ba9c23 152
giovannivisentini 2:760e36ba9c23 153 static const std::string sVcardMimeType;
giovannivisentini 2:760e36ba9c23 154 static const std::string sStartFieldTag[];
giovannivisentini 2:760e36ba9c23 155 static const std::string sEndFieldTag;
giovannivisentini 2:760e36ba9c23 156 static const std::string sStartVCardTag;
giovannivisentini 2:760e36ba9c23 157 static const std::string sEndVCardTag;
giovannivisentini 2:760e36ba9c23 158 static const std::string sEmptyTagContent;
giovannivisentini 2:760e36ba9c23 159 };
giovannivisentini 2:760e36ba9c23 160
giovannivisentini 2:760e36ba9c23 161 } /* namespace NDefLib */
giovannivisentini 2:760e36ba9c23 162
giovannivisentini 2:760e36ba9c23 163 #endif /* NDEFLIB_RECORDTYPE_RECORDVCARD_H_ */