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.cpp
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 RecordURI implementation
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 #include <cstring>
DuyLionTran 0:89e2c8a57572 39
DuyLionTran 0:89e2c8a57572 40 #include "RecordURI.h"
DuyLionTran 0:89e2c8a57572 41 #include "RecordMail.h"
DuyLionTran 0:89e2c8a57572 42 #include "RecordSMS.h"
DuyLionTran 0:89e2c8a57572 43 #include "RecordGeo.h"
DuyLionTran 0:89e2c8a57572 44
DuyLionTran 0:89e2c8a57572 45 namespace NDefLib {
DuyLionTran 0:89e2c8a57572 46
DuyLionTran 0:89e2c8a57572 47 const uint8_t RecordURI::sNDEFUriIdCode = 'U';
DuyLionTran 0:89e2c8a57572 48
DuyLionTran 0:89e2c8a57572 49 const std::string RecordURI::sKnowUriPrefix[] = { "", "http://www.",
DuyLionTran 0:89e2c8a57572 50 "https://www.", "http://", "https://", "tel:", "mailto:",
DuyLionTran 0:89e2c8a57572 51 "ftp://anonymous:anonymous@", "ftp://ftp.", "ftps://", "sftp://",
DuyLionTran 0:89e2c8a57572 52 "smb://", "nfs://", "ftp://", "dav://", "news:", "telnet://", "imap:",
DuyLionTran 0:89e2c8a57572 53 "rtsp://", "urn:", "pop:", "sip:", "sips:", "tftp:", "btspp://",
DuyLionTran 0:89e2c8a57572 54 "btl2cap://", "btgoep://", "tcpobex://", "irdaobex://", "file://",
DuyLionTran 0:89e2c8a57572 55 "urn:epc:id:", "urn:epc:tag", "urn:epc:pat:", "urn:epc:raw:",
DuyLionTran 0:89e2c8a57572 56 "urn:epc:", "urn:nfc:" };
DuyLionTran 0:89e2c8a57572 57
DuyLionTran 0:89e2c8a57572 58 void RecordURI::set_record_header() {
DuyLionTran 0:89e2c8a57572 59 mRecordHeader.set_FNT(RecordHeader::NFC_well_known);
DuyLionTran 0:89e2c8a57572 60 mRecordHeader.set_type_length(sizeof(sNDEFUriIdCode));
DuyLionTran 0:89e2c8a57572 61 }
DuyLionTran 0:89e2c8a57572 62
DuyLionTran 0:89e2c8a57572 63 RecordURI::RecordURI(knowUriId_t uriId, const std::string &uriContent) :
DuyLionTran 0:89e2c8a57572 64 mUriTypeId(uriId), mTypeString("") {
DuyLionTran 0:89e2c8a57572 65 set_content(uriContent);
DuyLionTran 0:89e2c8a57572 66 set_record_header();
DuyLionTran 0:89e2c8a57572 67 }
DuyLionTran 0:89e2c8a57572 68
DuyLionTran 0:89e2c8a57572 69 RecordURI::RecordURI(const std::string &uriType, const std::string &uriContent) :
DuyLionTran 0:89e2c8a57572 70 mContent(uriContent),mUriTypeId(UNKNOWN), mTypeString(uriType) {
DuyLionTran 0:89e2c8a57572 71 update_record_header();
DuyLionTran 0:89e2c8a57572 72 set_record_header();
DuyLionTran 0:89e2c8a57572 73 }
DuyLionTran 0:89e2c8a57572 74
DuyLionTran 0:89e2c8a57572 75 uint16_t RecordURI::write(uint8_t *buffer) {
DuyLionTran 0:89e2c8a57572 76 uint16_t offset = 0;
DuyLionTran 0:89e2c8a57572 77 update_content();
DuyLionTran 0:89e2c8a57572 78
DuyLionTran 0:89e2c8a57572 79 offset += mRecordHeader.write_header(buffer);
DuyLionTran 0:89e2c8a57572 80
DuyLionTran 0:89e2c8a57572 81 buffer[offset++] = sNDEFUriIdCode;
DuyLionTran 0:89e2c8a57572 82 buffer[offset++] = (uint8_t) mUriTypeId;
DuyLionTran 0:89e2c8a57572 83
DuyLionTran 0:89e2c8a57572 84 if (mUriTypeId == UNKNOWN) {
DuyLionTran 0:89e2c8a57572 85 std::memcpy(buffer + offset, mTypeString.c_str(), mTypeString.size());
DuyLionTran 0:89e2c8a57572 86 offset += mTypeString.size();
DuyLionTran 0:89e2c8a57572 87 }
DuyLionTran 0:89e2c8a57572 88
DuyLionTran 0:89e2c8a57572 89 std::memcpy(buffer + offset, mContent.c_str(), mContent.size());
DuyLionTran 0:89e2c8a57572 90 offset += mContent.size();
DuyLionTran 0:89e2c8a57572 91 return offset;
DuyLionTran 0:89e2c8a57572 92 }
DuyLionTran 0:89e2c8a57572 93
DuyLionTran 0:89e2c8a57572 94 RecordURI* RecordURI::parse(const RecordHeader &header,
DuyLionTran 0:89e2c8a57572 95 const uint8_t *buffer) {
DuyLionTran 0:89e2c8a57572 96 uint16_t offset = 0;
DuyLionTran 0:89e2c8a57572 97
DuyLionTran 0:89e2c8a57572 98 if (buffer[offset++] != sNDEFUriIdCode) {
DuyLionTran 0:89e2c8a57572 99 return NULL;
DuyLionTran 0:89e2c8a57572 100 }
DuyLionTran 0:89e2c8a57572 101 knowUriId_t uriType = (knowUriId_t) buffer[offset++];
DuyLionTran 0:89e2c8a57572 102 //it is a standard type handle by a specific class
DuyLionTran 0:89e2c8a57572 103 if (uriType == MAIL) {
DuyLionTran 0:89e2c8a57572 104 return RecordMail::parse(header, buffer);
DuyLionTran 0:89e2c8a57572 105 }
DuyLionTran 0:89e2c8a57572 106
DuyLionTran 0:89e2c8a57572 107 //is an standard type without a specific class
DuyLionTran 0:89e2c8a57572 108 if (uriType != UNKNOWN) {
DuyLionTran 0:89e2c8a57572 109 return new RecordURI(uriType, std::string((const char*) buffer + offset, header.get_payload_length() - 1));
DuyLionTran 0:89e2c8a57572 110 }
DuyLionTran 0:89e2c8a57572 111
DuyLionTran 0:89e2c8a57572 112 //is an unknown type with a specific class
DuyLionTran 0:89e2c8a57572 113 RecordURI *r = RecordSMS::parse(header, buffer);
DuyLionTran 0:89e2c8a57572 114 if (r != NULL) {
DuyLionTran 0:89e2c8a57572 115 return r;
DuyLionTran 0:89e2c8a57572 116 }
DuyLionTran 0:89e2c8a57572 117 r = RecordGeo::parse(header, buffer);
DuyLionTran 0:89e2c8a57572 118 if (r != NULL) {
DuyLionTran 0:89e2c8a57572 119 return r;
DuyLionTran 0:89e2c8a57572 120 } //else is an unknown type without a specific class
DuyLionTran 0:89e2c8a57572 121
DuyLionTran 0:89e2c8a57572 122 return new RecordURI(uriType,
DuyLionTran 0:89e2c8a57572 123 std::string((const char*) buffer + offset, header.get_payload_length() - 1));
DuyLionTran 0:89e2c8a57572 124 }
DuyLionTran 0:89e2c8a57572 125
DuyLionTran 0:89e2c8a57572 126 } /* namespace NDefLib */
DuyLionTran 0:89e2c8a57572 127
DuyLionTran 0:89e2c8a57572 128
DuyLionTran 0:89e2c8a57572 129 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/