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 RecordMimeType.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 data encoded as MimeType.
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 0:04b82ae7aa43 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 0:04b82ae7aa43 36 */
giovannivisentini 0:04b82ae7aa43 37
giovannivisentini 0:04b82ae7aa43 38 #ifndef NDEFLIB_RECORDTYPE_RECORDMIMETYPE_H_
giovannivisentini 0:04b82ae7aa43 39 #define NDEFLIB_RECORDTYPE_RECORDMIMETYPE_H_
giovannivisentini 0:04b82ae7aa43 40
giovannivisentini 7:1ebd6049fa57 41 #include <cstring>
giovannivisentini 0:04b82ae7aa43 42 #include <string>
giovannivisentini 0:04b82ae7aa43 43
giovannivisentini 4:eaf6c49a86e4 44 #include "NDefLib/Record.h"
giovannivisentini 0:04b82ae7aa43 45
giovannivisentini 0:04b82ae7aa43 46 namespace NDefLib {
giovannivisentini 0:04b82ae7aa43 47
giovannivisentini 4:eaf6c49a86e4 48 /**
giovannivisentini 12:ed4d9b8d1410 49 * {@link Record} that contains data encoded as MimeType.
giovannivisentini 4:eaf6c49a86e4 50 */
giovannivisentini 0:04b82ae7aa43 51 class RecordMimeType: public Record {
giovannivisentini 0:04b82ae7aa43 52 public:
giovannivisentini 4:eaf6c49a86e4 53
giovannivisentini 9:689c1f56f359 54 /**
giovannivisentini 12:ed4d9b8d1410 55 * Create an RecordMimeType reading the data from the buffer.
giovannivisentini 12:ed4d9b8d1410 56 * @param header Record header.
giovannivisentini 12:ed4d9b8d1410 57 * @param buffer Buffer to read the data from.
giovannivisentini 9:689c1f56f359 58 * @return an object of type RecordMimeType or NULL
giovannivisentini 12:ed4d9b8d1410 59 * @par User is in charge of freeing the pointer returned by this function.
giovannivisentini 9:689c1f56f359 60 */
giovannivisentini 4:eaf6c49a86e4 61 static RecordMimeType* parse(const RecordHeader &header,
giovannivisentini 1:a0eeb478a45a 62 const uint8_t* buffer);
giovannivisentini 1:a0eeb478a45a 63
giovannivisentini 4:eaf6c49a86e4 64 /**
giovannivisentini 12:ed4d9b8d1410 65 * Create a new record with a specific MIME type.
giovannivisentini 12:ed4d9b8d1410 66 * @param mimeType MIME type.
giovannivisentini 12:ed4d9b8d1410 67 * @param data Content.
giovannivisentini 12:ed4d9b8d1410 68 * @param nDataLenght Content length in bytes.
giovannivisentini 12:ed4d9b8d1410 69 * @par Data content is copied inside the class, unless NULL pointer is passed and
giovannivisentini 12:ed4d9b8d1410 70 * @{link setMimeDataPointer} is used to set the data pointer.
giovannivisentini 4:eaf6c49a86e4 71 */
giovannivisentini 7:1ebd6049fa57 72 RecordMimeType(const std::string &mimeType, const uint8_t *data=NULL,
giovannivisentini 4:eaf6c49a86e4 73 uint32_t nDataLenght=0);
giovannivisentini 0:04b82ae7aa43 74
giovannivisentini 9:689c1f56f359 75 /**
giovannivisentini 12:ed4d9b8d1410 76 * Create a new RecordMimeType.
giovannivisentini 12:ed4d9b8d1410 77 * @param mimeType MIME type.
giovannivisentini 12:ed4d9b8d1410 78 * @param data String that contains the data.
giovannivisentini 12:ed4d9b8d1410 79 * @par The string is copied inside the class.
giovannivisentini 9:689c1f56f359 80 */
giovannivisentini 7:1ebd6049fa57 81 RecordMimeType(const std::string &mimeType, const std::string &data);
giovannivisentini 7:1ebd6049fa57 82
giovannivisentini 9:689c1f56f359 83 /**
giovannivisentini 13:dbf3a61d70b3 84 * Return the mime type of the content.
giovannivisentini 12:ed4d9b8d1410 85 * @return the mime type of the content.
giovannivisentini 9:689c1f56f359 86 */
giovannivisentini 19:13d84b136a62 87 const std::string& get_mime_type() const {
giovannivisentini 1:a0eeb478a45a 88 return mMimeType;
giovannivisentini 1:a0eeb478a45a 89 }
giovannivisentini 1:a0eeb478a45a 90
giovannivisentini 4:eaf6c49a86e4 91 /**
giovannivisentini 12:ed4d9b8d1410 92 * Change the data pointer used by this record.
giovannivisentini 12:ed4d9b8d1410 93 * @param data Pointer used by this record.
giovannivisentini 12:ed4d9b8d1410 94 * @param dataLength Number of byte to write in this record.
giovannivisentini 12:ed4d9b8d1410 95 * @par The buffer is not copied or freed by this class.
giovannivisentini 12:ed4d9b8d1410 96 * With this function only the data pointer is copied, so it must not be freed before the object is deallocated.
giovannivisentini 4:eaf6c49a86e4 97 */
giovannivisentini 19:13d84b136a62 98 void set_mime_data_pointer(uint8_t* data, uint32_t dataLength){
giovannivisentini 19:13d84b136a62 99 delete_mime_data();
giovannivisentini 4:eaf6c49a86e4 100 mData = data;
giovannivisentini 4:eaf6c49a86e4 101 mDataLength=dataLength;
giovannivisentini 19:13d84b136a62 102 mRecordHeader.set_payload_length(dataLength);
giovannivisentini 1:a0eeb478a45a 103 }
giovannivisentini 4:eaf6c49a86e4 104
giovannivisentini 4:eaf6c49a86e4 105 /**
giovannivisentini 12:ed4d9b8d1410 106 * Change the data linked with this record, with this function the
giovannivisentini 12:ed4d9b8d1410 107 * data are copied inside the object.
giovannivisentini 12:ed4d9b8d1410 108 * @param data Pointer to the data buffer.
giovannivisentini 12:ed4d9b8d1410 109 * @param dataLength Number of bytes to write.
giovannivisentini 4:eaf6c49a86e4 110 */
giovannivisentini 19:13d84b136a62 111 void copy_mime_data(const uint8_t* data, uint32_t dataLength);
giovannivisentini 4:eaf6c49a86e4 112
giovannivisentini 9:689c1f56f359 113 /**
giovannivisentini 12:ed4d9b8d1410 114 * @return number of bytes used to store the content data
giovannivisentini 9:689c1f56f359 115 */
giovannivisentini 19:13d84b136a62 116 uint32_t get_mime_data_lenght() const {
giovannivisentini 4:eaf6c49a86e4 117 return mDataLength;
giovannivisentini 4:eaf6c49a86e4 118 }
giovannivisentini 4:eaf6c49a86e4 119
giovannivisentini 9:689c1f56f359 120 /**
giovannivisentini 12:ed4d9b8d1410 121 * @return pointer to the content data
giovannivisentini 12:ed4d9b8d1410 122 * @par DO NOT free this pointer, it is managed by the class.
giovannivisentini 9:689c1f56f359 123 */
giovannivisentini 19:13d84b136a62 124 uint8_t const* get_mime_data() const {
giovannivisentini 1:a0eeb478a45a 125 return mData;
giovannivisentini 1:a0eeb478a45a 126 }
giovannivisentini 1:a0eeb478a45a 127
giovannivisentini 9:689c1f56f359 128 /**
giovannivisentini 12:ed4d9b8d1410 129 * Get the record type.
giovannivisentini 9:689c1f56f359 130 * @return TYPE_MIME
giovannivisentini 9:689c1f56f359 131 */
giovannivisentini 19:13d84b136a62 132 virtual RecordType_t get_type() const {
giovannivisentini 1:a0eeb478a45a 133 return TYPE_MIME;
giovannivisentini 4:eaf6c49a86e4 134 } //getType
giovannivisentini 1:a0eeb478a45a 135
giovannivisentini 13:dbf3a61d70b3 136
giovannivisentini 13:dbf3a61d70b3 137 virtual uint16_t write(uint8_t *buffer);
giovannivisentini 13:dbf3a61d70b3 138
giovannivisentini 9:689c1f56f359 139 /**
giovannivisentini 12:ed4d9b8d1410 140 * If needed free the memory used to store the content data.
giovannivisentini 9:689c1f56f359 141 */
giovannivisentini 4:eaf6c49a86e4 142 virtual ~RecordMimeType() {
giovannivisentini 19:13d84b136a62 143 delete_mime_data();
giovannivisentini 0:04b82ae7aa43 144 };
giovannivisentini 0:04b82ae7aa43 145
giovannivisentini 9:689c1f56f359 146 /**
giovannivisentini 19:13d84b136a62 147 * Compare two objects
giovannivisentini 12:ed4d9b8d1410 148 * @return true if the 2 records have the same mime type, length and data.
giovannivisentini 9:689c1f56f359 149 */
giovannivisentini 7:1ebd6049fa57 150 bool operator==(const RecordMimeType &other) const {
giovannivisentini 7:1ebd6049fa57 151 return mMimeType==other.mMimeType &&
giovannivisentini 7:1ebd6049fa57 152 mDataLength == other.mDataLength &&
giovannivisentini 7:1ebd6049fa57 153 (std::memcmp(mData,other.mData,mDataLength)==0);
giovannivisentini 7:1ebd6049fa57 154 }
giovannivisentini 7:1ebd6049fa57 155
giovannivisentini 0:04b82ae7aa43 156 private:
giovannivisentini 2:760e36ba9c23 157
giovannivisentini 19:13d84b136a62 158 void initialize_header_data();
giovannivisentini 4:eaf6c49a86e4 159
giovannivisentini 4:eaf6c49a86e4 160 /**
giovannivisentini 12:ed4d9b8d1410 161 * Delete the mData buffer if it is allocated by this class.
giovannivisentini 4:eaf6c49a86e4 162 */
giovannivisentini 19:13d84b136a62 163 void delete_mime_data(){
giovannivisentini 4:eaf6c49a86e4 164 if(mDataToFree && mData!=NULL){
giovannivisentini 4:eaf6c49a86e4 165 mDataToFree=false;
giovannivisentini 4:eaf6c49a86e4 166 delete [] mData;
giovannivisentini 4:eaf6c49a86e4 167 mData=NULL;
giovannivisentini 4:eaf6c49a86e4 168 }//if
giovannivisentini 12:ed4d9b8d1410 169 }//deleteMimeData
giovannivisentini 4:eaf6c49a86e4 170
giovannivisentini 0:04b82ae7aa43 171 const std::string mMimeType;
giovannivisentini 4:eaf6c49a86e4 172 uint32_t mDataLength;
giovannivisentini 4:eaf6c49a86e4 173 uint8_t *mData;
giovannivisentini 4:eaf6c49a86e4 174 bool mDataToFree;
giovannivisentini 0:04b82ae7aa43 175
giovannivisentini 0:04b82ae7aa43 176 };
giovannivisentini 0:04b82ae7aa43 177
giovannivisentini 0:04b82ae7aa43 178 } /* namespace NDefLib */
giovannivisentini 0:04b82ae7aa43 179
giovannivisentini 0:04b82ae7aa43 180 #endif /* NDEFLIB_RECORDTYPE_RECORDMIMETYPE_H_ */