v-16

Committer:
DuyLionTran
Date:
Tue Dec 12 15:58:23 2017 +0000
Revision:
0:89e2c8a57572
version 1.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 0:89e2c8a57572 1 /**
DuyLionTran 0:89e2c8a57572 2 ******************************************************************************
DuyLionTran 0:89e2c8a57572 3 * @file RecordURI.h
DuyLionTran 0:89e2c8a57572 4 * @author ST / Central Labs
DuyLionTran 0:89e2c8a57572 5 * @version V2.0.0
DuyLionTran 0:89e2c8a57572 6 * @date 28 Apr 2017
DuyLionTran 0:89e2c8a57572 7 * @brief {@link Record} that contains an URI address
DuyLionTran 0:89e2c8a57572 8 ******************************************************************************
DuyLionTran 0:89e2c8a57572 9 * @attention
DuyLionTran 0:89e2c8a57572 10 *
DuyLionTran 0:89e2c8a57572 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
DuyLionTran 0:89e2c8a57572 12 *
DuyLionTran 0:89e2c8a57572 13 * Redistribution and use in source and binary forms, with or without modification,
DuyLionTran 0:89e2c8a57572 14 * are permitted provided that the following conditions are met:
DuyLionTran 0:89e2c8a57572 15 * 1. Redistributions of source code must retain the above copyright notice,
DuyLionTran 0:89e2c8a57572 16 * this list of conditions and the following disclaimer.
DuyLionTran 0:89e2c8a57572 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
DuyLionTran 0:89e2c8a57572 18 * this list of conditions and the following disclaimer in the documentation
DuyLionTran 0:89e2c8a57572 19 * and/or other materials provided with the distribution.
DuyLionTran 0:89e2c8a57572 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
DuyLionTran 0:89e2c8a57572 21 * may be used to endorse or promote products derived from this software
DuyLionTran 0:89e2c8a57572 22 * without specific prior written permission.
DuyLionTran 0:89e2c8a57572 23 *
DuyLionTran 0:89e2c8a57572 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
DuyLionTran 0:89e2c8a57572 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
DuyLionTran 0:89e2c8a57572 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DuyLionTran 0:89e2c8a57572 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
DuyLionTran 0:89e2c8a57572 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DuyLionTran 0:89e2c8a57572 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
DuyLionTran 0:89e2c8a57572 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
DuyLionTran 0:89e2c8a57572 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
DuyLionTran 0:89e2c8a57572 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
DuyLionTran 0:89e2c8a57572 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
DuyLionTran 0:89e2c8a57572 34 *
DuyLionTran 0:89e2c8a57572 35 ******************************************************************************
DuyLionTran 0:89e2c8a57572 36 */
DuyLionTran 0:89e2c8a57572 37
DuyLionTran 0:89e2c8a57572 38 #ifndef NDEFLIB_RECORDTYPE_RECORDURI_H_
DuyLionTran 0:89e2c8a57572 39 #define NDEFLIB_RECORDTYPE_RECORDURI_H_
DuyLionTran 0:89e2c8a57572 40 #include <map>
DuyLionTran 0:89e2c8a57572 41 #include <string>
DuyLionTran 0:89e2c8a57572 42 #include <NDefLib/Record.h>
DuyLionTran 0:89e2c8a57572 43
DuyLionTran 0:89e2c8a57572 44 namespace NDefLib {
DuyLionTran 0:89e2c8a57572 45
DuyLionTran 0:89e2c8a57572 46 /**
DuyLionTran 0:89e2c8a57572 47 * {@link Record} that contains an URI address.
DuyLionTran 0:89e2c8a57572 48 */
DuyLionTran 0:89e2c8a57572 49 class RecordURI: public Record {
DuyLionTran 0:89e2c8a57572 50
DuyLionTran 0:89e2c8a57572 51 public:
DuyLionTran 0:89e2c8a57572 52
DuyLionTran 0:89e2c8a57572 53 /**
DuyLionTran 0:89e2c8a57572 54 * Load a record URI from a buffer.
DuyLionTran 0:89e2c8a57572 55 * @param header Record header.
DuyLionTran 0:89e2c8a57572 56 * @param buffer Buffer to read the tag playload from.
DuyLionTran 0:89e2c8a57572 57 * @return record or NULL if it was not possible build it
DuyLionTran 0:89e2c8a57572 58 * @par User is in charge of freeing the pointer returned by this function.
DuyLionTran 0:89e2c8a57572 59 */
DuyLionTran 0:89e2c8a57572 60 static RecordURI* parse(const RecordHeader &header,
DuyLionTran 0:89e2c8a57572 61 const uint8_t *buffer);
DuyLionTran 0:89e2c8a57572 62
DuyLionTran 0:89e2c8a57572 63 /**
DuyLionTran 0:89e2c8a57572 64 * If you want encode an know URI you can use this define to
DuyLionTran 0:89e2c8a57572 65 * avoid to encode the URI type as string
DuyLionTran 0:89e2c8a57572 66 */
DuyLionTran 0:89e2c8a57572 67 typedef enum {
DuyLionTran 0:89e2c8a57572 68 UNKNOWN = 0X00, //!< UNKNOWN
DuyLionTran 0:89e2c8a57572 69 HTTP_WWW = 0X01, //!< HTTP_WWW
DuyLionTran 0:89e2c8a57572 70 HTTPS_WWW = 0X02, //!< HTTPS_WWW
DuyLionTran 0:89e2c8a57572 71 HTTP = 0X03, //!< HTTP
DuyLionTran 0:89e2c8a57572 72 HTTPS = 0X04, //!< HTTPS
DuyLionTran 0:89e2c8a57572 73 TEL = 0x05, //!< TEL
DuyLionTran 0:89e2c8a57572 74 MAIL = 0X06, //!< MAIL
DuyLionTran 0:89e2c8a57572 75 FTP_ANONIMUS = 0X07,//!< FTP_ANONIMUS
DuyLionTran 0:89e2c8a57572 76 FTP_FTP = 0X08, //!< FTP_FTP
DuyLionTran 0:89e2c8a57572 77 FTPS = 0X09, //!< FTPS
DuyLionTran 0:89e2c8a57572 78 SFTP = 0X0A, //!< SFTP
DuyLionTran 0:89e2c8a57572 79 SMB = 0X0B, //!< SMB
DuyLionTran 0:89e2c8a57572 80 NFS = 0X0C, //!< NFS
DuyLionTran 0:89e2c8a57572 81 FTP = 0X0d, //!< FTP
DuyLionTran 0:89e2c8a57572 82 DAV = 0X0E, //!< DAV
DuyLionTran 0:89e2c8a57572 83 NEWS = 0X0F, //!< NEWS
DuyLionTran 0:89e2c8a57572 84 TELNET = 0X10, //!< TELNET
DuyLionTran 0:89e2c8a57572 85 IMAP = 0X11, //!< IMAP
DuyLionTran 0:89e2c8a57572 86 RTSP = 0X12, //!< RTSP
DuyLionTran 0:89e2c8a57572 87 URN = 0X13, //!< URN
DuyLionTran 0:89e2c8a57572 88 POP = 0X14, //!< POP
DuyLionTran 0:89e2c8a57572 89 SIP = 0X15, //!< SIP
DuyLionTran 0:89e2c8a57572 90 SIPS = 0X016, //!< SIPS
DuyLionTran 0:89e2c8a57572 91 TFTP = 0X017, //!< TFTP
DuyLionTran 0:89e2c8a57572 92 BTSPP = 0x018, //!< BTSPP
DuyLionTran 0:89e2c8a57572 93 BTL2CAP = 0x019, //!< BTL2CAP
DuyLionTran 0:89e2c8a57572 94 BTGOEP = 0X01A, //!< BTGOEP
DuyLionTran 0:89e2c8a57572 95 TCPOBEX = 0X1B, //!< TCPOBEX
DuyLionTran 0:89e2c8a57572 96 IRDAOBEX = 0X1C, //!< IRDAOBEX
DuyLionTran 0:89e2c8a57572 97 FILE = 0X1D, //!< FILE
DuyLionTran 0:89e2c8a57572 98 URN_EPC_ID = 0X1E, //!< URN_EPC_ID
DuyLionTran 0:89e2c8a57572 99 URN_EPC_TAG = 0X1F, //!< URN_EPC_TAG
DuyLionTran 0:89e2c8a57572 100 URN_EPC_PAT = 0X20, //!< URN_EPC_PAT
DuyLionTran 0:89e2c8a57572 101 URN_EPC_RAW = 0X21, //!< URN_EPC_RAW
DuyLionTran 0:89e2c8a57572 102 URN_EPC = 0X22, //!< URN_EPC
DuyLionTran 0:89e2c8a57572 103 URN_NFC = 0X23 //!< URN_NFC
DuyLionTran 0:89e2c8a57572 104 } knowUriId_t;
DuyLionTran 0:89e2c8a57572 105
DuyLionTran 0:89e2c8a57572 106 /**
DuyLionTran 0:89e2c8a57572 107 * Build RecordUri with a defined URI type.
DuyLionTran 0:89e2c8a57572 108 * @param URIId URI type.
DuyLionTran 0:89e2c8a57572 109 * @param URIContent URI content.
DuyLionTran 0:89e2c8a57572 110 * @par The URI prefix is removed.
DuyLionTran 0:89e2c8a57572 111 * @par The string is copied inside the class.
DuyLionTran 0:89e2c8a57572 112 */
DuyLionTran 0:89e2c8a57572 113 explicit RecordURI(knowUriId_t URIId, const std::string &URIContent="");
DuyLionTran 0:89e2c8a57572 114
DuyLionTran 0:89e2c8a57572 115 /**
DuyLionTran 0:89e2c8a57572 116 * Build a custom URI type.
DuyLionTran 0:89e2c8a57572 117 * @param URIType string with the URI type.
DuyLionTran 0:89e2c8a57572 118 * @param URIContent URI content.
DuyLionTran 0:89e2c8a57572 119 */
DuyLionTran 0:89e2c8a57572 120 explicit RecordURI(const std::string &URIType, const std::string &URIContent="");
DuyLionTran 0:89e2c8a57572 121
DuyLionTran 0:89e2c8a57572 122 /**
DuyLionTran 0:89e2c8a57572 123 * Get the record type.
DuyLionTran 0:89e2c8a57572 124 * @return TYPE_URI
DuyLionTran 0:89e2c8a57572 125 */
DuyLionTran 0:89e2c8a57572 126 virtual RecordType_t get_type() const {
DuyLionTran 0:89e2c8a57572 127 return TYPE_URI;
DuyLionTran 0:89e2c8a57572 128 } //getType
DuyLionTran 0:89e2c8a57572 129
DuyLionTran 0:89e2c8a57572 130 /**
DuyLionTran 0:89e2c8a57572 131 * Returns the URI type.
DuyLionTran 0:89e2c8a57572 132 * @return URI type inside this record, UNKNOWN if unknown
DuyLionTran 0:89e2c8a57572 133 */
DuyLionTran 0:89e2c8a57572 134 knowUriId_t get_uri_id() const {
DuyLionTran 0:89e2c8a57572 135 return mUriTypeId;
DuyLionTran 0:89e2c8a57572 136 }
DuyLionTran 0:89e2c8a57572 137
DuyLionTran 0:89e2c8a57572 138 virtual uint16_t get_byte_length() {
DuyLionTran 0:89e2c8a57572 139 update_content_and_header();
DuyLionTran 0:89e2c8a57572 140 return mRecordHeader.get_record_length();
DuyLionTran 0:89e2c8a57572 141 }
DuyLionTran 0:89e2c8a57572 142
DuyLionTran 0:89e2c8a57572 143 /**
DuyLionTran 0:89e2c8a57572 144 * Returns the URI content.
DuyLionTran 0:89e2c8a57572 145 * @return URI content
DuyLionTran 0:89e2c8a57572 146 */
DuyLionTran 0:89e2c8a57572 147 std::string& get_content() {
DuyLionTran 0:89e2c8a57572 148 update_content_and_header();
DuyLionTran 0:89e2c8a57572 149 return mContent;
DuyLionTran 0:89e2c8a57572 150 }
DuyLionTran 0:89e2c8a57572 151
DuyLionTran 0:89e2c8a57572 152 /**
DuyLionTran 0:89e2c8a57572 153 * Change the URI content.
DuyLionTran 0:89e2c8a57572 154 * @param URI new URI content.
DuyLionTran 0:89e2c8a57572 155 */
DuyLionTran 0:89e2c8a57572 156 void set_content(const std::string &URI){
DuyLionTran 0:89e2c8a57572 157 if(mUriTypeId!=UNKNOWN)
DuyLionTran 0:89e2c8a57572 158 store_removeing_prefix(sKnowUriPrefix[mUriTypeId],URI);
DuyLionTran 0:89e2c8a57572 159 else
DuyLionTran 0:89e2c8a57572 160 mContent=URI;
DuyLionTran 0:89e2c8a57572 161 update_content_and_header();
DuyLionTran 0:89e2c8a57572 162 }
DuyLionTran 0:89e2c8a57572 163
DuyLionTran 0:89e2c8a57572 164 /**
DuyLionTran 0:89e2c8a57572 165 * If the URI type Id is {@code UNKNOWN} this return the user
DuyLionTran 0:89e2c8a57572 166 * URI type.
DuyLionTran 0:89e2c8a57572 167 * @return URI type set by the user or an empyt string
DuyLionTran 0:89e2c8a57572 168 */
DuyLionTran 0:89e2c8a57572 169 const std::string& get_uri_type() const {
DuyLionTran 0:89e2c8a57572 170 return mTypeString;
DuyLionTran 0:89e2c8a57572 171 }
DuyLionTran 0:89e2c8a57572 172
DuyLionTran 0:89e2c8a57572 173 bool operator==(const RecordURI &other) const {
DuyLionTran 0:89e2c8a57572 174 return (mUriTypeId==other.mUriTypeId) &&
DuyLionTran 0:89e2c8a57572 175 (mTypeString==other.mTypeString) &&
DuyLionTran 0:89e2c8a57572 176 (mContent==other.mContent);
DuyLionTran 0:89e2c8a57572 177 }
DuyLionTran 0:89e2c8a57572 178
DuyLionTran 0:89e2c8a57572 179 virtual uint16_t write(uint8_t *buffer);
DuyLionTran 0:89e2c8a57572 180 virtual ~RecordURI() {
DuyLionTran 0:89e2c8a57572 181 };
DuyLionTran 0:89e2c8a57572 182
DuyLionTran 0:89e2c8a57572 183 protected:
DuyLionTran 0:89e2c8a57572 184
DuyLionTran 0:89e2c8a57572 185 /**
DuyLionTran 0:89e2c8a57572 186 * Record id to write to be recognizable as an URI record.
DuyLionTran 0:89e2c8a57572 187 */
DuyLionTran 0:89e2c8a57572 188 static const uint8_t sNDEFUriIdCode;
DuyLionTran 0:89e2c8a57572 189
DuyLionTran 0:89e2c8a57572 190 /**
DuyLionTran 0:89e2c8a57572 191 * A subclass must implement this function to store the tag content and update the mContent
DuyLionTran 0:89e2c8a57572 192 * variable accordingly.
DuyLionTran 0:89e2c8a57572 193 * @par You should not call this function directly but use updateContentAndHeader that keeps the
DuyLionTran 0:89e2c8a57572 194 * header information in sync with the content.
DuyLionTran 0:89e2c8a57572 195 */
DuyLionTran 0:89e2c8a57572 196 virtual void update_content(){};
DuyLionTran 0:89e2c8a57572 197
DuyLionTran 0:89e2c8a57572 198 /**
DuyLionTran 0:89e2c8a57572 199 * Update the tag content and update the header with the new content size.
DuyLionTran 0:89e2c8a57572 200 */
DuyLionTran 0:89e2c8a57572 201 void update_content_and_header(){
DuyLionTran 0:89e2c8a57572 202 update_content();
DuyLionTran 0:89e2c8a57572 203 update_record_header();
DuyLionTran 0:89e2c8a57572 204 }
DuyLionTran 0:89e2c8a57572 205
DuyLionTran 0:89e2c8a57572 206 /**
DuyLionTran 0:89e2c8a57572 207 * The subclass must store in this variable the content to write to the tag.
DuyLionTran 0:89e2c8a57572 208 * This class will ask to update the content throught the updateContent callback.
DuyLionTran 0:89e2c8a57572 209 */
DuyLionTran 0:89e2c8a57572 210 std::string mContent;
DuyLionTran 0:89e2c8a57572 211
DuyLionTran 0:89e2c8a57572 212 private:
DuyLionTran 0:89e2c8a57572 213
DuyLionTran 0:89e2c8a57572 214 /**
DuyLionTran 0:89e2c8a57572 215 * Set the record header flags.
DuyLionTran 0:89e2c8a57572 216 */
DuyLionTran 0:89e2c8a57572 217 void set_record_header();
DuyLionTran 0:89e2c8a57572 218
DuyLionTran 0:89e2c8a57572 219 /**
DuyLionTran 0:89e2c8a57572 220 * Set the correct size of the payload.
DuyLionTran 0:89e2c8a57572 221 */
DuyLionTran 0:89e2c8a57572 222 void update_record_header(){
DuyLionTran 0:89e2c8a57572 223 //+1 = size of the URITypeId
DuyLionTran 0:89e2c8a57572 224 mRecordHeader.set_payload_length(1 + mTypeString.size() + mContent.size());
DuyLionTran 0:89e2c8a57572 225 }
DuyLionTran 0:89e2c8a57572 226
DuyLionTran 0:89e2c8a57572 227 void store_removeing_prefix(const std::string &prefix,const std::string &content){
DuyLionTran 0:89e2c8a57572 228 //check that the content doens't contain the prefix
DuyLionTran 0:89e2c8a57572 229 if (content.compare(0, prefix.size(), prefix) == 0) {
DuyLionTran 0:89e2c8a57572 230 mContent = std::string(content, prefix.size());
DuyLionTran 0:89e2c8a57572 231 } else
DuyLionTran 0:89e2c8a57572 232 mContent = content;
DuyLionTran 0:89e2c8a57572 233 }
DuyLionTran 0:89e2c8a57572 234
DuyLionTran 0:89e2c8a57572 235 /**
DuyLionTran 0:89e2c8a57572 236 * URI type used by this record
DuyLionTran 0:89e2c8a57572 237 */
DuyLionTran 0:89e2c8a57572 238 const knowUriId_t mUriTypeId;
DuyLionTran 0:89e2c8a57572 239
DuyLionTran 0:89e2c8a57572 240 /**
DuyLionTran 0:89e2c8a57572 241 * In case of unknown URI type, it stores the used defined URI type.
DuyLionTran 0:89e2c8a57572 242 */
DuyLionTran 0:89e2c8a57572 243 const std::string mTypeString;
DuyLionTran 0:89e2c8a57572 244
DuyLionTran 0:89e2c8a57572 245
DuyLionTran 0:89e2c8a57572 246 /**
DuyLionTran 0:89e2c8a57572 247 * Array of known prefix of known URI type
DuyLionTran 0:89e2c8a57572 248 */
DuyLionTran 0:89e2c8a57572 249 static const std::string sKnowUriPrefix[];
DuyLionTran 0:89e2c8a57572 250 };
DuyLionTran 0:89e2c8a57572 251
DuyLionTran 0:89e2c8a57572 252 } /* namespace NDefLib */
DuyLionTran 0:89e2c8a57572 253
DuyLionTran 0:89e2c8a57572 254 #endif /* NDEFLIB_RECORDTYPE_RECORDURI_H_ */