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:
Mon Aug 21 12:02:31 2017 +0000
Revision:
21:72c86cbd49be
Parent:
20:31f727872290
change on_message_write callback; the message parameter was unused and it pointed to an invalid object

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 6:739e3211749d 1 /**
giovannivisentini 6:739e3211749d 2 ******************************************************************************
giovannivisentini 6:739e3211749d 3 * @file RecordVCard.h
giovannivisentini 8:473f6e0b03df 4 * @author ST / Central Labs
giovannivisentini 19:13d84b136a62 5 * @version V2.0.0
giovannivisentini 19:13d84b136a62 6 * @date 28 Apr 2017
giovannivisentini 9:689c1f56f359 7 * @brief {@link RecordMimeType} that contains a VCard data
giovannivisentini 6:739e3211749d 8 ******************************************************************************
giovannivisentini 6:739e3211749d 9 * @attention
giovannivisentini 6:739e3211749d 10 *
giovannivisentini 6:739e3211749d 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
giovannivisentini 2:760e36ba9c23 12 *
giovannivisentini 6:739e3211749d 13 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 6:739e3211749d 14 * are permitted provided that the following conditions are met:
giovannivisentini 6:739e3211749d 15 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 6:739e3211749d 16 * this list of conditions and the following disclaimer.
giovannivisentini 6:739e3211749d 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 6:739e3211749d 18 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 6:739e3211749d 19 * and/or other materials provided with the distribution.
giovannivisentini 6:739e3211749d 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 6:739e3211749d 21 * may be used to endorse or promote products derived from this software
giovannivisentini 6:739e3211749d 22 * without specific prior written permission.
giovannivisentini 6:739e3211749d 23 *
giovannivisentini 6:739e3211749d 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 6:739e3211749d 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 6:739e3211749d 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 6:739e3211749d 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 6:739e3211749d 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 6:739e3211749d 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 6:739e3211749d 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 6:739e3211749d 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 6:739e3211749d 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 6:739e3211749d 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 6:739e3211749d 34 *
giovannivisentini 6:739e3211749d 35 ******************************************************************************
giovannivisentini 2:760e36ba9c23 36 */
giovannivisentini 2:760e36ba9c23 37
giovannivisentini 2:760e36ba9c23 38 #ifndef NDEFLIB_RECORDTYPE_RECORDVCARD_H_
giovannivisentini 2:760e36ba9c23 39 #define NDEFLIB_RECORDTYPE_RECORDVCARD_H_
giovannivisentini 2:760e36ba9c23 40
giovannivisentini 2:760e36ba9c23 41 #include <map>
giovannivisentini 2:760e36ba9c23 42 #include <string>
giovannivisentini 2:760e36ba9c23 43 #include "RecordMimeType.h"
giovannivisentini 2:760e36ba9c23 44
giovannivisentini 2:760e36ba9c23 45 namespace NDefLib {
giovannivisentini 2:760e36ba9c23 46
giovannivisentini 4:eaf6c49a86e4 47 /**
giovannivisentini 12:ed4d9b8d1410 48 * Specialize the {@link RecordMimeType} to store VCard information.
giovannivisentini 12:ed4d9b8d1410 49 * This record handles the VCard version 3 format.
giovannivisentini 9:689c1f56f359 50 * @see https://en.wikipedia.org/wiki/VCard
giovannivisentini 4:eaf6c49a86e4 51 */
giovannivisentini 2:760e36ba9c23 52 class RecordVCard: public RecordMimeType {
giovannivisentini 2:760e36ba9c23 53 public:
giovannivisentini 12:ed4d9b8d1410 54
giovannivisentini 4:eaf6c49a86e4 55 /**
giovannivisentini 12:ed4d9b8d1410 56 * Type of information that you can store inside the tag
giovannivisentini 4:eaf6c49a86e4 57 */
giovannivisentini 4:eaf6c49a86e4 58 typedef enum {
giovannivisentini 4:eaf6c49a86e4 59 ADDRESS, //!< ADDRESS
giovannivisentini 4:eaf6c49a86e4 60 ADDRESS_HOME, //!< ADDRESS_HOME
giovannivisentini 4:eaf6c49a86e4 61 ADDRESS_WORK, //!< ADDRESS_WORK
giovannivisentini 4:eaf6c49a86e4 62 AGENT, //!< AGENT
giovannivisentini 4:eaf6c49a86e4 63 BIRDAY, //!< BIRDAY
giovannivisentini 4:eaf6c49a86e4 64 CATEGORIES, //!< CATEGORIES
giovannivisentini 4:eaf6c49a86e4 65 EMAIL, //!< EMAIL
giovannivisentini 4:eaf6c49a86e4 66 EMAIL_HOME, //!< EMAIL_HOME
giovannivisentini 4:eaf6c49a86e4 67 EMAIL_WORK, //!< EMAIL_WORK
giovannivisentini 4:eaf6c49a86e4 68 FORMATTED_NAME,//!< FORMATTED_NAME
giovannivisentini 4:eaf6c49a86e4 69 GEO, //!< GEO latitude and longitude ; separated
giovannivisentini 4:eaf6c49a86e4 70 IMPP, //!< IMPP
giovannivisentini 4:eaf6c49a86e4 71 PGPKEY_URL, //!< PGPKEY_URL
giovannivisentini 4:eaf6c49a86e4 72 PGPGKEY_BASE64,//!< PGPGKEY_BASE64
giovannivisentini 4:eaf6c49a86e4 73 LOGO, //!< LOGO
giovannivisentini 4:eaf6c49a86e4 74 LOGO_URI, //!< LOGO_URI
giovannivisentini 4:eaf6c49a86e4 75 LOGO_BASE64, //!< generic hardcoded image add TYPE=XXXX:imagebyte
giovannivisentini 4:eaf6c49a86e4 76 NAME, //!< NAME
giovannivisentini 4:eaf6c49a86e4 77 NICKNAME, //!< NICKNAME
giovannivisentini 4:eaf6c49a86e4 78 NOTE, //!< NOTE
giovannivisentini 4:eaf6c49a86e4 79 ORGANIZATION, //!< ORGANIZATION
giovannivisentini 4:eaf6c49a86e4 80 PHOTO_URI, //!< PHOTO_URI
giovannivisentini 4:eaf6c49a86e4 81 PHOTO_BASE64, //!< generic hardcoded image add TYPE=XXXX:imagebyte
giovannivisentini 4:eaf6c49a86e4 82 REVISION, //!< REVISION
giovannivisentini 4:eaf6c49a86e4 83 SOURCE_URL, //!< SOURCE_URL
giovannivisentini 4:eaf6c49a86e4 84 TEL, //!< TEL
giovannivisentini 4:eaf6c49a86e4 85 TEL_HOME, //!< TEL_HOME
giovannivisentini 4:eaf6c49a86e4 86 TEL_WORK, //!< TEL_WORK
giovannivisentini 4:eaf6c49a86e4 87 TEL_MOBILE, //!< TEL_MOBILE
giovannivisentini 4:eaf6c49a86e4 88 TITLE, //!< TITLE
giovannivisentini 4:eaf6c49a86e4 89 URL, //!< URL
giovannivisentini 4:eaf6c49a86e4 90 } VCardField_t;
giovannivisentini 2:760e36ba9c23 91
giovannivisentini 4:eaf6c49a86e4 92 /**
giovannivisentini 12:ed4d9b8d1410 93 * Type used to store the vcard information.
giovannivisentini 4:eaf6c49a86e4 94 */
giovannivisentini 4:eaf6c49a86e4 95 typedef std::map<VCardField_t, std::string> VCardInfo_t;
giovannivisentini 2:760e36ba9c23 96
giovannivisentini 4:eaf6c49a86e4 97 /**
giovannivisentini 12:ed4d9b8d1410 98 * Create a RecordVCard reading the data from the buffer.
giovannivisentini 12:ed4d9b8d1410 99 * @param header Record header.
giovannivisentini 12:ed4d9b8d1410 100 * @param buffer Buffer to read the data from.
giovannivisentini 4:eaf6c49a86e4 101 * @return an object of type RecordVCard or NULL
giovannivisentini 12:ed4d9b8d1410 102 * @par User is in charge of freeing the pointer returned by this function.
giovannivisentini 4:eaf6c49a86e4 103 */
giovannivisentini 4:eaf6c49a86e4 104 static RecordVCard* parse(const RecordHeader &header,
giovannivisentini 2:760e36ba9c23 105 const uint8_t* buffer);
giovannivisentini 2:760e36ba9c23 106
giovannivisentini 4:eaf6c49a86e4 107 /**
giovannivisentini 12:ed4d9b8d1410 108 * Create a record with the specific information.
giovannivisentini 12:ed4d9b8d1410 109 * @param Info optional information to store into the record.
giovannivisentini 4:eaf6c49a86e4 110 */
giovannivisentini 5:f2b7efcc5b6e 111 explicit RecordVCard(const VCardInfo_t &info=VCardInfo_t());
giovannivisentini 2:760e36ba9c23 112
giovannivisentini 4:eaf6c49a86e4 113 /**
giovannivisentini 12:ed4d9b8d1410 114 * Get the specific information stored in this record.
giovannivisentini 12:ed4d9b8d1410 115 * @param Type type of information to get.
giovannivisentini 12:ed4d9b8d1410 116 * @return if present, the information or an empty string
giovannivisentini 4:eaf6c49a86e4 117 */
giovannivisentini 4:eaf6c49a86e4 118 const std::string& operator[](const VCardField_t &type)const {
giovannivisentini 4:eaf6c49a86e4 119 VCardInfo_t::const_iterator elem = mCardInfo.find(type);
Davidroid 20:31f727872290 120 if (elem == mCardInfo.end()) {
giovannivisentini 2:760e36ba9c23 121 return sEmptyTagContent;
Davidroid 20:31f727872290 122 }
Davidroid 20:31f727872290 123
giovannivisentini 2:760e36ba9c23 124 return elem->second;
giovannivisentini 2:760e36ba9c23 125 }
giovannivisentini 2:760e36ba9c23 126
giovannivisentini 4:eaf6c49a86e4 127 /**
giovannivisentini 12:ed4d9b8d1410 128 * Get or set/change an information associated with this record.
giovannivisentini 12:ed4d9b8d1410 129 * @param type Type of information to change.
giovannivisentini 4:eaf6c49a86e4 130 * @return reference to the string information
giovannivisentini 4:eaf6c49a86e4 131 */
giovannivisentini 4:eaf6c49a86e4 132 std::string& operator[](const VCardField_t &type) {
giovannivisentini 4:eaf6c49a86e4 133 mContentIsChange=true;
giovannivisentini 4:eaf6c49a86e4 134 return mCardInfo[type];
giovannivisentini 4:eaf6c49a86e4 135 }
giovannivisentini 9:689c1f56f359 136
giovannivisentini 9:689c1f56f359 137 /**
giovannivisentini 12:ed4d9b8d1410 138 * Get the record type.
giovannivisentini 9:689c1f56f359 139 * @return TYPE_MIME_VCARD
giovannivisentini 9:689c1f56f359 140 */
giovannivisentini 19:13d84b136a62 141 virtual RecordType_t get_type() const {
giovannivisentini 2:760e36ba9c23 142 return TYPE_MIME_VCARD;
giovannivisentini 4:eaf6c49a86e4 143 } //getType
giovannivisentini 4:eaf6c49a86e4 144
giovannivisentini 9:689c1f56f359 145 /**
giovannivisentini 9:689c1f56f359 146 * @return update the record content and return the number of
giovannivisentini 12:ed4d9b8d1410 147 * bytes needed to store this record
giovannivisentini 9:689c1f56f359 148 */
giovannivisentini 19:13d84b136a62 149 virtual uint16_t get_byte_length() {
giovannivisentini 19:13d84b136a62 150 update_content_info_string();
giovannivisentini 19:13d84b136a62 151 return RecordMimeType::get_byte_length();
giovannivisentini 4:eaf6c49a86e4 152 }
giovannivisentini 2:760e36ba9c23 153
giovannivisentini 9:689c1f56f359 154 /**
giovannivisentini 12:ed4d9b8d1410 155 * Update the content and write it on the buffer.
giovannivisentini 12:ed4d9b8d1410 156 * @param[out] buffer buffer to write the record content into.
giovannivisentini 12:ed4d9b8d1410 157 * @return number of bytes written
giovannivisentini 9:689c1f56f359 158 * @see Record#write
giovannivisentini 9:689c1f56f359 159 */
giovannivisentini 4:eaf6c49a86e4 160 virtual uint16_t write(uint8_t *buffer){
giovannivisentini 19:13d84b136a62 161 update_content_info_string();
giovannivisentini 4:eaf6c49a86e4 162 return RecordMimeType::write(buffer);
giovannivisentini 4:eaf6c49a86e4 163 }
giovannivisentini 4:eaf6c49a86e4 164
giovannivisentini 9:689c1f56f359 165 /**
giovannivisentini 12:ed4d9b8d1410 166 * Compare two objects.
giovannivisentini 9:689c1f56f359 167 * @return true if the records have the same Vcard information
giovannivisentini 9:689c1f56f359 168 */
giovannivisentini 7:1ebd6049fa57 169 bool operator==(const RecordVCard &other){
giovannivisentini 7:1ebd6049fa57 170 return (mCardInfo==other.mCardInfo);
giovannivisentini 7:1ebd6049fa57 171 }
giovannivisentini 7:1ebd6049fa57 172
giovannivisentini 4:eaf6c49a86e4 173 virtual ~RecordVCard() {
giovannivisentini 4:eaf6c49a86e4 174 }
giovannivisentini 2:760e36ba9c23 175
giovannivisentini 2:760e36ba9c23 176 private:
giovannivisentini 4:eaf6c49a86e4 177 VCardInfo_t mCardInfo;
giovannivisentini 9:689c1f56f359 178
giovannivisentini 9:689c1f56f359 179 std::string mCardInfoString; ///< buffer containing the Vcard representation for this record
giovannivisentini 9:689c1f56f359 180
giovannivisentini 9:689c1f56f359 181 bool mContentIsChange; ///< true if we have to upadte the string rappresentation of the data
giovannivisentini 2:760e36ba9c23 182
giovannivisentini 9:689c1f56f359 183 /**
giovannivisentini 12:ed4d9b8d1410 184 * Generate a string representing the vcard info
giovannivisentini 9:689c1f56f359 185 */
giovannivisentini 19:13d84b136a62 186 void update_content_info_string();
giovannivisentini 2:760e36ba9c23 187
giovannivisentini 4:eaf6c49a86e4 188 /**
giovannivisentini 12:ed4d9b8d1410 189 * Check if the string that starts from the offset position is a valid
giovannivisentini 12:ed4d9b8d1410 190 * vcard field.
giovannivisentini 12:ed4d9b8d1410 191 * @param content String to search into.
giovannivisentini 12:ed4d9b8d1410 192 * @param offset Search offset.
giovannivisentini 12:ed4d9b8d1410 193 * @return type index of the found field or a negative number if not a valid vcard
giovannivisentini 4:eaf6c49a86e4 194 */
giovannivisentini 19:13d84b136a62 195 static int8_t find_VCard_field_type(const std::string &content,
giovannivisentini 4:eaf6c49a86e4 196 uint16_t offset);
giovannivisentini 2:760e36ba9c23 197
giovannivisentini 4:eaf6c49a86e4 198 /**
giovannivisentini 12:ed4d9b8d1410 199 * Return the lenght of a vcard field.
giovannivisentini 12:ed4d9b8d1410 200 * @param Content string to search into.
giovannivisentini 12:ed4d9b8d1410 201 * @param Offset search offset.
giovannivisentini 4:eaf6c49a86e4 202 * @return field length
giovannivisentini 12:ed4d9b8d1410 203 * @par This function searches the first sEndVCardTag appearance.
giovannivisentini 4:eaf6c49a86e4 204 */
giovannivisentini 19:13d84b136a62 205 static uint16_t find_VCard_field_data_lenght(const std::string &content,
giovannivisentini 4:eaf6c49a86e4 206 uint16_t offset);
giovannivisentini 2:760e36ba9c23 207
giovannivisentini 2:760e36ba9c23 208 static const std::string sVcardMimeType;
giovannivisentini 2:760e36ba9c23 209 static const std::string sStartFieldTag[];
giovannivisentini 2:760e36ba9c23 210 static const std::string sEndFieldTag;
giovannivisentini 2:760e36ba9c23 211 static const std::string sStartVCardTag;
giovannivisentini 2:760e36ba9c23 212 static const std::string sEndVCardTag;
giovannivisentini 2:760e36ba9c23 213 static const std::string sEmptyTagContent;
giovannivisentini 2:760e36ba9c23 214 };
giovannivisentini 2:760e36ba9c23 215
giovannivisentini 2:760e36ba9c23 216 } /* namespace NDefLib */
giovannivisentini 2:760e36ba9c23 217
giovannivisentini 2:760e36ba9c23 218 #endif /* NDEFLIB_RECORDTYPE_RECORDVCARD_H_ */
Davidroid 20:31f727872290 219
Davidroid 20:31f727872290 220
Davidroid 20:31f727872290 221 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/