aws-crt-cpp
C++ wrapper around the aws-c-* libraries. Provides Cross-Platform Transport Protocols and SSL/TLS implementations for C++.
MqttRequestResponseClient.h
Go to the documentation of this file.
1 #pragma once
2 
7 #include <aws/crt/Exports.h>
8 
9 #include <aws/crt/Allocator.h>
10 #include <aws/crt/Optional.h>
11 #include <aws/crt/Types.h>
12 #include <aws/crt/Variant.h>
14 #include <aws/mqtt/request-response/request_response_client.h>
15 
16 #include <functional>
17 
18 namespace Aws
19 {
20 
21  namespace Crt
22  {
23  namespace Mqtt
24  {
25  class MqttConnection;
26  }
27 
28  namespace Mqtt5
29  {
30  class Mqtt5Client;
31  }
32  } // namespace Crt
33 
34  namespace Iot
35  {
36  namespace RequestResponse
37  {
42  {
43 
47  SubscriptionEstablished = ARRSSET_SUBSCRIPTION_ESTABLISHED,
48 
52  SubscriptionLost = ARRSSET_SUBSCRIPTION_LOST,
53 
59  SubscriptionHalted = ARRSSET_SUBSCRIPTION_HALTED,
60  };
61 
66  {
67  public:
75  {
76  m_type = type;
77  return *this;
78  }
79 
87  {
88  m_errorCode = errorCode;
89  return *this;
90  }
91 
96  SubscriptionStatusEventType GetType() const { return m_type; }
97 
102  int GetErrorCode() const { return m_errorCode; }
103 
104  private:
106  int m_errorCode = 0;
107  };
108 
112  using SubscriptionStatusEventHandler = std::function<void(SubscriptionStatusEvent &&)>;
113 
120  {
121  UserPropertyView(Aws::Crt::ByteCursor name, Aws::Crt::ByteCursor value) : m_name(name), m_value(value)
122  {
123  }
126  };
127 
134  {
135  public:
139  IncomingPublishEvent() : m_topic(), m_payload()
140  {
141  AWS_ZERO_STRUCT(m_topic);
142  AWS_ZERO_STRUCT(m_payload);
143  }
144 
152  {
153  m_topic = topic;
154  return *this;
155  }
156 
164  {
165  m_payload = payload;
166  return *this;
167  }
168 
176  {
177  m_contentType = contentType;
178  return *this;
179  }
180 
188  {
189  m_userProperties = std::move(userProperties);
190  return *this;
191  }
192 
199  IncomingPublishEvent &WithMessageExpiryIntervalSeconds(uint32_t messageExpiryIntervalSeconds)
200  {
201  m_messageExpiryIntervalSeconds = messageExpiryIntervalSeconds;
202  return *this;
203  }
204 
210  Aws::Crt::ByteCursor GetTopic() const { return m_topic; }
211 
217  Aws::Crt::ByteCursor GetPayload() const { return m_payload; }
218 
224  const Aws::Crt::Optional<Aws::Crt::ByteCursor> &GetContentType() const { return m_contentType; }
225 
231  {
232  return m_userProperties;
233  }
234 
236  {
237  return m_messageExpiryIntervalSeconds;
238  }
239 
240  private:
241  Aws::Crt::ByteCursor m_topic;
242  Aws::Crt::ByteCursor m_payload;
245  Aws::Crt::Optional<uint32_t> m_messageExpiryIntervalSeconds;
246  };
247 
253  using IncomingPublishEventHandler = std::function<void(IncomingPublishEvent &&)>;
254 
261  {
262  public:
266  UnmodeledResponse() : m_topic(), m_payload()
267  {
268  AWS_ZERO_STRUCT(m_payload);
269  AWS_ZERO_STRUCT(m_topic);
270  }
271 
279  {
280  m_payload = payload;
281  return *this;
282  }
283 
291  {
292  m_topic = topic;
293  return *this;
294  }
295 
301  Aws::Crt::ByteCursor GetPayload() const { return m_payload; }
302 
308  Aws::Crt::ByteCursor GetTopic() const { return m_topic; }
309 
310  private:
315  Aws::Crt::ByteCursor m_topic;
316 
320  Aws::Crt::ByteCursor m_payload;
321  };
322 
329  template <typename R, typename E> class Result
330  {
331  public:
332  Result() = delete;
333 
334  explicit Result(const R &response) : m_rawResult(response) {}
335  explicit Result(R &&response) : m_rawResult(std::move(response)) {}
336  explicit Result(const E &error) : m_rawResult(error) {}
337  explicit Result(E &&error) : m_rawResult(std::move(error)) {}
338 
339  Result &operator=(const R &response)
340  {
341  this->m_rawResult = response;
342 
343  return *this;
344  }
345 
346  Result &operator=(R &&response)
347  {
348  this->m_rawResult = std::move(response);
349 
350  return *this;
351  }
352 
353  Result &operator=(const E &error)
354  {
355  this->m_rawResult = error;
356  return *this;
357  }
358 
359  Result &operator=(E &&error)
360  {
361  this->m_rawResult = std::move(error);
362 
363  return *this;
364  }
365 
366  bool IsSuccess() const { return m_rawResult.template holds_alternative<R>(); }
367 
368  const R &GetResponse() const
369  {
370  AWS_FATAL_ASSERT(IsSuccess());
371 
372  return m_rawResult.template get<R>();
373  }
374 
375  const E &GetError() const
376  {
377  AWS_FATAL_ASSERT(!IsSuccess());
378 
379  return m_rawResult.template get<E>();
380  }
381 
382  private:
383  Aws::Crt::Variant<R, E> m_rawResult;
384  };
385 
391 
397  using UnmodeledResultHandler = std::function<void(UnmodeledResult &&)>;
398 
404  template <typename T> class StreamingOperationOptions
405  {
406  public:
414  const SubscriptionStatusEventHandler &handler)
415  {
416  m_subscriptionStatusEventHandler = handler;
417  return *this;
418  }
419 
426  StreamingOperationOptions &WithStreamHandler(const std::function<void(T &&)> &handler)
427  {
428  m_streamHandler = handler;
429  return *this;
430  }
431 
438  {
439  return m_subscriptionStatusEventHandler;
440  }
441 
447  const std::function<void(T &&)> &GetStreamHandler() const { return m_streamHandler; }
448 
449  private:
450  SubscriptionStatusEventHandler m_subscriptionStatusEventHandler;
451 
452  std::function<void(T &&)> m_streamHandler;
453  };
454 
462  {
463  public:
465  : subscriptionTopicFilter(), subscriptionStatusEventHandler(), incomingPublishEventHandler()
466  {
467  AWS_ZERO_STRUCT(subscriptionTopicFilter);
468  }
469 
471 
473 
475  };
476 
481  {
482  public:
487  virtual ~IStreamingOperation() = default;
488 
492  virtual void Open() = 0;
493  };
494 
499  {
500  public:
512  uint32_t maxRequestResponseSubscriptions)
513  {
514  m_maxRequestResponseSubscriptions = maxRequestResponseSubscriptions;
515  return *this;
516  }
517 
527  RequestResponseClientOptions &WithMaxStreamingSubscriptions(uint32_t maxStreamingSubscriptions)
528  {
529  m_maxStreamingSubscriptions = maxStreamingSubscriptions;
530  return *this;
531  }
532 
541  RequestResponseClientOptions &WithOperationTimeoutInSeconds(uint32_t operationTimeoutInSeconds)
542  {
543  m_operationTimeoutInSeconds = operationTimeoutInSeconds;
544  return *this;
545  }
546 
554  uint32_t GetMaxRequestResponseSubscriptions() const { return m_maxRequestResponseSubscriptions; }
555 
561  uint32_t GetMaxStreamingSubscriptions() const { return m_maxStreamingSubscriptions; }
562 
568  uint32_t GetOperationTimeoutInSeconds() const { return m_operationTimeoutInSeconds; }
569 
570  private:
574  uint32_t m_maxRequestResponseSubscriptions = 0;
575 
579  uint32_t m_maxStreamingSubscriptions = 0;
580 
584  uint32_t m_operationTimeoutInSeconds = 0;
585  };
586 
591  {
592  public:
597  virtual ~IMqttRequestResponseClient() = default;
598 
606  virtual int SubmitRequest(
607  const aws_mqtt_request_operation_options &requestOptions,
608  UnmodeledResultHandler &&resultHandler) = 0;
609 
617  virtual std::shared_ptr<IStreamingOperation> CreateStream(
618  const StreamingOperationOptionsInternal &options) = 0;
619  };
620 
629  AWS_CRT_CPP_API std::shared_ptr<IMqttRequestResponseClient> NewClientFrom5(
630  const Aws::Crt::Mqtt5::Mqtt5Client &protocolClient,
631  const RequestResponseClientOptions &options,
633 
642  AWS_CRT_CPP_API std::shared_ptr<IMqttRequestResponseClient> NewClientFrom311(
643  const Aws::Crt::Mqtt::MqttConnection &protocolClient,
644  const RequestResponseClientOptions &options,
646 
647  } // namespace RequestResponse
648  } // namespace Iot
649 } // namespace Aws
RequestResponseClientOptions & WithOperationTimeoutInSeconds(uint32_t operationTimeoutInSeconds)
Definition: MqttRequestResponseClient.h:541
Result & operator=(R &&response)
Definition: MqttRequestResponseClient.h:346
IncomingPublishEvent & WithContentType(Aws::Crt::ByteCursor contentType)
Definition: MqttRequestResponseClient.h:175
StreamingOperationOptions & WithStreamHandler(const std::function< void(T &&)> &handler)
Definition: MqttRequestResponseClient.h:426
AWS_CRT_CPP_API std::shared_ptr< IMqttRequestResponseClient > NewClientFrom311(const Aws::Crt::Mqtt::MqttConnection &protocolClient, const RequestResponseClientOptions &options, Aws::Crt::Allocator *allocator=Aws::Crt::ApiAllocator())
Definition: MqttRequestResponseClient.cpp:498
Definition: MqttRequestResponseClient.h:133
SubscriptionStatusEventType
Definition: MqttRequestResponseClient.h:41
UnmodeledResponse & WithTopic(Aws::Crt::ByteCursor topic)
Definition: MqttRequestResponseClient.h:290
uint32_t GetMaxStreamingSubscriptions() const
Definition: MqttRequestResponseClient.h:561
#define AWS_CRT_CPP_API
Definition: Exports.h:36
IncomingPublishEvent & WithPayload(Aws::Crt::ByteCursor payload)
Definition: MqttRequestResponseClient.h:163
const E & GetError() const
Definition: MqttRequestResponseClient.h:375
const Aws::Crt::Optional< Aws::Crt::ByteCursor > & GetContentType() const
Definition: MqttRequestResponseClient.h:224
const R & GetResponse() const
Definition: MqttRequestResponseClient.h:368
std::function< void(UnmodeledResult &&)> UnmodeledResultHandler
Definition: MqttRequestResponseClient.h:397
Aws::Crt::ByteCursor GetPayload() const
Definition: MqttRequestResponseClient.h:301
int GetErrorCode() const
Definition: MqttRequestResponseClient.h:102
Definition: StringView.h:861
Result(R &&response)
Definition: MqttRequestResponseClient.h:335
StreamingOperationOptions & WithSubscriptionStatusEventHandler(const SubscriptionStatusEventHandler &handler)
Definition: MqttRequestResponseClient.h:413
const Aws::Crt::Optional< Aws::Crt::Vector< UserPropertyView > > & GetUserProperties() const
Definition: MqttRequestResponseClient.h:230
RequestResponseClientOptions & WithMaxRequestResponseSubscriptions(uint32_t maxRequestResponseSubscriptions)
Definition: MqttRequestResponseClient.h:511
Aws::Crt::ByteCursor GetPayload() const
Definition: MqttRequestResponseClient.h:217
const SubscriptionStatusEventHandler & GetSubscriptionStatusEventHandler() const
Definition: MqttRequestResponseClient.h:437
Aws::Crt::ByteCursor subscriptionTopicFilter
Definition: MqttRequestResponseClient.h:470
aws_allocator Allocator
Definition: Allocator.h:14
aws_byte_cursor ByteCursor
Definition: Types.h:31
Result & operator=(E &&error)
Definition: MqttRequestResponseClient.h:359
Definition: MqttRequestResponseClient.h:480
StreamingOperationOptionsInternal()
Definition: MqttRequestResponseClient.h:464
SubscriptionStatusEvent & WithType(SubscriptionStatusEventType type)
Definition: MqttRequestResponseClient.h:74
std::function< void(IncomingPublishEvent &&)> IncomingPublishEventHandler
Definition: MqttRequestResponseClient.h:253
const Aws::Crt::Optional< uint32_t > & GetMessageExpiryIntervalSeconds() const
Definition: MqttRequestResponseClient.h:235
Aws::Crt::ByteCursor m_value
Definition: MqttRequestResponseClient.h:125
Result(E &&error)
Definition: MqttRequestResponseClient.h:337
Definition: MqttRequestResponseClient.h:461
IncomingPublishEventHandler incomingPublishEventHandler
Definition: MqttRequestResponseClient.h:474
Definition: MqttRequestResponseClient.h:65
UnmodeledResponse()
Definition: MqttRequestResponseClient.h:266
Definition: MqttRequestResponseClient.h:590
AWS_CRT_CPP_API std::shared_ptr< IMqttRequestResponseClient > NewClientFrom5(const Aws::Crt::Mqtt5::Mqtt5Client &protocolClient, const RequestResponseClientOptions &options, Aws::Crt::Allocator *allocator=Aws::Crt::ApiAllocator())
Definition: MqttRequestResponseClient.cpp:469
Definition: MqttRequestResponseClient.h:119
IncomingPublishEvent()
Definition: MqttRequestResponseClient.h:139
AWS_CRT_CPP_API Allocator * ApiAllocator() noexcept
Definition: Allocator.cpp:24
Definition: MqttRequestResponseClient.h:329
RequestResponseClientOptions & WithMaxStreamingSubscriptions(uint32_t maxStreamingSubscriptions)
Definition: MqttRequestResponseClient.h:527
Aws::Crt::ByteCursor m_name
Definition: MqttRequestResponseClient.h:124
SubscriptionStatusEventHandler subscriptionStatusEventHandler
Definition: MqttRequestResponseClient.h:472
Result & operator=(const E &error)
Definition: MqttRequestResponseClient.h:353
Result & operator=(const R &response)
Definition: MqttRequestResponseClient.h:339
Result(const E &error)
Definition: MqttRequestResponseClient.h:336
const std::function< void(T &&)> & GetStreamHandler() const
Definition: MqttRequestResponseClient.h:447
std::function< void(SubscriptionStatusEvent &&)> SubscriptionStatusEventHandler
Definition: MqttRequestResponseClient.h:112
Definition: MqttRequestResponseClient.h:260
uint32_t GetMaxRequestResponseSubscriptions() const
Definition: MqttRequestResponseClient.h:554
std::vector< T, StlAllocator< T >> Vector
Definition: Types.h:53
IncomingPublishEvent & WithTopic(Aws::Crt::ByteCursor topic)
Definition: MqttRequestResponseClient.h:151
Result(const R &response)
Definition: MqttRequestResponseClient.h:334
Aws::Crt::ByteCursor GetTopic() const
Definition: MqttRequestResponseClient.h:308
SubscriptionStatusEvent & WithErrorCode(int errorCode)
Definition: MqttRequestResponseClient.h:86
UserPropertyView(Aws::Crt::ByteCursor name, Aws::Crt::ByteCursor value)
Definition: MqttRequestResponseClient.h:121
Definition: MqttRequestResponseClient.h:404
SubscriptionStatusEventType GetType() const
Definition: MqttRequestResponseClient.h:96
IncomingPublishEvent & WithUserProperties(Aws::Crt::Vector< UserPropertyView > userProperties)
Definition: MqttRequestResponseClient.h:187
Aws::Crt::ByteCursor GetTopic() const
Definition: MqttRequestResponseClient.h:210
Definition: Mqtt5Client.h:331
Definition: MqttRequestResponseClient.h:498
uint32_t GetOperationTimeoutInSeconds() const
Definition: MqttRequestResponseClient.h:568
IncomingPublishEvent & WithMessageExpiryIntervalSeconds(uint32_t messageExpiryIntervalSeconds)
Definition: MqttRequestResponseClient.h:199
Definition: MqttConnection.h:157
bool IsSuccess() const
Definition: MqttRequestResponseClient.h:366
UnmodeledResponse & WithPayload(Aws::Crt::ByteCursor payload)
Definition: MqttRequestResponseClient.h:278
Definition: Allocator.h:10