@@ -20,18 +20,27 @@ namespace Aws
2020 {
2121 namespace Mqtt5
2222 {
23- ScopedResource<PublishAcknowledgementHandle> PublishAcknowledgementHandle::s_create (
23+ /* *
24+ * We keep the definition of PublishAcknowledgementHandle here so it remains an incomplete type in all
25+ * headers. This makes the type opaque to users. They can hold a
26+ * ScopedResource<PublishAcknowledgementHandle> but cannot inspect, modify, or construct one directly.
27+ */
28+ struct PublishAcknowledgementHandle
29+ {
30+ explicit PublishAcknowledgementHandle (uint64_t controlId) noexcept : controlId(controlId) {}
31+ uint64_t controlId;
32+ };
33+
34+ static ScopedResource<PublishAcknowledgementHandle> s_createPublishAcknowledgementHandle (
2435 Allocator *allocator,
2536 uint64_t controlId) noexcept
2637 {
27- /* Manually call aws_mem_acquire here because PublishAcknowledgeHandle only has a private constructor
28- * and cannot be used with Aws::Crt::New. Aws::Crt::Delete still clears memory appropriately. */
29- void *mem = aws_mem_acquire (allocator, sizeof (PublishAcknowledgementHandle));
30- if (!mem)
38+ PublishAcknowledgementHandle *handle =
39+ Aws::Crt::New<PublishAcknowledgementHandle>(allocator, controlId);
40+ if (!handle)
3141 {
3242 return ScopedResource<PublishAcknowledgementHandle>(nullptr , [](PublishAcknowledgementHandle *) {});
3343 }
34- PublishAcknowledgementHandle *handle = new (mem) PublishAcknowledgementHandle (controlId);
3544 return ScopedResource<PublishAcknowledgementHandle>(
3645 handle, [allocator](PublishAcknowledgementHandle *p) { Aws::Crt::Delete (p, allocator); });
3746 }
@@ -246,7 +255,7 @@ namespace Aws
246255
247256 if (publishAcknowledgementId != 0 )
248257 {
249- functor.handle = PublishAcknowledgementHandle::s_create (
258+ functor.handle = s_createPublishAcknowledgementHandle (
250259 client_core->m_allocator , publishAcknowledgementId);
251260 /* std::function requires a copyable callable so we wrap the move only functor
252261 * into a shared_ptr so the lambda can be copyable. */
@@ -716,7 +725,7 @@ namespace Aws
716725 return false ;
717726 }
718727 return aws_mqtt5_client_invoke_publish_acknowledgement (
719- m_client, publishAcknowledgementHandle->m_controlId , nullptr ) == AWS_OP_SUCCESS;
728+ m_client, publishAcknowledgementHandle->controlId , nullptr ) == AWS_OP_SUCCESS;
720729 }
721730
722731 void Mqtt5ClientCore::Close () noexcept
0 commit comments