2 Copyright (c) 2010-2013 Roger Light <roger@atchoo.org>
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
8 1. Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 3. Neither the name of mosquitto nor the names of its
14 contributors may be used to endorse or promote products derived from
15 this software without specific prior written permission.
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 POSSIBILITY OF SUCH DAMAGE.
31 #include <mosquitto.h>
32 #include <mosquittopp.h>
37 static void on_connect_wrapper(struct mosquitto *mosq, void *userdata, int rc)
39 class mosquittopp *m = (class mosquittopp *)userdata;
43 static void on_disconnect_wrapper(struct mosquitto *mosq, void *userdata, int rc)
45 class mosquittopp *m = (class mosquittopp *)userdata;
49 static void on_publish_wrapper(struct mosquitto *mosq, void *userdata, int mid)
51 class mosquittopp *m = (class mosquittopp *)userdata;
55 static void on_message_wrapper(struct mosquitto *mosq, void *userdata,
56 const struct mosquitto_message *message)
58 class mosquittopp *m = (class mosquittopp *)userdata;
59 m->on_message(message);
62 static void on_subscribe_wrapper(struct mosquitto *mosq, void *userdata, int mid, int qos_count,
63 const int *granted_qos)
65 class mosquittopp *m = (class mosquittopp *)userdata;
66 m->on_subscribe(mid, qos_count, granted_qos);
69 static void on_unsubscribe_wrapper(struct mosquitto *mosq, void *userdata, int mid)
71 class mosquittopp *m = (class mosquittopp *)userdata;
72 m->on_unsubscribe(mid);
76 static void on_log_wrapper(struct mosquitto *mosq, void *userdata, int level, const char *str)
78 class mosquittopp *m = (class mosquittopp *)userdata;
79 m->on_log(level, str);
82 int lib_version(int *major, int *minor, int *revision)
84 if (major) *major = LIBMOSQUITTO_MAJOR;
85 if (minor) *minor = LIBMOSQUITTO_MINOR;
86 if (revision) *revision = LIBMOSQUITTO_REVISION;
87 return LIBMOSQUITTO_VERSION_NUMBER;
92 return mosquitto_lib_init();
97 return mosquitto_lib_cleanup();
100 const char *strerror(int mosq_errno)
102 return mosquitto_strerror(mosq_errno);
105 const char *connack_string(int connack_code)
107 return mosquitto_connack_string(connack_code);
110 int sub_topic_tokenise(const char *subtopic, char ***topics, int *count)
112 return mosquitto_sub_topic_tokenise(subtopic, topics, count);
115 int sub_topic_tokens_free(char ***topics, int count)
117 return mosquitto_sub_topic_tokens_free(topics, count);
120 int topic_matches_sub(const char *sub, const char *topic, bool *result)
122 return mosquitto_topic_matches_sub(sub, topic, result);
125 mosquittopp::mosquittopp(const char *id, bool clean_session)
127 m_mosq = mosquitto_new(id, clean_session, this);
128 mosquitto_connect_callback_set(m_mosq, on_connect_wrapper);
129 mosquitto_disconnect_callback_set(m_mosq, on_disconnect_wrapper);
130 mosquitto_publish_callback_set(m_mosq, on_publish_wrapper);
131 mosquitto_message_callback_set(m_mosq, on_message_wrapper);
132 mosquitto_subscribe_callback_set(m_mosq, on_subscribe_wrapper);
133 mosquitto_unsubscribe_callback_set(m_mosq, on_unsubscribe_wrapper);
134 mosquitto_log_callback_set(m_mosq, on_log_wrapper);
137 mosquittopp::~mosquittopp()
139 mosquitto_destroy(m_mosq);
142 int mosquittopp::reinitialise(const char *id, bool clean_session)
145 rc = mosquitto_reinitialise(m_mosq, id, clean_session, this);
146 if (rc == MOSQ_ERR_SUCCESS)
148 mosquitto_connect_callback_set(m_mosq, on_connect_wrapper);
149 mosquitto_disconnect_callback_set(m_mosq, on_disconnect_wrapper);
150 mosquitto_publish_callback_set(m_mosq, on_publish_wrapper);
151 mosquitto_message_callback_set(m_mosq, on_message_wrapper);
152 mosquitto_subscribe_callback_set(m_mosq, on_subscribe_wrapper);
153 mosquitto_unsubscribe_callback_set(m_mosq, on_unsubscribe_wrapper);
154 mosquitto_log_callback_set(m_mosq, on_log_wrapper);
159 int mosquittopp::connect(const char *host, int port, int keepalive)
161 return mosquitto_connect(m_mosq, host, port, keepalive);
164 int mosquittopp::connect(const char *host, int port, int keepalive, const char *bind_address)
166 return mosquitto_connect_bind(m_mosq, host, port, keepalive, bind_address);
169 int mosquittopp::connect_async(const char *host, int port, int keepalive)
171 return mosquitto_connect_async(m_mosq, host, port, keepalive);
174 int mosquittopp::connect_async(const char *host, int port, int keepalive, const char *bind_address)
176 return mosquitto_connect_bind_async(m_mosq, host, port, keepalive, bind_address);
179 int mosquittopp::reconnect()
181 return mosquitto_reconnect(m_mosq);
184 int mosquittopp::reconnect_async()
186 return mosquitto_reconnect_async(m_mosq);
189 int mosquittopp::disconnect()
191 return mosquitto_disconnect(m_mosq);
194 int mosquittopp::socket()
196 return mosquitto_socket(m_mosq);
199 int mosquittopp::will_set(const char *topic, int payloadlen, const void *payload, int qos,
202 return mosquitto_will_set(m_mosq, topic, payloadlen, payload, qos, retain);
205 int mosquittopp::will_clear()
207 return mosquitto_will_clear(m_mosq);
210 int mosquittopp::username_pw_set(const char *username, const char *password)
212 return mosquitto_username_pw_set(m_mosq, username, password);
215 int mosquittopp::publish(int *mid, const char *topic, int payloadlen, const void *payload, int qos,
218 return mosquitto_publish(m_mosq, mid, topic, payloadlen, payload, qos, retain);
221 void mosquittopp::reconnect_delay_set(unsigned int reconnect_delay,
222 unsigned int reconnect_delay_max, bool reconnect_exponential_backoff)
224 mosquitto_reconnect_delay_set(m_mosq, reconnect_delay, reconnect_delay_max,
225 reconnect_exponential_backoff);
228 int mosquittopp::max_inflight_messages_set(unsigned int max_inflight_messages)
230 return mosquitto_max_inflight_messages_set(m_mosq, max_inflight_messages);
233 void mosquittopp::message_retry_set(unsigned int message_retry)
235 mosquitto_message_retry_set(m_mosq, message_retry);
238 int mosquittopp::subscribe(int *mid, const char *sub, int qos)
240 return mosquitto_subscribe(m_mosq, mid, sub, qos);
243 int mosquittopp::unsubscribe(int *mid, const char *sub)
245 return mosquitto_unsubscribe(m_mosq, mid, sub);
248 int mosquittopp::loop(int timeout, int max_packets)
250 return mosquitto_loop(m_mosq, timeout, max_packets);
253 int mosquittopp::loop_misc()
255 return mosquitto_loop_misc(m_mosq);
258 int mosquittopp::loop_read(int max_packets)
260 return mosquitto_loop_read(m_mosq, max_packets);
263 int mosquittopp::loop_write(int max_packets)
265 return mosquitto_loop_write(m_mosq, max_packets);
268 int mosquittopp::loop_forever(int timeout, int max_packets)
270 return mosquitto_loop_forever(m_mosq, timeout, max_packets);
273 int mosquittopp::loop_start()
275 return mosquitto_loop_start(m_mosq);
278 int mosquittopp::loop_stop(bool force)
280 return mosquitto_loop_stop(m_mosq, force);
283 bool mosquittopp::want_write()
285 return mosquitto_want_write(m_mosq);
288 void mosquittopp::user_data_set(void *userdata)
290 mosquitto_user_data_set(m_mosq, userdata);
293 int mosquittopp::tls_set(const char *cafile, const char *capath, const char *certfile,
294 const char *keyfile, int (*pw_callback)(char *buf, int size, int rwflag, void *userdata))
296 return mosquitto_tls_set(m_mosq, cafile, capath, certfile, keyfile, pw_callback);
299 int mosquittopp::tls_opts_set(int cert_reqs, const char *tls_version, const char *ciphers)
301 return mosquitto_tls_opts_set(m_mosq, cert_reqs, tls_version, ciphers);
304 int mosquittopp::tls_insecure_set(bool value)
306 return mosquitto_tls_insecure_set(m_mosq, value);
309 int mosquittopp::tls_psk_set(const char *psk, const char *identity, const char *ciphers)
311 return mosquitto_tls_psk_set(m_mosq, psk, identity, ciphers);