diff --git a/source/core_mqtt.c b/source/core_mqtt.c index 0166462c..55afe35d 100644 --- a/source/core_mqtt.c +++ b/source/core_mqtt.c @@ -90,6 +90,11 @@ */ #define CORE_MQTT_UNSUBSCRIBE_PER_TOPIC_VECTOR_LENGTH ( 2U ) +struct MQTTVec +{ + TransportOutVector_t pVector; /**< Pointer to transport vector. USER SHOULD NOT ACCESS THIS DIRECTLY - IT IS AN INTERNAL DETAIL AND CAN CHANGE. */ +}; + /*-----------------------------------------------------------*/ /** @@ -3726,3 +3731,37 @@ const char * MQTT_Status_strerror( MQTTStatus_t status ) } /*-----------------------------------------------------------*/ + +size_t MQTT_GetBytesInMQTTVec( MQTTVec_t * pVec, + size_t len ) +{ + size_t memoryRequired = 0; + size_t i; + TransportOutVector_t * pTransportVec = ( TransportOutVector_t * ) pVec; + + for( i = 0; i < len; i++ ) + { + memoryRequired += pTransportVec[ i ].iov_len; + } + + return memoryRequired; +} + +/*-----------------------------------------------------------*/ + +void MQTT_SerializeMQTTVec( uint8_t * pAllocatedMem, + MQTTVec_t * pVec, + size_t len ) +{ + TransportOutVector_t * pTransportVec = ( TransportOutVector_t * ) pVec; + size_t index = 0; + size_t i = 0; + + for( i = 0; i < len; i++ ) + { + memcpy( &pAllocatedMem[ index ], pTransportVec[ i ].iov_base, pTransportVec[ i ].iov_len ); + index += pTransportVec[ i ].iov_len; + } +} + +/*-----------------------------------------------------------*/ diff --git a/source/include/core_mqtt.h b/source/include/core_mqtt.h index 38069274..eef73276 100644 --- a/source/include/core_mqtt.h +++ b/source/include/core_mqtt.h @@ -343,6 +343,12 @@ typedef struct MQTTDeserializedInfo MQTTStatus_t deserializationResult; /**< @brief Return code of deserialization. */ } MQTTDeserializedInfo_t; +/** + * @ingroup mqtt_struct_types + * @brief An opaque structure provided by the library to the #MQTTStorePacketForRetransmit function when using #MQTTStorePacketForRetransmit. + */ +typedef struct MQTTVec MQTTVec_t; + /** * @brief Initialize an MQTT context. * @@ -649,7 +655,7 @@ MQTTStatus_t MQTT_CheckConnectStatus( MQTTContext_t * pContext ); * #MQTTNoDataAvailable if no data available to receive in transport until * the @p timeoutMs for CONNACK; * #MQTTStatusConnected if the connection is already established - * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect + * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect * before calling any other API * MQTTPublishClearAllFailed if on a clean session connection, clearing all the * previously copied publishes fails @@ -744,7 +750,7 @@ MQTTStatus_t MQTT_Connect( MQTTContext_t * pContext, * #MQTTBadParameter if invalid parameters are passed; * #MQTTSendFailed if transport write failed; * #MQTTStatusNotConnected if the connection is not established yet - * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect + * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect * before calling any other API * #MQTTSuccess otherwise. * @@ -800,7 +806,7 @@ MQTTStatus_t MQTT_Subscribe( MQTTContext_t * pContext, * #MQTTBadParameter if invalid parameters are passed; * #MQTTSendFailed if transport write failed; * #MQTTStatusNotConnected if the connection is not established yet - * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect + * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect * before calling any other API * #MQTTPublishStoreFailed if the user provided callback to copy and store the * outgoing publish packet fails @@ -872,7 +878,7 @@ MQTTStatus_t MQTT_CancelCallback( const MQTTContext_t * pContext, * #MQTTBadParameter if invalid parameters are passed; * #MQTTSendFailed if transport write failed; * #MQTTStatusNotConnected if the connection is not established yet - * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect + * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect * before calling any other API * #MQTTSuccess otherwise. */ @@ -894,7 +900,7 @@ MQTTStatus_t MQTT_Ping( MQTTContext_t * pContext ); * #MQTTBadParameter if invalid parameters are passed; * #MQTTSendFailed if transport write failed; * #MQTTStatusNotConnected if the connection is not established yet - * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect + * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect * before calling any other API * #MQTTSuccess otherwise. * @@ -984,7 +990,7 @@ MQTTStatus_t MQTT_Disconnect( MQTTContext_t * pContext ); * incomplete data; it should be called again (probably after a delay); * #MQTTStatusNotConnected if the connection is not established yet and a PING * or an ACK is being sent. - * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect + * #MQTTStatusDisconnectPending if the user is expected to call MQTT_Disconnect * before calling any other API * #MQTTSuccess on success. * @@ -1240,6 +1246,32 @@ MQTTStatus_t MQTT_GetSubAckStatusCodes( const MQTTPacketInfo_t * pSubackPacket, const char * MQTT_Status_strerror( MQTTStatus_t status ); /* @[declare_mqtt_status_strerror] */ +/** + * @brief Get the bytes in an array of #MQTTVec_t which can store the whole array as a an MQTT packet when calling MQTT_SerializeMQTTVec( void * pAllocatedMem, MQTTVec_t *pVec, size_t len ) function. + * + * @param[in] pVec The #MQTTVec_t array. + * @param[in] len The length of the #MQTTVec_t array. + * + * @return The bytes in the provided MQTTVec_t array which can then be used to set aside memory to be used with MQTT_SerializeMQTTVec( void * pAllocatedMem, MQTTVec_t *pVec, size_t len ) function. + */ +/* @[declare_mqtt_getbytesinmqttvec] */ +size_t MQTT_GetBytesInMQTTVec( MQTTVec_t * pVec, + size_t len ); +/* @[declare_mqtt_getbytesinmqttvec] */ + +/** + * @brief Serialize the bytes in an array of #MQTTVec_t in the provided \p pAllocatedMem + * + * @param[in] pAllocatedMem Memory in which to serialize the data in the #MQTTVec_t array. It must be of size provided by MQTT_GetBytesInMQTTVec( MQTTVec_t *pVec, size_t len ). + * @param[in] pVec The #MQTTVec_t array. + * @param[in] len The length of the #MQTTVec_t array. + */ +/* @[declare_mqtt_serializemqttvec] */ +void MQTT_SerializeMQTTVec( uint8_t * pAllocatedMem, + MQTTVec_t * pVec, + size_t len ); +/* @[declare_mqtt_serializemqttvec] */ + /* *INDENT-OFF* */ #ifdef __cplusplus }