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:
19:13d84b136a62
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 RecordURI.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 12:ed4d9b8d1410 7 * @brief {@link Record} that contains an URI address
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 1:a0eeb478a45a 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 1:a0eeb478a45a 36 */
giovannivisentini 1:a0eeb478a45a 37
giovannivisentini 1:a0eeb478a45a 38 #ifndef NDEFLIB_RECORDTYPE_RECORDURI_H_
giovannivisentini 1:a0eeb478a45a 39 #define NDEFLIB_RECORDTYPE_RECORDURI_H_
giovannivisentini 1:a0eeb478a45a 40 #include <map>
giovannivisentini 1:a0eeb478a45a 41 #include <string>
giovannivisentini 1:a0eeb478a45a 42 #include <NDefLib/Record.h>
giovannivisentini 1:a0eeb478a45a 43
giovannivisentini 1:a0eeb478a45a 44 namespace NDefLib {
giovannivisentini 1:a0eeb478a45a 45
giovannivisentini 4:eaf6c49a86e4 46 /**
giovannivisentini 12:ed4d9b8d1410 47 * {@link Record} that contains an URI address.
giovannivisentini 4:eaf6c49a86e4 48 */
giovannivisentini 1:a0eeb478a45a 49 class RecordURI: public Record {
giovannivisentini 1:a0eeb478a45a 50
giovannivisentini 1:a0eeb478a45a 51 public:
giovannivisentini 1:a0eeb478a45a 52
giovannivisentini 4:eaf6c49a86e4 53 /**
giovannivisentini 12:ed4d9b8d1410 54 * Load a record URI from a buffer.
giovannivisentini 12:ed4d9b8d1410 55 * @param header Record header.
giovannivisentini 12:ed4d9b8d1410 56 * @param buffer Buffer to read the tag playload from.
giovannivisentini 4:eaf6c49a86e4 57 * @return record or NULL if it was not possible build it
giovannivisentini 12:ed4d9b8d1410 58 * @par User is in charge of freeing the pointer returned by this function.
giovannivisentini 4:eaf6c49a86e4 59 */
giovannivisentini 4:eaf6c49a86e4 60 static RecordURI* parse(const RecordHeader &header,
giovannivisentini 1:a0eeb478a45a 61 const uint8_t *buffer);
giovannivisentini 1:a0eeb478a45a 62
giovannivisentini 4:eaf6c49a86e4 63 /**
giovannivisentini 12:ed4d9b8d1410 64 * If you want encode an know URI you can use this define to
giovannivisentini 12:ed4d9b8d1410 65 * avoid to encode the URI type as string
giovannivisentini 4:eaf6c49a86e4 66 */
giovannivisentini 1:a0eeb478a45a 67 typedef enum {
giovannivisentini 4:eaf6c49a86e4 68 UNKNOWN = 0X00, //!< UNKNOWN
giovannivisentini 4:eaf6c49a86e4 69 HTTP_WWW = 0X01, //!< HTTP_WWW
giovannivisentini 4:eaf6c49a86e4 70 HTTPS_WWW = 0X02, //!< HTTPS_WWW
giovannivisentini 4:eaf6c49a86e4 71 HTTP = 0X03, //!< HTTP
giovannivisentini 4:eaf6c49a86e4 72 HTTPS = 0X04, //!< HTTPS
giovannivisentini 4:eaf6c49a86e4 73 TEL = 0x05, //!< TEL
giovannivisentini 4:eaf6c49a86e4 74 MAIL = 0X06, //!< MAIL
giovannivisentini 4:eaf6c49a86e4 75 FTP_ANONIMUS = 0X07,//!< FTP_ANONIMUS
giovannivisentini 4:eaf6c49a86e4 76 FTP_FTP = 0X08, //!< FTP_FTP
giovannivisentini 4:eaf6c49a86e4 77 FTPS = 0X09, //!< FTPS
giovannivisentini 4:eaf6c49a86e4 78 SFTP = 0X0A, //!< SFTP
giovannivisentini 4:eaf6c49a86e4 79 SMB = 0X0B, //!< SMB
giovannivisentini 4:eaf6c49a86e4 80 NFS = 0X0C, //!< NFS
giovannivisentini 4:eaf6c49a86e4 81 FTP = 0X0d, //!< FTP
giovannivisentini 4:eaf6c49a86e4 82 DAV = 0X0E, //!< DAV
giovannivisentini 4:eaf6c49a86e4 83 NEWS = 0X0F, //!< NEWS
giovannivisentini 4:eaf6c49a86e4 84 TELNET = 0X10, //!< TELNET
giovannivisentini 4:eaf6c49a86e4 85 IMAP = 0X11, //!< IMAP
giovannivisentini 4:eaf6c49a86e4 86 RTSP = 0X12, //!< RTSP
giovannivisentini 4:eaf6c49a86e4 87 URN = 0X13, //!< URN
giovannivisentini 4:eaf6c49a86e4 88 POP = 0X14, //!< POP
giovannivisentini 4:eaf6c49a86e4 89 SIP = 0X15, //!< SIP
giovannivisentini 4:eaf6c49a86e4 90 SIPS = 0X016, //!< SIPS
giovannivisentini 4:eaf6c49a86e4 91 TFTP = 0X017, //!< TFTP
giovannivisentini 4:eaf6c49a86e4 92 BTSPP = 0x018, //!< BTSPP
giovannivisentini 4:eaf6c49a86e4 93 BTL2CAP = 0x019, //!< BTL2CAP
giovannivisentini 4:eaf6c49a86e4 94 BTGOEP = 0X01A, //!< BTGOEP
giovannivisentini 4:eaf6c49a86e4 95 TCPOBEX = 0X1B, //!< TCPOBEX
giovannivisentini 4:eaf6c49a86e4 96 IRDAOBEX = 0X1C, //!< IRDAOBEX
giovannivisentini 4:eaf6c49a86e4 97 FILE = 0X1D, //!< FILE
giovannivisentini 4:eaf6c49a86e4 98 URN_EPC_ID = 0X1E, //!< URN_EPC_ID
giovannivisentini 4:eaf6c49a86e4 99 URN_EPC_TAG = 0X1F, //!< URN_EPC_TAG
giovannivisentini 4:eaf6c49a86e4 100 URN_EPC_PAT = 0X20, //!< URN_EPC_PAT
giovannivisentini 4:eaf6c49a86e4 101 URN_EPC_RAW = 0X21, //!< URN_EPC_RAW
giovannivisentini 4:eaf6c49a86e4 102 URN_EPC = 0X22, //!< URN_EPC
giovannivisentini 4:eaf6c49a86e4 103 URN_NFC = 0X23 //!< URN_NFC
giovannivisentini 1:a0eeb478a45a 104 } knowUriId_t;
giovannivisentini 1:a0eeb478a45a 105
giovannivisentini 4:eaf6c49a86e4 106 /**
giovannivisentini 12:ed4d9b8d1410 107 * Build RecordUri with a defined URI type.
giovannivisentini 12:ed4d9b8d1410 108 * @param URIId URI type.
giovannivisentini 12:ed4d9b8d1410 109 * @param URIContent URI content.
giovannivisentini 12:ed4d9b8d1410 110 * @par The URI prefix is removed.
giovannivisentini 12:ed4d9b8d1410 111 * @par The string is copied inside the class.
giovannivisentini 4:eaf6c49a86e4 112 */
giovannivisentini 12:ed4d9b8d1410 113 explicit RecordURI(knowUriId_t URIId, const std::string &URIContent="");
giovannivisentini 1:a0eeb478a45a 114
giovannivisentini 4:eaf6c49a86e4 115 /**
giovannivisentini 12:ed4d9b8d1410 116 * Build a custom URI type.
giovannivisentini 12:ed4d9b8d1410 117 * @param URIType string with the URI type.
giovannivisentini 12:ed4d9b8d1410 118 * @param URIContent URI content.
giovannivisentini 4:eaf6c49a86e4 119 */
giovannivisentini 12:ed4d9b8d1410 120 explicit RecordURI(const std::string &URIType, const std::string &URIContent="");
giovannivisentini 1:a0eeb478a45a 121
giovannivisentini 9:689c1f56f359 122 /**
giovannivisentini 12:ed4d9b8d1410 123 * Get the record type.
giovannivisentini 9:689c1f56f359 124 * @return TYPE_URI
giovannivisentini 9:689c1f56f359 125 */
giovannivisentini 19:13d84b136a62 126 virtual RecordType_t get_type() const {
giovannivisentini 1:a0eeb478a45a 127 return TYPE_URI;
giovannivisentini 4:eaf6c49a86e4 128 } //getType
giovannivisentini 1:a0eeb478a45a 129
giovannivisentini 9:689c1f56f359 130 /**
giovannivisentini 12:ed4d9b8d1410 131 * Returns the URI type.
giovannivisentini 13:dbf3a61d70b3 132 * @return URI type inside this record, UNKNOWN if unknown
giovannivisentini 9:689c1f56f359 133 */
giovannivisentini 19:13d84b136a62 134 knowUriId_t get_uri_id() const {
giovannivisentini 1:a0eeb478a45a 135 return mUriTypeId;
giovannivisentini 1:a0eeb478a45a 136 }
giovannivisentini 1:a0eeb478a45a 137
giovannivisentini 19:13d84b136a62 138 virtual uint16_t get_byte_length() {
giovannivisentini 19:13d84b136a62 139 update_content_and_header();
giovannivisentini 19:13d84b136a62 140 return mRecordHeader.get_record_length();
giovannivisentini 4:eaf6c49a86e4 141 }
giovannivisentini 4:eaf6c49a86e4 142
giovannivisentini 9:689c1f56f359 143 /**
giovannivisentini 12:ed4d9b8d1410 144 * Returns the URI content.
giovannivisentini 12:ed4d9b8d1410 145 * @return URI content
giovannivisentini 9:689c1f56f359 146 */
giovannivisentini 19:13d84b136a62 147 std::string& get_content() {
giovannivisentini 19:13d84b136a62 148 update_content_and_header();
giovannivisentini 1:a0eeb478a45a 149 return mContent;
giovannivisentini 1:a0eeb478a45a 150 }
giovannivisentini 1:a0eeb478a45a 151
giovannivisentini 9:689c1f56f359 152 /**
giovannivisentini 12:ed4d9b8d1410 153 * Change the URI content.
giovannivisentini 12:ed4d9b8d1410 154 * @param URI new URI content.
giovannivisentini 9:689c1f56f359 155 */
giovannivisentini 19:13d84b136a62 156 void set_content(const std::string &URI){
giovannivisentini 4:eaf6c49a86e4 157 if(mUriTypeId!=UNKNOWN)
giovannivisentini 19:13d84b136a62 158 store_removeing_prefix(sKnowUriPrefix[mUriTypeId],URI);
giovannivisentini 4:eaf6c49a86e4 159 else
giovannivisentini 12:ed4d9b8d1410 160 mContent=URI;
giovannivisentini 19:13d84b136a62 161 update_content_and_header();
giovannivisentini 4:eaf6c49a86e4 162 }
giovannivisentini 4:eaf6c49a86e4 163
giovannivisentini 9:689c1f56f359 164 /**
giovannivisentini 12:ed4d9b8d1410 165 * If the URI type Id is {@code UNKNOWN} this return the user
giovannivisentini 12:ed4d9b8d1410 166 * URI type.
giovannivisentini 12:ed4d9b8d1410 167 * @return URI type set by the user or an empyt string
giovannivisentini 9:689c1f56f359 168 */
giovannivisentini 19:13d84b136a62 169 const std::string& get_uri_type() const {
giovannivisentini 1:a0eeb478a45a 170 return mTypeString;
giovannivisentini 1:a0eeb478a45a 171 }
giovannivisentini 1:a0eeb478a45a 172
giovannivisentini 7:1ebd6049fa57 173 bool operator==(const RecordURI &other) const {
giovannivisentini 7:1ebd6049fa57 174 return (mUriTypeId==other.mUriTypeId) &&
giovannivisentini 7:1ebd6049fa57 175 (mTypeString==other.mTypeString) &&
giovannivisentini 7:1ebd6049fa57 176 (mContent==other.mContent);
giovannivisentini 7:1ebd6049fa57 177 }
giovannivisentini 7:1ebd6049fa57 178
giovannivisentini 13:dbf3a61d70b3 179 virtual uint16_t write(uint8_t *buffer);
giovannivisentini 4:eaf6c49a86e4 180 virtual ~RecordURI() {
giovannivisentini 4:eaf6c49a86e4 181 };
giovannivisentini 1:a0eeb478a45a 182
giovannivisentini 1:a0eeb478a45a 183 protected:
giovannivisentini 4:eaf6c49a86e4 184
giovannivisentini 4:eaf6c49a86e4 185 /**
giovannivisentini 12:ed4d9b8d1410 186 * Record id to write to be recognizable as an URI record.
giovannivisentini 4:eaf6c49a86e4 187 */
giovannivisentini 1:a0eeb478a45a 188 static const uint8_t sNDEFUriIdCode;
giovannivisentini 1:a0eeb478a45a 189
giovannivisentini 4:eaf6c49a86e4 190 /**
giovannivisentini 12:ed4d9b8d1410 191 * A subclass must implement this function to store the tag content and update the mContent
giovannivisentini 12:ed4d9b8d1410 192 * variable accordingly.
giovannivisentini 12:ed4d9b8d1410 193 * @par You should not call this function directly but use updateContentAndHeader that keeps the
giovannivisentini 12:ed4d9b8d1410 194 * header information in sync with the content.
giovannivisentini 4:eaf6c49a86e4 195 */
giovannivisentini 19:13d84b136a62 196 virtual void update_content(){};
giovannivisentini 4:eaf6c49a86e4 197
giovannivisentini 4:eaf6c49a86e4 198 /**
giovannivisentini 12:ed4d9b8d1410 199 * Update the tag content and update the header with the new content size.
giovannivisentini 7:1ebd6049fa57 200 */
giovannivisentini 19:13d84b136a62 201 void update_content_and_header(){
giovannivisentini 19:13d84b136a62 202 update_content();
giovannivisentini 19:13d84b136a62 203 update_record_header();
giovannivisentini 7:1ebd6049fa57 204 }
giovannivisentini 7:1ebd6049fa57 205
giovannivisentini 7:1ebd6049fa57 206 /**
giovannivisentini 12:ed4d9b8d1410 207 * The subclass must store in this variable the content to write to the tag.
giovannivisentini 12:ed4d9b8d1410 208 * This class will ask to update the content throught the updateContent callback.
giovannivisentini 4:eaf6c49a86e4 209 */
giovannivisentini 4:eaf6c49a86e4 210 std::string mContent;
giovannivisentini 4:eaf6c49a86e4 211
giovannivisentini 1:a0eeb478a45a 212 private:
giovannivisentini 1:a0eeb478a45a 213
giovannivisentini 4:eaf6c49a86e4 214 /**
giovannivisentini 12:ed4d9b8d1410 215 * Set the record header flags.
giovannivisentini 4:eaf6c49a86e4 216 */
giovannivisentini 19:13d84b136a62 217 void set_record_header();
giovannivisentini 1:a0eeb478a45a 218
giovannivisentini 4:eaf6c49a86e4 219 /**
giovannivisentini 12:ed4d9b8d1410 220 * Set the correct size of the payload.
giovannivisentini 4:eaf6c49a86e4 221 */
giovannivisentini 19:13d84b136a62 222 void update_record_header(){
giovannivisentini 12:ed4d9b8d1410 223 //+1 = size of the URITypeId
giovannivisentini 19:13d84b136a62 224 mRecordHeader.set_payload_length(1 + mTypeString.size() + mContent.size());
giovannivisentini 4:eaf6c49a86e4 225 }
giovannivisentini 4:eaf6c49a86e4 226
giovannivisentini 19:13d84b136a62 227 void store_removeing_prefix(const std::string &prefix,const std::string &content){
giovannivisentini 4:eaf6c49a86e4 228 //check that the content doens't contain the prefix
giovannivisentini 4:eaf6c49a86e4 229 if (content.compare(0, prefix.size(), prefix) == 0) {
giovannivisentini 4:eaf6c49a86e4 230 mContent = std::string(content, prefix.size());
giovannivisentini 4:eaf6c49a86e4 231 } else
giovannivisentini 4:eaf6c49a86e4 232 mContent = content;
giovannivisentini 4:eaf6c49a86e4 233 }
giovannivisentini 4:eaf6c49a86e4 234
giovannivisentini 4:eaf6c49a86e4 235 /**
giovannivisentini 12:ed4d9b8d1410 236 * URI type used by this record
giovannivisentini 4:eaf6c49a86e4 237 */
giovannivisentini 1:a0eeb478a45a 238 const knowUriId_t mUriTypeId;
giovannivisentini 4:eaf6c49a86e4 239
giovannivisentini 4:eaf6c49a86e4 240 /**
giovannivisentini 12:ed4d9b8d1410 241 * In case of unknown URI type, it stores the used defined URI type.
giovannivisentini 4:eaf6c49a86e4 242 */
giovannivisentini 1:a0eeb478a45a 243 const std::string mTypeString;
giovannivisentini 1:a0eeb478a45a 244
giovannivisentini 1:a0eeb478a45a 245
giovannivisentini 4:eaf6c49a86e4 246 /**
giovannivisentini 12:ed4d9b8d1410 247 * Array of known prefix of known URI type
giovannivisentini 4:eaf6c49a86e4 248 */
giovannivisentini 1:a0eeb478a45a 249 static const std::string sKnowUriPrefix[];
giovannivisentini 1:a0eeb478a45a 250 };
giovannivisentini 1:a0eeb478a45a 251
giovannivisentini 1:a0eeb478a45a 252 } /* namespace NDefLib */
giovannivisentini 1:a0eeb478a45a 253
giovannivisentini 1:a0eeb478a45a 254 #endif /* NDEFLIB_RECORDTYPE_RECORDURI_H_ */