mirror of https://github.com/ARMmbed/mbed-os.git
207 lines
5.1 KiB
C++
207 lines
5.1 KiB
C++
/* mbed Microcontroller Library
|
|
* Copyright (c) 2018 ARM Limited
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef NFC_COMMON_URI_H_
|
|
#define NFC_COMMON_URI_H_
|
|
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include "platform/Span.h"
|
|
|
|
#include "nfc/ndef/RecordParser.h"
|
|
#include "nfc/ndef/MessageBuilder.h"
|
|
|
|
namespace mbed {
|
|
namespace nfc {
|
|
namespace ndef {
|
|
namespace common {
|
|
|
|
/**
|
|
* @addtogroup nfc
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* Model the well known type URI.
|
|
*/
|
|
class URI {
|
|
public:
|
|
/**
|
|
* Identifier codes
|
|
*/
|
|
enum uri_identifier_code_t {
|
|
NA = 0x00, /// Not applicable
|
|
HTTP_WWW = 0x01, /// http://www.
|
|
HTTPS_WWW = 0x02, /// https://www.
|
|
HTTP = 0x03, /// http://
|
|
HTTPS = 0x04, /// https://
|
|
TEL = 0x05, /// tel:
|
|
MAILTO = 0x06, /// mailto:
|
|
FTP_ANONYMOUS = 0x07, /// ftp://anonymous:anonymous@
|
|
FTP_FTP = 0x08, /// ftp://ftp.
|
|
FTPS = 0x09, /// ftps://
|
|
SFTP = 0x0A, /// sftp://
|
|
SMB = 0x0B, /// smb://
|
|
NFS = 0x0C, /// nfs://
|
|
FTP = 0x0D, /// ftp://
|
|
DAV = 0x0E, /// dav://
|
|
NEWS = 0x0F, /// news:
|
|
TELNET = 0x10, /// telnet://
|
|
IMAP = 0x11, /// imap:
|
|
RSTP = 0x12, /// rstp://
|
|
URN = 0x13, /// urn:
|
|
POP = 0x14, /// pop:
|
|
SIP = 0x15, /// sip:
|
|
SIPS = 0x16, /// sips:
|
|
TFTP = 0x17, /// tftp:
|
|
BTSPP = 0x18, /// btspp://
|
|
BTL2CAP = 0x19, /// btl2cap://
|
|
BTGOEP = 0x1A, /// btgoep://
|
|
TCPOBEX = 0x1B, /// tcpobex://
|
|
IRDAOBEX = 0x1C, /// irdaobex://
|
|
FILE = 0x1D, /// file://
|
|
URN_EPC_ID = 0x1E, /// urn:epc:id:
|
|
URN_EPC_TAG = 0x1F, /// urn:epc:tag:
|
|
URN_EPC_PAT = 0x20, /// urn:epc:pat:
|
|
URN_EPC_RAW = 0x21, /// urn:epc:raw:
|
|
URN_EPC = 0x22, /// urn:epc:
|
|
URN_NFC = 0x23, /// urn:nfc:
|
|
};
|
|
|
|
/**
|
|
* Construct an empty URI object.
|
|
*/
|
|
URI();
|
|
|
|
/**
|
|
* Construct a URI from an id and a uri field.
|
|
*
|
|
* @param id The code of the URI prefix.
|
|
* @param uri_field The URI itself.
|
|
*
|
|
* @note To remove the NULL terminator of the C-string of the uri_field
|
|
* parameter, you can use the utility function span_from_cstr.
|
|
*/
|
|
URI(uri_identifier_code_t id, const Span<const uint8_t> &uri_field);
|
|
|
|
/**
|
|
* Construct a URI from another URI.
|
|
* @param to_copy The uri copied.
|
|
*/
|
|
URI(const URI &to_copy);
|
|
|
|
/**
|
|
* Destroy a URI object.
|
|
*/
|
|
~URI();
|
|
|
|
/**
|
|
* Replace the content by the one of an existing URI.
|
|
* @param to_copy The URI to copy.
|
|
* @return a reference to this object
|
|
*/
|
|
URI &operator=(const URI &to_copy);
|
|
|
|
/**
|
|
* Replace the value of the URI.
|
|
*
|
|
* @param id The ID of the URI
|
|
* @param uri_field A buffer containing the value of the URI field.
|
|
*
|
|
* @note To remove the NULL terminator of the C-string of the uri_field
|
|
* parameter, you can use the utility function span_from_cstr.
|
|
*/
|
|
void set_uri(
|
|
uri_identifier_code_t id,
|
|
const Span<const uint8_t> &uri_field
|
|
);
|
|
|
|
/**
|
|
* Return the id of the uri.
|
|
* @return The id of the uri.
|
|
*/
|
|
uri_identifier_code_t get_id() const;
|
|
|
|
/**
|
|
* Return the current value of the uri field.
|
|
* @return The value of the uri field.
|
|
*/
|
|
Span<const uint8_t> get_uri_field() const;
|
|
|
|
/**
|
|
* Append into a message builder
|
|
*/
|
|
bool append_as_record(
|
|
MessageBuilder &message_builder,
|
|
bool is_last_record = false
|
|
) const;
|
|
|
|
/**
|
|
* Compute the size of this object in a ndef record.
|
|
*
|
|
* @return The size of the ndef record required to store this object.
|
|
*/
|
|
size_t get_record_size() const;
|
|
|
|
/**
|
|
* Equal operator between two URIs
|
|
* @param lhs The URI on the left hand side
|
|
* @param rhs The URI on the right hand side
|
|
* @return true if lhs equals rhs or false.
|
|
*/
|
|
friend bool operator==(const URI &lhs, const URI &rhs)
|
|
{
|
|
if (lhs._uri_size != rhs._uri_size) {
|
|
return false;
|
|
}
|
|
|
|
return memcmp(lhs._uri, rhs._uri, lhs._uri_size) == 0;
|
|
}
|
|
|
|
friend bool operator!=(const URI &lhs, const URI &rhs)
|
|
{
|
|
return !(lhs == rhs);
|
|
}
|
|
|
|
private:
|
|
friend class URIParser;
|
|
|
|
void move_data(uint8_t *text, size_t size);
|
|
|
|
uint8_t *_uri;
|
|
size_t _uri_size;
|
|
};
|
|
|
|
/**
|
|
* Parser of a URI.
|
|
*/
|
|
class URIParser : public GenericRecordParser<URIParser, URI> {
|
|
public:
|
|
bool do_parse(const Record &record, URI &uri);
|
|
};
|
|
|
|
/**
|
|
* @}
|
|
*/
|
|
|
|
} // namespace common
|
|
} // namespace ndef
|
|
} // namespace nfc
|
|
} // namespace mbed
|
|
|
|
#endif /* NFC_COMMON_URI_H_ */
|