azure-core-amqp
Loading...
Searching...
No Matches
message_sender.hpp
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#pragma once
5
6#include "azure/core/amqp/internal/amqp_settle_mode.hpp"
7#include "azure/core/amqp/models/amqp_message.hpp"
8#include "azure/core/amqp/models/amqp_value.hpp"
9#include "cancellable.hpp"
10#include "claims_based_security.hpp"
11#include "common/async_operation_queue.hpp"
12#include "connection.hpp"
13#include "link.hpp"
14#include "models/amqp_error.hpp"
15
16#include <azure/core/nullable.hpp>
17
18#include <tuple>
19
20#if defined(_azure_TESTING_BUILD)
21// Define the test classes dependant on this class here.
22namespace Azure { namespace Core { namespace Amqp { namespace Tests { namespace MessageTests {
23 class AmqpServerMock;
24 class MockServiceEndpoint;
25}}}}} // namespace Azure::Core::Amqp::Tests::MessageTests
26#endif // _azure_TESTING_BUILDs
27
28namespace Azure { namespace Core { namespace Amqp { namespace _detail {
29 class MessageSenderImpl;
30 class MessageSenderFactory;
31}}}} // namespace Azure::Core::Amqp::_detail
32
33namespace Azure { namespace Core { namespace Amqp { namespace _internal {
34 enum class MessageSendStatus
35 {
36 Invalid,
37 Ok,
38 Error,
39 Timeout,
40 Cancelled,
41 };
42 std::ostream& operator<<(std::ostream& stream, MessageSendStatus status);
43
44 enum class MessageSenderState
45 {
46 Invalid,
47 Idle,
48 Opening,
49 Open,
50 Closing,
51 Error,
52 };
53 std::ostream& operator<<(std::ostream& stream, MessageSenderState state);
54
55 class MessageSender;
56 class MessageSenderEvents {
57 protected:
58 ~MessageSenderEvents() = default;
59
60 public:
61 virtual void OnMessageSenderStateChanged(
62 MessageSender const& sender,
63 MessageSenderState newState,
64 MessageSenderState oldState)
65 = 0;
66 virtual void OnMessageSenderDisconnected(
67 MessageSender const& sender,
68 Models::_internal::AmqpError const& error)
69 = 0;
70 };
71
72 struct MessageSenderOptions final
73 {
82 std::string Name;
83
93 SenderSettleMode SettleMode{};
94
96 Models::_internal::MessageSource MessageSource;
97
99 Nullable<uint64_t> MaxMessageSize;
100
110 uint32_t MaxLinkCredits{};
111
120 Nullable<uint32_t> InitialDeliveryCount;
121
123 bool EnableTrace{false};
124
126 bool AuthenticationRequired{true};
127 };
128
129 class MessageSender final {
130 public:
131 using MessageSendCompleteCallback
132 = std::function<void(MessageSendStatus sendResult, Models::AmqpValue const& deliveryState)>;
133
134 ~MessageSender() noexcept;
135
136 MessageSender(MessageSender const&) = default;
137 MessageSender& operator=(MessageSender const&) = default;
138 MessageSender(MessageSender&&) noexcept = default;
139 MessageSender& operator=(MessageSender&&) noexcept = default;
140
150 _azure_NODISCARD Models::_internal::AmqpError Open(Context const& context = {});
151
155 void Close(Context const& context = {});
156
161 std::string GetLinkName() const;
162
167 std::uint64_t GetMaxMessageSize() const;
168
176 _azure_NODISCARD std::tuple<MessageSendStatus, Models::_internal::AmqpError> Send(
177 Models::AmqpMessage const& message,
178 Context const& context = {});
179
180 private:
181 // Half-open the message sender (does not block waiting on the Open to complete).
182 _azure_NODISCARD Models::_internal::AmqpError HalfOpen(Context const& context = {});
187 MessageSender(std::shared_ptr<_detail::MessageSenderImpl> sender) : m_impl{sender} {}
188
189 friend class _detail::MessageSenderFactory;
190 std::shared_ptr<_detail::MessageSenderImpl> m_impl;
191#if _azure_TESTING_BUILD
192 friend class Azure::Core::Amqp::Tests::MessageTests::AmqpServerMock;
193 friend class Azure::Core::Amqp::Tests::MessageTests::MockServiceEndpoint;
194 friend class Azure::Core::Amqp::Tests::MessageTests::MessageListenerEvents;
195#endif // _azure_TESTING_BUILD
196 };
197}}}} // namespace Azure::Core::Amqp::_internal