diff --git a/include/mosquittopp.h b/include/mosquittopp.h index d8703c37..a1c32ad8 100644 --- a/include/mosquittopp.h +++ b/include/mosquittopp.h @@ -36,12 +36,16 @@ namespace mosqpp { mosqpp_EXPORT const char * strerror(int mosq_errno); mosqpp_EXPORT const char * connack_string(int connack_code); +mosqpp_EXPORT const char * reason_string(int reason_code); mosqpp_EXPORT int sub_topic_tokenise(const char *subtopic, char ***topics, int *count); mosqpp_EXPORT int sub_topic_tokens_free(char ***topics, int count); mosqpp_EXPORT int lib_version(int *major, int *minor, int *revision); mosqpp_EXPORT int lib_init(); mosqpp_EXPORT int lib_cleanup(); mosqpp_EXPORT int topic_matches_sub(const char *sub, const char *topic, bool *result); +mosqpp_EXPORT int topic_matches_sub_with_pattern(const char *sub, const char *topic, const char *clientid, const char *username, bool *result); +mosqpp_EXPORT int sub_matches_acl(const char *acl, const char *sub, bool *result); +mosqpp_EXPORT int sub_matches_acl_with_pattern(const char *acl, const char *sub, const char *clientid, const char *username, bool *result); mosqpp_EXPORT int validate_utf8(const char *str, int len); mosqpp_EXPORT int subscribe_simple( struct mosquitto_message **messages, @@ -74,6 +78,9 @@ mosqpp_EXPORT int subscribe_callback( const struct libmosquitto_will *will=NULL, const struct libmosquitto_tls *tls=NULL); +mosqpp_EXPORT int property_check_command(int command, int identifier); +mosqpp_EXPORT int property_check_all(int command, const mosquitto_property *properties); + /* * Class: mosquittopp * @@ -90,18 +97,24 @@ class mosqpp_EXPORT mosquittopp { int reinitialise(const char *id, bool clean_session); int socket(); int will_set(const char *topic, int payloadlen=0, const void *payload=NULL, int qos=0, bool retain=false); + int will_set_v5(const char *topic, int payloadlen=0, const void *payload=NULL, int qos=0, bool retain=false, mosquitto_property *properties=NULL); int will_clear(); int username_pw_set(const char *username, const char *password=NULL); int connect(const char *host, int port=1883, int keepalive=60); - int connect_async(const char *host, int port=1883, int keepalive=60); int connect(const char *host, int port, int keepalive, const char *bind_address); + int connect_v5(const char *host, int port, int keepalive, const char *bind_address, const mosquitto_property *properties); + int connect_async(const char *host, int port=1883, int keepalive=60); int connect_async(const char *host, int port, int keepalive, const char *bind_address); int reconnect(); int reconnect_async(); int disconnect(); + int disconnect_v5(int reason_code, const mosquitto_property *properties); int publish(int *mid, const char *topic, int payloadlen=0, const void *payload=NULL, int qos=0, bool retain=false); + int publish_v5(int *mid, const char *topic, int payloadlen=0, const void *payload=NULL, int qos=0, bool retain=false, const mosquitto_property *properties=NULL); int subscribe(int *mid, const char *sub, int qos=0); + int subscribe_v5(int *mid, const char *sub, int qos=0, int options=0, const mosquitto_property *properties=NULL); int unsubscribe(int *mid, const char *sub); + int unsubscribe_v5(int *mid, const char *sub, const mosquitto_property *properties); void reconnect_delay_set(unsigned int reconnect_delay, unsigned int reconnect_delay_max, bool reconnect_exponential_backoff); int max_inflight_messages_set(unsigned int max_inflight_messages); void message_retry_set(unsigned int message_retry); @@ -111,6 +124,9 @@ class mosqpp_EXPORT mosquittopp { int tls_insecure_set(bool value); int tls_psk_set(const char *psk, const char *identity, const char *ciphers=NULL); int opts_set(enum mosq_opt_t option, void *value); + int int_option(enum mosq_opt_t option, int value); + int string_option(enum mosq_opt_t option, const char *value); + int void_option(enum mosq_opt_t option, void *value); int loop(int timeout=-1, int max_packets=1); int loop_misc(); @@ -124,13 +140,20 @@ class mosqpp_EXPORT mosquittopp { int socks5_set(const char *host, int port=1080, const char *username=NULL, const char *password=NULL); // names in the functions commented to prevent unused parameter warning + virtual void on_pre_connect() {return;} virtual void on_connect(int /*rc*/) {return;} virtual void on_connect_with_flags(int /*rc*/, int /*flags*/) {return;} + virtual void on_connect_v5(int /*rc*/, int /*flags*/, const mosquitto_property * /*props*/) {return;} virtual void on_disconnect(int /*rc*/) {return;} + virtual void on_disconnect_v5(int /*rc*/, const mosquitto_property * /*props*/) {return;} virtual void on_publish(int /*mid*/) {return;} + virtual void on_publish_v5(int /*mid*/, int /*reason_code*/, const mosquitto_property * /*props*/) {return;} virtual void on_message(const struct mosquitto_message * /*message*/) {return;} + virtual void on_message_v5(const struct mosquitto_message * /*message*/, const mosquitto_property * /*props*/) {return;} virtual void on_subscribe(int /*mid*/, int /*qos_count*/, const int * /*granted_qos*/) {return;} + virtual void on_subscribe_v5(int /*mid*/, int /*qos_count*/, const int * /*granted_qos*/, const mosquitto_property * /*props*/) {return;} virtual void on_unsubscribe(int /*mid*/) {return;} + virtual void on_unsubscribe_v5(int /*mid*/, const mosquitto_property * /*props*/) {return;} virtual void on_log(int /*level*/, const char * /*str*/) {return;} virtual void on_error() {return;} }; diff --git a/lib/cpp/mosquittopp.cpp b/lib/cpp/mosquittopp.cpp index ca4c1679..eb053fae 100644 --- a/lib/cpp/mosquittopp.cpp +++ b/lib/cpp/mosquittopp.cpp @@ -22,6 +22,15 @@ Contributors: namespace mosqpp { +static void on_pre_connect_wrapper(struct mosquitto *mosq, void *userdata) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + + UNUSED(mosq); + + m->on_pre_connect(); +} + static void on_connect_wrapper(struct mosquitto *mosq, void *userdata, int rc) { class mosquittopp *m = (class mosquittopp *)userdata; @@ -38,6 +47,13 @@ static void on_connect_with_flags_wrapper(struct mosquitto *mosq, void *userdata m->on_connect_with_flags(rc, flags); } +static void on_connect_v5_wrapper(struct mosquitto *mosq, void *userdata, int rc, int flags, const mosquitto_property *props) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + UNUSED(mosq); + m->on_connect_v5(rc, flags, props); +} + static void on_disconnect_wrapper(struct mosquitto *mosq, void *userdata, int rc) { class mosquittopp *m = (class mosquittopp *)userdata; @@ -45,6 +61,13 @@ static void on_disconnect_wrapper(struct mosquitto *mosq, void *userdata, int rc m->on_disconnect(rc); } +static void on_disconnect_v5_wrapper(struct mosquitto *mosq, void *userdata, int rc, const mosquitto_property *props) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + UNUSED(mosq); + m->on_disconnect_v5(rc, props); +} + static void on_publish_wrapper(struct mosquitto *mosq, void *userdata, int mid) { class mosquittopp *m = (class mosquittopp *)userdata; @@ -52,6 +75,13 @@ static void on_publish_wrapper(struct mosquitto *mosq, void *userdata, int mid) m->on_publish(mid); } +static void on_publish_v5_wrapper(struct mosquitto *mosq, void *userdata, int mid, int reason_code, const mosquitto_property *props) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + UNUSED(mosq); + m->on_publish_v5(mid, reason_code, props); +} + static void on_message_wrapper(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) { class mosquittopp *m = (class mosquittopp *)userdata; @@ -59,6 +89,13 @@ static void on_message_wrapper(struct mosquitto *mosq, void *userdata, const str m->on_message(message); } +static void on_message_v5_wrapper(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message, const mosquitto_property *props) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + UNUSED(mosq); + m->on_message_v5(message, props); +} + static void on_subscribe_wrapper(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos) { class mosquittopp *m = (class mosquittopp *)userdata; @@ -66,6 +103,13 @@ static void on_subscribe_wrapper(struct mosquitto *mosq, void *userdata, int mid m->on_subscribe(mid, qos_count, granted_qos); } +static void on_subscribe_v5_wrapper(struct mosquitto *mosq, void *userdata, int mid, int qos_count, const int *granted_qos, const mosquitto_property *props) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + UNUSED(mosq); + m->on_subscribe_v5(mid, qos_count, granted_qos, props); +} + static void on_unsubscribe_wrapper(struct mosquitto *mosq, void *userdata, int mid) { class mosquittopp *m = (class mosquittopp *)userdata; @@ -73,6 +117,13 @@ static void on_unsubscribe_wrapper(struct mosquitto *mosq, void *userdata, int m m->on_unsubscribe(mid); } +static void on_unsubscribe_v5_wrapper(struct mosquitto *mosq, void *userdata, int mid, const mosquitto_property *props) +{ + class mosquittopp *m = (class mosquittopp *)userdata; + UNUSED(mosq); + m->on_unsubscribe_v5(mid, props); +} + static void on_log_wrapper(struct mosquitto *mosq, void *userdata, int level, const char *str) { @@ -109,6 +160,21 @@ const char* connack_string(int connack_code) return mosquitto_connack_string(connack_code); } +int property_check_command(int command, int identifier) +{ + return mosquitto_property_check_command(command, identifier); +} + +int property_check_all(int command, const mosquitto_property *properties) +{ + return mosquitto_property_check_all(command, properties); +} + +const char* reason_string(int reason_code) +{ + return mosquitto_reason_string(reason_code); +} + int sub_topic_tokenise(const char *subtopic, char ***topics, int *count) { return mosquitto_sub_topic_tokenise(subtopic, topics, count); @@ -124,6 +190,21 @@ int topic_matches_sub(const char *sub, const char *topic, bool *result) return mosquitto_topic_matches_sub(sub, topic, result); } +int topic_matches_sub_with_pattern(const char *sub, const char *topic, const char *clientid, const char *username, bool *result) +{ + return mosquitto_topic_matches_sub_with_pattern(sub, topic, clientid, username, result); +} + +int sub_matches_acl(const char *acl, const char *sub, bool *result) +{ + return mosquitto_sub_matches_acl(acl, sub, result); +} + +int sub_matches_acl_with_pattern(const char *acl, const char *sub, const char *clientid, const char *username, bool *result) +{ + return mosquitto_sub_matches_acl_with_pattern(acl, sub, clientid, username, result); +} + int validate_utf8(const char *str, int len) { return mosquitto_validate_utf8(str, len); @@ -222,6 +303,11 @@ int mosquittopp::connect(const char *host, int port, int keepalive, const char * return mosquitto_connect_bind(m_mosq, host, port, keepalive, bind_address); } +int mosquittopp::connect_v5(const char *host, int port, int keepalive, const char *bind_address, const mosquitto_property *properties) +{ + return mosquitto_connect_bind_v5(m_mosq, host, port, keepalive, bind_address, properties); +} + int mosquittopp::connect_async(const char *host, int port, int keepalive) { return mosquitto_connect_async(m_mosq, host, port, keepalive); @@ -247,6 +333,11 @@ int mosquittopp::disconnect() return mosquitto_disconnect(m_mosq); } +int mosquittopp::disconnect_v5(int reason_code, const mosquitto_property *properties) +{ + return mosquitto_disconnect_v5(m_mosq, reason_code, properties); +} + int mosquittopp::socket() { return mosquitto_socket(m_mosq); @@ -257,6 +348,11 @@ int mosquittopp::will_set(const char *topic, int payloadlen, const void *payload return mosquitto_will_set(m_mosq, topic, payloadlen, payload, qos, retain); } +int mosquittopp::will_set_v5(const char *topic, int payloadlen, const void *payload, int qos, bool retain, mosquitto_property *properties) +{ + return mosquitto_will_set_v5(m_mosq, topic, payloadlen, payload, qos, retain, properties); +} + int mosquittopp::will_clear() { return mosquitto_will_clear(m_mosq); @@ -272,6 +368,11 @@ int mosquittopp::publish(int *mid, const char *topic, int payloadlen, const void return mosquitto_publish(m_mosq, mid, topic, payloadlen, payload, qos, retain); } +int mosquittopp::publish_v5(int *mid, const char *topic, int payloadlen, const void *payload, int qos, bool retain, const mosquitto_property *properties) +{ + return mosquitto_publish_v5(m_mosq, mid, topic, payloadlen, payload, qos, retain, properties); +} + void mosquittopp::reconnect_delay_set(unsigned int reconnect_delay, unsigned int reconnect_delay_max, bool reconnect_exponential_backoff) { mosquitto_reconnect_delay_set(m_mosq, reconnect_delay, reconnect_delay_max, reconnect_exponential_backoff); @@ -292,11 +393,21 @@ int mosquittopp::subscribe(int *mid, const char *sub, int qos) return mosquitto_subscribe(m_mosq, mid, sub, qos); } +int mosquittopp::subscribe_v5(int *mid, const char *sub, int qos, int options, const mosquitto_property *properties) +{ + return mosquitto_subscribe_v5(m_mosq, mid, sub, qos, options, properties); +} + int mosquittopp::unsubscribe(int *mid, const char *sub) { return mosquitto_unsubscribe(m_mosq, mid, sub); } +int mosquittopp::unsubscribe_v5(int *mid, const char *sub, const mosquitto_property *properties) +{ + return mosquitto_unsubscribe_v5(m_mosq, mid, sub, properties); +} + int mosquittopp::loop(int timeout, int max_packets) { return mosquitto_loop(m_mosq, timeout, max_packets); @@ -342,6 +453,21 @@ int mosquittopp::opts_set(enum mosq_opt_t option, void *value) return mosquitto_opts_set(m_mosq, option, value); } +int mosquittopp::int_option(enum mosq_opt_t option, int value) +{ + return mosquitto_int_option(m_mosq, option, value); +} + +int mosquittopp::string_option(enum mosq_opt_t option, const char *value) +{ + return mosquitto_string_option(m_mosq, option, value); +} + +int mosquittopp::void_option(enum mosq_opt_t option, void *value) +{ + return mosquitto_void_option(m_mosq, option, value); +} + int mosquittopp::threaded_set(bool threaded) { return mosquitto_threaded_set(m_mosq, threaded);