in source/mqtt/MqttClient.cpp [729:762]
std::shared_ptr<MqttConnection> MqttClient::NewConnection(
const char *hostName,
uint16_t port,
const Io::SocketOptions &socketOptions,
const Crt::Io::TlsContext &tlsContext,
bool useWebsocket) noexcept
{
if (!tlsContext)
{
AWS_LOGF_ERROR(
AWS_LS_MQTT_CLIENT,
"id=%p Trying to call MqttClient::NewConnection using an invalid TlsContext.",
(void *)m_client);
aws_raise_error(AWS_ERROR_INVALID_ARGUMENT);
return nullptr;
}
// If you're reading this and asking.... why is this so complicated? Why not use make_shared
// or allocate_shared? Well, MqttConnection constructors are private and stl is dumb like that.
// so, we do it manually.
Allocator *allocator = m_client->allocator;
MqttConnection *toSeat =
reinterpret_cast<MqttConnection *>(aws_mem_acquire(allocator, sizeof(MqttConnection)));
if (!toSeat)
{
return nullptr;
}
toSeat = new (toSeat) MqttConnection(m_client, hostName, port, socketOptions, tlsContext, useWebsocket);
return std::shared_ptr<MqttConnection>(toSeat, [allocator](MqttConnection *connection) {
connection->~MqttConnection();
aws_mem_release(allocator, reinterpret_cast<void *>(connection));
});
}