azure-core-amqp
Loading...
Searching...
No Matches
session.hpp
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#pragma once
5
6#include "azure/core/amqp/internal/models/amqp_error.hpp"
7#include "azure/core/amqp/models/amqp_value.hpp"
8#include "common/async_operation_queue.hpp"
9#include "connection_string_credential.hpp"
10#include "endpoint.hpp"
11#include "models/message_source.hpp"
12#include "models/message_target.hpp"
13
14#include <chrono>
15#include <memory>
16#include <string>
17#include <vector>
18
19#if defined(_azure_TESTING_BUILD)
20// Define the test classes dependant on this class here.
21namespace Azure { namespace Core { namespace Amqp { namespace Tests {
22 namespace MessageTests {
23 class AmqpServerMock;
24 class MockServiceEndpoint;
25 class MessageListenerEvents;
26 } // namespace MessageTests
27
28 class TestSessions_SimpleSession_Test;
29 class TestSessions_SessionProperties_Test;
30 class TestSessions_SessionBeginEnd_Test;
31 class TestSessions_MultipleSessionBeginEnd_Test;
32 class TestLinks_LinkAttachDetach_Test;
33 class TestSocketListenerEvents;
34 class LinkSocketListenerEvents;
35 class TestMessages_SenderSendAsync_Test;
36}}}} // namespace Azure::Core::Amqp::Tests
37#endif // _azure_TESTING_BUILD
38#if defined(SAMPLES_BUILD)
39namespace LocalServerSample {
40class SampleEvents;
41} // namespace LocalServerSample
42#endif // SAMPLES_BUILD
43
44namespace Azure { namespace Core { namespace Amqp { namespace _detail {
45 class SessionImpl;
46 class SessionFactory;
47}}}} // namespace Azure::Core::Amqp::_detail
48
49namespace Azure { namespace Core { namespace Amqp { namespace _internal {
50
51 class Connection;
52 enum class SessionRole;
53 class MessageSender;
54 struct MessageSenderOptions;
55 class MessageSenderEvents;
56 class MessageReceiver;
57 struct MessageReceiverOptions;
58 class MessageReceiverEvents;
59 class ManagementClient;
60 struct ManagementClientOptions;
61 class ManagementClientEvents;
62
63 enum class ExpiryPolicy
64 {
65 LinkDetach,
66 SessionEnd,
67 ConnectionClose,
68 Never,
69 };
70
71 enum class SessionState
72 {
73 Unmapped,
74 BeginSent,
75 BeginReceived,
76 Mapped,
77 EndSent,
78 EndReceived,
79 Discarding,
80 Error,
81 };
82
83 enum class SessionSendTransferResult
84 {
85 Ok,
86 Error,
87 Busy,
88 };
89
90 class Session;
91 class SessionEvents {
92 protected:
93 ~SessionEvents() = default;
94
95 public:
96 virtual bool OnLinkAttached(
97 Session const& session,
98 LinkEndpoint& newLink,
99 std::string const& name,
100 SessionRole role,
101 Models::AmqpValue const& source,
102 Models::AmqpValue const& target,
103 Models::AmqpValue const& properties)
104 = 0;
105 };
106
107 struct SessionOptions final
108 {
112 Nullable<uint32_t> InitialIncomingWindowSize;
116 Nullable<uint32_t> InitialOutgoingWindowSize;
117
122 Nullable<uint32_t> MaximumLinkCount;
123 };
124
125 class Session final {
126 public:
128 ~Session() noexcept;
129
139 MessageSender CreateMessageSender(
140 Models::_internal::MessageTarget const& target,
141 MessageSenderOptions const& options,
142 MessageSenderEvents* events) const;
143
153 MessageReceiver CreateMessageReceiver(
154 Models::_internal::MessageSource const& receiverSource,
155 MessageReceiverOptions const& options,
156 MessageReceiverEvents* receiverEvents = nullptr) const;
157
158 ManagementClient CreateManagementClient(
159 std::string const& managementInstancePath,
160 ManagementClientOptions const& options,
161 ManagementClientEvents* managementEvents = nullptr) const;
162
163 private:
168 uint32_t GetIncomingWindow() const;
173 uint32_t GetOutgoingWindow() const;
174
179 uint32_t GetHandleMax() const;
180
187 void Begin();
188
195 void End(std::string const& condition_value = {}, std::string const& description = {});
196
207 void SendDetach(
208 LinkEndpoint const& linkEndpoint,
209 bool closeLink,
210 Models::_internal::AmqpError const& error) const;
211
225 MessageSender CreateMessageSender(
226 LinkEndpoint& endpoint,
227 Models::_internal::MessageTarget const& target,
228 MessageSenderOptions const& options,
229 MessageSenderEvents* events) const;
230
240 MessageReceiver CreateMessageReceiver(
241 LinkEndpoint& linkEndpoint,
242 Models::_internal::MessageSource const& receiverSource,
243 MessageReceiverOptions const& options,
244 MessageReceiverEvents* receiverEvents = nullptr) const;
245
246 friend class _detail::SessionFactory;
247
248#if _azure_TESTING_BUILD
249 friend class Azure::Core::Amqp::Tests::MessageTests::AmqpServerMock;
250 friend class Azure::Core::Amqp::Tests::MessageTests::MockServiceEndpoint;
251 friend class Azure::Core::Amqp::Tests::MessageTests::MessageListenerEvents;
252 friend class Azure::Core::Amqp::Tests::TestSocketListenerEvents;
253 friend class Azure::Core::Amqp::Tests::LinkSocketListenerEvents;
254 friend class Azure::Core::Amqp::Tests::TestSessions_SimpleSession_Test;
255 friend class Azure::Core::Amqp::Tests::TestSessions_SessionProperties_Test;
256 friend class Azure::Core::Amqp::Tests::TestSessions_SessionBeginEnd_Test;
257 friend class Azure::Core::Amqp::Tests::TestSessions_MultipleSessionBeginEnd_Test;
258 friend class Azure::Core::Amqp::Tests::TestLinks_LinkAttachDetach_Test;
259
260 friend class Azure::Core::Amqp::Tests::TestMessages_SenderSendAsync_Test;
261#endif // _azure_TESTING_BUILD
262#if SAMPLES_BUILD
263 friend class LocalServerSample::SampleEvents;
264#endif // SAMPLES_BUILD
265 private:
273 Session(std::shared_ptr<_detail::SessionImpl> impl) : m_impl{impl} {}
274
275 std::shared_ptr<_detail::SessionImpl> m_impl;
276 };
277
278}}}} // namespace Azure::Core::Amqp::_internal