Skip to content

Commit 1602886

Browse files
Addressed most PR feedback from graebm.
1 parent 92d819a commit 1602886

File tree

7 files changed

+91
-22
lines changed

7 files changed

+91
-22
lines changed

include/aws/crt/io/Bootstrap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace Aws
2929
class AWS_CRT_CPP_API ClientBootstrap final
3030
{
3131
public:
32-
ClientBootstrap(const EventLoopGroup& elGroup = EventLoopGroup(),
32+
ClientBootstrap(EventLoopGroup& elGroup,
3333
Allocator* allocator = DefaultAllocator()) noexcept;
3434
~ClientBootstrap();
3535
ClientBootstrap(const ClientBootstrap&) = delete;
@@ -40,7 +40,7 @@ namespace Aws
4040
operator bool() const noexcept;
4141
int LastError() const noexcept;
4242

43-
const aws_client_bootstrap* GetUnderlyingHandle() const;
43+
aws_client_bootstrap* GetUnderlyingHandle() noexcept;
4444
private:
4545
aws_client_bootstrap m_bootstrap;
4646
int m_lastError;

include/aws/crt/io/EventLoopGroup.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace Aws
4949
operator bool() const;
5050
int LastError() const;
5151

52-
const aws_event_loop_group* GetUnderlyingHandle() const;
52+
aws_event_loop_group* GetUnderlyingHandle() noexcept;
5353

5454
private:
5555
aws_event_loop_group m_eventLoopGroup;

include/aws/crt/mqtt/MqttClient.h

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,15 @@ namespace Aws
3636
class MqttClient;
3737
class MqttConnection;
3838

39+
enum class ConnectionState
40+
{
41+
Init,
42+
Connecting,
43+
Connected,
44+
Disconnected,
45+
Error,
46+
};
47+
3948
/**
4049
* Invoked Upon Connection failure.
4150
*/
@@ -69,12 +78,13 @@ namespace Aws
6978
public:
7079
~MqttConnection();
7180
MqttConnection(const MqttConnection&) = delete;
72-
MqttConnection(MqttConnection&&) = default;
81+
MqttConnection(MqttConnection&&);
7382
MqttConnection& operator =(const MqttConnection&) = delete;
74-
MqttConnection& operator =(MqttConnection&&) = default;
83+
MqttConnection& operator =(MqttConnection&&);
7584

7685
operator bool() const noexcept;
7786
int LastError() const noexcept;
87+
inline ConnectionState GetConnectionState() const noexcept { return m_connectionState; }
7888

7989
inline void SetOnConnectionFailedHandler(OnConnectionFailedHandler&& onConnectionFailed) noexcept
8090
{
@@ -154,7 +164,7 @@ namespace Aws
154164
OnConnAckHandler m_onConnAck;
155165
OnDisconnectHandler m_onDisconnect;
156166
int m_lastError;
157-
bool m_isInit;
167+
ConnectionState m_connectionState;
158168

159169
static void s_onConnectionFailed(aws_mqtt_client_connection* connection, int errorCode, void* userData);
160170
static void s_onConnAck(aws_mqtt_client_connection* connection,
@@ -180,7 +190,7 @@ namespace Aws
180190
/**
181191
* Initialize an MqttClient using bootstrap and allocator
182192
*/
183-
MqttClient(const Io::ClientBootstrap& bootstrap, Allocator* allocator = DefaultAllocator()) noexcept;
193+
MqttClient(Io::ClientBootstrap& bootstrap, Allocator* allocator = DefaultAllocator()) noexcept;
184194

185195
~MqttClient();
186196
MqttClient(const MqttClient&) = delete;

samples/mqtt_pub_sub/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ int main(int argc, char* argv[])
200200
{
201201
{
202202
fprintf(stdout, "Connection completed with return code %d\n", returnCode);
203+
fprintf(stdout, "Conneciton state %d\n", connection.GetConnectionState());
203204
std::lock_guard<std::mutex> lockGuard(mutex);
204205
connectionSucceeded = true;
205206
}
@@ -226,6 +227,7 @@ int main(int argc, char* argv[])
226227
{
227228
{
228229
fprintf(stdout, "Connection closed\n");
230+
fprintf(stdout, "Conneciton state %d\n", connection.GetConnectionState());
229231
std::lock_guard<std::mutex> lockGuard(mutex);
230232
connectionClosed = true;
231233
}

source/io/Bootstrap.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ namespace Aws
2020
{
2121
namespace Io
2222
{
23-
ClientBootstrap::ClientBootstrap(const EventLoopGroup& elGroup, Allocator* allocator) noexcept :
23+
ClientBootstrap::ClientBootstrap(EventLoopGroup& elGroup, Allocator* allocator) noexcept :
2424
m_lastError(AWS_ERROR_SUCCESS)
2525
{
2626
AWS_ZERO_STRUCT(m_bootstrap);
2727
if (aws_client_bootstrap_init(&m_bootstrap, allocator,
28-
(aws_event_loop_group*)elGroup.GetUnderlyingHandle(), nullptr, nullptr))
28+
elGroup.GetUnderlyingHandle(), nullptr, nullptr))
2929
{
3030
m_lastError = aws_last_error();
3131
}
@@ -74,7 +74,7 @@ namespace Aws
7474
return m_lastError;
7575
}
7676

77-
const aws_client_bootstrap* ClientBootstrap::GetUnderlyingHandle() const
77+
aws_client_bootstrap* ClientBootstrap::GetUnderlyingHandle() noexcept
7878
{
7979
if (*this)
8080
{

source/io/EventLoopGroup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ namespace Aws
8181
return m_lastError == AWS_ERROR_SUCCESS;
8282
}
8383

84-
const aws_event_loop_group *EventLoopGroup::GetUnderlyingHandle() const
84+
aws_event_loop_group *EventLoopGroup::GetUnderlyingHandle() noexcept
8585
{
8686
if (*this)
8787
{

source/mqtt/MqttClient.cpp

Lines changed: 68 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ namespace Aws
3030
auto connWrapper = reinterpret_cast<MqttConnection*>(userData);
3131
connWrapper->m_lastError = errorCode;
3232

33+
connWrapper->m_connectionState = ConnectionState::Disconnected;
3334
if (connWrapper->m_onConnectionFailed)
3435
{
3536
connWrapper->m_onConnectionFailed(*connWrapper);
@@ -43,6 +44,15 @@ namespace Aws
4344
{
4445
auto connWrapper = reinterpret_cast<MqttConnection*>(userData);
4546

47+
if (returnCode == AWS_MQTT_CONNECT_ACCEPTED)
48+
{
49+
connWrapper->m_connectionState = ConnectionState::Connected;
50+
}
51+
else
52+
{
53+
connWrapper->m_connectionState = ConnectionState::Error;
54+
}
55+
4656
if (connWrapper->m_onConnAck)
4757
{
4858
connWrapper->m_onConnAck(*connWrapper, returnCode, sessionPresent);
@@ -54,9 +64,15 @@ namespace Aws
5464
auto connWrapper = reinterpret_cast<MqttConnection*>(userData);
5565
connWrapper->m_lastError = errorCode;
5666

67+
connWrapper->m_connectionState = ConnectionState::Disconnected;
68+
5769
if (connWrapper->m_onDisconnect)
5870
{
59-
return connWrapper->m_onDisconnect(*connWrapper);
71+
if (connWrapper->m_onDisconnect(*connWrapper))
72+
{
73+
connWrapper->m_connectionState = ConnectionState::Connecting;
74+
return true;
75+
}
6076
}
6177

6278
return false;
@@ -125,7 +141,7 @@ namespace Aws
125141
Io::TlsConnectionOptions&& tlsConnOptions) noexcept :
126142
m_owningClient(client),
127143
m_lastError(AWS_ERROR_SUCCESS),
128-
m_isInit(false)
144+
m_connectionState(ConnectionState::Init)
129145
{
130146
aws_mqtt_client_connection_callbacks callbacks;
131147
AWS_ZERO_STRUCT(callbacks);
@@ -144,12 +160,9 @@ namespace Aws
144160

145161
if (!m_underlyingConnection)
146162
{
163+
m_connectionState = ConnectionState::Error;
147164
m_lastError = aws_last_error();
148-
}
149-
else
150-
{
151-
m_isInit = true;
152-
}
165+
}
153166
}
154167

155168
MqttConnection::~MqttConnection()
@@ -158,11 +171,52 @@ namespace Aws
158171
{
159172
aws_mqtt_client_connection_destroy(m_underlyingConnection);
160173
}
174+
175+
AWS_ZERO_STRUCT(*this);
176+
}
177+
178+
MqttConnection::MqttConnection(MqttConnection&& toMove) :
179+
m_owningClient(toMove.m_owningClient),
180+
m_underlyingConnection(toMove.m_underlyingConnection),
181+
m_onConnectionFailed(std::move(toMove.m_onConnectionFailed)),
182+
m_onConnAck(std::move(toMove.m_onConnAck)),
183+
m_onDisconnect(std::move(toMove.m_onDisconnect)),
184+
m_lastError(toMove.m_lastError),
185+
m_connectionState(toMove.m_connectionState)
186+
{
187+
toMove.m_owningClient = nullptr;
188+
toMove.m_underlyingConnection = nullptr;
189+
toMove.m_lastError = AWS_ERROR_UNKNOWN;
190+
toMove.m_connectionState = ConnectionState::Error;
191+
}
192+
193+
MqttConnection& MqttConnection::operator =(MqttConnection&& toMove)
194+
{
195+
if (this == &toMove)
196+
{
197+
return *this;
198+
}
199+
200+
m_owningClient = toMove.m_owningClient;
201+
m_underlyingConnection = toMove.m_underlyingConnection;
202+
m_onConnectionFailed = std::move(toMove.m_onConnectionFailed);
203+
m_onConnAck = std::move(toMove.m_onConnAck);
204+
m_onDisconnect = std::move(toMove.m_onDisconnect);
205+
m_lastError = toMove.m_lastError;
206+
m_connectionState = toMove.m_connectionState;
207+
208+
toMove.m_owningClient = nullptr;
209+
toMove.m_underlyingConnection = nullptr;
210+
toMove.m_lastError = AWS_ERROR_UNKNOWN;
211+
toMove.m_connectionState = ConnectionState::Error;
212+
213+
return *this;
161214
}
162215

216+
163217
MqttConnection::operator bool() const noexcept
164218
{
165-
return m_isInit;
219+
return m_connectionState != ConnectionState::Error;
166220
}
167221

168222
int MqttConnection::LastError() const noexcept
@@ -206,6 +260,10 @@ namespace Aws
206260
{
207261
m_lastError = aws_last_error();
208262
}
263+
else
264+
{
265+
m_connectionState = ConnectionState::Connecting;
266+
}
209267
}
210268

211269
void MqttConnection::Disconnect() noexcept
@@ -365,13 +423,12 @@ namespace Aws
365423
aws_mqtt_client_connection_ping(m_underlyingConnection);
366424
}
367425

368-
MqttClient::MqttClient(const Io::ClientBootstrap &bootstrap, Allocator *allocator) noexcept :
426+
MqttClient::MqttClient(Io::ClientBootstrap &bootstrap, Allocator *allocator) noexcept :
369427
m_lastError(AWS_ERROR_SUCCESS),
370428
m_isInit(false)
371429
{
372430
AWS_ZERO_STRUCT(m_client);
373-
if (aws_mqtt_client_init(&m_client, allocator,
374-
const_cast<aws_client_bootstrap*>(bootstrap.GetUnderlyingHandle())))
431+
if (aws_mqtt_client_init(&m_client, allocator, bootstrap.GetUnderlyingHandle()))
375432
{
376433
m_lastError = aws_last_error();
377434
}

0 commit comments

Comments
 (0)