CUSTOMIZED FOR WATER MONITOR
Diff: RecordMimeType.h
- Revision:
- 0:51d7bdf88981
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RecordMimeType.h Thu Dec 07 17:07:22 2017 +0000 @@ -0,0 +1,180 @@ +/** + ****************************************************************************** + * @file RecordMimeType.h + * @author ST / Central Labs + * @version V2.0.0 + * @date 28 Apr 2017 + * @brief {@link Record} that contains data encoded as MimeType. + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +#ifndef NDEFLIB_RECORDTYPE_RECORDMIMETYPE_H_ +#define NDEFLIB_RECORDTYPE_RECORDMIMETYPE_H_ + +#include <cstring> +#include <string> + +#include "NDefLib/Record.h" + +namespace NDefLib { + +/** + * {@link Record} that contains data encoded as MimeType. + */ +class RecordMimeType: public Record { +public: + + /** + * Create an RecordMimeType reading the data from the buffer. + * @param header Record header. + * @param buffer Buffer to read the data from. + * @return an object of type RecordMimeType or NULL + * @par User is in charge of freeing the pointer returned by this function. + */ + static RecordMimeType* parse(const RecordHeader &header, + const uint8_t* buffer); + + /** + * Create a new record with a specific MIME type. + * @param mimeType MIME type. + * @param data Content. + * @param nDataLenght Content length in bytes. + * @par Data content is copied inside the class, unless NULL pointer is passed and + * @{link setMimeDataPointer} is used to set the data pointer. + */ + RecordMimeType(const std::string &mimeType, const uint8_t *data=NULL, + uint32_t nDataLenght=0); + + /** + * Create a new RecordMimeType. + * @param mimeType MIME type. + * @param data String that contains the data. + * @par The string is copied inside the class. + */ + RecordMimeType(const std::string &mimeType, const std::string &data); + + /** + * Return the mime type of the content. + * @return the mime type of the content. + */ + const std::string& get_mime_type() const { + return mMimeType; + } + + /** + * Change the data pointer used by this record. + * @param data Pointer used by this record. + * @param dataLength Number of byte to write in this record. + * @par The buffer is not copied or freed by this class. + * With this function only the data pointer is copied, so it must not be freed before the object is deallocated. + */ + void set_mime_data_pointer(uint8_t* data, uint32_t dataLength){ + delete_mime_data(); + mData = data; + mDataLength=dataLength; + mRecordHeader.set_payload_length(dataLength); + } + + /** + * Change the data linked with this record, with this function the + * data are copied inside the object. + * @param data Pointer to the data buffer. + * @param dataLength Number of bytes to write. + */ + void copy_mime_data(const uint8_t* data, uint32_t dataLength); + + /** + * @return number of bytes used to store the content data + */ + uint32_t get_mime_data_lenght() const { + return mDataLength; + } + + /** + * @return pointer to the content data + * @par DO NOT free this pointer, it is managed by the class. + */ + uint8_t const* get_mime_data() const { + return mData; + } + + /** + * Get the record type. + * @return TYPE_MIME + */ + virtual RecordType_t get_type() const { + return TYPE_MIME; + } //getType + + + virtual uint16_t write(uint8_t *buffer); + + /** + * If needed free the memory used to store the content data. + */ + virtual ~RecordMimeType() { + delete_mime_data(); + }; + + /** + * Compare two objects + * @return true if the 2 records have the same mime type, length and data. + */ + bool operator==(const RecordMimeType &other) const { + return mMimeType==other.mMimeType && + mDataLength == other.mDataLength && + (std::memcmp(mData,other.mData,mDataLength)==0); + } + +private: + + void initialize_header_data(); + + /** + * Delete the mData buffer if it is allocated by this class. + */ + void delete_mime_data(){ + if(mDataToFree && mData!=NULL){ + mDataToFree=false; + delete [] mData; + mData=NULL; + }//if + }//deleteMimeData + + const std::string mMimeType; + uint32_t mDataLength; + uint8_t *mData; + bool mDataToFree; + +}; + +} /* namespace NDefLib */ + +#endif /* NDEFLIB_RECORDTYPE_RECORDMIMETYPE_H_ */