Xin Zhang / azure-iot-c-sdk-f767zi

Dependents:   samplemqtt

Committer:
XinZhangMS
Date:
Thu Aug 23 06:52:14 2018 +0000
Revision:
0:f7f1f0d76dd6
azure-c-sdk for mbed os supporting NUCLEO_F767ZI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_umqtt_c/mqtt_message.h"
XinZhangMS 0:f7f1f0d76dd6 6 #include "azure_c_shared_utility/optimize_size.h"
XinZhangMS 0:f7f1f0d76dd6 7 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 8 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 9
XinZhangMS 0:f7f1f0d76dd6 10 typedef struct MQTT_MESSAGE_TAG
XinZhangMS 0:f7f1f0d76dd6 11 {
XinZhangMS 0:f7f1f0d76dd6 12 uint16_t packetId;
XinZhangMS 0:f7f1f0d76dd6 13 QOS_VALUE qosInfo;
XinZhangMS 0:f7f1f0d76dd6 14
XinZhangMS 0:f7f1f0d76dd6 15 char* topicName;
XinZhangMS 0:f7f1f0d76dd6 16 APP_PAYLOAD appPayload;
XinZhangMS 0:f7f1f0d76dd6 17
XinZhangMS 0:f7f1f0d76dd6 18 const char* const_topic_name;
XinZhangMS 0:f7f1f0d76dd6 19 APP_PAYLOAD const_payload;
XinZhangMS 0:f7f1f0d76dd6 20
XinZhangMS 0:f7f1f0d76dd6 21 bool isDuplicateMsg;
XinZhangMS 0:f7f1f0d76dd6 22 bool isMessageRetained;
XinZhangMS 0:f7f1f0d76dd6 23 } MQTT_MESSAGE;
XinZhangMS 0:f7f1f0d76dd6 24
XinZhangMS 0:f7f1f0d76dd6 25 MQTT_MESSAGE_HANDLE mqttmessage_create_in_place(uint16_t packetId, const char* topicName, QOS_VALUE qosValue, const uint8_t* appMsg, size_t appMsgLength)
XinZhangMS 0:f7f1f0d76dd6 26 {
XinZhangMS 0:f7f1f0d76dd6 27 /* Codes_SRS_MQTTMESSAGE_07_026: [If the parameters topicName is NULL then mqttmessage_create_in_place shall return NULL.].] */
XinZhangMS 0:f7f1f0d76dd6 28 MQTT_MESSAGE* result;
XinZhangMS 0:f7f1f0d76dd6 29 if (topicName == NULL)
XinZhangMS 0:f7f1f0d76dd6 30 {
XinZhangMS 0:f7f1f0d76dd6 31 LogError("Invalid Parameter topicName: %p, packetId: %d.", topicName, packetId);
XinZhangMS 0:f7f1f0d76dd6 32 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 33 }
XinZhangMS 0:f7f1f0d76dd6 34 else
XinZhangMS 0:f7f1f0d76dd6 35 {
XinZhangMS 0:f7f1f0d76dd6 36 result = malloc(sizeof(MQTT_MESSAGE));
XinZhangMS 0:f7f1f0d76dd6 37 if (result != NULL)
XinZhangMS 0:f7f1f0d76dd6 38 {
XinZhangMS 0:f7f1f0d76dd6 39 memset(result, 0, sizeof(MQTT_MESSAGE) );
XinZhangMS 0:f7f1f0d76dd6 40 result->const_topic_name = topicName;
XinZhangMS 0:f7f1f0d76dd6 41
XinZhangMS 0:f7f1f0d76dd6 42 result->packetId = packetId;
XinZhangMS 0:f7f1f0d76dd6 43 result->isDuplicateMsg = false;
XinZhangMS 0:f7f1f0d76dd6 44 result->isMessageRetained = false;
XinZhangMS 0:f7f1f0d76dd6 45 result->qosInfo = qosValue;
XinZhangMS 0:f7f1f0d76dd6 46
XinZhangMS 0:f7f1f0d76dd6 47 /* Codes_SRS_MQTTMESSAGE_07_027: [mqttmessage_create_in_place shall use the a pointer to topicName or appMsg .] */
XinZhangMS 0:f7f1f0d76dd6 48 result->const_payload.length = appMsgLength;
XinZhangMS 0:f7f1f0d76dd6 49 if (result->const_payload.length > 0)
XinZhangMS 0:f7f1f0d76dd6 50 {
XinZhangMS 0:f7f1f0d76dd6 51 result->const_payload.message = (uint8_t*)appMsg;
XinZhangMS 0:f7f1f0d76dd6 52 }
XinZhangMS 0:f7f1f0d76dd6 53 }
XinZhangMS 0:f7f1f0d76dd6 54 else
XinZhangMS 0:f7f1f0d76dd6 55 {
XinZhangMS 0:f7f1f0d76dd6 56 /* Codes_SRS_MQTTMESSAGE_07_028: [If any memory allocation fails mqttmessage_create_in_place shall free any allocated memory and return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 57 LogError("Failure unable to allocate MQTT Message.");
XinZhangMS 0:f7f1f0d76dd6 58 }
XinZhangMS 0:f7f1f0d76dd6 59 }
XinZhangMS 0:f7f1f0d76dd6 60 /* Codes_SRS_MQTTMESSAGE_07_029: [ Upon success, mqttmessage_create_in_place shall return a NON-NULL MQTT_MESSAGE_HANDLE value.] */
XinZhangMS 0:f7f1f0d76dd6 61 return (MQTT_MESSAGE_HANDLE)result;
XinZhangMS 0:f7f1f0d76dd6 62 }
XinZhangMS 0:f7f1f0d76dd6 63
XinZhangMS 0:f7f1f0d76dd6 64 MQTT_MESSAGE_HANDLE mqttmessage_create(uint16_t packetId, const char* topicName, QOS_VALUE qosValue, const uint8_t* appMsg, size_t appMsgLength)
XinZhangMS 0:f7f1f0d76dd6 65 {
XinZhangMS 0:f7f1f0d76dd6 66 /* Codes_SRS_MQTTMESSAGE_07_001:[If the parameters topicName is NULL is zero then mqttmessage_create shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 67 MQTT_MESSAGE* result;
XinZhangMS 0:f7f1f0d76dd6 68 if (topicName == NULL)
XinZhangMS 0:f7f1f0d76dd6 69 {
XinZhangMS 0:f7f1f0d76dd6 70 LogError("Invalid Parameter topicName: %p, packetId: %d.", topicName, packetId);
XinZhangMS 0:f7f1f0d76dd6 71 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 72 }
XinZhangMS 0:f7f1f0d76dd6 73 else
XinZhangMS 0:f7f1f0d76dd6 74 {
XinZhangMS 0:f7f1f0d76dd6 75 /* Codes_SRS_MQTTMESSAGE_07_002: [mqttmessage_create shall allocate and copy the topicName and appMsg parameters.] */
XinZhangMS 0:f7f1f0d76dd6 76 result = malloc(sizeof(MQTT_MESSAGE));
XinZhangMS 0:f7f1f0d76dd6 77 if (result != NULL)
XinZhangMS 0:f7f1f0d76dd6 78 {
XinZhangMS 0:f7f1f0d76dd6 79 memset(result, 0, sizeof(MQTT_MESSAGE));
XinZhangMS 0:f7f1f0d76dd6 80 if (mallocAndStrcpy_s(&result->topicName, topicName) != 0)
XinZhangMS 0:f7f1f0d76dd6 81 {
XinZhangMS 0:f7f1f0d76dd6 82 /* Codes_SRS_MQTTMESSAGE_07_003: [If any memory allocation fails mqttmessage_create shall free any allocated memory and return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 83 LogError("Failure allocating topic name");
XinZhangMS 0:f7f1f0d76dd6 84 free(result);
XinZhangMS 0:f7f1f0d76dd6 85 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 86 }
XinZhangMS 0:f7f1f0d76dd6 87 else
XinZhangMS 0:f7f1f0d76dd6 88 {
XinZhangMS 0:f7f1f0d76dd6 89 result->packetId = packetId;
XinZhangMS 0:f7f1f0d76dd6 90 result->isDuplicateMsg = false;
XinZhangMS 0:f7f1f0d76dd6 91 result->isMessageRetained = false;
XinZhangMS 0:f7f1f0d76dd6 92 result->qosInfo = qosValue;
XinZhangMS 0:f7f1f0d76dd6 93
XinZhangMS 0:f7f1f0d76dd6 94 /* Codes_SRS_MQTTMESSAGE_07_002: [mqttmessage_create shall allocate and copy the topicName and appMsg parameters.] */
XinZhangMS 0:f7f1f0d76dd6 95 result->appPayload.length = appMsgLength;
XinZhangMS 0:f7f1f0d76dd6 96 if (result->appPayload.length > 0)
XinZhangMS 0:f7f1f0d76dd6 97 {
XinZhangMS 0:f7f1f0d76dd6 98 result->appPayload.message = malloc(appMsgLength);
XinZhangMS 0:f7f1f0d76dd6 99 if (result->appPayload.message == NULL)
XinZhangMS 0:f7f1f0d76dd6 100 {
XinZhangMS 0:f7f1f0d76dd6 101 /* Codes_SRS_MQTTMESSAGE_07_003: [If any memory allocation fails mqttmessage_create shall free any allocated memory and return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 102 LogError("Failure allocating message value of %uz", appMsgLength);
XinZhangMS 0:f7f1f0d76dd6 103 free(result->topicName);
XinZhangMS 0:f7f1f0d76dd6 104 free(result);
XinZhangMS 0:f7f1f0d76dd6 105 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 106 }
XinZhangMS 0:f7f1f0d76dd6 107 else
XinZhangMS 0:f7f1f0d76dd6 108 {
XinZhangMS 0:f7f1f0d76dd6 109 (void)memcpy(result->appPayload.message, appMsg, appMsgLength);
XinZhangMS 0:f7f1f0d76dd6 110 }
XinZhangMS 0:f7f1f0d76dd6 111 }
XinZhangMS 0:f7f1f0d76dd6 112 else
XinZhangMS 0:f7f1f0d76dd6 113 {
XinZhangMS 0:f7f1f0d76dd6 114 result->appPayload.message = NULL;
XinZhangMS 0:f7f1f0d76dd6 115 }
XinZhangMS 0:f7f1f0d76dd6 116 }
XinZhangMS 0:f7f1f0d76dd6 117 }
XinZhangMS 0:f7f1f0d76dd6 118 }
XinZhangMS 0:f7f1f0d76dd6 119 /* Codes_SRS_MQTTMESSAGE_07_004: [If mqttmessage_createMessage succeeds the it shall return a NON-NULL MQTT_MESSAGE_HANDLE value.] */
XinZhangMS 0:f7f1f0d76dd6 120 return (MQTT_MESSAGE_HANDLE)result;
XinZhangMS 0:f7f1f0d76dd6 121 }
XinZhangMS 0:f7f1f0d76dd6 122
XinZhangMS 0:f7f1f0d76dd6 123 void mqttmessage_destroy(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 124 {
XinZhangMS 0:f7f1f0d76dd6 125 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 126 /* Codes_SRS_MQTTMESSAGE_07_005: [If the handle parameter is NULL then mqttmessage_destroyMessage shall do nothing] */
XinZhangMS 0:f7f1f0d76dd6 127 if (msgInfo != NULL)
XinZhangMS 0:f7f1f0d76dd6 128 {
XinZhangMS 0:f7f1f0d76dd6 129 /* Codes_SRS_MQTTMESSAGE_07_006: [mqttmessage_destroyMessage shall free all resources associated with the MQTT_MESSAGE_HANDLE value] */
XinZhangMS 0:f7f1f0d76dd6 130 if (msgInfo->topicName != NULL)
XinZhangMS 0:f7f1f0d76dd6 131 {
XinZhangMS 0:f7f1f0d76dd6 132 free(msgInfo->topicName);
XinZhangMS 0:f7f1f0d76dd6 133 }
XinZhangMS 0:f7f1f0d76dd6 134 if (msgInfo->appPayload.message != NULL)
XinZhangMS 0:f7f1f0d76dd6 135 {
XinZhangMS 0:f7f1f0d76dd6 136 free(msgInfo->appPayload.message);
XinZhangMS 0:f7f1f0d76dd6 137 }
XinZhangMS 0:f7f1f0d76dd6 138 free(msgInfo);
XinZhangMS 0:f7f1f0d76dd6 139 }
XinZhangMS 0:f7f1f0d76dd6 140 }
XinZhangMS 0:f7f1f0d76dd6 141
XinZhangMS 0:f7f1f0d76dd6 142 MQTT_MESSAGE_HANDLE mqttmessage_clone(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 143 {
XinZhangMS 0:f7f1f0d76dd6 144 MQTT_MESSAGE_HANDLE result;
XinZhangMS 0:f7f1f0d76dd6 145 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 146 {
XinZhangMS 0:f7f1f0d76dd6 147 /* Codes_SRS_MQTTMESSAGE_07_007: [If handle parameter is NULL then mqttmessage_clone shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 148 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 149 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 150 }
XinZhangMS 0:f7f1f0d76dd6 151 else
XinZhangMS 0:f7f1f0d76dd6 152 {
XinZhangMS 0:f7f1f0d76dd6 153 /* Codes_SRS_MQTTMESSAGE_07_008: [mqttmessage_clone shall create a new MQTT_MESSAGE_HANDLE with data content identical of the handle value.] */
XinZhangMS 0:f7f1f0d76dd6 154 MQTT_MESSAGE* mqtt_message = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 155 result = mqttmessage_create(mqtt_message->packetId, mqtt_message->topicName, mqtt_message->qosInfo, mqtt_message->appPayload.message, mqtt_message->appPayload.length);
XinZhangMS 0:f7f1f0d76dd6 156 if (result != NULL)
XinZhangMS 0:f7f1f0d76dd6 157 {
XinZhangMS 0:f7f1f0d76dd6 158 (void)mqttmessage_setIsDuplicateMsg(result, mqtt_message->isDuplicateMsg);
XinZhangMS 0:f7f1f0d76dd6 159 (void)mqttmessage_setIsRetained(result, mqtt_message->isMessageRetained);
XinZhangMS 0:f7f1f0d76dd6 160 }
XinZhangMS 0:f7f1f0d76dd6 161 }
XinZhangMS 0:f7f1f0d76dd6 162 return result;
XinZhangMS 0:f7f1f0d76dd6 163 }
XinZhangMS 0:f7f1f0d76dd6 164
XinZhangMS 0:f7f1f0d76dd6 165 uint16_t mqttmessage_getPacketId(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 166 {
XinZhangMS 0:f7f1f0d76dd6 167 uint16_t result;
XinZhangMS 0:f7f1f0d76dd6 168 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 169 {
XinZhangMS 0:f7f1f0d76dd6 170 /* Codes_SRS_MQTTMESSAGE_07_010: [If handle is NULL then mqttmessage_getPacketId shall return 0.] */
XinZhangMS 0:f7f1f0d76dd6 171 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 172 result = 0;
XinZhangMS 0:f7f1f0d76dd6 173 }
XinZhangMS 0:f7f1f0d76dd6 174 else
XinZhangMS 0:f7f1f0d76dd6 175 {
XinZhangMS 0:f7f1f0d76dd6 176 /* Codes_SRS_MQTTMESSAGE_07_011: [mqttmessage_getPacketId shall return the packetId value contained in MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 177 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 178 result = msgInfo->packetId;
XinZhangMS 0:f7f1f0d76dd6 179 }
XinZhangMS 0:f7f1f0d76dd6 180 return result;
XinZhangMS 0:f7f1f0d76dd6 181 }
XinZhangMS 0:f7f1f0d76dd6 182
XinZhangMS 0:f7f1f0d76dd6 183 const char* mqttmessage_getTopicName(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 184 {
XinZhangMS 0:f7f1f0d76dd6 185 const char* result;
XinZhangMS 0:f7f1f0d76dd6 186 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 187 {
XinZhangMS 0:f7f1f0d76dd6 188 /* Codes_SRS_MQTTMESSAGE_07_012: [If handle is NULL then mqttmessage_getTopicName shall return a NULL string.] */
XinZhangMS 0:f7f1f0d76dd6 189 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 190 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 191 }
XinZhangMS 0:f7f1f0d76dd6 192 else
XinZhangMS 0:f7f1f0d76dd6 193 {
XinZhangMS 0:f7f1f0d76dd6 194 /* Codes_SRS_MQTTMESSAGE_07_013: [mqttmessage_getTopicName shall return the topicName contained in MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 195 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 196 if (msgInfo->topicName == NULL)
XinZhangMS 0:f7f1f0d76dd6 197 {
XinZhangMS 0:f7f1f0d76dd6 198 result = msgInfo->const_topic_name;
XinZhangMS 0:f7f1f0d76dd6 199 }
XinZhangMS 0:f7f1f0d76dd6 200 else
XinZhangMS 0:f7f1f0d76dd6 201 {
XinZhangMS 0:f7f1f0d76dd6 202 result = msgInfo->topicName;
XinZhangMS 0:f7f1f0d76dd6 203 }
XinZhangMS 0:f7f1f0d76dd6 204 }
XinZhangMS 0:f7f1f0d76dd6 205 return result;
XinZhangMS 0:f7f1f0d76dd6 206 }
XinZhangMS 0:f7f1f0d76dd6 207
XinZhangMS 0:f7f1f0d76dd6 208 QOS_VALUE mqttmessage_getQosType(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 209 {
XinZhangMS 0:f7f1f0d76dd6 210 QOS_VALUE result;
XinZhangMS 0:f7f1f0d76dd6 211 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 212 {
XinZhangMS 0:f7f1f0d76dd6 213 /* Codes_SRS_MQTTMESSAGE_07_014: [If handle is NULL then mqttmessage_getQosType shall return the default DELIVER_AT_MOST_ONCE value.] */
XinZhangMS 0:f7f1f0d76dd6 214 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 215 result = DELIVER_AT_MOST_ONCE;
XinZhangMS 0:f7f1f0d76dd6 216 }
XinZhangMS 0:f7f1f0d76dd6 217 else
XinZhangMS 0:f7f1f0d76dd6 218 {
XinZhangMS 0:f7f1f0d76dd6 219 /* Codes_SRS_MQTTMESSAGE_07_015: [mqttmessage_getQosType shall return the QOS Type value contained in MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 220 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 221 result = msgInfo->qosInfo;
XinZhangMS 0:f7f1f0d76dd6 222 }
XinZhangMS 0:f7f1f0d76dd6 223 return result;
XinZhangMS 0:f7f1f0d76dd6 224 }
XinZhangMS 0:f7f1f0d76dd6 225
XinZhangMS 0:f7f1f0d76dd6 226 bool mqttmessage_getIsDuplicateMsg(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 227 {
XinZhangMS 0:f7f1f0d76dd6 228 bool result;
XinZhangMS 0:f7f1f0d76dd6 229 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 230 {
XinZhangMS 0:f7f1f0d76dd6 231 /* Codes_SRS_MQTTMESSAGE_07_016: [If handle is NULL then mqttmessage_getIsDuplicateMsg shall return false.] */
XinZhangMS 0:f7f1f0d76dd6 232 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 233 result = false;
XinZhangMS 0:f7f1f0d76dd6 234 }
XinZhangMS 0:f7f1f0d76dd6 235 else
XinZhangMS 0:f7f1f0d76dd6 236 {
XinZhangMS 0:f7f1f0d76dd6 237 /* Codes_SRS_MQTTMESSAGE_07_017: [mqttmessage_getIsDuplicateMsg shall return the isDuplicateMsg value contained in MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 238 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 239 result = msgInfo->isDuplicateMsg;
XinZhangMS 0:f7f1f0d76dd6 240 }
XinZhangMS 0:f7f1f0d76dd6 241 return result;
XinZhangMS 0:f7f1f0d76dd6 242 }
XinZhangMS 0:f7f1f0d76dd6 243
XinZhangMS 0:f7f1f0d76dd6 244 bool mqttmessage_getIsRetained(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 245 {
XinZhangMS 0:f7f1f0d76dd6 246 bool result;
XinZhangMS 0:f7f1f0d76dd6 247 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 248 {
XinZhangMS 0:f7f1f0d76dd6 249 /* Codes_SRS_MQTTMESSAGE_07_018: [If handle is NULL then mqttmessage_getIsRetained shall return false.] */
XinZhangMS 0:f7f1f0d76dd6 250 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 251 result = false;
XinZhangMS 0:f7f1f0d76dd6 252 }
XinZhangMS 0:f7f1f0d76dd6 253 else
XinZhangMS 0:f7f1f0d76dd6 254 {
XinZhangMS 0:f7f1f0d76dd6 255 /* Codes_SRS_MQTTMESSAGE_07_019: [mqttmessage_getIsRetained shall return the isRetained value contained in MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 256 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 257 result = msgInfo->isMessageRetained;
XinZhangMS 0:f7f1f0d76dd6 258 }
XinZhangMS 0:f7f1f0d76dd6 259 return result;
XinZhangMS 0:f7f1f0d76dd6 260 }
XinZhangMS 0:f7f1f0d76dd6 261
XinZhangMS 0:f7f1f0d76dd6 262 int mqttmessage_setIsDuplicateMsg(MQTT_MESSAGE_HANDLE handle, bool duplicateMsg)
XinZhangMS 0:f7f1f0d76dd6 263 {
XinZhangMS 0:f7f1f0d76dd6 264 int result;
XinZhangMS 0:f7f1f0d76dd6 265 /* Codes_SRS_MQTTMESSAGE_07_022: [If handle is NULL then mqttmessage_setIsDuplicateMsg shall return a non-zero value.] */
XinZhangMS 0:f7f1f0d76dd6 266 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 267 {
XinZhangMS 0:f7f1f0d76dd6 268 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 269 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 270 }
XinZhangMS 0:f7f1f0d76dd6 271 else
XinZhangMS 0:f7f1f0d76dd6 272 {
XinZhangMS 0:f7f1f0d76dd6 273 /* Codes_SRS_MQTTMESSAGE_07_023: [mqttmessage_setIsDuplicateMsg shall store the duplicateMsg value in the MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 274 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 275 msgInfo->isDuplicateMsg = duplicateMsg;
XinZhangMS 0:f7f1f0d76dd6 276 result = 0;
XinZhangMS 0:f7f1f0d76dd6 277 }
XinZhangMS 0:f7f1f0d76dd6 278 return result;
XinZhangMS 0:f7f1f0d76dd6 279 }
XinZhangMS 0:f7f1f0d76dd6 280
XinZhangMS 0:f7f1f0d76dd6 281 int mqttmessage_setIsRetained(MQTT_MESSAGE_HANDLE handle, bool retainMsg)
XinZhangMS 0:f7f1f0d76dd6 282 {
XinZhangMS 0:f7f1f0d76dd6 283 int result;
XinZhangMS 0:f7f1f0d76dd6 284 /* Codes_SRS_MQTTMESSAGE_07_024: [If handle is NULL then mqttmessage_setIsRetained shall return a non-zero value.] */
XinZhangMS 0:f7f1f0d76dd6 285 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 286 {
XinZhangMS 0:f7f1f0d76dd6 287 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 288 result = __FAILURE__;
XinZhangMS 0:f7f1f0d76dd6 289 }
XinZhangMS 0:f7f1f0d76dd6 290 else
XinZhangMS 0:f7f1f0d76dd6 291 {
XinZhangMS 0:f7f1f0d76dd6 292 /* Codes_SRS_MQTTMESSAGE_07_025: [mqttmessage_setIsRetained shall store the retainMsg value in the MQTT_MESSAGE_HANDLE handle.] */
XinZhangMS 0:f7f1f0d76dd6 293 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 294 msgInfo->isMessageRetained = retainMsg;
XinZhangMS 0:f7f1f0d76dd6 295 result = 0;
XinZhangMS 0:f7f1f0d76dd6 296 }
XinZhangMS 0:f7f1f0d76dd6 297 return result;
XinZhangMS 0:f7f1f0d76dd6 298 }
XinZhangMS 0:f7f1f0d76dd6 299
XinZhangMS 0:f7f1f0d76dd6 300 const APP_PAYLOAD* mqttmessage_getApplicationMsg(MQTT_MESSAGE_HANDLE handle)
XinZhangMS 0:f7f1f0d76dd6 301 {
XinZhangMS 0:f7f1f0d76dd6 302 const APP_PAYLOAD* result;
XinZhangMS 0:f7f1f0d76dd6 303 if (handle == NULL)
XinZhangMS 0:f7f1f0d76dd6 304 {
XinZhangMS 0:f7f1f0d76dd6 305 /* Codes_SRS_MQTTMESSAGE_07_020: [If handle is NULL or if msgLen is 0 then mqttmessage_getApplicationMsg shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 306 LogError("Invalid Parameter handle: %p.", handle);
XinZhangMS 0:f7f1f0d76dd6 307 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 308 }
XinZhangMS 0:f7f1f0d76dd6 309 else
XinZhangMS 0:f7f1f0d76dd6 310 {
XinZhangMS 0:f7f1f0d76dd6 311 /* Codes_SRS_MQTTMESSAGE_07_021: [mqttmessage_getApplicationMsg shall return the applicationMsg value contained in MQTT_MESSAGE_HANDLE handle and the length of the appMsg in the msgLen parameter.] */
XinZhangMS 0:f7f1f0d76dd6 312 MQTT_MESSAGE* msgInfo = (MQTT_MESSAGE*)handle;
XinZhangMS 0:f7f1f0d76dd6 313 if (msgInfo->const_payload.length > 0)
XinZhangMS 0:f7f1f0d76dd6 314 {
XinZhangMS 0:f7f1f0d76dd6 315 result = &msgInfo->const_payload;
XinZhangMS 0:f7f1f0d76dd6 316 }
XinZhangMS 0:f7f1f0d76dd6 317 else
XinZhangMS 0:f7f1f0d76dd6 318 {
XinZhangMS 0:f7f1f0d76dd6 319 result = &msgInfo->appPayload;
XinZhangMS 0:f7f1f0d76dd6 320 }
XinZhangMS 0:f7f1f0d76dd6 321 }
XinZhangMS 0:f7f1f0d76dd6 322 return result;
XinZhangMS 0:f7f1f0d76dd6 323 }