PahoMqttCpp
MQTT C++ Client for POSIX and Windows
Loading...
Searching...
No Matches
token.h
Go to the documentation of this file.
1
7
8/*******************************************************************************
9 * Copyright (c) 2013-2019 Frank Pagliughi <fpagliughi@mindspring.com>
10 *
11 * All rights reserved. This program and the accompanying materials
12 * are made available under the terms of the Eclipse Public License v2.0
13 * and Eclipse Distribution License v1.0 which accompany this distribution.
14 *
15 * The Eclipse Public License is available at
16 * http://www.eclipse.org/legal/epl-v20.html
17 * and the Eclipse Distribution License is available at
18 * http://www.eclipse.org/org/documents/edl-v10.php.
19 *
20 * Contributors:
21 * Frank Pagliughi - initial implementation and documentation
22 * Frank Pagliughi - MQTT v5 support & server responses
23 *******************************************************************************/
24
25#ifndef __mqtt_token_h
26#define __mqtt_token_h
27
28#include <chrono>
29#include <condition_variable>
30#include <mutex>
31#include <thread>
32#include <vector>
33
34#include "MQTTAsync.h"
35#include "mqtt/buffer_ref.h"
36#include "mqtt/exception.h"
38#include "mqtt/properties.h"
41#include "mqtt/types.h"
42
43namespace mqtt {
44
45class iasync_client;
46
48
53class token
54{
55public:
57 using ptr_t = std::shared_ptr<token>;
59 using const_ptr_t = std::shared_ptr<const token>;
61 using weak_ptr_t = std::weak_ptr<token>;
62
65
66private:
68 using guard = std::lock_guard<std::mutex>;
70 using unique_lock = std::unique_lock<std::mutex>;
71
73 mutable std::mutex lock_;
75 mutable std::condition_variable cond_;
76
78 Type type_;
80 iasync_client* cli_;
82 int rc_{0};
86 string errMsg_;
88 MQTTAsync_token msgId_;
92 void* userContext_;
93
99 iaction_listener* listener_;
101 size_t nExpected_;
103 bool complete_;
104
106 std::unique_ptr<connect_response> connRsp_;
108 std::unique_ptr<subscribe_response> subRsp_;
110 std::unique_ptr<unsubscribe_response> unsubRsp_;
111
113 friend class async_client;
114 friend class mock_async_client;
115
116 friend class connect_options;
117 friend class response_options;
119 friend class disconnect_options;
120
124 void reset();
130 void set_message_id(MQTTAsync_token msgId) {
131 guard g(lock_);
132 msgId_ = msgId;
133 }
143 static void on_success(void* tokObj, MQTTAsync_successData* rsp);
144 static void on_success5(void* tokObj, MQTTAsync_successData5* rsp);
154 static void on_failure(void* tokObj, MQTTAsync_failureData* rsp);
155 static void on_failure5(void* tokObj, MQTTAsync_failureData5* rsp);
162 static void on_connected(void* tokObj, char* /*cause*/);
167 void on_success(MQTTAsync_successData* rsp);
168 void on_success5(MQTTAsync_successData5* rsp);
173 void on_failure(MQTTAsync_failureData* rsp);
174 void on_failure5(MQTTAsync_failureData5* rsp);
175
180 void check_ret() const {
181 if (rc_ != MQTTASYNC_SUCCESS || reasonCode_ >= 0x80)
182 throw exception(rc_, reasonCode_, errMsg_);
183 }
184
185public:
191 token(Type typ, iasync_client& cli) : token{typ, cli, MQTTAsync_token(0)} {}
201 token(Type typ, iasync_client& cli, void* userContext, iaction_listener& cb)
202 : token{typ, cli, const_string_collection_ptr(), userContext, cb} {}
203
210 token(Type typ, iasync_client& cli, const string& topic)
211 : token{typ, cli, string_collection::create(topic)} {}
223 Type typ, iasync_client& cli, const string& topic, void* userContext,
225 )
226 : token{typ, cli, string_collection::create(topic), userContext, cb} {}
227
246 Type typ, iasync_client& cli, const_string_collection_ptr topics, void* userContext,
248 );
255 token(Type typ, iasync_client& cli, MQTTAsync_token tok);
259 virtual ~token() {}
266 static ptr_t create(Type typ, iasync_client& cli) {
267 return std::make_shared<token>(typ, cli);
268 }
278 static ptr_t create(
279 Type typ, iasync_client& cli, void* userContext, iaction_listener& cb
280 ) {
281 return std::make_shared<token>(typ, cli, userContext, cb);
282 }
289 static ptr_t create(Type typ, iasync_client& cli, const string& topic) {
290 return std::make_shared<token>(typ, cli, topic);
291 }
302 static ptr_t create(
303 Type typ, iasync_client& cli, const string& topic, void* userContext,
305 ) {
306 return std::make_shared<token>(typ, cli, topic, userContext, cb);
307 }
315 return std::make_shared<token>(typ, cli, topics);
316 }
327 static ptr_t create(
328 Type typ, iasync_client& cli, const_string_collection_ptr topics, void* userContext,
330 ) {
331 return std::make_shared<token>(typ, cli, topics, userContext, cb);
332 }
338 Type get_type() const { return type_; }
344 guard g(lock_);
345 return listener_;
346 }
352 virtual iasync_client* get_client() const { return cli_; }
357 virtual int get_message_id() const {
358 static_assert(sizeof(msgId_) <= sizeof(int), "MQTTAsync_token must fit into int");
359 return int(msgId_);
360 }
367 virtual const_string_collection_ptr get_topics() const { return topics_; }
372 virtual void* get_user_context() const {
373 guard g(lock_);
374 return userContext_;
375 }
380 virtual bool is_complete() const { return complete_; }
388 explicit operator bool() const {
389 guard g(lock_);
390 return rc_ == MQTTASYNC_SUCCESS && reasonCode_ < 0x80;
391 }
398 virtual int get_return_code() const { return rc_; }
403 virtual void set_action_callback(iaction_listener& listener);
409 virtual void set_user_context(void* userContext) {
410 guard g(lock_);
411 userContext_ = userContext;
412 }
418 void set_num_expected(size_t n) { nExpected_ = n; }
423 ReasonCode get_reason_code() const { return reasonCode_; }
428 string get_error_message() const { return errMsg_; }
433 virtual void wait();
439 virtual bool try_wait() {
440 guard g(lock_);
441 if (complete_)
442 check_ret();
443 return complete_;
444 }
452 virtual bool wait_for(long timeout) {
453 return wait_for(std::chrono::milliseconds(timeout));
454 }
461 template <class Rep, class Period>
462 bool wait_for(const std::chrono::duration<Rep, Period>& relTime) {
463 unique_lock g(lock_);
464 if (!cond_.wait_for(g, std::chrono::milliseconds(relTime), [this] {
465 return complete_;
466 }))
467 return false;
468 check_ret();
469 return true;
470 }
477 template <class Clock, class Duration>
478 bool wait_until(const std::chrono::time_point<Clock, Duration>& absTime) {
479 unique_lock g(lock_);
480 if (!cond_.wait_until(g, absTime, [this] { return complete_; }))
481 return false;
482 check_ret();
483 return true;
484 }
485
510};
511
514
517
519} // namespace mqtt
520
521#endif // __mqtt_token_h
Definition async_client.h:121
Definition connect_options.h:50
Definition server_response.h:73
Definition response_options.h:264
Definition disconnect_options.h:41
Definition exception.h:48
Definition iaction_listener.h:50
Definition iasync_client.h:60
Definition response_options.h:51
Definition string_collection.h:45
Definition token.h:54
token(Type typ, iasync_client &cli, void *userContext, iaction_listener &cb)
Definition token.h:201
static ptr_t create(Type typ, iasync_client &cli, const string &topic)
Definition token.h:289
static ptr_t create(Type typ, iasync_client &cli)
Definition token.h:266
virtual int get_message_id() const
Definition token.h:357
virtual void * get_user_context() const
Definition token.h:372
virtual int get_return_code() const
Definition token.h:398
virtual void wait()
token(Type typ, iasync_client &cli, const string &topic, void *userContext, iaction_listener &cb)
Definition token.h:222
static ptr_t create(Type typ, iasync_client &cli, const string &topic, void *userContext, iaction_listener &cb)
Definition token.h:302
Type get_type() const
Definition token.h:338
ReasonCode get_reason_code() const
Definition token.h:423
std::shared_ptr< token > ptr_t
Definition token.h:57
unsubscribe_response get_unsubscribe_response() const
static ptr_t create(Type typ, iasync_client &cli, const_string_collection_ptr topics)
Definition token.h:314
subscribe_response get_subscribe_response() const
std::shared_ptr< const token > const_ptr_t
Definition token.h:59
virtual bool wait_for(long timeout)
Definition token.h:452
virtual const_string_collection_ptr get_topics() const
Definition token.h:367
virtual bool is_complete() const
Definition token.h:380
virtual void set_user_context(void *userContext)
Definition token.h:409
token(Type typ, iasync_client &cli)
Definition token.h:191
Type
Definition token.h:64
@ SUBSCRIBE
Definition token.h:64
@ CONNECT
Definition token.h:64
@ UNSUBSCRIBE
Definition token.h:64
@ PUBLISH
Definition token.h:64
@ DISCONNECT
Definition token.h:64
string get_error_message() const
Definition token.h:428
token(Type typ, iasync_client &cli, MQTTAsync_token tok)
bool wait_until(const std::chrono::time_point< Clock, Duration > &absTime)
Definition token.h:478
token(Type typ, iasync_client &cli, const_string_collection_ptr topics)
connect_response get_connect_response() const
virtual iaction_listener * get_action_callback() const
Definition token.h:343
virtual iasync_client * get_client() const
Definition token.h:352
virtual bool try_wait()
Definition token.h:439
virtual ~token()
Definition token.h:259
std::weak_ptr< token > weak_ptr_t
Definition token.h:61
token(Type typ, iasync_client &cli, const string &topic)
Definition token.h:210
void set_num_expected(size_t n)
Definition token.h:418
token(Type typ, iasync_client &cli, const_string_collection_ptr topics, void *userContext, iaction_listener &cb)
virtual void set_action_callback(iaction_listener &listener)
friend class mock_async_client
Definition token.h:114
static ptr_t create(Type typ, iasync_client &cli, const_string_collection_ptr topics, void *userContext, iaction_listener &cb)
Definition token.h:327
static ptr_t create(Type typ, iasync_client &cli, void *userContext, iaction_listener &cb)
Definition token.h:278
bool wait_for(const std::chrono::duration< Rep, Period > &relTime)
Definition token.h:462
Definition topic.h:45
Definition server_response.h:172
Definition async_client.h:60
ReasonCode
Definition reason_code.h:39
@ SUCCESS
Definition reason_code.h:40
token::const_ptr_t const_token_ptr
Definition token.h:516
string_collection::const_ptr_t const_string_collection_ptr
Definition string_collection.h:259
token::ptr_t token_ptr
Definition token.h:513
Definition server_response.h:131