mosquitto/lib/cpp/mosquittopp.cpp

382 lines
9.7 KiB
C++
Raw Normal View History

2014-05-07 22:27:00 +00:00
/*
Copyright (c) 2010-2019 Roger Light <roger@atchoo.org>
2014-05-07 22:27:00 +00:00
All rights reserved. This program and the accompanying materials
2020-11-25 17:34:21 +00:00
are made available under the terms of the Eclipse Public License 2.0
2014-05-07 22:27:00 +00:00
and Eclipse Distribution License v1.0 which accompany this distribution.
2021-10-05 14:20:37 +00:00
2014-05-07 22:27:00 +00:00
The Eclipse Public License is available at
2020-11-25 17:34:21 +00:00
https://www.eclipse.org/legal/epl-2.0/
2014-05-07 22:27:00 +00:00
and the Eclipse Distribution License is available at
http://www.eclipse.org/org/documents/edl-v10.php.
2021-10-05 14:20:37 +00:00
2014-05-07 22:27:00 +00:00
Contributors:
Roger Light - initial implementation and documentation.
*/
#include <cstdlib>
#include <mosquitto.h>
#include <mosquittopp.h>
2019-03-13 14:11:50 +00:00
#define UNUSED(A) (void)(A)
2014-05-07 22:27:00 +00:00
namespace mosqpp {
static void on_connect_wrapper(struct mosquitto *mosq, void *userdata, int rc)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_connect(rc);
}
2018-04-11 13:11:02 +00:00
static void on_connect_with_flags_wrapper(struct mosquitto *mosq, void *userdata, int rc, int flags)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2018-04-11 13:11:02 +00:00
m->on_connect_with_flags(rc, flags);
}
2014-05-07 22:27:00 +00:00
static void on_disconnect_wrapper(struct mosquitto *mosq, void *userdata, int rc)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_disconnect(rc);
}
static void on_publish_wrapper(struct mosquitto *mosq, void *userdata, int mid)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_publish(mid);
}
static void on_message_wrapper(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_message(message);
}
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;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_subscribe(mid, qos_count, granted_qos);
}
static void on_unsubscribe_wrapper(struct mosquitto *mosq, void *userdata, int mid)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_unsubscribe(mid);
}
static void on_log_wrapper(struct mosquitto *mosq, void *userdata, int level, const char *str)
{
class mosquittopp *m = (class mosquittopp *)userdata;
2019-03-13 14:11:50 +00:00
UNUSED(mosq);
2014-05-07 22:27:00 +00:00
m->on_log(level, str);
}
int lib_version(int *major, int *minor, int *revision)
{
if(major) *major = LIBMOSQUITTO_MAJOR;
if(minor) *minor = LIBMOSQUITTO_MINOR;
if(revision) *revision = LIBMOSQUITTO_REVISION;
return LIBMOSQUITTO_VERSION_NUMBER;
}
int lib_init()
{
return mosquitto_lib_init();
}
int lib_cleanup()
{
return mosquitto_lib_cleanup();
}
const char* strerror(int mosq_errno)
{
return mosquitto_strerror(mosq_errno);
}
const char* connack_string(int connack_code)
{
return mosquitto_connack_string(connack_code);
}
int sub_topic_tokenise(const char *subtopic, char ***topics, int *count)
{
return mosquitto_sub_topic_tokenise(subtopic, topics, count);
}
int sub_topic_tokens_free(char ***topics, int count)
{
return mosquitto_sub_topic_tokens_free(topics, count);
}
int topic_matches_sub(const char *sub, const char *topic, bool *result)
{
return mosquitto_topic_matches_sub(sub, topic, result);
}
int validate_utf8(const char *str, int len)
{
return mosquitto_validate_utf8(str, len);
}
2016-01-26 17:00:08 +00:00
int subscribe_simple(
struct mosquitto_message **messages,
int msg_count,
bool retained,
2016-01-26 17:00:08 +00:00
const char *topic,
int qos,
const char *host,
int port,
const char *client_id,
int keepalive,
bool clean_session,
const char *username,
const char *password,
const struct libmosquitto_will *will,
const struct libmosquitto_tls *tls)
{
return mosquitto_subscribe_simple(
messages, msg_count, retained,
topic, qos,
2016-01-26 17:00:08 +00:00
host, port, client_id, keepalive, clean_session,
username, password,
will, tls);
}
mosqpp_EXPORT int subscribe_callback(
int (*callback)(struct mosquitto *, void *, const struct mosquitto_message *),
void *userdata,
2016-01-26 17:00:08 +00:00
const char *topic,
int qos,
const char *host,
int port,
const char *client_id,
int keepalive,
bool clean_session,
const char *username,
const char *password,
const struct libmosquitto_will *will,
const struct libmosquitto_tls *tls)
{
return mosquitto_subscribe_callback(
callback, userdata,
topic, qos,
2016-01-26 17:00:08 +00:00
host, port, client_id, keepalive, clean_session,
username, password,
will, tls);
}
2014-05-07 22:27:00 +00:00
mosquittopp::mosquittopp(const char *id, bool clean_session)
{
m_mosq = mosquitto_new(id, clean_session, this);
mosquitto_connect_callback_set(m_mosq, on_connect_wrapper);
2018-04-11 13:11:02 +00:00
mosquitto_connect_with_flags_callback_set(m_mosq, on_connect_with_flags_wrapper);
2014-05-07 22:27:00 +00:00
mosquitto_disconnect_callback_set(m_mosq, on_disconnect_wrapper);
mosquitto_publish_callback_set(m_mosq, on_publish_wrapper);
mosquitto_message_callback_set(m_mosq, on_message_wrapper);
mosquitto_subscribe_callback_set(m_mosq, on_subscribe_wrapper);
mosquitto_unsubscribe_callback_set(m_mosq, on_unsubscribe_wrapper);
mosquitto_log_callback_set(m_mosq, on_log_wrapper);
}
mosquittopp::~mosquittopp()
{
mosquitto_destroy(m_mosq);
}
int mosquittopp::reinitialise(const char *id, bool clean_session)
{
int rc;
rc = mosquitto_reinitialise(m_mosq, id, clean_session, this);
if(rc == MOSQ_ERR_SUCCESS){
mosquitto_connect_callback_set(m_mosq, on_connect_wrapper);
2018-04-11 13:11:02 +00:00
mosquitto_connect_with_flags_callback_set(m_mosq, on_connect_with_flags_wrapper);
2014-05-07 22:27:00 +00:00
mosquitto_disconnect_callback_set(m_mosq, on_disconnect_wrapper);
mosquitto_publish_callback_set(m_mosq, on_publish_wrapper);
mosquitto_message_callback_set(m_mosq, on_message_wrapper);
mosquitto_subscribe_callback_set(m_mosq, on_subscribe_wrapper);
mosquitto_unsubscribe_callback_set(m_mosq, on_unsubscribe_wrapper);
mosquitto_log_callback_set(m_mosq, on_log_wrapper);
}
return rc;
}
int mosquittopp::connect(const char *host, int port, int keepalive)
{
return mosquitto_connect(m_mosq, host, port, keepalive);
}
int mosquittopp::connect(const char *host, int port, int keepalive, const char *bind_address)
{
return mosquitto_connect_bind(m_mosq, host, port, keepalive, bind_address);
}
int mosquittopp::connect_async(const char *host, int port, int keepalive)
{
return mosquitto_connect_async(m_mosq, host, port, keepalive);
}
int mosquittopp::connect_async(const char *host, int port, int keepalive, const char *bind_address)
{
return mosquitto_connect_bind_async(m_mosq, host, port, keepalive, bind_address);
}
int mosquittopp::reconnect()
{
return mosquitto_reconnect(m_mosq);
}
int mosquittopp::reconnect_async()
{
return mosquitto_reconnect_async(m_mosq);
}
int mosquittopp::disconnect()
{
return mosquitto_disconnect(m_mosq);
}
int mosquittopp::socket()
{
return mosquitto_socket(m_mosq);
}
int mosquittopp::will_set(const char *topic, int payloadlen, const void *payload, int qos, bool retain)
{
return mosquitto_will_set(m_mosq, topic, payloadlen, payload, qos, retain);
}
int mosquittopp::will_clear()
{
return mosquitto_will_clear(m_mosq);
}
int mosquittopp::username_pw_set(const char *username, const char *password)
{
return mosquitto_username_pw_set(m_mosq, username, password);
}
int mosquittopp::publish(int *mid, const char *topic, int payloadlen, const void *payload, int qos, bool retain)
{
return mosquitto_publish(m_mosq, mid, topic, payloadlen, payload, qos, retain);
}
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);
}
int mosquittopp::max_inflight_messages_set(unsigned int max_inflight_messages)
{
return mosquitto_max_inflight_messages_set(m_mosq, max_inflight_messages);
}
void mosquittopp::message_retry_set(unsigned int message_retry)
{
mosquitto_message_retry_set(m_mosq, message_retry);
}
int mosquittopp::subscribe(int *mid, const char *sub, int qos)
{
return mosquitto_subscribe(m_mosq, mid, sub, qos);
}
int mosquittopp::unsubscribe(int *mid, const char *sub)
{
return mosquitto_unsubscribe(m_mosq, mid, sub);
}
int mosquittopp::loop(int timeout, int max_packets)
{
return mosquitto_loop(m_mosq, timeout, max_packets);
}
int mosquittopp::loop_misc()
{
return mosquitto_loop_misc(m_mosq);
}
int mosquittopp::loop_read(int max_packets)
{
return mosquitto_loop_read(m_mosq, max_packets);
}
int mosquittopp::loop_write(int max_packets)
{
return mosquitto_loop_write(m_mosq, max_packets);
}
int mosquittopp::loop_forever(int timeout, int max_packets)
{
return mosquitto_loop_forever(m_mosq, timeout, max_packets);
}
int mosquittopp::loop_start()
{
return mosquitto_loop_start(m_mosq);
}
int mosquittopp::loop_stop(bool force)
{
return mosquitto_loop_stop(m_mosq, force);
}
bool mosquittopp::want_write()
{
return mosquitto_want_write(m_mosq);
}
2015-01-27 00:32:20 +00:00
int mosquittopp::opts_set(enum mosq_opt_t option, void *value)
{
return mosquitto_opts_set(m_mosq, option, value);
}
2014-07-02 19:45:26 +00:00
int mosquittopp::threaded_set(bool threaded)
{
return mosquitto_threaded_set(m_mosq, threaded);
}
2014-05-07 22:27:00 +00:00
void mosquittopp::user_data_set(void *userdata)
{
mosquitto_user_data_set(m_mosq, userdata);
}
2014-09-30 00:04:10 +00:00
int mosquittopp::socks5_set(const char *host, int port, const char *username, const char *password)
{
return mosquitto_socks5_set(m_mosq, host, port, username, password);
}
2014-05-07 22:27:00 +00:00
int mosquittopp::tls_set(const char *cafile, const char *capath, const char *certfile, const char *keyfile, int (*pw_callback)(char *buf, int size, int rwflag, void *userdata))
{
return mosquitto_tls_set(m_mosq, cafile, capath, certfile, keyfile, pw_callback);
}
int mosquittopp::tls_opts_set(int cert_reqs, const char *tls_version, const char *ciphers)
{
return mosquitto_tls_opts_set(m_mosq, cert_reqs, tls_version, ciphers);
}
int mosquittopp::tls_insecure_set(bool value)
{
return mosquitto_tls_insecure_set(m_mosq, value);
}
int mosquittopp::tls_psk_set(const char *psk, const char *identity, const char *ciphers)
{
return mosquitto_tls_psk_set(m_mosq, psk, identity, ciphers);
}
}