A modelling and serializer library for Microsoft Azure IoTHub client applications

Dependents:   sht15_remote_monitoring f767zi_mqtt remote_monitoring simplesample_amqp ... more

This library implements a serializer library to be used in projects involving Microsoft Azure IoT Hub connectivity. The code is replicated from https://github.com/Azure/azure-iot-sdks

Committer:
AzureIoTClient
Date:
Fri Jan 15 15:49:46 2016 -0800
Revision:
6:36cc37b1dbc9
Parent:
0:1f9b2707ec7d
Child:
7:5176a13270bb
v1.0.0-preview.4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 0:1f9b2707ec7d 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 0:1f9b2707ec7d 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 0:1f9b2707ec7d 3
AzureIoTClient 0:1f9b2707ec7d 4 #include <stdlib.h>
AzureIoTClient 0:1f9b2707ec7d 5 #ifdef _CRTDBG_MAP_ALLOC
AzureIoTClient 0:1f9b2707ec7d 6 #include <crtdbg.h>
AzureIoTClient 0:1f9b2707ec7d 7 #endif
AzureIoTClient 0:1f9b2707ec7d 8 #include "gballoc.h"
AzureIoTClient 0:1f9b2707ec7d 9
AzureIoTClient 0:1f9b2707ec7d 10 #include "agenttypesystem.h"
AzureIoTClient 0:1f9b2707ec7d 11
AzureIoTClient 0:1f9b2707ec7d 12 #ifdef _MSC_VER
AzureIoTClient 0:1f9b2707ec7d 13 #pragma warning(disable: 4756) /* Known warning for INFINITY */
AzureIoTClient 0:1f9b2707ec7d 14 #endif
AzureIoTClient 0:1f9b2707ec7d 15
AzureIoTClient 0:1f9b2707ec7d 16 #include <stddef.h>
AzureIoTClient 0:1f9b2707ec7d 17
AzureIoTClient 0:1f9b2707ec7d 18 #include <float.h>
AzureIoTClient 0:1f9b2707ec7d 19 #include <math.h>
AzureIoTClient 0:1f9b2707ec7d 20 #include "crt_abstractions.h"
AzureIoTClient 0:1f9b2707ec7d 21
AzureIoTClient 0:1f9b2707ec7d 22 #include "jsonencoder.h"
AzureIoTClient 0:1f9b2707ec7d 23 #include "multitree.h"
AzureIoTClient 0:1f9b2707ec7d 24
AzureIoTClient 0:1f9b2707ec7d 25 #include "agenttime.h"
AzureIoTClient 0:1f9b2707ec7d 26
AzureIoTClient 0:1f9b2707ec7d 27 #include "iot_logging.h"
AzureIoTClient 0:1f9b2707ec7d 28
AzureIoTClient 0:1f9b2707ec7d 29 #define NaN_STRING "NaN"
AzureIoTClient 0:1f9b2707ec7d 30 #define MINUSINF_STRING "-INF"
AzureIoTClient 0:1f9b2707ec7d 31 #define PLUSINF_STRING "INF"
AzureIoTClient 0:1f9b2707ec7d 32
AzureIoTClient 0:1f9b2707ec7d 33 #ifndef _HUGE_ENUF
AzureIoTClient 0:1f9b2707ec7d 34 #define _HUGE_ENUF 1e+300 /* _HUGE_ENUF*_HUGE_ENUF must overflow */
AzureIoTClient 0:1f9b2707ec7d 35 #endif /* _HUGE_ENUF */
AzureIoTClient 0:1f9b2707ec7d 36
AzureIoTClient 0:1f9b2707ec7d 37 #ifndef INFINITY
AzureIoTClient 0:1f9b2707ec7d 38 #define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF)) /* causes warning C4756: overflow in constant arithmetic (by design) */
AzureIoTClient 0:1f9b2707ec7d 39 #endif /* INFINITY */
AzureIoTClient 0:1f9b2707ec7d 40
AzureIoTClient 0:1f9b2707ec7d 41 #ifndef NAN
AzureIoTClient 0:1f9b2707ec7d 42 #define NAN ((float)(INFINITY * 0.0F))
AzureIoTClient 0:1f9b2707ec7d 43 #endif /* NAN */
AzureIoTClient 0:1f9b2707ec7d 44
AzureIoTClient 0:1f9b2707ec7d 45 #define GUID_STRING_LENGHT 38
AzureIoTClient 0:1f9b2707ec7d 46
AzureIoTClient 0:1f9b2707ec7d 47 DEFINE_ENUM_STRINGS(AGENT_DATA_TYPES_RESULT, AGENT_DATA_TYPES_RESULT_VALUES);
AzureIoTClient 0:1f9b2707ec7d 48
AzureIoTClient 0:1f9b2707ec7d 49 static int ValidateDate(int year, int month, int day);
AzureIoTClient 0:1f9b2707ec7d 50
AzureIoTClient 0:1f9b2707ec7d 51 static int NoCloneFunction(void** destination, const void* source)
AzureIoTClient 0:1f9b2707ec7d 52 {
AzureIoTClient 0:1f9b2707ec7d 53 *destination = (void*)source;
AzureIoTClient 0:1f9b2707ec7d 54 return 0;
AzureIoTClient 0:1f9b2707ec7d 55 }
AzureIoTClient 0:1f9b2707ec7d 56
AzureIoTClient 0:1f9b2707ec7d 57 static void NoFreeFunction(void* value)
AzureIoTClient 0:1f9b2707ec7d 58 {
AzureIoTClient 0:1f9b2707ec7d 59 (void)value;
AzureIoTClient 0:1f9b2707ec7d 60 }
AzureIoTClient 0:1f9b2707ec7d 61
AzureIoTClient 0:1f9b2707ec7d 62
AzureIoTClient 0:1f9b2707ec7d 63 static const char base64char[64] = {
AzureIoTClient 0:1f9b2707ec7d 64 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
AzureIoTClient 0:1f9b2707ec7d 65 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
AzureIoTClient 0:1f9b2707ec7d 66 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',
AzureIoTClient 0:1f9b2707ec7d 67 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
AzureIoTClient 0:1f9b2707ec7d 68 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
AzureIoTClient 0:1f9b2707ec7d 69 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',
AzureIoTClient 0:1f9b2707ec7d 70 '8', '9', '-', '_'
AzureIoTClient 0:1f9b2707ec7d 71 };
AzureIoTClient 0:1f9b2707ec7d 72
AzureIoTClient 0:1f9b2707ec7d 73 static const char base64b16[16] = {
AzureIoTClient 0:1f9b2707ec7d 74 'A', 'E', 'I', 'M', 'Q', 'U', 'Y', 'c', 'g', 'k',
AzureIoTClient 0:1f9b2707ec7d 75 'o', 's', 'w', '0', '4', '8'
AzureIoTClient 0:1f9b2707ec7d 76 };
AzureIoTClient 0:1f9b2707ec7d 77
AzureIoTClient 0:1f9b2707ec7d 78 static const char base64b8[4] = {
AzureIoTClient 0:1f9b2707ec7d 79 'A' , 'Q' , 'g' , 'w'
AzureIoTClient 0:1f9b2707ec7d 80 };
AzureIoTClient 0:1f9b2707ec7d 81
AzureIoTClient 0:1f9b2707ec7d 82 #define IS_DIGIT(a) (('0'<=(a)) &&((a)<='9'))
AzureIoTClient 0:1f9b2707ec7d 83
AzureIoTClient 0:1f9b2707ec7d 84 /*creates an AGENT_DATA_TYPE containing a EDM_BOOLEAN from a int*/
AzureIoTClient 0:1f9b2707ec7d 85 AGENT_DATA_TYPES_RESULT Create_EDM_BOOLEAN_from_int(AGENT_DATA_TYPE* agentData, int v)
AzureIoTClient 0:1f9b2707ec7d 86 {
AzureIoTClient 0:1f9b2707ec7d 87 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 88 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[All the Create_... functions shall check their parameters for validity.When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned]*/
AzureIoTClient 0:1f9b2707ec7d 89 if(agentData==NULL)
AzureIoTClient 0:1f9b2707ec7d 90 {
AzureIoTClient 0:1f9b2707ec7d 91 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 92 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 93 }
AzureIoTClient 0:1f9b2707ec7d 94 else
AzureIoTClient 0:1f9b2707ec7d 95 {
AzureIoTClient 0:1f9b2707ec7d 96 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_031:[ Creates a AGENT_DATA_TYPE representing an EDM_BOOLEAN.]*/
AzureIoTClient 0:1f9b2707ec7d 97 agentData->type = EDM_BOOLEAN_TYPE;
AzureIoTClient 0:1f9b2707ec7d 98 agentData->value.edmBoolean.value = (v)?(EDM_TRUE):(EDM_FALSE);
AzureIoTClient 0:1f9b2707ec7d 99 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 100 }
AzureIoTClient 0:1f9b2707ec7d 101 return result;
AzureIoTClient 0:1f9b2707ec7d 102 }
AzureIoTClient 0:1f9b2707ec7d 103
AzureIoTClient 0:1f9b2707ec7d 104 /*creates an AGENT_DATA_TYPE containing a UINT8*/
AzureIoTClient 0:1f9b2707ec7d 105 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_UINT8(AGENT_DATA_TYPE* agentData, uint8_t v)
AzureIoTClient 0:1f9b2707ec7d 106 {
AzureIoTClient 0:1f9b2707ec7d 107 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 108 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 109 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 110 {
AzureIoTClient 0:1f9b2707ec7d 111 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 112 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 113 }
AzureIoTClient 0:1f9b2707ec7d 114 else
AzureIoTClient 0:1f9b2707ec7d 115 {
AzureIoTClient 0:1f9b2707ec7d 116 agentData->type = EDM_BYTE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 117 agentData->value.edmByte.value = v;
AzureIoTClient 0:1f9b2707ec7d 118 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 119 }
AzureIoTClient 0:1f9b2707ec7d 120 return result;
AzureIoTClient 0:1f9b2707ec7d 121 }
AzureIoTClient 0:1f9b2707ec7d 122
AzureIoTClient 0:1f9b2707ec7d 123 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_091:[Creates an AGENT_DATA_TYPE containing an Edm.DateTimeOffset from an EDM_DATE_TIME_OFFSET.]*/
AzureIoTClient 0:1f9b2707ec7d 124 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_EDM_DATE_TIME_OFFSET(AGENT_DATA_TYPE* agentData, EDM_DATE_TIME_OFFSET v)
AzureIoTClient 0:1f9b2707ec7d 125 {
AzureIoTClient 0:1f9b2707ec7d 126 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 127 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ]*/
AzureIoTClient 0:1f9b2707ec7d 128 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 129 {
AzureIoTClient 0:1f9b2707ec7d 130 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 131 }
AzureIoTClient 0:1f9b2707ec7d 132 else if (ValidateDate(v.dateTime.tm_year+1900, v.dateTime.tm_mon +1 , v.dateTime.tm_mday) != 0)
AzureIoTClient 0:1f9b2707ec7d 133 {
AzureIoTClient 0:1f9b2707ec7d 134 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_092:[ The structure shall be validated to be conforming to OData specifications (odata-abnf-construction-rules, 2013), and if found invalid, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 135 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 136 }
AzureIoTClient 0:1f9b2707ec7d 137 else if (
AzureIoTClient 0:1f9b2707ec7d 138 (v.dateTime.tm_hour > 23) ||
AzureIoTClient 0:1f9b2707ec7d 139 (v.dateTime.tm_hour < 0) ||
AzureIoTClient 0:1f9b2707ec7d 140 (v.dateTime.tm_min > 59) ||
AzureIoTClient 0:1f9b2707ec7d 141 (v.dateTime.tm_min < 0) ||
AzureIoTClient 0:1f9b2707ec7d 142 (v.dateTime.tm_sec > 59) ||
AzureIoTClient 0:1f9b2707ec7d 143 (v.dateTime.tm_sec < 0)
AzureIoTClient 0:1f9b2707ec7d 144 )
AzureIoTClient 0:1f9b2707ec7d 145 {
AzureIoTClient 0:1f9b2707ec7d 146 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_092:[ The structure shall be validated, and if found invalid, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 147 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 148 }
AzureIoTClient 0:1f9b2707ec7d 149 else if ((v.hasFractionalSecond) && (v.fractionalSecond > 999999999999))
AzureIoTClient 0:1f9b2707ec7d 150 {
AzureIoTClient 0:1f9b2707ec7d 151 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_092:[ The structure shall be validated to be conforming to OData specifications (odata-abnf-construction-rules, 2013), and if found invalid, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 152 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 153 }
AzureIoTClient 0:1f9b2707ec7d 154 else if (
AzureIoTClient 0:1f9b2707ec7d 155 (v.hasTimeZone) &&
AzureIoTClient 0:1f9b2707ec7d 156 (
AzureIoTClient 0:1f9b2707ec7d 157 (v.timeZoneHour<-23) ||
AzureIoTClient 0:1f9b2707ec7d 158 (v.timeZoneHour>23) ||
AzureIoTClient 0:1f9b2707ec7d 159 (v.timeZoneMinute>59)
AzureIoTClient 0:1f9b2707ec7d 160 )
AzureIoTClient 0:1f9b2707ec7d 161 )
AzureIoTClient 0:1f9b2707ec7d 162 {
AzureIoTClient 0:1f9b2707ec7d 163 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_092:[ The structure shall be validated to be conforming to OData specifications (odata-abnf-construction-rules, 2013), and if found invalid, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 164 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 165 }
AzureIoTClient 0:1f9b2707ec7d 166 else
AzureIoTClient 0:1f9b2707ec7d 167 {
AzureIoTClient 0:1f9b2707ec7d 168 agentData->type = EDM_DATE_TIME_OFFSET_TYPE;
AzureIoTClient 0:1f9b2707ec7d 169 agentData->value.edmDateTimeOffset = v;
AzureIoTClient 0:1f9b2707ec7d 170 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 171 }
AzureIoTClient 0:1f9b2707ec7d 172 return result;
AzureIoTClient 0:1f9b2707ec7d 173 }
AzureIoTClient 0:1f9b2707ec7d 174
AzureIoTClient 0:1f9b2707ec7d 175 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_094:[ Creates and AGENT_DATA_TYPE containing a EDM_GUID from an EDM_GUID]*/
AzureIoTClient 0:1f9b2707ec7d 176 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_EDM_GUID(AGENT_DATA_TYPE* agentData, EDM_GUID v)
AzureIoTClient 0:1f9b2707ec7d 177 {
AzureIoTClient 0:1f9b2707ec7d 178 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 179 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the functions shall check their parameters for validity. When an invalid parameter is detected, the value AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 180 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 181 {
AzureIoTClient 0:1f9b2707ec7d 182 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 183 LogError("result = %s \r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 184 }
AzureIoTClient 0:1f9b2707ec7d 185 else
AzureIoTClient 0:1f9b2707ec7d 186 {
AzureIoTClient 0:1f9b2707ec7d 187 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_094:[ Creates and AGENT_DATA_TYPE containing a EDM_GUID from an EDM_GUID]*/
AzureIoTClient 0:1f9b2707ec7d 188 agentData->type = EDM_GUID_TYPE;
AzureIoTClient 0:1f9b2707ec7d 189 memmove(agentData->value.edmGuid.GUID, v.GUID, 16);
AzureIoTClient 0:1f9b2707ec7d 190 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 191 }
AzureIoTClient 0:1f9b2707ec7d 192 return result;
AzureIoTClient 0:1f9b2707ec7d 193 }
AzureIoTClient 0:1f9b2707ec7d 194
AzureIoTClient 0:1f9b2707ec7d 195 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_098:[ Creates an AGENT_DATA_TYPE containing a EDM_BINARY from a EDM_BINARY.]*/
AzureIoTClient 0:1f9b2707ec7d 196 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_EDM_BINARY(AGENT_DATA_TYPE* agentData, EDM_BINARY v)
AzureIoTClient 0:1f9b2707ec7d 197 {
AzureIoTClient 0:1f9b2707ec7d 198 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 199 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the functions shall check their parameters for validity. When an invalid parameter is detected, the value AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 200 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 201 {
AzureIoTClient 0:1f9b2707ec7d 202 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 203 LogError("result = %s\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 204 }
AzureIoTClient 0:1f9b2707ec7d 205 else
AzureIoTClient 0:1f9b2707ec7d 206 {
AzureIoTClient 0:1f9b2707ec7d 207 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_098:[ Creates an AGENT_DATA_TYPE containing a EDM_BINARY from a EDM_BINARY.]*/
AzureIoTClient 0:1f9b2707ec7d 208 if (v.data == NULL)
AzureIoTClient 0:1f9b2707ec7d 209 {
AzureIoTClient 0:1f9b2707ec7d 210 if (v.size != 0)
AzureIoTClient 0:1f9b2707ec7d 211 {
AzureIoTClient 0:1f9b2707ec7d 212 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 213 LogError("result = %s \r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 214 }
AzureIoTClient 0:1f9b2707ec7d 215 else
AzureIoTClient 0:1f9b2707ec7d 216 {
AzureIoTClient 0:1f9b2707ec7d 217 agentData->type = EDM_BINARY_TYPE;
AzureIoTClient 0:1f9b2707ec7d 218 agentData->value.edmBinary.size = 0;
AzureIoTClient 0:1f9b2707ec7d 219 agentData->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 220 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 221 }
AzureIoTClient 0:1f9b2707ec7d 222 }
AzureIoTClient 0:1f9b2707ec7d 223 else
AzureIoTClient 0:1f9b2707ec7d 224 {
AzureIoTClient 0:1f9b2707ec7d 225 if (v.size != 0)
AzureIoTClient 0:1f9b2707ec7d 226 {
AzureIoTClient 0:1f9b2707ec7d 227 /*make a copy*/
AzureIoTClient 0:1f9b2707ec7d 228 if ((agentData->value.edmBinary.data = (unsigned char*)malloc(v.size)) == NULL)
AzureIoTClient 0:1f9b2707ec7d 229 {
AzureIoTClient 0:1f9b2707ec7d 230 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 231 LogError("result = %s\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 232 }
AzureIoTClient 0:1f9b2707ec7d 233 else
AzureIoTClient 0:1f9b2707ec7d 234 {
AzureIoTClient 0:1f9b2707ec7d 235 memcpy(agentData->value.edmBinary.data, v.data, v.size);
AzureIoTClient 0:1f9b2707ec7d 236 agentData->type = EDM_BINARY_TYPE;
AzureIoTClient 0:1f9b2707ec7d 237 agentData->value.edmBinary.size = v.size;
AzureIoTClient 0:1f9b2707ec7d 238 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 239 }
AzureIoTClient 0:1f9b2707ec7d 240 }
AzureIoTClient 0:1f9b2707ec7d 241 else
AzureIoTClient 0:1f9b2707ec7d 242 {
AzureIoTClient 0:1f9b2707ec7d 243 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 244 LogError("result = %s\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 245 }
AzureIoTClient 0:1f9b2707ec7d 246 }
AzureIoTClient 0:1f9b2707ec7d 247 }
AzureIoTClient 0:1f9b2707ec7d 248 return result;
AzureIoTClient 0:1f9b2707ec7d 249 }
AzureIoTClient 0:1f9b2707ec7d 250
AzureIoTClient 0:1f9b2707ec7d 251 /*scans sign, if any*/
AzureIoTClient 0:1f9b2707ec7d 252 /*if no sign, then it will set *sign to = +1*/
AzureIoTClient 0:1f9b2707ec7d 253 /*if sign, then it will set *sign to = +/-1*/
AzureIoTClient 0:1f9b2707ec7d 254 static void scanOptionalSign(const char* source, size_t sourceSize, size_t* position, int* sign)
AzureIoTClient 0:1f9b2707ec7d 255 {
AzureIoTClient 0:1f9b2707ec7d 256 if (*position < sourceSize)
AzureIoTClient 0:1f9b2707ec7d 257 {
AzureIoTClient 0:1f9b2707ec7d 258 if (source[*position] == '-')
AzureIoTClient 0:1f9b2707ec7d 259 {
AzureIoTClient 0:1f9b2707ec7d 260
AzureIoTClient 0:1f9b2707ec7d 261 *sign = -1;
AzureIoTClient 0:1f9b2707ec7d 262 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 263 }
AzureIoTClient 0:1f9b2707ec7d 264 else if (source[*position] == '+')
AzureIoTClient 0:1f9b2707ec7d 265 {
AzureIoTClient 0:1f9b2707ec7d 266 *sign = +1;
AzureIoTClient 0:1f9b2707ec7d 267 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 268 }
AzureIoTClient 0:1f9b2707ec7d 269 else
AzureIoTClient 0:1f9b2707ec7d 270 {
AzureIoTClient 0:1f9b2707ec7d 271 *sign = +1;
AzureIoTClient 0:1f9b2707ec7d 272 }
AzureIoTClient 0:1f9b2707ec7d 273 }
AzureIoTClient 0:1f9b2707ec7d 274 }
AzureIoTClient 0:1f9b2707ec7d 275
AzureIoTClient 0:1f9b2707ec7d 276 /*scans a minus sign, if any*/
AzureIoTClient 0:1f9b2707ec7d 277 /*if no sign, then it will set *sign to = +1*/
AzureIoTClient 0:1f9b2707ec7d 278 /*if sign, then it will set *sign to = +/-1*/
AzureIoTClient 0:1f9b2707ec7d 279 static void scanOptionalMinusSign(const char* source, size_t sourceSize, size_t* position, int* sign)
AzureIoTClient 0:1f9b2707ec7d 280 {
AzureIoTClient 0:1f9b2707ec7d 281 if (*position < sourceSize)
AzureIoTClient 0:1f9b2707ec7d 282 {
AzureIoTClient 0:1f9b2707ec7d 283 if (source[*position] == '-')
AzureIoTClient 0:1f9b2707ec7d 284 {
AzureIoTClient 0:1f9b2707ec7d 285
AzureIoTClient 0:1f9b2707ec7d 286 *sign = -1;
AzureIoTClient 0:1f9b2707ec7d 287 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 288 }
AzureIoTClient 0:1f9b2707ec7d 289 else
AzureIoTClient 0:1f9b2707ec7d 290 {
AzureIoTClient 0:1f9b2707ec7d 291 *sign = +1;
AzureIoTClient 0:1f9b2707ec7d 292 }
AzureIoTClient 0:1f9b2707ec7d 293 }
AzureIoTClient 0:1f9b2707ec7d 294 }
AzureIoTClient 0:1f9b2707ec7d 295
AzureIoTClient 0:1f9b2707ec7d 296 /*this function alawys returns 0 if it processed 1 digit*/
AzureIoTClient 0:1f9b2707ec7d 297 /*return 1 when error (such as wrong parameters)*/
AzureIoTClient 0:1f9b2707ec7d 298 static int scanMandatoryOneDigit(const char* source, size_t sourceSize, size_t* position)
AzureIoTClient 0:1f9b2707ec7d 299 {
AzureIoTClient 0:1f9b2707ec7d 300 int result;
AzureIoTClient 0:1f9b2707ec7d 301 if (*position < sourceSize)
AzureIoTClient 0:1f9b2707ec7d 302 {
AzureIoTClient 0:1f9b2707ec7d 303 if (IS_DIGIT(source[*position]))
AzureIoTClient 0:1f9b2707ec7d 304 {
AzureIoTClient 0:1f9b2707ec7d 305 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 306 result = 0;
AzureIoTClient 0:1f9b2707ec7d 307 }
AzureIoTClient 0:1f9b2707ec7d 308 else
AzureIoTClient 0:1f9b2707ec7d 309 {
AzureIoTClient 0:1f9b2707ec7d 310 result = 1;
AzureIoTClient 0:1f9b2707ec7d 311 }
AzureIoTClient 0:1f9b2707ec7d 312 }
AzureIoTClient 0:1f9b2707ec7d 313 else
AzureIoTClient 0:1f9b2707ec7d 314 {
AzureIoTClient 0:1f9b2707ec7d 315 result = 1;
AzureIoTClient 0:1f9b2707ec7d 316 }
AzureIoTClient 0:1f9b2707ec7d 317 return result;
AzureIoTClient 0:1f9b2707ec7d 318 }
AzureIoTClient 0:1f9b2707ec7d 319
AzureIoTClient 0:1f9b2707ec7d 320 /*scans digits, if any*/
AzureIoTClient 0:1f9b2707ec7d 321 static void scanOptionalNDigits(const char* source, size_t sourceSize, size_t* position)
AzureIoTClient 0:1f9b2707ec7d 322 {
AzureIoTClient 0:1f9b2707ec7d 323 while (*position < sourceSize)
AzureIoTClient 0:1f9b2707ec7d 324 {
AzureIoTClient 0:1f9b2707ec7d 325 if (IS_DIGIT(source[*position]))
AzureIoTClient 0:1f9b2707ec7d 326 {
AzureIoTClient 0:1f9b2707ec7d 327 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 328 }
AzureIoTClient 0:1f9b2707ec7d 329 else
AzureIoTClient 0:1f9b2707ec7d 330 {
AzureIoTClient 0:1f9b2707ec7d 331 break;
AzureIoTClient 0:1f9b2707ec7d 332 }
AzureIoTClient 0:1f9b2707ec7d 333 }
AzureIoTClient 0:1f9b2707ec7d 334 }
AzureIoTClient 0:1f9b2707ec7d 335
AzureIoTClient 0:1f9b2707ec7d 336 /*from the string pointed to by source, having the size sourceSize, starting at initial position *position*/
AzureIoTClient 0:1f9b2707ec7d 337 /*this function will attempt to read a decimal number having an optional sign(+/-) followed by precisely N digits */
AzureIoTClient 0:1f9b2707ec7d 338 /*will return 0 if in the string there was a number and that number has been read in the *value parameter*/
AzureIoTClient 0:1f9b2707ec7d 339 /*will update position parameter to reflect the first character not belonging to the number*/
AzureIoTClient 0:1f9b2707ec7d 340 static int scanAndReadNDigitsInt(const char* source, size_t sourceSize, size_t* position, int *value, size_t N)
AzureIoTClient 0:1f9b2707ec7d 341 {
AzureIoTClient 0:1f9b2707ec7d 342 N++;
AzureIoTClient 0:1f9b2707ec7d 343 *value = 0;
AzureIoTClient 0:1f9b2707ec7d 344 while ((*position < sourceSize) &&
AzureIoTClient 0:1f9b2707ec7d 345 (N > 0))
AzureIoTClient 0:1f9b2707ec7d 346 {
AzureIoTClient 0:1f9b2707ec7d 347 if (IS_DIGIT(source[*position]))
AzureIoTClient 0:1f9b2707ec7d 348 {
AzureIoTClient 0:1f9b2707ec7d 349 *value *= 10;
AzureIoTClient 0:1f9b2707ec7d 350 *value += (source[*position] - '0');
AzureIoTClient 0:1f9b2707ec7d 351 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 352 }
AzureIoTClient 0:1f9b2707ec7d 353 else
AzureIoTClient 0:1f9b2707ec7d 354 {
AzureIoTClient 0:1f9b2707ec7d 355 break;
AzureIoTClient 0:1f9b2707ec7d 356 }
AzureIoTClient 0:1f9b2707ec7d 357
AzureIoTClient 0:1f9b2707ec7d 358 N--;
AzureIoTClient 0:1f9b2707ec7d 359 }
AzureIoTClient 0:1f9b2707ec7d 360
AzureIoTClient 0:1f9b2707ec7d 361 return N != 1;
AzureIoTClient 0:1f9b2707ec7d 362 }
AzureIoTClient 0:1f9b2707ec7d 363
AzureIoTClient 0:1f9b2707ec7d 364 /*this function alawys returns 0 if it found a dot followed by at least digit*/
AzureIoTClient 0:1f9b2707ec7d 365 /*return 1 when error (such as wrong parameters)*/
AzureIoTClient 0:1f9b2707ec7d 366 static int scanOptionalDotAndDigits(const char* source, size_t sourceSize, size_t* position)
AzureIoTClient 0:1f9b2707ec7d 367 {
AzureIoTClient 0:1f9b2707ec7d 368 int result = 0;
AzureIoTClient 0:1f9b2707ec7d 369 if (*position < sourceSize)
AzureIoTClient 0:1f9b2707ec7d 370 {
AzureIoTClient 0:1f9b2707ec7d 371 if (source[*position] == '.')
AzureIoTClient 0:1f9b2707ec7d 372 {
AzureIoTClient 0:1f9b2707ec7d 373 (*position)++;
AzureIoTClient 0:1f9b2707ec7d 374 if (scanMandatoryOneDigit(source, sourceSize, position) != 0)
AzureIoTClient 0:1f9b2707ec7d 375 {
AzureIoTClient 0:1f9b2707ec7d 376 /* not a digit following the dot... */
AzureIoTClient 0:1f9b2707ec7d 377 result = 1;
AzureIoTClient 0:1f9b2707ec7d 378 }
AzureIoTClient 0:1f9b2707ec7d 379 else
AzureIoTClient 0:1f9b2707ec7d 380 {
AzureIoTClient 0:1f9b2707ec7d 381 scanOptionalNDigits(source, sourceSize, position);
AzureIoTClient 0:1f9b2707ec7d 382 }
AzureIoTClient 0:1f9b2707ec7d 383 }
AzureIoTClient 0:1f9b2707ec7d 384 else
AzureIoTClient 0:1f9b2707ec7d 385 {
AzureIoTClient 0:1f9b2707ec7d 386 /*not a dot, don't care*/
AzureIoTClient 0:1f9b2707ec7d 387 }
AzureIoTClient 0:1f9b2707ec7d 388 }
AzureIoTClient 0:1f9b2707ec7d 389 return result;
AzureIoTClient 0:1f9b2707ec7d 390 }
AzureIoTClient 0:1f9b2707ec7d 391
AzureIoTClient 0:1f9b2707ec7d 392
AzureIoTClient 0:1f9b2707ec7d 393 static int scanMandatory1CapitalHexDigit(const char* source, uint8_t* value)
AzureIoTClient 0:1f9b2707ec7d 394 {
AzureIoTClient 0:1f9b2707ec7d 395 int result = 0;
AzureIoTClient 0:1f9b2707ec7d 396 if (('0' <= source[0]) && (source[0] <= '9'))
AzureIoTClient 0:1f9b2707ec7d 397 {
AzureIoTClient 0:1f9b2707ec7d 398 *value = (source[0] - '0');
AzureIoTClient 0:1f9b2707ec7d 399 }
AzureIoTClient 0:1f9b2707ec7d 400 else if (('A' <= source[0]) && (source[0] <= 'F'))
AzureIoTClient 0:1f9b2707ec7d 401 {
AzureIoTClient 0:1f9b2707ec7d 402 *value = (source[0] - 'A'+10);
AzureIoTClient 0:1f9b2707ec7d 403 }
AzureIoTClient 0:1f9b2707ec7d 404 else
AzureIoTClient 0:1f9b2707ec7d 405 {
AzureIoTClient 0:1f9b2707ec7d 406 result = 1;
AzureIoTClient 0:1f9b2707ec7d 407 }
AzureIoTClient 0:1f9b2707ec7d 408 return result;
AzureIoTClient 0:1f9b2707ec7d 409 }
AzureIoTClient 0:1f9b2707ec7d 410
AzureIoTClient 0:1f9b2707ec7d 411 /*this function alawys returns 0 if it found 2 hex digits, also updates the *value parameter*/
AzureIoTClient 0:1f9b2707ec7d 412 /*return 1 when error (such as wrong parameters)*/
AzureIoTClient 0:1f9b2707ec7d 413 static int scanMandatory2CapitalHexDigits(const char* source, uint8_t* value)
AzureIoTClient 0:1f9b2707ec7d 414 {
AzureIoTClient 0:1f9b2707ec7d 415 int result;
AzureIoTClient 0:1f9b2707ec7d 416 uint8_t temp;
AzureIoTClient 0:1f9b2707ec7d 417 if (scanMandatory1CapitalHexDigit(source, &temp) == 0)
AzureIoTClient 0:1f9b2707ec7d 418 {
AzureIoTClient 0:1f9b2707ec7d 419 *value = temp*16;
AzureIoTClient 0:1f9b2707ec7d 420 if (scanMandatory1CapitalHexDigit(source + 1, &temp) == 0)
AzureIoTClient 0:1f9b2707ec7d 421 {
AzureIoTClient 0:1f9b2707ec7d 422 *value += temp;
AzureIoTClient 0:1f9b2707ec7d 423 result = 0;
AzureIoTClient 0:1f9b2707ec7d 424 }
AzureIoTClient 0:1f9b2707ec7d 425 else
AzureIoTClient 0:1f9b2707ec7d 426 {
AzureIoTClient 0:1f9b2707ec7d 427 result = 1;
AzureIoTClient 0:1f9b2707ec7d 428 }
AzureIoTClient 0:1f9b2707ec7d 429 }
AzureIoTClient 0:1f9b2707ec7d 430 else
AzureIoTClient 0:1f9b2707ec7d 431 {
AzureIoTClient 0:1f9b2707ec7d 432 result = 2;
AzureIoTClient 0:1f9b2707ec7d 433 }
AzureIoTClient 0:1f9b2707ec7d 434
AzureIoTClient 0:1f9b2707ec7d 435 return result;
AzureIoTClient 0:1f9b2707ec7d 436 }
AzureIoTClient 0:1f9b2707ec7d 437
AzureIoTClient 0:1f9b2707ec7d 438 static int ValidateDecimal(const char* v, size_t vlen)
AzureIoTClient 0:1f9b2707ec7d 439 {
AzureIoTClient 0:1f9b2707ec7d 440 int result;
AzureIoTClient 0:1f9b2707ec7d 441 int sign = 0;
AzureIoTClient 0:1f9b2707ec7d 442 size_t validatePosition = 0;
AzureIoTClient 0:1f9b2707ec7d 443 scanOptionalSign(v, vlen, &validatePosition, &sign);
AzureIoTClient 0:1f9b2707ec7d 444 if (scanMandatoryOneDigit(v, vlen, &validatePosition) != 0)
AzureIoTClient 0:1f9b2707ec7d 445 {
AzureIoTClient 0:1f9b2707ec7d 446 result = 1;
AzureIoTClient 0:1f9b2707ec7d 447 }
AzureIoTClient 0:1f9b2707ec7d 448 else
AzureIoTClient 0:1f9b2707ec7d 449 {
AzureIoTClient 0:1f9b2707ec7d 450 scanOptionalNDigits(v, vlen, &validatePosition);
AzureIoTClient 0:1f9b2707ec7d 451 if (scanOptionalDotAndDigits(v, vlen, &validatePosition) != 0)
AzureIoTClient 0:1f9b2707ec7d 452 {
AzureIoTClient 0:1f9b2707ec7d 453 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_067:[ If the string indicated by the parameter v does not match exactly an ODATA string representation, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 454 result = 1;
AzureIoTClient 0:1f9b2707ec7d 455 }
AzureIoTClient 0:1f9b2707ec7d 456 else if (validatePosition != vlen) /*Trailing wrong characters*/
AzureIoTClient 0:1f9b2707ec7d 457 {
AzureIoTClient 0:1f9b2707ec7d 458 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_067:[ If the string indicated by the parameter v does not match exactly an ODATA string representation, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 459 result = 1;
AzureIoTClient 0:1f9b2707ec7d 460 }
AzureIoTClient 0:1f9b2707ec7d 461 else
AzureIoTClient 0:1f9b2707ec7d 462 {
AzureIoTClient 0:1f9b2707ec7d 463 result = 0;
AzureIoTClient 0:1f9b2707ec7d 464 }
AzureIoTClient 0:1f9b2707ec7d 465 }
AzureIoTClient 0:1f9b2707ec7d 466
AzureIoTClient 0:1f9b2707ec7d 467 return result;
AzureIoTClient 0:1f9b2707ec7d 468 }
AzureIoTClient 0:1f9b2707ec7d 469
AzureIoTClient 0:1f9b2707ec7d 470 /*return 0 if everything went ok*/
AzureIoTClient 0:1f9b2707ec7d 471 /*takes 1 base64char and returns its value*/
AzureIoTClient 0:1f9b2707ec7d 472 static int base64toValue(char base64charSource, unsigned char* value)
AzureIoTClient 0:1f9b2707ec7d 473 {
AzureIoTClient 0:1f9b2707ec7d 474 int result;
AzureIoTClient 0:1f9b2707ec7d 475 if (('A' <= base64charSource) && (base64charSource <= 'Z'))
AzureIoTClient 0:1f9b2707ec7d 476 {
AzureIoTClient 0:1f9b2707ec7d 477 *value = base64charSource - 'A';
AzureIoTClient 0:1f9b2707ec7d 478 result = 0;
AzureIoTClient 0:1f9b2707ec7d 479 }
AzureIoTClient 0:1f9b2707ec7d 480 else if (('a' <= base64charSource) && (base64charSource <= 'z'))
AzureIoTClient 0:1f9b2707ec7d 481 {
AzureIoTClient 0:1f9b2707ec7d 482 *value = ('Z' - 'A') +1+ (base64charSource - 'a');
AzureIoTClient 0:1f9b2707ec7d 483 result = 0;
AzureIoTClient 0:1f9b2707ec7d 484 }
AzureIoTClient 0:1f9b2707ec7d 485 else if (('0' <= base64charSource) && (base64charSource <= '9'))
AzureIoTClient 0:1f9b2707ec7d 486 {
AzureIoTClient 0:1f9b2707ec7d 487 *value = ('Z' - 'A') +1+('z'-'a')+1 +(base64charSource - '0');
AzureIoTClient 0:1f9b2707ec7d 488 result = 0;
AzureIoTClient 0:1f9b2707ec7d 489 }
AzureIoTClient 0:1f9b2707ec7d 490 else if ('-' == base64charSource)
AzureIoTClient 0:1f9b2707ec7d 491 {
AzureIoTClient 0:1f9b2707ec7d 492 *value = 62;
AzureIoTClient 0:1f9b2707ec7d 493 result = 0;
AzureIoTClient 0:1f9b2707ec7d 494 }
AzureIoTClient 0:1f9b2707ec7d 495 else if ('_' == base64charSource)
AzureIoTClient 0:1f9b2707ec7d 496 {
AzureIoTClient 0:1f9b2707ec7d 497 *value = 63;
AzureIoTClient 0:1f9b2707ec7d 498 result = 0;
AzureIoTClient 0:1f9b2707ec7d 499 }
AzureIoTClient 0:1f9b2707ec7d 500 else
AzureIoTClient 0:1f9b2707ec7d 501 {
AzureIoTClient 0:1f9b2707ec7d 502 result = 1;
AzureIoTClient 0:1f9b2707ec7d 503 }
AzureIoTClient 0:1f9b2707ec7d 504 return result;
AzureIoTClient 0:1f9b2707ec7d 505 }
AzureIoTClient 0:1f9b2707ec7d 506
AzureIoTClient 0:1f9b2707ec7d 507 /*returns 0 if everything went ok*/
AzureIoTClient 0:1f9b2707ec7d 508 /*scans 4 base64 characters and returns 3 usual bytes*/
AzureIoTClient 0:1f9b2707ec7d 509 static int scan4base64char(const char* source, size_t sourceSize, unsigned char *destination0, unsigned char* destination1, unsigned char* destination2)
AzureIoTClient 0:1f9b2707ec7d 510 {
AzureIoTClient 0:1f9b2707ec7d 511 int result;
AzureIoTClient 0:1f9b2707ec7d 512 if (sourceSize < 4)
AzureIoTClient 0:1f9b2707ec7d 513 {
AzureIoTClient 0:1f9b2707ec7d 514 result = 1;
AzureIoTClient 0:1f9b2707ec7d 515 }
AzureIoTClient 0:1f9b2707ec7d 516 else
AzureIoTClient 0:1f9b2707ec7d 517 {
AzureIoTClient 0:1f9b2707ec7d 518 unsigned char b0, b1, b2, b3;
AzureIoTClient 0:1f9b2707ec7d 519 if (
AzureIoTClient 0:1f9b2707ec7d 520 (base64toValue(source[0], &b0) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 521 (base64toValue(source[1], &b1) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 522 (base64toValue(source[2], &b2) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 523 (base64toValue(source[3], &b3) == 0)
AzureIoTClient 0:1f9b2707ec7d 524 )
AzureIoTClient 0:1f9b2707ec7d 525 {
AzureIoTClient 0:1f9b2707ec7d 526 *destination0 = (b0 << 2) | ((b1 & 0x30) >> 4);
AzureIoTClient 0:1f9b2707ec7d 527 *destination1 = ((b1 & 0x0F)<<4) | ((b2 & 0x3C) >>2 );
AzureIoTClient 0:1f9b2707ec7d 528 *destination2 = ((b2 & 0x03) << 6) | (b3);
AzureIoTClient 0:1f9b2707ec7d 529 result = 0;
AzureIoTClient 0:1f9b2707ec7d 530 }
AzureIoTClient 0:1f9b2707ec7d 531 else
AzureIoTClient 0:1f9b2707ec7d 532 {
AzureIoTClient 0:1f9b2707ec7d 533 result = 2;
AzureIoTClient 0:1f9b2707ec7d 534 }
AzureIoTClient 0:1f9b2707ec7d 535 }
AzureIoTClient 0:1f9b2707ec7d 536 return result;
AzureIoTClient 0:1f9b2707ec7d 537 }
AzureIoTClient 0:1f9b2707ec7d 538
AzureIoTClient 0:1f9b2707ec7d 539 /*return 0 if the character is one of ( 'A' / 'E' / 'I' / 'M' / 'Q' / 'U' / 'Y' / 'c' / 'g' / 'k' / 'o' / 's' / 'w' / '0' / '4' / '8' )*/
AzureIoTClient 0:1f9b2707ec7d 540 static int base64b16toValue(unsigned char source, unsigned char* destination)
AzureIoTClient 0:1f9b2707ec7d 541 {
AzureIoTClient 0:1f9b2707ec7d 542 unsigned char i;
AzureIoTClient 0:1f9b2707ec7d 543 for (i = 0; i <= 15; i++)
AzureIoTClient 0:1f9b2707ec7d 544 {
AzureIoTClient 0:1f9b2707ec7d 545 if (base64b16[i] == source)
AzureIoTClient 0:1f9b2707ec7d 546 {
AzureIoTClient 0:1f9b2707ec7d 547 *destination = i;
AzureIoTClient 0:1f9b2707ec7d 548 return 0;
AzureIoTClient 0:1f9b2707ec7d 549 }
AzureIoTClient 0:1f9b2707ec7d 550 }
AzureIoTClient 0:1f9b2707ec7d 551 return 1;
AzureIoTClient 0:1f9b2707ec7d 552 }
AzureIoTClient 0:1f9b2707ec7d 553
AzureIoTClient 0:1f9b2707ec7d 554 /*return 0 if the character is one of ( 'A' / 'Q' / 'g' / 'w' )*/
AzureIoTClient 0:1f9b2707ec7d 555 static int base64b8toValue(unsigned char source, unsigned char* destination)
AzureIoTClient 0:1f9b2707ec7d 556 {
AzureIoTClient 0:1f9b2707ec7d 557 unsigned char i;
AzureIoTClient 0:1f9b2707ec7d 558 for (i = 0; i <= 3; i++)
AzureIoTClient 0:1f9b2707ec7d 559 {
AzureIoTClient 0:1f9b2707ec7d 560 if (base64b8[i] == source)
AzureIoTClient 0:1f9b2707ec7d 561 {
AzureIoTClient 0:1f9b2707ec7d 562 *destination = i;
AzureIoTClient 0:1f9b2707ec7d 563 return 0;
AzureIoTClient 0:1f9b2707ec7d 564 }
AzureIoTClient 0:1f9b2707ec7d 565 }
AzureIoTClient 0:1f9b2707ec7d 566 return 1;
AzureIoTClient 0:1f9b2707ec7d 567 }
AzureIoTClient 0:1f9b2707ec7d 568
AzureIoTClient 0:1f9b2707ec7d 569
AzureIoTClient 0:1f9b2707ec7d 570 /*returns 0 if everything went ok*/
AzureIoTClient 0:1f9b2707ec7d 571 /*scans 2 base64 characters + 1 special + 1 optional = and returns 2 usual bytes*/
AzureIoTClient 0:1f9b2707ec7d 572 int scanbase64b16(const char* source, size_t sourceSize, size_t *consumed, unsigned char* destination0, unsigned char* destination1)
AzureIoTClient 0:1f9b2707ec7d 573 {
AzureIoTClient 0:1f9b2707ec7d 574 int result;
AzureIoTClient 0:1f9b2707ec7d 575 if (sourceSize < 3)
AzureIoTClient 0:1f9b2707ec7d 576 {
AzureIoTClient 0:1f9b2707ec7d 577 result = 1;
AzureIoTClient 0:1f9b2707ec7d 578 }
AzureIoTClient 0:1f9b2707ec7d 579 else
AzureIoTClient 0:1f9b2707ec7d 580 {
AzureIoTClient 0:1f9b2707ec7d 581 unsigned char c0, c1, c2;
AzureIoTClient 0:1f9b2707ec7d 582 *consumed = 0;
AzureIoTClient 0:1f9b2707ec7d 583 if (
AzureIoTClient 0:1f9b2707ec7d 584 (base64toValue(source[0], &c0) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 585 (base64toValue(source[1], &c1) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 586 (base64b16toValue(source[2], &c2) == 0)
AzureIoTClient 0:1f9b2707ec7d 587 )
AzureIoTClient 0:1f9b2707ec7d 588 {
AzureIoTClient 0:1f9b2707ec7d 589 *consumed = 3 + ((sourceSize>=3)&&(source[3] == '=')); /*== produce 1 or 0 ( in C )*/
AzureIoTClient 0:1f9b2707ec7d 590 *destination0 = (c0 << 2) | ((c1 & 0x30) >> 4);
AzureIoTClient 0:1f9b2707ec7d 591 *destination1 = ((c1 &0x0F) <<4) | c2;
AzureIoTClient 0:1f9b2707ec7d 592 result = 0;
AzureIoTClient 0:1f9b2707ec7d 593 }
AzureIoTClient 0:1f9b2707ec7d 594 else
AzureIoTClient 0:1f9b2707ec7d 595 {
AzureIoTClient 0:1f9b2707ec7d 596 result = 2;
AzureIoTClient 0:1f9b2707ec7d 597 }
AzureIoTClient 0:1f9b2707ec7d 598 }
AzureIoTClient 0:1f9b2707ec7d 599 return result;
AzureIoTClient 0:1f9b2707ec7d 600 }
AzureIoTClient 0:1f9b2707ec7d 601
AzureIoTClient 0:1f9b2707ec7d 602 /*return 0 if everything is ok*/
AzureIoTClient 0:1f9b2707ec7d 603 /*Reads base64b8 = base64char ( 'A' / 'Q' / 'g' / 'w' ) [ "==" ]*/
AzureIoTClient 0:1f9b2707ec7d 604 int scanbase64b8(const char* source, size_t sourceSize, size_t *consumed, unsigned char* destination0)
AzureIoTClient 0:1f9b2707ec7d 605 {
AzureIoTClient 0:1f9b2707ec7d 606 int result;
AzureIoTClient 0:1f9b2707ec7d 607 if (sourceSize < 2)
AzureIoTClient 0:1f9b2707ec7d 608 {
AzureIoTClient 0:1f9b2707ec7d 609 result = 1;
AzureIoTClient 0:1f9b2707ec7d 610 }
AzureIoTClient 0:1f9b2707ec7d 611 else
AzureIoTClient 0:1f9b2707ec7d 612 {
AzureIoTClient 0:1f9b2707ec7d 613 unsigned char c0, c1;
AzureIoTClient 0:1f9b2707ec7d 614 if (
AzureIoTClient 0:1f9b2707ec7d 615 (base64toValue(source[0], &c0) == 0) &&
AzureIoTClient 0:1f9b2707ec7d 616 (base64b8toValue(source[1], &c1) == 0)
AzureIoTClient 0:1f9b2707ec7d 617 )
AzureIoTClient 0:1f9b2707ec7d 618 {
AzureIoTClient 0:1f9b2707ec7d 619 *consumed = 2 + (((sourceSize>=4) && (source[2] == '=') && (source[3] == '='))?2:0); /*== produce 1 or 0 ( in C )*/
AzureIoTClient 0:1f9b2707ec7d 620 *destination0 = (c0 << 2) | (c1 & 3);
AzureIoTClient 0:1f9b2707ec7d 621 result = 0;
AzureIoTClient 0:1f9b2707ec7d 622 }
AzureIoTClient 0:1f9b2707ec7d 623 else
AzureIoTClient 0:1f9b2707ec7d 624 {
AzureIoTClient 0:1f9b2707ec7d 625 result = 2;
AzureIoTClient 0:1f9b2707ec7d 626 }
AzureIoTClient 0:1f9b2707ec7d 627 }
AzureIoTClient 0:1f9b2707ec7d 628 return result;
AzureIoTClient 0:1f9b2707ec7d 629 }
AzureIoTClient 0:1f9b2707ec7d 630
AzureIoTClient 0:1f9b2707ec7d 631 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_039:[ Creates an AGENT_DATA_TYPE containing an EDM_DECIMAL from a null-terminated string.]*/
AzureIoTClient 0:1f9b2707ec7d 632 AGENT_DATA_TYPES_RESULT Create_EDM_DECIMAL_from_charz(AGENT_DATA_TYPE* agentData, const char* v)
AzureIoTClient 0:1f9b2707ec7d 633 {
AzureIoTClient 0:1f9b2707ec7d 634 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 635 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 636 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 637 {
AzureIoTClient 0:1f9b2707ec7d 638 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 639 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 640 }
AzureIoTClient 0:1f9b2707ec7d 641 else if (v == NULL)
AzureIoTClient 0:1f9b2707ec7d 642 {
AzureIoTClient 0:1f9b2707ec7d 643 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 644 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 645 }
AzureIoTClient 0:1f9b2707ec7d 646 else
AzureIoTClient 0:1f9b2707ec7d 647 {
AzureIoTClient 0:1f9b2707ec7d 648 size_t vlen = strlen(v);
AzureIoTClient 0:1f9b2707ec7d 649 /*validate that v has the form [SIGN] 1*DIGIT ["." 1*DIGIT]*/
AzureIoTClient 0:1f9b2707ec7d 650 if (vlen == 0)
AzureIoTClient 0:1f9b2707ec7d 651 {
AzureIoTClient 0:1f9b2707ec7d 652 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_067:[ If the string indicated by the parameter v does not match exactly an ODATA string representation, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 653 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 654 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 655 }
AzureIoTClient 0:1f9b2707ec7d 656 else
AzureIoTClient 0:1f9b2707ec7d 657 {
AzureIoTClient 0:1f9b2707ec7d 658 if (ValidateDecimal(v, vlen) != 0)
AzureIoTClient 0:1f9b2707ec7d 659 {
AzureIoTClient 0:1f9b2707ec7d 660 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_067:[ If the string indicated by the parameter v does not match exactly an ODATA string representation, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 661 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 662 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 663 }
AzureIoTClient 0:1f9b2707ec7d 664 else if ((agentData->value.edmDecimal.value = STRING_construct(v)) == NULL)
AzureIoTClient 0:1f9b2707ec7d 665 {
AzureIoTClient 0:1f9b2707ec7d 666 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 667 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 668 }
AzureIoTClient 0:1f9b2707ec7d 669 else
AzureIoTClient 0:1f9b2707ec7d 670 {
AzureIoTClient 0:1f9b2707ec7d 671 agentData->type = EDM_DECIMAL_TYPE;
AzureIoTClient 0:1f9b2707ec7d 672 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 673 }
AzureIoTClient 0:1f9b2707ec7d 674 }
AzureIoTClient 0:1f9b2707ec7d 675 }
AzureIoTClient 0:1f9b2707ec7d 676 return result;
AzureIoTClient 0:1f9b2707ec7d 677 }
AzureIoTClient 0:1f9b2707ec7d 678
AzureIoTClient 0:1f9b2707ec7d 679 /*create an AGENT_DATA_TYPE containing an EDM_DOUBLE from a double*/
AzureIoTClient 0:1f9b2707ec7d 680 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_DOUBLE(AGENT_DATA_TYPE* agentData, double v)
AzureIoTClient 0:1f9b2707ec7d 681 {
AzureIoTClient 0:1f9b2707ec7d 682 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 683 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[All the Create_... functions shall check their parameters for validity.When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned]*/
AzureIoTClient 0:1f9b2707ec7d 684 if(agentData==NULL)
AzureIoTClient 0:1f9b2707ec7d 685 {
AzureIoTClient 0:1f9b2707ec7d 686 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 687 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 688 }
AzureIoTClient 0:1f9b2707ec7d 689 else
AzureIoTClient 0:1f9b2707ec7d 690 {
AzureIoTClient 0:1f9b2707ec7d 691 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_041:[Creates an AGENT_DATA_TYPE containing an EDM_DOUBLE from double]*/
AzureIoTClient 0:1f9b2707ec7d 692 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_042:[Values of NaN, -INF, +INF are accepted]*/
AzureIoTClient 0:1f9b2707ec7d 693 agentData->type = EDM_DOUBLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 694 agentData->value.edmDouble.value = v;
AzureIoTClient 0:1f9b2707ec7d 695 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 696 }
AzureIoTClient 0:1f9b2707ec7d 697 return result;
AzureIoTClient 0:1f9b2707ec7d 698 }
AzureIoTClient 0:1f9b2707ec7d 699
AzureIoTClient 0:1f9b2707ec7d 700 /*create an AGENT_DATA_TYPE from INT16_T*/
AzureIoTClient 0:1f9b2707ec7d 701 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_043:[ Creates an AGENT_DATA_TYPE containing an EDM_INT16 from int16_t]*/
AzureIoTClient 0:1f9b2707ec7d 702 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_SINT16(AGENT_DATA_TYPE* agentData, int16_t v)
AzureIoTClient 0:1f9b2707ec7d 703 {
AzureIoTClient 0:1f9b2707ec7d 704 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 705 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 706 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 707 {
AzureIoTClient 0:1f9b2707ec7d 708 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 709 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 710 }
AzureIoTClient 0:1f9b2707ec7d 711 else
AzureIoTClient 0:1f9b2707ec7d 712 {
AzureIoTClient 0:1f9b2707ec7d 713 agentData->type = EDM_INT16_TYPE;
AzureIoTClient 0:1f9b2707ec7d 714 agentData->value.edmInt16.value = v;
AzureIoTClient 0:1f9b2707ec7d 715 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 716 }
AzureIoTClient 0:1f9b2707ec7d 717 return result;
AzureIoTClient 0:1f9b2707ec7d 718 }
AzureIoTClient 0:1f9b2707ec7d 719
AzureIoTClient 0:1f9b2707ec7d 720 /*create an AGENT_DATA_TYPE from INT32_T*/
AzureIoTClient 0:1f9b2707ec7d 721 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_SINT32(AGENT_DATA_TYPE* agentData, int32_t v)
AzureIoTClient 0:1f9b2707ec7d 722 {
AzureIoTClient 0:1f9b2707ec7d 723 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 724 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 725 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 726 {
AzureIoTClient 0:1f9b2707ec7d 727 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 728 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 729 }
AzureIoTClient 0:1f9b2707ec7d 730 else
AzureIoTClient 0:1f9b2707ec7d 731 {
AzureIoTClient 0:1f9b2707ec7d 732 agentData->type = EDM_INT32_TYPE;
AzureIoTClient 0:1f9b2707ec7d 733 agentData->value.edmInt32.value = v;
AzureIoTClient 0:1f9b2707ec7d 734 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 735 }
AzureIoTClient 0:1f9b2707ec7d 736 return result;
AzureIoTClient 0:1f9b2707ec7d 737 }
AzureIoTClient 0:1f9b2707ec7d 738
AzureIoTClient 0:1f9b2707ec7d 739 /*create an AGENT_DATA_TYPE from INT64_T*/
AzureIoTClient 0:1f9b2707ec7d 740 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_045:[ Creates an AGENT_DATA_TYPE containing an EDM_INT64 from int64_t]*/
AzureIoTClient 0:1f9b2707ec7d 741 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_SINT64(AGENT_DATA_TYPE* agentData, int64_t v)
AzureIoTClient 0:1f9b2707ec7d 742 {
AzureIoTClient 0:1f9b2707ec7d 743 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 744 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 745 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 746 {
AzureIoTClient 0:1f9b2707ec7d 747 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 748 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 749
AzureIoTClient 0:1f9b2707ec7d 750 }
AzureIoTClient 0:1f9b2707ec7d 751 else
AzureIoTClient 0:1f9b2707ec7d 752 {
AzureIoTClient 0:1f9b2707ec7d 753 agentData->type = EDM_INT64_TYPE;
AzureIoTClient 0:1f9b2707ec7d 754 agentData->value.edmInt64.value = v;
AzureIoTClient 0:1f9b2707ec7d 755 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 756 }
AzureIoTClient 0:1f9b2707ec7d 757 return result;
AzureIoTClient 0:1f9b2707ec7d 758 }
AzureIoTClient 0:1f9b2707ec7d 759
AzureIoTClient 0:1f9b2707ec7d 760 /*create an AGENT_DATA_TYPE from int8_t*/
AzureIoTClient 0:1f9b2707ec7d 761 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_SINT8(AGENT_DATA_TYPE* agentData, int8_t v)
AzureIoTClient 0:1f9b2707ec7d 762 {
AzureIoTClient 0:1f9b2707ec7d 763 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 764 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 765 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 766 {
AzureIoTClient 0:1f9b2707ec7d 767 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 768 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 769
AzureIoTClient 0:1f9b2707ec7d 770 }
AzureIoTClient 0:1f9b2707ec7d 771 else
AzureIoTClient 0:1f9b2707ec7d 772 {
AzureIoTClient 0:1f9b2707ec7d 773 agentData->type = EDM_SBYTE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 774 agentData->value.edmSbyte.value = v;
AzureIoTClient 0:1f9b2707ec7d 775 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 776 }
AzureIoTClient 0:1f9b2707ec7d 777 return result;
AzureIoTClient 0:1f9b2707ec7d 778 }
AzureIoTClient 0:1f9b2707ec7d 779
AzureIoTClient 0:1f9b2707ec7d 780 static int ValidateDate(int year, int month, int day)
AzureIoTClient 0:1f9b2707ec7d 781 {
AzureIoTClient 0:1f9b2707ec7d 782 int result;
AzureIoTClient 0:1f9b2707ec7d 783
AzureIoTClient 0:1f9b2707ec7d 784 if ((year <= -10000) || (year >= 10000))
AzureIoTClient 0:1f9b2707ec7d 785 {
AzureIoTClient 0:1f9b2707ec7d 786 result = 1;
AzureIoTClient 0:1f9b2707ec7d 787 }
AzureIoTClient 0:1f9b2707ec7d 788 else
AzureIoTClient 0:1f9b2707ec7d 789 {
AzureIoTClient 0:1f9b2707ec7d 790 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[ If year-month-date does not indicate a valid day (for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 791 if (day <= 0)
AzureIoTClient 0:1f9b2707ec7d 792 {
AzureIoTClient 0:1f9b2707ec7d 793 result = 1;
AzureIoTClient 0:1f9b2707ec7d 794 }
AzureIoTClient 0:1f9b2707ec7d 795 else
AzureIoTClient 0:1f9b2707ec7d 796 {
AzureIoTClient 0:1f9b2707ec7d 797 /*the following data will be validated...*/
AzureIoTClient 0:1f9b2707ec7d 798 /*leap years are those that can be divided by 4. But if the year can be divided by 100, it is not leap. But if they year can be divided by 400 it is leap*/
AzureIoTClient 0:1f9b2707ec7d 799 if (
AzureIoTClient 0:1f9b2707ec7d 800 (month == 1) || /*these months have always 31 days*/
AzureIoTClient 0:1f9b2707ec7d 801 (month == 3) ||
AzureIoTClient 0:1f9b2707ec7d 802 (month == 5) ||
AzureIoTClient 0:1f9b2707ec7d 803 (month == 7) ||
AzureIoTClient 0:1f9b2707ec7d 804 (month == 8) ||
AzureIoTClient 0:1f9b2707ec7d 805 (month == 10) ||
AzureIoTClient 0:1f9b2707ec7d 806 (month == 12)
AzureIoTClient 0:1f9b2707ec7d 807 )
AzureIoTClient 0:1f9b2707ec7d 808 {
AzureIoTClient 0:1f9b2707ec7d 809 if (day <= 31)
AzureIoTClient 0:1f9b2707ec7d 810 {
AzureIoTClient 0:1f9b2707ec7d 811 result = 0;
AzureIoTClient 0:1f9b2707ec7d 812 }
AzureIoTClient 0:1f9b2707ec7d 813 else
AzureIoTClient 0:1f9b2707ec7d 814 {
AzureIoTClient 0:1f9b2707ec7d 815 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 816 result = 1;
AzureIoTClient 0:1f9b2707ec7d 817 }
AzureIoTClient 0:1f9b2707ec7d 818 }
AzureIoTClient 0:1f9b2707ec7d 819 else if (
AzureIoTClient 0:1f9b2707ec7d 820 (month == 4) ||
AzureIoTClient 0:1f9b2707ec7d 821 (month == 6) ||
AzureIoTClient 0:1f9b2707ec7d 822 (month == 9) ||
AzureIoTClient 0:1f9b2707ec7d 823 (month == 11)
AzureIoTClient 0:1f9b2707ec7d 824 )
AzureIoTClient 0:1f9b2707ec7d 825 {
AzureIoTClient 0:1f9b2707ec7d 826 if (day <= 30)
AzureIoTClient 0:1f9b2707ec7d 827 {
AzureIoTClient 0:1f9b2707ec7d 828 result = 0;
AzureIoTClient 0:1f9b2707ec7d 829 }
AzureIoTClient 0:1f9b2707ec7d 830 else
AzureIoTClient 0:1f9b2707ec7d 831 {
AzureIoTClient 0:1f9b2707ec7d 832 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 833 result = -1;
AzureIoTClient 0:1f9b2707ec7d 834 }
AzureIoTClient 0:1f9b2707ec7d 835 }
AzureIoTClient 0:1f9b2707ec7d 836 else if (month == 2)/*february*/
AzureIoTClient 0:1f9b2707ec7d 837 {
AzureIoTClient 0:1f9b2707ec7d 838 if ((year % 400) == 0)
AzureIoTClient 0:1f9b2707ec7d 839 {
AzureIoTClient 0:1f9b2707ec7d 840 /*these are leap years, suchs as 2000*/
AzureIoTClient 0:1f9b2707ec7d 841 if (day <= 29)
AzureIoTClient 0:1f9b2707ec7d 842 {
AzureIoTClient 0:1f9b2707ec7d 843 result = 0;
AzureIoTClient 0:1f9b2707ec7d 844 }
AzureIoTClient 0:1f9b2707ec7d 845 else
AzureIoTClient 0:1f9b2707ec7d 846 {
AzureIoTClient 0:1f9b2707ec7d 847 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 848 result = 1;
AzureIoTClient 0:1f9b2707ec7d 849 }
AzureIoTClient 0:1f9b2707ec7d 850 }
AzureIoTClient 0:1f9b2707ec7d 851 else if ((year % 100) == 0)
AzureIoTClient 0:1f9b2707ec7d 852 {
AzureIoTClient 0:1f9b2707ec7d 853 /*non-leap year, such as 1900*/
AzureIoTClient 0:1f9b2707ec7d 854 if (day <= 28)
AzureIoTClient 0:1f9b2707ec7d 855 {
AzureIoTClient 0:1f9b2707ec7d 856 result = 0;
AzureIoTClient 0:1f9b2707ec7d 857 }
AzureIoTClient 0:1f9b2707ec7d 858 else
AzureIoTClient 0:1f9b2707ec7d 859 {
AzureIoTClient 0:1f9b2707ec7d 860 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 861 result = 1;
AzureIoTClient 0:1f9b2707ec7d 862 }
AzureIoTClient 0:1f9b2707ec7d 863 }
AzureIoTClient 0:1f9b2707ec7d 864 else if ((year % 4) == 0)
AzureIoTClient 0:1f9b2707ec7d 865 {
AzureIoTClient 0:1f9b2707ec7d 866 /*these are leap years, such as 2104*/
AzureIoTClient 0:1f9b2707ec7d 867 if (day <= 29)
AzureIoTClient 0:1f9b2707ec7d 868 {
AzureIoTClient 0:1f9b2707ec7d 869 result = 0;
AzureIoTClient 0:1f9b2707ec7d 870 }
AzureIoTClient 0:1f9b2707ec7d 871 else
AzureIoTClient 0:1f9b2707ec7d 872 {
AzureIoTClient 0:1f9b2707ec7d 873 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 874 result = 1;
AzureIoTClient 0:1f9b2707ec7d 875 }
AzureIoTClient 0:1f9b2707ec7d 876 }
AzureIoTClient 0:1f9b2707ec7d 877 else
AzureIoTClient 0:1f9b2707ec7d 878 {
AzureIoTClient 0:1f9b2707ec7d 879 /*certainly not a leap year*/
AzureIoTClient 0:1f9b2707ec7d 880 if (day <= 28)
AzureIoTClient 0:1f9b2707ec7d 881 {
AzureIoTClient 0:1f9b2707ec7d 882 result = 0;
AzureIoTClient 0:1f9b2707ec7d 883 }
AzureIoTClient 0:1f9b2707ec7d 884 else
AzureIoTClient 0:1f9b2707ec7d 885 {
AzureIoTClient 0:1f9b2707ec7d 886 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 887 result = 1;
AzureIoTClient 0:1f9b2707ec7d 888 }
AzureIoTClient 0:1f9b2707ec7d 889 }
AzureIoTClient 0:1f9b2707ec7d 890 }
AzureIoTClient 0:1f9b2707ec7d 891 else
AzureIoTClient 0:1f9b2707ec7d 892 {
AzureIoTClient 0:1f9b2707ec7d 893 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_070:[If year - month - date does not indicate a valid day(for example 31 Feb 2013), then AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 894 result = 1;
AzureIoTClient 0:1f9b2707ec7d 895 }
AzureIoTClient 0:1f9b2707ec7d 896 }
AzureIoTClient 0:1f9b2707ec7d 897 }
AzureIoTClient 0:1f9b2707ec7d 898
AzureIoTClient 0:1f9b2707ec7d 899 return result;
AzureIoTClient 0:1f9b2707ec7d 900 }
AzureIoTClient 0:1f9b2707ec7d 901
AzureIoTClient 0:1f9b2707ec7d 902 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_069:[ Creates an AGENT_DATA_TYPE containing an EDM_DATE from a year, a month and a day of the month.]*/
AzureIoTClient 0:1f9b2707ec7d 903 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_date(AGENT_DATA_TYPE* agentData, int16_t year, uint8_t month, uint8_t day)
AzureIoTClient 0:1f9b2707ec7d 904 {
AzureIoTClient 0:1f9b2707ec7d 905 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 906 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 907 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 908 {
AzureIoTClient 0:1f9b2707ec7d 909 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 910 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 911 }
AzureIoTClient 0:1f9b2707ec7d 912 /*ODATA-ABNF: year = [ "-" ] ( "0" 3DIGIT / oneToNine 3*DIGIT )*/
AzureIoTClient 0:1f9b2707ec7d 913 else if (ValidateDate(year, month, day) != 0)
AzureIoTClient 0:1f9b2707ec7d 914 {
AzureIoTClient 0:1f9b2707ec7d 915 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 916 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 917 }
AzureIoTClient 0:1f9b2707ec7d 918 else
AzureIoTClient 0:1f9b2707ec7d 919 {
AzureIoTClient 0:1f9b2707ec7d 920 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_069:[ Creates an AGENT_DATA_TYPE containing an EDM_DATE from a year, a month and a day of the month.]*/
AzureIoTClient 0:1f9b2707ec7d 921 agentData->type = EDM_DATE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 922 agentData->value.edmDate.year = year;
AzureIoTClient 0:1f9b2707ec7d 923 agentData->value.edmDate.month = month;
AzureIoTClient 0:1f9b2707ec7d 924 agentData->value.edmDate.day = day;
AzureIoTClient 0:1f9b2707ec7d 925 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 926 }
AzureIoTClient 0:1f9b2707ec7d 927
AzureIoTClient 0:1f9b2707ec7d 928 return result;
AzureIoTClient 0:1f9b2707ec7d 929 }
AzureIoTClient 0:1f9b2707ec7d 930
AzureIoTClient 0:1f9b2707ec7d 931
AzureIoTClient 0:1f9b2707ec7d 932 /*create an AGENT_DATA_TYPE from SINGLE*/
AzureIoTClient 0:1f9b2707ec7d 933 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_FLOAT(AGENT_DATA_TYPE* agentData, float v)
AzureIoTClient 0:1f9b2707ec7d 934 {
AzureIoTClient 0:1f9b2707ec7d 935 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 936 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[All the Create_... functions shall check their parameters for validity.When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned]*/
AzureIoTClient 0:1f9b2707ec7d 937 if(agentData==NULL)
AzureIoTClient 0:1f9b2707ec7d 938 {
AzureIoTClient 0:1f9b2707ec7d 939 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 940 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 941 }
AzureIoTClient 0:1f9b2707ec7d 942 else
AzureIoTClient 0:1f9b2707ec7d 943 {
AzureIoTClient 0:1f9b2707ec7d 944 agentData->type = EDM_SINGLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 945 agentData->value.edmSingle.value = v;
AzureIoTClient 0:1f9b2707ec7d 946 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 947 }
AzureIoTClient 0:1f9b2707ec7d 948 return result;
AzureIoTClient 0:1f9b2707ec7d 949 }
AzureIoTClient 0:1f9b2707ec7d 950
AzureIoTClient 0:1f9b2707ec7d 951 const char hexToASCII[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
AzureIoTClient 0:1f9b2707ec7d 952
AzureIoTClient 0:1f9b2707ec7d 953 /*create an AGENT_DATA_TYPE from ANSI zero terminated string*/
AzureIoTClient 0:1f9b2707ec7d 954 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_charz(AGENT_DATA_TYPE* agentData, const char* v)
AzureIoTClient 0:1f9b2707ec7d 955 {
AzureIoTClient 0:1f9b2707ec7d 956 AGENT_DATA_TYPES_RESULT result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 957 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 958 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 959 {
AzureIoTClient 0:1f9b2707ec7d 960 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 961 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 962 }
AzureIoTClient 0:1f9b2707ec7d 963 else if (v == NULL)
AzureIoTClient 0:1f9b2707ec7d 964 {
AzureIoTClient 0:1f9b2707ec7d 965 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 966 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 967 }
AzureIoTClient 0:1f9b2707ec7d 968 else
AzureIoTClient 0:1f9b2707ec7d 969 {
AzureIoTClient 0:1f9b2707ec7d 970 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_049:[ Creates an AGENT_DATA_TYPE containing an EDM_STRING from an ASCII zero terminated string.]*/
AzureIoTClient 0:1f9b2707ec7d 971 agentData->type = EDM_STRING_TYPE;
AzureIoTClient 0:1f9b2707ec7d 972 if (mallocAndStrcpy_s(&agentData->value.edmString.chars, v) != 0)
AzureIoTClient 0:1f9b2707ec7d 973 {
AzureIoTClient 0:1f9b2707ec7d 974 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 975 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 976 }
AzureIoTClient 0:1f9b2707ec7d 977 else
AzureIoTClient 0:1f9b2707ec7d 978 {
AzureIoTClient 0:1f9b2707ec7d 979 agentData->value.edmString.length = strlen(agentData->value.edmString.chars);
AzureIoTClient 0:1f9b2707ec7d 980 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 981 }
AzureIoTClient 0:1f9b2707ec7d 982 }
AzureIoTClient 0:1f9b2707ec7d 983 return result;
AzureIoTClient 0:1f9b2707ec7d 984 }
AzureIoTClient 0:1f9b2707ec7d 985
AzureIoTClient 0:1f9b2707ec7d 986 /*create an AGENT_DATA_TYPE from ANSI zero terminated string (without quotes) */
AzureIoTClient 0:1f9b2707ec7d 987 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_charz_no_quotes(AGENT_DATA_TYPE* agentData, const char* v)
AzureIoTClient 0:1f9b2707ec7d 988 {
AzureIoTClient 0:1f9b2707ec7d 989 AGENT_DATA_TYPES_RESULT result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 990 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the Create_... functions shall check their parameters for validity. When an invalid parameter is detected, a code of AGENT_DATA_TYPES_INVALID_ARG shall be returned ].*/
AzureIoTClient 0:1f9b2707ec7d 991 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 992 {
AzureIoTClient 0:1f9b2707ec7d 993 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 994 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 995 }
AzureIoTClient 0:1f9b2707ec7d 996 else if (v == NULL)
AzureIoTClient 0:1f9b2707ec7d 997 {
AzureIoTClient 0:1f9b2707ec7d 998 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 999 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1000 }
AzureIoTClient 0:1f9b2707ec7d 1001 else
AzureIoTClient 0:1f9b2707ec7d 1002 {
AzureIoTClient 0:1f9b2707ec7d 1003 /* Codes_SRS_AGENT_TYPE_SYSTEM_01_001: [Creates an AGENT_DATA_TYPE containing an EDM_STRING from an ASCII zero terminated string.] */
AzureIoTClient 0:1f9b2707ec7d 1004 agentData->type = EDM_STRING_NO_QUOTES_TYPE;
AzureIoTClient 0:1f9b2707ec7d 1005 if (mallocAndStrcpy_s(&agentData->value.edmStringNoQuotes.chars, v) != 0)
AzureIoTClient 0:1f9b2707ec7d 1006 {
AzureIoTClient 0:1f9b2707ec7d 1007 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1008 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1009 }
AzureIoTClient 0:1f9b2707ec7d 1010 else
AzureIoTClient 0:1f9b2707ec7d 1011 {
AzureIoTClient 0:1f9b2707ec7d 1012 agentData->value.edmStringNoQuotes.length = strlen(agentData->value.edmStringNoQuotes.chars);
AzureIoTClient 0:1f9b2707ec7d 1013 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1014 }
AzureIoTClient 0:1f9b2707ec7d 1015 }
AzureIoTClient 0:1f9b2707ec7d 1016 return result;
AzureIoTClient 0:1f9b2707ec7d 1017 }
AzureIoTClient 0:1f9b2707ec7d 1018
AzureIoTClient 0:1f9b2707ec7d 1019 void Destroy_AGENT_DATA_TYPE(AGENT_DATA_TYPE* agentData)
AzureIoTClient 0:1f9b2707ec7d 1020 {
AzureIoTClient 0:1f9b2707ec7d 1021 if(agentData==NULL)
AzureIoTClient 0:1f9b2707ec7d 1022 {
AzureIoTClient 0:1f9b2707ec7d 1023 LogError("agentData was NULL.\r\n");
AzureIoTClient 0:1f9b2707ec7d 1024 }
AzureIoTClient 0:1f9b2707ec7d 1025 else
AzureIoTClient 0:1f9b2707ec7d 1026 {
AzureIoTClient 0:1f9b2707ec7d 1027 switch(agentData->type)
AzureIoTClient 0:1f9b2707ec7d 1028 {
AzureIoTClient 0:1f9b2707ec7d 1029 default:
AzureIoTClient 0:1f9b2707ec7d 1030 {
AzureIoTClient 0:1f9b2707ec7d 1031 LogError("invalid agentData\r\n");
AzureIoTClient 0:1f9b2707ec7d 1032 break;
AzureIoTClient 0:1f9b2707ec7d 1033 }
AzureIoTClient 0:1f9b2707ec7d 1034 case(EDM_NO_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1035 {
AzureIoTClient 0:1f9b2707ec7d 1036 LogError("invalid agentData\r\n");
AzureIoTClient 0:1f9b2707ec7d 1037 break;
AzureIoTClient 0:1f9b2707ec7d 1038 }
AzureIoTClient 0:1f9b2707ec7d 1039 case(EDM_BINARY_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1040 {
AzureIoTClient 0:1f9b2707ec7d 1041 /*destroying means maybe deallocating some memory*/
AzureIoTClient 0:1f9b2707ec7d 1042 free(agentData->value.edmBinary.data); /* If ptr is a null pointer, no action occurs*/
AzureIoTClient 0:1f9b2707ec7d 1043 agentData->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 1044 break;
AzureIoTClient 0:1f9b2707ec7d 1045 }
AzureIoTClient 0:1f9b2707ec7d 1046 case(EDM_BOOLEAN_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1047 {
AzureIoTClient 0:1f9b2707ec7d 1048 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1049 break;
AzureIoTClient 0:1f9b2707ec7d 1050 }
AzureIoTClient 0:1f9b2707ec7d 1051 case(EDM_BYTE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1052 {
AzureIoTClient 0:1f9b2707ec7d 1053 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1054 break;
AzureIoTClient 0:1f9b2707ec7d 1055 }
AzureIoTClient 0:1f9b2707ec7d 1056 case(EDM_DATE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1057 {
AzureIoTClient 0:1f9b2707ec7d 1058 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1059 break;
AzureIoTClient 0:1f9b2707ec7d 1060 }
AzureIoTClient 0:1f9b2707ec7d 1061 case(EDM_DATE_TIME_OFFSET_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1062 {
AzureIoTClient 0:1f9b2707ec7d 1063 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1064 break;
AzureIoTClient 0:1f9b2707ec7d 1065 }
AzureIoTClient 0:1f9b2707ec7d 1066 case(EDM_DECIMAL_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1067 {
AzureIoTClient 0:1f9b2707ec7d 1068 STRING_delete(agentData->value.edmDecimal.value);
AzureIoTClient 0:1f9b2707ec7d 1069 agentData->value.edmDecimal.value = NULL;
AzureIoTClient 0:1f9b2707ec7d 1070 break;
AzureIoTClient 0:1f9b2707ec7d 1071 }
AzureIoTClient 0:1f9b2707ec7d 1072 case(EDM_DURATION_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1073 {
AzureIoTClient 0:1f9b2707ec7d 1074 LogError("EDM_DURATION_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1075 break;
AzureIoTClient 0:1f9b2707ec7d 1076 }
AzureIoTClient 0:1f9b2707ec7d 1077 case(EDM_GUID_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1078 {
AzureIoTClient 0:1f9b2707ec7d 1079 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1080 break;
AzureIoTClient 0:1f9b2707ec7d 1081 }
AzureIoTClient 0:1f9b2707ec7d 1082 case(EDM_INT16_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1083 {
AzureIoTClient 0:1f9b2707ec7d 1084 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1085 break;
AzureIoTClient 0:1f9b2707ec7d 1086 }
AzureIoTClient 0:1f9b2707ec7d 1087 case(EDM_INT32_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1088 {
AzureIoTClient 0:1f9b2707ec7d 1089 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1090 break;
AzureIoTClient 0:1f9b2707ec7d 1091 }
AzureIoTClient 0:1f9b2707ec7d 1092 case(EDM_INT64_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1093 {
AzureIoTClient 0:1f9b2707ec7d 1094 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1095 break;
AzureIoTClient 0:1f9b2707ec7d 1096 }
AzureIoTClient 0:1f9b2707ec7d 1097 case(EDM_SBYTE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1098 {
AzureIoTClient 0:1f9b2707ec7d 1099 /*nothing to do*/
AzureIoTClient 0:1f9b2707ec7d 1100 break;
AzureIoTClient 0:1f9b2707ec7d 1101 }
AzureIoTClient 0:1f9b2707ec7d 1102 case(EDM_STREAM):
AzureIoTClient 0:1f9b2707ec7d 1103 {
AzureIoTClient 0:1f9b2707ec7d 1104 LogError("EDM_STREAM not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1105 break;
AzureIoTClient 0:1f9b2707ec7d 1106 }
AzureIoTClient 0:1f9b2707ec7d 1107 case(EDM_STRING_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1108 {
AzureIoTClient 0:1f9b2707ec7d 1109 if (agentData->value.edmString.chars != NULL)
AzureIoTClient 0:1f9b2707ec7d 1110 {
AzureIoTClient 0:1f9b2707ec7d 1111 free(agentData->value.edmString.chars);
AzureIoTClient 0:1f9b2707ec7d 1112 agentData->value.edmString.chars = NULL;
AzureIoTClient 0:1f9b2707ec7d 1113 }
AzureIoTClient 0:1f9b2707ec7d 1114 break;
AzureIoTClient 0:1f9b2707ec7d 1115 }
AzureIoTClient 0:1f9b2707ec7d 1116 case(EDM_STRING_NO_QUOTES_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1117 {
AzureIoTClient 0:1f9b2707ec7d 1118 if (agentData->value.edmStringNoQuotes.chars != NULL)
AzureIoTClient 0:1f9b2707ec7d 1119 {
AzureIoTClient 0:1f9b2707ec7d 1120 free(agentData->value.edmStringNoQuotes.chars);
AzureIoTClient 0:1f9b2707ec7d 1121 agentData->value.edmStringNoQuotes.chars = NULL;
AzureIoTClient 0:1f9b2707ec7d 1122 }
AzureIoTClient 0:1f9b2707ec7d 1123 break;
AzureIoTClient 0:1f9b2707ec7d 1124 }
AzureIoTClient 0:1f9b2707ec7d 1125 case(EDM_TIME_OF_DAY_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1126 {
AzureIoTClient 0:1f9b2707ec7d 1127 LogError("EDM_TIME_OF_DAY_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1128 break;
AzureIoTClient 0:1f9b2707ec7d 1129 }
AzureIoTClient 0:1f9b2707ec7d 1130 case(EDM_GEOGRAPHY_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1131 {
AzureIoTClient 0:1f9b2707ec7d 1132 LogError("EDM_GEOGRAPHY_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1133 break;
AzureIoTClient 0:1f9b2707ec7d 1134 }
AzureIoTClient 0:1f9b2707ec7d 1135 case(EDM_GEOGRAPHY_POINT_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1136 {
AzureIoTClient 0:1f9b2707ec7d 1137 LogError("EDM_GEOGRAPHY_POINT_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1138 break;
AzureIoTClient 0:1f9b2707ec7d 1139 }
AzureIoTClient 0:1f9b2707ec7d 1140 case(EDM_GEOGRAPHY_LINE_STRING_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1141 {
AzureIoTClient 0:1f9b2707ec7d 1142 LogError("EDM_GEOGRAPHY_LINE_STRING_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1143 break;
AzureIoTClient 0:1f9b2707ec7d 1144 }
AzureIoTClient 0:1f9b2707ec7d 1145 case(EDM_GEOGRAPHY_POLYGON_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1146 {
AzureIoTClient 0:1f9b2707ec7d 1147 LogError("EDM_GEOGRAPHY_POLYGON_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1148 break;
AzureIoTClient 0:1f9b2707ec7d 1149 }
AzureIoTClient 0:1f9b2707ec7d 1150 case(EDM_GEOGRAPHY_MULTI_POINT_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1151 {
AzureIoTClient 0:1f9b2707ec7d 1152 LogError("EDM_GEOGRAPHY_MULTI_POINT_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1153 break;
AzureIoTClient 0:1f9b2707ec7d 1154 }
AzureIoTClient 0:1f9b2707ec7d 1155 case(EDM_GEOGRAPHY_MULTI_LINE_STRING_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1156 {
AzureIoTClient 0:1f9b2707ec7d 1157 LogError("EDM_GEOGRAPHY_MULTI_LINE_STRING_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1158 break;
AzureIoTClient 0:1f9b2707ec7d 1159 }
AzureIoTClient 0:1f9b2707ec7d 1160 case(EDM_GEOGRAPHY_MULTI_POLYGON_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1161 {
AzureIoTClient 0:1f9b2707ec7d 1162 LogError("EDM_GEOGRAPHY_MULTI_POLYGON_TYPE\r\n");
AzureIoTClient 0:1f9b2707ec7d 1163 break;
AzureIoTClient 0:1f9b2707ec7d 1164 }
AzureIoTClient 0:1f9b2707ec7d 1165 case(EDM_GEOGRAPHY_COLLECTION_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1166 {
AzureIoTClient 0:1f9b2707ec7d 1167 LogError("EDM_GEOGRAPHY_COLLECTION_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1168 break;
AzureIoTClient 0:1f9b2707ec7d 1169 }
AzureIoTClient 0:1f9b2707ec7d 1170 case(EDM_GEOMETRY_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1171 {
AzureIoTClient 0:1f9b2707ec7d 1172 LogError("EDM_GEOMETRY_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1173 break;
AzureIoTClient 0:1f9b2707ec7d 1174 }
AzureIoTClient 0:1f9b2707ec7d 1175 case(EDM_GEOMETRY_POINT_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1176 {
AzureIoTClient 0:1f9b2707ec7d 1177 LogError("EDM_GEOMETRY_POINT_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1178 break;
AzureIoTClient 0:1f9b2707ec7d 1179 }
AzureIoTClient 0:1f9b2707ec7d 1180 case(EDM_GEOMETRY_LINE_STRING_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1181 {
AzureIoTClient 0:1f9b2707ec7d 1182 LogError("EDM_GEOMETRY_LINE_STRING_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1183 break;
AzureIoTClient 0:1f9b2707ec7d 1184 }
AzureIoTClient 0:1f9b2707ec7d 1185 case(EDM_GEOMETRY_POLYGON_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1186 {
AzureIoTClient 0:1f9b2707ec7d 1187 LogError("EDM_GEOMETRY_POLYGON_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1188 break;
AzureIoTClient 0:1f9b2707ec7d 1189 }
AzureIoTClient 0:1f9b2707ec7d 1190 case(EDM_GEOMETRY_MULTI_POINT_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1191 {
AzureIoTClient 0:1f9b2707ec7d 1192 LogError("EDM_GEOMETRY_MULTI_POINT_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1193 break;
AzureIoTClient 0:1f9b2707ec7d 1194 }
AzureIoTClient 0:1f9b2707ec7d 1195 case(EDM_GEOMETRY_MULTI_LINE_STRING_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1196 {
AzureIoTClient 0:1f9b2707ec7d 1197 LogError("EDM_GEOMETRY_MULTI_LINE_STRING_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1198 break;
AzureIoTClient 0:1f9b2707ec7d 1199 }
AzureIoTClient 0:1f9b2707ec7d 1200 case(EDM_GEOMETRY_MULTI_POLYGON_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1201 {
AzureIoTClient 0:1f9b2707ec7d 1202 LogError("EDM_GEOMETRY_MULTI_POLYGON_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1203 break;
AzureIoTClient 0:1f9b2707ec7d 1204 }
AzureIoTClient 0:1f9b2707ec7d 1205 case(EDM_GEOMETRY_COLLECTION_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1206 {
AzureIoTClient 0:1f9b2707ec7d 1207 LogError("EDM_GEOMETRY_COLLECTION_TYPE not implemented\r\n");
AzureIoTClient 0:1f9b2707ec7d 1208 break;
AzureIoTClient 0:1f9b2707ec7d 1209 }
AzureIoTClient 0:1f9b2707ec7d 1210 case(EDM_SINGLE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1211 {
AzureIoTClient 0:1f9b2707ec7d 1212 break;
AzureIoTClient 0:1f9b2707ec7d 1213 }
AzureIoTClient 0:1f9b2707ec7d 1214 case(EDM_DOUBLE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1215 {
AzureIoTClient 0:1f9b2707ec7d 1216 break;
AzureIoTClient 0:1f9b2707ec7d 1217 }
AzureIoTClient 0:1f9b2707ec7d 1218 case (EDM_COMPLEX_TYPE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1219 {
AzureIoTClient 0:1f9b2707ec7d 1220 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_050:[Destroy_AGENT_DATA_TYPE shall deallocate all allocated resources used to represent the type.]*/
AzureIoTClient 0:1f9b2707ec7d 1221 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1222 for (i = 0; i < agentData->value.edmComplexType.nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 1223 {
AzureIoTClient 0:1f9b2707ec7d 1224 free((void*)(agentData->value.edmComplexType.fields[i].fieldName));
AzureIoTClient 0:1f9b2707ec7d 1225 agentData->value.edmComplexType.fields[i].fieldName = NULL;
AzureIoTClient 0:1f9b2707ec7d 1226 Destroy_AGENT_DATA_TYPE(agentData->value.edmComplexType.fields[i].value);
AzureIoTClient 0:1f9b2707ec7d 1227 free(agentData->value.edmComplexType.fields[i].value);
AzureIoTClient 0:1f9b2707ec7d 1228 agentData->value.edmComplexType.fields[i].value = NULL;
AzureIoTClient 0:1f9b2707ec7d 1229 }
AzureIoTClient 0:1f9b2707ec7d 1230 free(agentData->value.edmComplexType.fields);
AzureIoTClient 0:1f9b2707ec7d 1231 break;
AzureIoTClient 0:1f9b2707ec7d 1232 }
AzureIoTClient 0:1f9b2707ec7d 1233 }
AzureIoTClient 0:1f9b2707ec7d 1234 agentData->type = EDM_NO_TYPE; /*mark as detroyed*/
AzureIoTClient 0:1f9b2707ec7d 1235 }
AzureIoTClient 0:1f9b2707ec7d 1236 }
AzureIoTClient 0:1f9b2707ec7d 1237
AzureIoTClient 0:1f9b2707ec7d 1238 #define tempBufferSize 10240
AzureIoTClient 0:1f9b2707ec7d 1239 static char tempBuffer[tempBufferSize];
AzureIoTClient 0:1f9b2707ec7d 1240
AzureIoTClient 0:1f9b2707ec7d 1241 static char hexDigitToChar(uint8_t hexDigit)
AzureIoTClient 0:1f9b2707ec7d 1242 {
AzureIoTClient 0:1f9b2707ec7d 1243 if (hexDigit < 10) return '0' + hexDigit;
AzureIoTClient 0:1f9b2707ec7d 1244 else return ('A' - 10) + hexDigit;
AzureIoTClient 0:1f9b2707ec7d 1245 }
AzureIoTClient 0:1f9b2707ec7d 1246
AzureIoTClient 0:1f9b2707ec7d 1247 AGENT_DATA_TYPES_RESULT AgentDataTypes_ToString(STRING_HANDLE destination, const AGENT_DATA_TYPE* value)
AzureIoTClient 0:1f9b2707ec7d 1248 {
AzureIoTClient 0:1f9b2707ec7d 1249 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 1250
AzureIoTClient 0:1f9b2707ec7d 1251 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_015:[If destination parameter is NULL, AgentDataTypes_ToString shall return AGENT_DATA_TYPES_INVALID_ARG.]*/
AzureIoTClient 0:1f9b2707ec7d 1252 if(destination == NULL)
AzureIoTClient 0:1f9b2707ec7d 1253 {
AzureIoTClient 0:1f9b2707ec7d 1254 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 1255 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1256 }
AzureIoTClient 0:1f9b2707ec7d 1257 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_053:[ If value is NULL or has been destroyed or otherwise doesn't contain valid data, AGENT_DATA_TYPES_INVALID_ARG shall be returned.]*/
AzureIoTClient 0:1f9b2707ec7d 1258 else if (value == NULL)
AzureIoTClient 0:1f9b2707ec7d 1259 {
AzureIoTClient 0:1f9b2707ec7d 1260 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 1261 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1262 }
AzureIoTClient 0:1f9b2707ec7d 1263 else
AzureIoTClient 0:1f9b2707ec7d 1264 {
AzureIoTClient 0:1f9b2707ec7d 1265 switch(value->type)
AzureIoTClient 0:1f9b2707ec7d 1266 {
AzureIoTClient 0:1f9b2707ec7d 1267 default:
AzureIoTClient 0:1f9b2707ec7d 1268 {
AzureIoTClient 0:1f9b2707ec7d 1269 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 1270 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1271 break;
AzureIoTClient 0:1f9b2707ec7d 1272 }
AzureIoTClient 0:1f9b2707ec7d 1273 case(EDM_NULL_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1274 {
AzureIoTClient 0:1f9b2707ec7d 1275 /*SRS_AGENT_TYPE_SYSTEM_99_101:[ EDM_NULL_TYPE shall return the unquoted string null.]*/
AzureIoTClient 0:1f9b2707ec7d 1276 if (STRING_concat(destination, "null") != 0)
AzureIoTClient 0:1f9b2707ec7d 1277 {
AzureIoTClient 0:1f9b2707ec7d 1278 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_016:[ When the value cannot be converted to a string AgentDataTypes_ToString shall return AGENT_DATA_TYPES_ERROR.]*/
AzureIoTClient 0:1f9b2707ec7d 1279 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1280 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1281 }
AzureIoTClient 0:1f9b2707ec7d 1282 else
AzureIoTClient 0:1f9b2707ec7d 1283 {
AzureIoTClient 0:1f9b2707ec7d 1284 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_014:[ All functions shall return AGENT_DATA_TYPES_OK when the processing is successful.]*/
AzureIoTClient 0:1f9b2707ec7d 1285 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1286 }
AzureIoTClient 0:1f9b2707ec7d 1287 break;
AzureIoTClient 0:1f9b2707ec7d 1288 }
AzureIoTClient 0:1f9b2707ec7d 1289 case(EDM_BOOLEAN_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1290 {
AzureIoTClient 0:1f9b2707ec7d 1291 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_017:[EDM_BOOLEAN:as in(odata - abnf - construction - rules, 2013), booleanValue = "true" / "false"]*/
AzureIoTClient 0:1f9b2707ec7d 1292 if (value->value.edmBoolean.value == EDM_TRUE)
AzureIoTClient 0:1f9b2707ec7d 1293 {
AzureIoTClient 0:1f9b2707ec7d 1294 /*SRS_AGENT_TYPE_SYSTEM_99_030:[If v is different than 0 then the AGENT_DATA_TYPE shall have the value "true".]*/
AzureIoTClient 0:1f9b2707ec7d 1295 if (STRING_concat(destination, "true") != 0)
AzureIoTClient 0:1f9b2707ec7d 1296 {
AzureIoTClient 0:1f9b2707ec7d 1297 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_016:[ When the value cannot be converted to a string AgentDataTypes_ToString shall return AGENT_DATA_TYPES_ERROR.]*/
AzureIoTClient 0:1f9b2707ec7d 1298 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1299 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1300 }
AzureIoTClient 0:1f9b2707ec7d 1301 else
AzureIoTClient 0:1f9b2707ec7d 1302 {
AzureIoTClient 0:1f9b2707ec7d 1303 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_014:[ All functions shall return AGENT_DATA_TYPES_OK when the processing is successful.]*/
AzureIoTClient 0:1f9b2707ec7d 1304 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1305 }
AzureIoTClient 0:1f9b2707ec7d 1306 }
AzureIoTClient 0:1f9b2707ec7d 1307 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_017:[EDM_BOOLEAN:as in(odata - abnf - construction - rules, 2013), booleanValue = "true" / "false"]*/
AzureIoTClient 0:1f9b2707ec7d 1308 else if (value->value.edmBoolean.value == EDM_FALSE)
AzureIoTClient 0:1f9b2707ec7d 1309 {
AzureIoTClient 0:1f9b2707ec7d 1310 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_029:[ If v 0 then the AGENT_DATA_TYPE shall have the value "false" Boolean.]*/
AzureIoTClient 0:1f9b2707ec7d 1311 if (STRING_concat(destination, "false") != 0)
AzureIoTClient 0:1f9b2707ec7d 1312 {
AzureIoTClient 0:1f9b2707ec7d 1313 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_016:[ When the value cannot be converted to a string AgentDataTypes_ToString shall return AGENT_DATA_TYPES_ERROR.]*/
AzureIoTClient 0:1f9b2707ec7d 1314 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1315 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1316 }
AzureIoTClient 0:1f9b2707ec7d 1317 else
AzureIoTClient 0:1f9b2707ec7d 1318 {
AzureIoTClient 0:1f9b2707ec7d 1319 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_014:[ All functions shall return AGENT_DATA_TYPES_OK when the processing is successful.]*/
AzureIoTClient 0:1f9b2707ec7d 1320 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1321 }
AzureIoTClient 0:1f9b2707ec7d 1322 }
AzureIoTClient 0:1f9b2707ec7d 1323 else
AzureIoTClient 0:1f9b2707ec7d 1324 {
AzureIoTClient 0:1f9b2707ec7d 1325 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_053:[ If value contains invalid data, AgentDataTypes_ToString shall return AGENT_DATA_TYPES_INVALID_ARG.]*/
AzureIoTClient 0:1f9b2707ec7d 1326 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 1327 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1328 }
AzureIoTClient 0:1f9b2707ec7d 1329
AzureIoTClient 0:1f9b2707ec7d 1330 break;
AzureIoTClient 0:1f9b2707ec7d 1331 }
AzureIoTClient 0:1f9b2707ec7d 1332 case(EDM_BYTE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1333 {
AzureIoTClient 0:1f9b2707ec7d 1334 char tempbuffer2[4]; /*because bytes can at most be 255 and that is 3 characters + 1 for '\0'*/
AzureIoTClient 0:1f9b2707ec7d 1335 size_t pos = 0;
AzureIoTClient 0:1f9b2707ec7d 1336 if (value->value.edmByte.value >= 100) tempbuffer2[pos++] = '0' + (value->value.edmByte.value / 100);
AzureIoTClient 0:1f9b2707ec7d 1337 if (value->value.edmByte.value >= 10) tempbuffer2[pos++] = '0' + (value->value.edmByte.value % 100) / 10;
AzureIoTClient 0:1f9b2707ec7d 1338 tempbuffer2[pos++] = '0' + (value->value.edmByte.value % 10);
AzureIoTClient 0:1f9b2707ec7d 1339 tempbuffer2[pos++] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1340
AzureIoTClient 0:1f9b2707ec7d 1341 if (STRING_concat(destination, tempbuffer2) != 0)
AzureIoTClient 0:1f9b2707ec7d 1342 {
AzureIoTClient 0:1f9b2707ec7d 1343 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1344 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1345 }
AzureIoTClient 0:1f9b2707ec7d 1346 else
AzureIoTClient 0:1f9b2707ec7d 1347 {
AzureIoTClient 0:1f9b2707ec7d 1348 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1349 }
AzureIoTClient 0:1f9b2707ec7d 1350 break;
AzureIoTClient 0:1f9b2707ec7d 1351 }
AzureIoTClient 0:1f9b2707ec7d 1352 case(EDM_DATE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1353 {
AzureIoTClient 0:1f9b2707ec7d 1354 size_t pos = 0;
AzureIoTClient 0:1f9b2707ec7d 1355 char tempBuffer2[1 + 5 + 1 + 2 + 1 + 2 + 1+1];
AzureIoTClient 0:1f9b2707ec7d 1356 int16_t year = value->value.edmDate.year;
AzureIoTClient 0:1f9b2707ec7d 1357 tempBuffer2[pos++] = '\"';
AzureIoTClient 0:1f9b2707ec7d 1358 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_068:[ EDM_DATE: dateValue = year "-" month "-" day.]*/
AzureIoTClient 0:1f9b2707ec7d 1359 if (year < 0)
AzureIoTClient 0:1f9b2707ec7d 1360 {
AzureIoTClient 0:1f9b2707ec7d 1361 tempBuffer2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1362 year = -year;
AzureIoTClient 0:1f9b2707ec7d 1363 }
AzureIoTClient 0:1f9b2707ec7d 1364
AzureIoTClient 0:1f9b2707ec7d 1365 tempBuffer2[pos++] = '0' + (char)(year / 1000);
AzureIoTClient 0:1f9b2707ec7d 1366 tempBuffer2[pos++] = '0' + (char)((year % 1000) / 100);
AzureIoTClient 0:1f9b2707ec7d 1367 tempBuffer2[pos++] = '0' + (char)((year % 100) / 10);
AzureIoTClient 0:1f9b2707ec7d 1368 tempBuffer2[pos++] = '0' + (char)(year % 10);
AzureIoTClient 0:1f9b2707ec7d 1369 tempBuffer2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1370 tempBuffer2[pos++] = '0' + value->value.edmDate.month / 10;
AzureIoTClient 0:1f9b2707ec7d 1371 tempBuffer2[pos++] = '0' + value->value.edmDate.month % 10;
AzureIoTClient 0:1f9b2707ec7d 1372 tempBuffer2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1373 tempBuffer2[pos++] = '0' + value->value.edmDate.day / 10;
AzureIoTClient 0:1f9b2707ec7d 1374 tempBuffer2[pos++] = '0' + value->value.edmDate.day % 10;
AzureIoTClient 0:1f9b2707ec7d 1375 tempBuffer2[pos++] = '\"';
AzureIoTClient 0:1f9b2707ec7d 1376 tempBuffer2[pos++] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1377
AzureIoTClient 0:1f9b2707ec7d 1378 if (STRING_concat(destination, tempBuffer2) != 0)
AzureIoTClient 0:1f9b2707ec7d 1379 {
AzureIoTClient 0:1f9b2707ec7d 1380 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1381 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1382 }
AzureIoTClient 0:1f9b2707ec7d 1383 else
AzureIoTClient 0:1f9b2707ec7d 1384 {
AzureIoTClient 0:1f9b2707ec7d 1385 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1386 }
AzureIoTClient 0:1f9b2707ec7d 1387 break;
AzureIoTClient 0:1f9b2707ec7d 1388 }
AzureIoTClient 0:1f9b2707ec7d 1389 case (EDM_DATE_TIME_OFFSET_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1390 {
AzureIoTClient 0:1f9b2707ec7d 1391 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_019:[ EDM_DATETIMEOFFSET: dateTimeOffsetValue = year "-" month "-" day "T" hour ":" minute [ ":" second [ "." fractionalSeconds ] ] ( "Z" / sign hour ":" minute )]*/
AzureIoTClient 0:1f9b2707ec7d 1392 /*from ABNF seems like these numbers HAVE to be padded with zeroes*/
AzureIoTClient 0:1f9b2707ec7d 1393 if (value->value.edmDateTimeOffset.hasTimeZone)
AzureIoTClient 0:1f9b2707ec7d 1394 {
AzureIoTClient 0:1f9b2707ec7d 1395 if (value->value.edmDateTimeOffset.hasFractionalSecond)
AzureIoTClient 0:1f9b2707ec7d 1396 {
AzureIoTClient 0:1f9b2707ec7d 1397 if (sprintf_s(tempBuffer, tempBufferSize, "\"%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%.12llu%+.2d:%.2d\"", /*+ in printf forces the sign to appear*/
AzureIoTClient 0:1f9b2707ec7d 1398 value->value.edmDateTimeOffset.dateTime.tm_year+1900,
AzureIoTClient 0:1f9b2707ec7d 1399 value->value.edmDateTimeOffset.dateTime.tm_mon+1,
AzureIoTClient 0:1f9b2707ec7d 1400 value->value.edmDateTimeOffset.dateTime.tm_mday,
AzureIoTClient 0:1f9b2707ec7d 1401 value->value.edmDateTimeOffset.dateTime.tm_hour,
AzureIoTClient 0:1f9b2707ec7d 1402 value->value.edmDateTimeOffset.dateTime.tm_min,
AzureIoTClient 0:1f9b2707ec7d 1403 value->value.edmDateTimeOffset.dateTime.tm_sec,
AzureIoTClient 0:1f9b2707ec7d 1404 value->value.edmDateTimeOffset.fractionalSecond,
AzureIoTClient 0:1f9b2707ec7d 1405 value->value.edmDateTimeOffset.timeZoneHour,
AzureIoTClient 0:1f9b2707ec7d 1406 value->value.edmDateTimeOffset.timeZoneMinute) < 0)
AzureIoTClient 0:1f9b2707ec7d 1407 {
AzureIoTClient 0:1f9b2707ec7d 1408 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1409 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1410 }
AzureIoTClient 0:1f9b2707ec7d 1411 else if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1412 {
AzureIoTClient 0:1f9b2707ec7d 1413 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1414 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1415 }
AzureIoTClient 0:1f9b2707ec7d 1416 else
AzureIoTClient 0:1f9b2707ec7d 1417 {
AzureIoTClient 0:1f9b2707ec7d 1418 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1419 }
AzureIoTClient 0:1f9b2707ec7d 1420 }
AzureIoTClient 0:1f9b2707ec7d 1421 else
AzureIoTClient 0:1f9b2707ec7d 1422 {
AzureIoTClient 0:1f9b2707ec7d 1423 if (sprintf_s(tempBuffer, tempBufferSize, "\"%.4d-%.2d-%.2dT%.2d:%.2d:%.2d%+.2d:%.2d\"", /*+ in printf forces the sign to appear*/
AzureIoTClient 0:1f9b2707ec7d 1424 value->value.edmDateTimeOffset.dateTime.tm_year + 1900,
AzureIoTClient 0:1f9b2707ec7d 1425 value->value.edmDateTimeOffset.dateTime.tm_mon+1,
AzureIoTClient 0:1f9b2707ec7d 1426 value->value.edmDateTimeOffset.dateTime.tm_mday,
AzureIoTClient 0:1f9b2707ec7d 1427 value->value.edmDateTimeOffset.dateTime.tm_hour,
AzureIoTClient 0:1f9b2707ec7d 1428 value->value.edmDateTimeOffset.dateTime.tm_min,
AzureIoTClient 0:1f9b2707ec7d 1429 value->value.edmDateTimeOffset.dateTime.tm_sec,
AzureIoTClient 0:1f9b2707ec7d 1430 value->value.edmDateTimeOffset.timeZoneHour,
AzureIoTClient 0:1f9b2707ec7d 1431 value->value.edmDateTimeOffset.timeZoneMinute) < 0)
AzureIoTClient 0:1f9b2707ec7d 1432 {
AzureIoTClient 0:1f9b2707ec7d 1433 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1434 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1435 }
AzureIoTClient 0:1f9b2707ec7d 1436 else if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1437 {
AzureIoTClient 0:1f9b2707ec7d 1438 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1439 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1440 }
AzureIoTClient 0:1f9b2707ec7d 1441 else
AzureIoTClient 0:1f9b2707ec7d 1442 {
AzureIoTClient 0:1f9b2707ec7d 1443 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1444 }
AzureIoTClient 0:1f9b2707ec7d 1445 }
AzureIoTClient 0:1f9b2707ec7d 1446 }
AzureIoTClient 0:1f9b2707ec7d 1447 else
AzureIoTClient 0:1f9b2707ec7d 1448 {
AzureIoTClient 0:1f9b2707ec7d 1449 if (value->value.edmDateTimeOffset.hasFractionalSecond)
AzureIoTClient 0:1f9b2707ec7d 1450 {
AzureIoTClient 0:1f9b2707ec7d 1451 if (sprintf_s(tempBuffer, tempBufferSize, "\"%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%.12lluZ\"", /*+ in printf forces the sign to appear*/
AzureIoTClient 0:1f9b2707ec7d 1452 value->value.edmDateTimeOffset.dateTime.tm_year + 1900,
AzureIoTClient 0:1f9b2707ec7d 1453 value->value.edmDateTimeOffset.dateTime.tm_mon+1,
AzureIoTClient 0:1f9b2707ec7d 1454 value->value.edmDateTimeOffset.dateTime.tm_mday,
AzureIoTClient 0:1f9b2707ec7d 1455 value->value.edmDateTimeOffset.dateTime.tm_hour,
AzureIoTClient 0:1f9b2707ec7d 1456 value->value.edmDateTimeOffset.dateTime.tm_min,
AzureIoTClient 0:1f9b2707ec7d 1457 value->value.edmDateTimeOffset.dateTime.tm_sec,
AzureIoTClient 0:1f9b2707ec7d 1458 value->value.edmDateTimeOffset.fractionalSecond) < 0)
AzureIoTClient 0:1f9b2707ec7d 1459 {
AzureIoTClient 0:1f9b2707ec7d 1460 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1461 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1462 }
AzureIoTClient 0:1f9b2707ec7d 1463 else if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1464 {
AzureIoTClient 0:1f9b2707ec7d 1465 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1466 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1467 }
AzureIoTClient 0:1f9b2707ec7d 1468 else
AzureIoTClient 0:1f9b2707ec7d 1469 {
AzureIoTClient 0:1f9b2707ec7d 1470 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1471 }
AzureIoTClient 0:1f9b2707ec7d 1472 }
AzureIoTClient 0:1f9b2707ec7d 1473 else
AzureIoTClient 0:1f9b2707ec7d 1474 {
AzureIoTClient 0:1f9b2707ec7d 1475 if (sprintf_s(tempBuffer, tempBufferSize, "\"%.4d-%.2d-%.2dT%.2d:%.2d:%.2dZ\"",
AzureIoTClient 0:1f9b2707ec7d 1476 value->value.edmDateTimeOffset.dateTime.tm_year + 1900,
AzureIoTClient 0:1f9b2707ec7d 1477 value->value.edmDateTimeOffset.dateTime.tm_mon+1,
AzureIoTClient 0:1f9b2707ec7d 1478 value->value.edmDateTimeOffset.dateTime.tm_mday,
AzureIoTClient 0:1f9b2707ec7d 1479 value->value.edmDateTimeOffset.dateTime.tm_hour,
AzureIoTClient 0:1f9b2707ec7d 1480 value->value.edmDateTimeOffset.dateTime.tm_min,
AzureIoTClient 0:1f9b2707ec7d 1481 value->value.edmDateTimeOffset.dateTime.tm_sec) < 0)
AzureIoTClient 0:1f9b2707ec7d 1482 {
AzureIoTClient 0:1f9b2707ec7d 1483 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1484 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1485 }
AzureIoTClient 0:1f9b2707ec7d 1486 else if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1487 {
AzureIoTClient 0:1f9b2707ec7d 1488 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1489 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1490 }
AzureIoTClient 0:1f9b2707ec7d 1491 else
AzureIoTClient 0:1f9b2707ec7d 1492 {
AzureIoTClient 0:1f9b2707ec7d 1493 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1494 }
AzureIoTClient 0:1f9b2707ec7d 1495 }
AzureIoTClient 0:1f9b2707ec7d 1496
AzureIoTClient 0:1f9b2707ec7d 1497
AzureIoTClient 0:1f9b2707ec7d 1498 }
AzureIoTClient 0:1f9b2707ec7d 1499 break;
AzureIoTClient 0:1f9b2707ec7d 1500 }
AzureIoTClient 0:1f9b2707ec7d 1501 case(EDM_DECIMAL_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1502 {
AzureIoTClient 0:1f9b2707ec7d 1503 if (STRING_concat_with_STRING(destination, value->value.edmDecimal.value) != 0)
AzureIoTClient 0:1f9b2707ec7d 1504 {
AzureIoTClient 0:1f9b2707ec7d 1505 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1506 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1507 }
AzureIoTClient 0:1f9b2707ec7d 1508 else
AzureIoTClient 0:1f9b2707ec7d 1509 {
AzureIoTClient 0:1f9b2707ec7d 1510 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1511 }
AzureIoTClient 0:1f9b2707ec7d 1512 break;
AzureIoTClient 0:1f9b2707ec7d 1513 }
AzureIoTClient 0:1f9b2707ec7d 1514 case (EDM_INT16_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1515 {
AzureIoTClient 0:1f9b2707ec7d 1516 /*-32768 to +32767*/
AzureIoTClient 0:1f9b2707ec7d 1517 char buffertemp2[7]; /*because 5 digits and sign and '\0'*/
AzureIoTClient 0:1f9b2707ec7d 1518 uint16_t positiveValue;
AzureIoTClient 0:1f9b2707ec7d 1519 size_t pos = 0;
AzureIoTClient 0:1f9b2707ec7d 1520 uint16_t rank = (uint16_t)10000;
AzureIoTClient 0:1f9b2707ec7d 1521 bool foundFirstDigit = false;
AzureIoTClient 0:1f9b2707ec7d 1522
AzureIoTClient 0:1f9b2707ec7d 1523 if (value->value.edmInt16.value < 0)
AzureIoTClient 0:1f9b2707ec7d 1524 {
AzureIoTClient 0:1f9b2707ec7d 1525 buffertemp2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1526 positiveValue = -value->value.edmInt16.value;
AzureIoTClient 0:1f9b2707ec7d 1527 }
AzureIoTClient 0:1f9b2707ec7d 1528 else
AzureIoTClient 0:1f9b2707ec7d 1529 {
AzureIoTClient 0:1f9b2707ec7d 1530 positiveValue = value->value.edmInt16.value;
AzureIoTClient 0:1f9b2707ec7d 1531 }
AzureIoTClient 0:1f9b2707ec7d 1532
AzureIoTClient 0:1f9b2707ec7d 1533 while (rank >= 10)
AzureIoTClient 0:1f9b2707ec7d 1534 {
AzureIoTClient 0:1f9b2707ec7d 1535 if ((foundFirstDigit == true) || (positiveValue / rank) > 0)
AzureIoTClient 0:1f9b2707ec7d 1536 {
AzureIoTClient 0:1f9b2707ec7d 1537 buffertemp2[pos++] = '0' + (char)(positiveValue / rank);
AzureIoTClient 0:1f9b2707ec7d 1538 foundFirstDigit = true;
AzureIoTClient 0:1f9b2707ec7d 1539 }
AzureIoTClient 0:1f9b2707ec7d 1540 positiveValue %= rank;
AzureIoTClient 0:1f9b2707ec7d 1541 rank /= 10;
AzureIoTClient 0:1f9b2707ec7d 1542 }
AzureIoTClient 0:1f9b2707ec7d 1543 buffertemp2[pos++] = '0' + (char)(positiveValue);
AzureIoTClient 0:1f9b2707ec7d 1544 buffertemp2[pos++] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1545
AzureIoTClient 0:1f9b2707ec7d 1546 if (STRING_concat(destination, buffertemp2) != 0)
AzureIoTClient 0:1f9b2707ec7d 1547 {
AzureIoTClient 0:1f9b2707ec7d 1548 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1549 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1550 }
AzureIoTClient 0:1f9b2707ec7d 1551 else
AzureIoTClient 0:1f9b2707ec7d 1552 {
AzureIoTClient 0:1f9b2707ec7d 1553 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1554 }
AzureIoTClient 0:1f9b2707ec7d 1555 break;
AzureIoTClient 0:1f9b2707ec7d 1556 }
AzureIoTClient 0:1f9b2707ec7d 1557 case (EDM_INT32_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1558 {
AzureIoTClient 0:1f9b2707ec7d 1559 /*-2147483648 to +2147483647*/
AzureIoTClient 0:1f9b2707ec7d 1560 char buffertemp2[12]; /*because 10 digits and sign and '\0'*/
AzureIoTClient 0:1f9b2707ec7d 1561 uint32_t positiveValue;
AzureIoTClient 0:1f9b2707ec7d 1562 size_t pos = 0;
AzureIoTClient 0:1f9b2707ec7d 1563 uint32_t rank = 1000000000UL;
AzureIoTClient 0:1f9b2707ec7d 1564 bool foundFirstDigit = false;
AzureIoTClient 0:1f9b2707ec7d 1565
AzureIoTClient 0:1f9b2707ec7d 1566 if (value->value.edmInt32.value < 0)
AzureIoTClient 0:1f9b2707ec7d 1567 {
AzureIoTClient 0:1f9b2707ec7d 1568 buffertemp2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1569 positiveValue = - value->value.edmInt32.value;
AzureIoTClient 0:1f9b2707ec7d 1570 }
AzureIoTClient 0:1f9b2707ec7d 1571 else
AzureIoTClient 0:1f9b2707ec7d 1572 {
AzureIoTClient 0:1f9b2707ec7d 1573 positiveValue = value->value.edmInt32.value;
AzureIoTClient 0:1f9b2707ec7d 1574 }
AzureIoTClient 0:1f9b2707ec7d 1575
AzureIoTClient 0:1f9b2707ec7d 1576 while (rank >= 10)
AzureIoTClient 0:1f9b2707ec7d 1577 {
AzureIoTClient 0:1f9b2707ec7d 1578 if ((foundFirstDigit == true) || (positiveValue / rank) > 0)
AzureIoTClient 0:1f9b2707ec7d 1579 {
AzureIoTClient 0:1f9b2707ec7d 1580 buffertemp2[pos++] = '0' + (char)(positiveValue / rank);
AzureIoTClient 0:1f9b2707ec7d 1581 foundFirstDigit = true;
AzureIoTClient 0:1f9b2707ec7d 1582 }
AzureIoTClient 0:1f9b2707ec7d 1583 positiveValue %= rank;
AzureIoTClient 0:1f9b2707ec7d 1584 rank /= 10;
AzureIoTClient 0:1f9b2707ec7d 1585 }
AzureIoTClient 0:1f9b2707ec7d 1586 buffertemp2[pos++] = '0' + (char)(positiveValue);
AzureIoTClient 0:1f9b2707ec7d 1587 buffertemp2[pos++] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1588
AzureIoTClient 0:1f9b2707ec7d 1589 if (STRING_concat(destination, buffertemp2) != 0)
AzureIoTClient 0:1f9b2707ec7d 1590 {
AzureIoTClient 0:1f9b2707ec7d 1591 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1592 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1593 }
AzureIoTClient 0:1f9b2707ec7d 1594 else
AzureIoTClient 0:1f9b2707ec7d 1595 {
AzureIoTClient 0:1f9b2707ec7d 1596 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1597 }
AzureIoTClient 0:1f9b2707ec7d 1598 break;
AzureIoTClient 0:1f9b2707ec7d 1599 }
AzureIoTClient 0:1f9b2707ec7d 1600 case (EDM_INT64_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1601 {
AzureIoTClient 0:1f9b2707ec7d 1602 char buffertemp2[21]; /*because 19 digits and sign and '\0'*/
AzureIoTClient 0:1f9b2707ec7d 1603 uint64_t positiveValue;
AzureIoTClient 0:1f9b2707ec7d 1604 size_t pos = 0;
AzureIoTClient 0:1f9b2707ec7d 1605 uint64_t rank = 10000000000000000000ULL;
AzureIoTClient 0:1f9b2707ec7d 1606 bool foundFirstDigit = false;
AzureIoTClient 0:1f9b2707ec7d 1607
AzureIoTClient 0:1f9b2707ec7d 1608 if (value->value.edmInt64.value < 0)
AzureIoTClient 0:1f9b2707ec7d 1609 {
AzureIoTClient 0:1f9b2707ec7d 1610 buffertemp2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1611 positiveValue = -value->value.edmInt64.value;
AzureIoTClient 0:1f9b2707ec7d 1612 }
AzureIoTClient 0:1f9b2707ec7d 1613 else
AzureIoTClient 0:1f9b2707ec7d 1614 {
AzureIoTClient 0:1f9b2707ec7d 1615 positiveValue = value->value.edmInt64.value;
AzureIoTClient 0:1f9b2707ec7d 1616 }
AzureIoTClient 0:1f9b2707ec7d 1617
AzureIoTClient 0:1f9b2707ec7d 1618 while (rank >= 10)
AzureIoTClient 0:1f9b2707ec7d 1619 {
AzureIoTClient 0:1f9b2707ec7d 1620 if ((foundFirstDigit == true) || (positiveValue / rank) > 0)
AzureIoTClient 0:1f9b2707ec7d 1621 {
AzureIoTClient 0:1f9b2707ec7d 1622 buffertemp2[pos++] = '0' + (char)(positiveValue / rank);
AzureIoTClient 0:1f9b2707ec7d 1623 foundFirstDigit = true;
AzureIoTClient 0:1f9b2707ec7d 1624 }
AzureIoTClient 0:1f9b2707ec7d 1625 positiveValue %= rank;
AzureIoTClient 0:1f9b2707ec7d 1626 rank /= 10;
AzureIoTClient 0:1f9b2707ec7d 1627 }
AzureIoTClient 0:1f9b2707ec7d 1628 buffertemp2[pos++] = '0' + (char)(positiveValue);
AzureIoTClient 0:1f9b2707ec7d 1629 buffertemp2[pos++] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1630
AzureIoTClient 0:1f9b2707ec7d 1631 if (STRING_concat(destination, buffertemp2) != 0)
AzureIoTClient 0:1f9b2707ec7d 1632 {
AzureIoTClient 0:1f9b2707ec7d 1633 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1634 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1635 }
AzureIoTClient 0:1f9b2707ec7d 1636 else
AzureIoTClient 0:1f9b2707ec7d 1637 {
AzureIoTClient 0:1f9b2707ec7d 1638 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1639 }
AzureIoTClient 0:1f9b2707ec7d 1640 break;
AzureIoTClient 0:1f9b2707ec7d 1641 }
AzureIoTClient 0:1f9b2707ec7d 1642 case (EDM_SBYTE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1643 {
AzureIoTClient 0:1f9b2707ec7d 1644 char tempbuffer2[5]; /* because '-' and 3 characters for 127 let's say and '\0'*/
AzureIoTClient 0:1f9b2707ec7d 1645 int absValue = value->value.edmSbyte.value;
AzureIoTClient 0:1f9b2707ec7d 1646 size_t pos=0;
AzureIoTClient 0:1f9b2707ec7d 1647 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_026:[ EDM_SBYTE: sbyteValue = [ sign ] 1*3DIGIT ; numbers in the range from -128 to 127]*/
AzureIoTClient 0:1f9b2707ec7d 1648
AzureIoTClient 0:1f9b2707ec7d 1649 if (value->value.edmSbyte.value < 0)
AzureIoTClient 0:1f9b2707ec7d 1650 {
AzureIoTClient 0:1f9b2707ec7d 1651 tempbuffer2[pos++] = '-';
AzureIoTClient 0:1f9b2707ec7d 1652 absValue = -absValue;
AzureIoTClient 0:1f9b2707ec7d 1653 }
AzureIoTClient 0:1f9b2707ec7d 1654
AzureIoTClient 0:1f9b2707ec7d 1655 if (absValue >= 100 ) tempbuffer2[pos++] = '0' + (char)(absValue / 100);
AzureIoTClient 0:1f9b2707ec7d 1656 if (absValue >=10) tempbuffer2[pos++] = '0' + (absValue % 100) / 10;
AzureIoTClient 0:1f9b2707ec7d 1657 tempbuffer2[pos++] = '0' + (absValue % 10);
AzureIoTClient 0:1f9b2707ec7d 1658 tempbuffer2[pos++] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1659
AzureIoTClient 0:1f9b2707ec7d 1660
AzureIoTClient 0:1f9b2707ec7d 1661 if (STRING_concat(destination, tempbuffer2) != 0)
AzureIoTClient 0:1f9b2707ec7d 1662 {
AzureIoTClient 0:1f9b2707ec7d 1663 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1664 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1665 }
AzureIoTClient 0:1f9b2707ec7d 1666 else
AzureIoTClient 0:1f9b2707ec7d 1667 {
AzureIoTClient 0:1f9b2707ec7d 1668 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1669 }
AzureIoTClient 0:1f9b2707ec7d 1670 break;
AzureIoTClient 0:1f9b2707ec7d 1671 }
AzureIoTClient 0:1f9b2707ec7d 1672 case (EDM_STRING_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1673 {
AzureIoTClient 0:1f9b2707ec7d 1674 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1675 size_t nControlCharacters = 0; /*counts how many characters are to be expanded from 1 character to \uxxxx (6 characters)*/
AzureIoTClient 0:1f9b2707ec7d 1676 size_t nEscapeCharacters = 0;
AzureIoTClient 0:1f9b2707ec7d 1677 size_t vlen = value->value.edmString.length;
AzureIoTClient 0:1f9b2707ec7d 1678 char* v = value->value.edmString.chars;
AzureIoTClient 0:1f9b2707ec7d 1679
AzureIoTClient 0:1f9b2707ec7d 1680 for (i = 0; i < vlen; i++)
AzureIoTClient 0:1f9b2707ec7d 1681 {
AzureIoTClient 0:1f9b2707ec7d 1682 if ((unsigned char)v[i] >= 128) /*this be a UNICODE character begin*/
AzureIoTClient 0:1f9b2707ec7d 1683 {
AzureIoTClient 0:1f9b2707ec7d 1684 break;
AzureIoTClient 0:1f9b2707ec7d 1685 }
AzureIoTClient 0:1f9b2707ec7d 1686 else
AzureIoTClient 0:1f9b2707ec7d 1687 {
AzureIoTClient 0:1f9b2707ec7d 1688 if (v[i] <= 0x1F)
AzureIoTClient 0:1f9b2707ec7d 1689 {
AzureIoTClient 0:1f9b2707ec7d 1690 nControlCharacters++;
AzureIoTClient 0:1f9b2707ec7d 1691 }
AzureIoTClient 0:1f9b2707ec7d 1692 else if (
AzureIoTClient 0:1f9b2707ec7d 1693 (v[i] == '"') ||
AzureIoTClient 0:1f9b2707ec7d 1694 (v[i] == '\\') ||
AzureIoTClient 0:1f9b2707ec7d 1695 (v[i] == '/')
AzureIoTClient 0:1f9b2707ec7d 1696 )
AzureIoTClient 0:1f9b2707ec7d 1697 {
AzureIoTClient 0:1f9b2707ec7d 1698 nEscapeCharacters++;
AzureIoTClient 0:1f9b2707ec7d 1699 }
AzureIoTClient 0:1f9b2707ec7d 1700 }
AzureIoTClient 0:1f9b2707ec7d 1701 }
AzureIoTClient 0:1f9b2707ec7d 1702
AzureIoTClient 0:1f9b2707ec7d 1703 if (i < vlen)
AzureIoTClient 0:1f9b2707ec7d 1704 {
AzureIoTClient 0:1f9b2707ec7d 1705 result = AGENT_DATA_TYPES_INVALID_ARG; /*don't handle those who do not copy bit by bit to UTF8*/
AzureIoTClient 0:1f9b2707ec7d 1706 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1707 }
AzureIoTClient 0:1f9b2707ec7d 1708 else
AzureIoTClient 0:1f9b2707ec7d 1709 {
AzureIoTClient 0:1f9b2707ec7d 1710 /*forward parse the string to scan for " and for \ that in JSON are \" respectively \\*/
AzureIoTClient 0:1f9b2707ec7d 1711 if (tempBufferSize < vlen + 5 * nControlCharacters + nEscapeCharacters + 3)
AzureIoTClient 0:1f9b2707ec7d 1712 {
AzureIoTClient 0:1f9b2707ec7d 1713 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1714 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1715 }
AzureIoTClient 0:1f9b2707ec7d 1716 else
AzureIoTClient 0:1f9b2707ec7d 1717 {
AzureIoTClient 0:1f9b2707ec7d 1718 size_t w = 0;
AzureIoTClient 0:1f9b2707ec7d 1719 tempBuffer[w++] = '"';
AzureIoTClient 0:1f9b2707ec7d 1720 for (i = 0; i < vlen; i++)
AzureIoTClient 0:1f9b2707ec7d 1721 {
AzureIoTClient 0:1f9b2707ec7d 1722 if (v[i] <= 0x1F)
AzureIoTClient 0:1f9b2707ec7d 1723 {
AzureIoTClient 0:1f9b2707ec7d 1724 tempBuffer[w++] = '\\';
AzureIoTClient 0:1f9b2707ec7d 1725 tempBuffer[w++] = 'u';
AzureIoTClient 0:1f9b2707ec7d 1726 tempBuffer[w++] = '0';
AzureIoTClient 0:1f9b2707ec7d 1727 tempBuffer[w++] = '0';
AzureIoTClient 0:1f9b2707ec7d 1728 tempBuffer[w++] = hexToASCII[(v[i] & 0xF0) >> 4]; /*high nibble*/
AzureIoTClient 0:1f9b2707ec7d 1729 tempBuffer[w++] = hexToASCII[v[i] & 0x0F]; /*lowNibble nibble*/
AzureIoTClient 0:1f9b2707ec7d 1730 }
AzureIoTClient 0:1f9b2707ec7d 1731 else if (v[i] == '"')
AzureIoTClient 0:1f9b2707ec7d 1732 {
AzureIoTClient 0:1f9b2707ec7d 1733 tempBuffer[w++] = '\\';
AzureIoTClient 0:1f9b2707ec7d 1734 tempBuffer[w++] = '"';
AzureIoTClient 0:1f9b2707ec7d 1735 }
AzureIoTClient 0:1f9b2707ec7d 1736 else if (v[i] == '\\')
AzureIoTClient 0:1f9b2707ec7d 1737 {
AzureIoTClient 0:1f9b2707ec7d 1738 tempBuffer[w++] = '\\';
AzureIoTClient 0:1f9b2707ec7d 1739 tempBuffer[w++] = '\\';
AzureIoTClient 0:1f9b2707ec7d 1740 }
AzureIoTClient 0:1f9b2707ec7d 1741 else if (v[i] == '/')
AzureIoTClient 0:1f9b2707ec7d 1742 {
AzureIoTClient 0:1f9b2707ec7d 1743 tempBuffer[w++] = '\\';
AzureIoTClient 0:1f9b2707ec7d 1744 tempBuffer[w++] = '/';
AzureIoTClient 0:1f9b2707ec7d 1745 }
AzureIoTClient 0:1f9b2707ec7d 1746 else
AzureIoTClient 0:1f9b2707ec7d 1747 {
AzureIoTClient 0:1f9b2707ec7d 1748 tempBuffer[w++] = v[i];
AzureIoTClient 0:1f9b2707ec7d 1749 }
AzureIoTClient 0:1f9b2707ec7d 1750 }
AzureIoTClient 0:1f9b2707ec7d 1751
AzureIoTClient 0:1f9b2707ec7d 1752 #ifdef _MSC_VER
AzureIoTClient 0:1f9b2707ec7d 1753 #pragma warning(suppress: 6386) /* The test Create_AGENT_DATA_TYPE_from_charz_With_2_Slashes_Succeeds verifies that Code Analysis is wrong here */
AzureIoTClient 0:1f9b2707ec7d 1754 #endif
AzureIoTClient 0:1f9b2707ec7d 1755 tempBuffer[w] = '"';
AzureIoTClient 0:1f9b2707ec7d 1756 /*zero terminating it*/
AzureIoTClient 0:1f9b2707ec7d 1757 tempBuffer[vlen + 5 * nControlCharacters + nEscapeCharacters + 3 - 1] = '\0';
AzureIoTClient 0:1f9b2707ec7d 1758
AzureIoTClient 0:1f9b2707ec7d 1759 if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1760 {
AzureIoTClient 0:1f9b2707ec7d 1761 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1762 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1763 }
AzureIoTClient 0:1f9b2707ec7d 1764 else
AzureIoTClient 0:1f9b2707ec7d 1765 {
AzureIoTClient 0:1f9b2707ec7d 1766 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1767 }
AzureIoTClient 0:1f9b2707ec7d 1768 }
AzureIoTClient 0:1f9b2707ec7d 1769 }
AzureIoTClient 0:1f9b2707ec7d 1770
AzureIoTClient 0:1f9b2707ec7d 1771 break;
AzureIoTClient 0:1f9b2707ec7d 1772 }
AzureIoTClient 0:1f9b2707ec7d 1773
AzureIoTClient 0:1f9b2707ec7d 1774 /* Codes_SRS_AGENT_TYPE_SYSTEM_01_003: [EDM_STRING_no_quotes: the string is copied as given when the AGENT_DATA_TYPE was created.] */
AzureIoTClient 0:1f9b2707ec7d 1775 case (EDM_STRING_NO_QUOTES_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1776 {
AzureIoTClient 0:1f9b2707ec7d 1777 /* this is a special case where we just want to copy/paste the contents, no encoding, no quotes */
AzureIoTClient 0:1f9b2707ec7d 1778 /* Codes_SRS_AGENT_TYPE_SYSTEM_01_002: [When serialized, this type is not enclosed with quotes.] */
AzureIoTClient 0:1f9b2707ec7d 1779 if (STRING_concat(destination, value->value.edmStringNoQuotes.chars) != 0)
AzureIoTClient 0:1f9b2707ec7d 1780 {
AzureIoTClient 0:1f9b2707ec7d 1781 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1782 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1783 }
AzureIoTClient 0:1f9b2707ec7d 1784 else
AzureIoTClient 0:1f9b2707ec7d 1785 {
AzureIoTClient 0:1f9b2707ec7d 1786 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1787 }
AzureIoTClient 0:1f9b2707ec7d 1788
AzureIoTClient 0:1f9b2707ec7d 1789 break;
AzureIoTClient 0:1f9b2707ec7d 1790 }
AzureIoTClient 0:1f9b2707ec7d 1791
AzureIoTClient 6:36cc37b1dbc9 1792 #ifdef USE_FLOATS
AzureIoTClient 0:1f9b2707ec7d 1793 case(EDM_SINGLE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1794 {
AzureIoTClient 0:1f9b2707ec7d 1795 /*C89 standard says: When a float is promoted to double or long double, or a double is promoted to long double, its value is unchanged*/
AzureIoTClient 0:1f9b2707ec7d 1796 /*I read that as : when a float is NaN or Inf, it will stay NaN or INF in double representation*/
AzureIoTClient 0:1f9b2707ec7d 1797
AzureIoTClient 0:1f9b2707ec7d 1798 /*The sprintf function returns the number of characters written in the array, not counting the terminating null character.*/
AzureIoTClient 0:1f9b2707ec7d 1799
AzureIoTClient 0:1f9b2707ec7d 1800 if(ISNAN(value->value.edmSingle.value))
AzureIoTClient 0:1f9b2707ec7d 1801 {
AzureIoTClient 0:1f9b2707ec7d 1802 if (STRING_concat(destination, NaN_STRING) != 0)
AzureIoTClient 0:1f9b2707ec7d 1803 {
AzureIoTClient 0:1f9b2707ec7d 1804 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1805 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1806 }
AzureIoTClient 0:1f9b2707ec7d 1807 else
AzureIoTClient 0:1f9b2707ec7d 1808 {
AzureIoTClient 0:1f9b2707ec7d 1809 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1810 }
AzureIoTClient 0:1f9b2707ec7d 1811 }
AzureIoTClient 0:1f9b2707ec7d 1812 else if (ISNEGATIVEINFINITY(value->value.edmSingle.value))
AzureIoTClient 0:1f9b2707ec7d 1813 {
AzureIoTClient 0:1f9b2707ec7d 1814 if (STRING_concat(destination, MINUSINF_STRING) != 0)
AzureIoTClient 0:1f9b2707ec7d 1815 {
AzureIoTClient 0:1f9b2707ec7d 1816 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1817 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1818 }
AzureIoTClient 0:1f9b2707ec7d 1819 else
AzureIoTClient 0:1f9b2707ec7d 1820 {
AzureIoTClient 0:1f9b2707ec7d 1821 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1822 }
AzureIoTClient 0:1f9b2707ec7d 1823 }
AzureIoTClient 0:1f9b2707ec7d 1824 else if (ISPOSITIVEINFINITY(value->value.edmSingle.value))
AzureIoTClient 0:1f9b2707ec7d 1825 {
AzureIoTClient 0:1f9b2707ec7d 1826 if (STRING_concat(destination, PLUSINF_STRING) != 0)
AzureIoTClient 0:1f9b2707ec7d 1827 {
AzureIoTClient 0:1f9b2707ec7d 1828 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1829 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1830 }
AzureIoTClient 0:1f9b2707ec7d 1831 else
AzureIoTClient 0:1f9b2707ec7d 1832 {
AzureIoTClient 0:1f9b2707ec7d 1833 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1834 }
AzureIoTClient 0:1f9b2707ec7d 1835 }
AzureIoTClient 0:1f9b2707ec7d 1836 else if(sprintf_s(tempBuffer, tempBufferSize, "%.*f", FLT_DIG, (double)(value->value.edmSingle.value))<0)
AzureIoTClient 0:1f9b2707ec7d 1837 {
AzureIoTClient 0:1f9b2707ec7d 1838 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1839 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1840 }
AzureIoTClient 0:1f9b2707ec7d 1841 else if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1842 {
AzureIoTClient 0:1f9b2707ec7d 1843 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1844 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1845 }
AzureIoTClient 0:1f9b2707ec7d 1846 else
AzureIoTClient 0:1f9b2707ec7d 1847 {
AzureIoTClient 0:1f9b2707ec7d 1848 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1849 }
AzureIoTClient 0:1f9b2707ec7d 1850 break;
AzureIoTClient 0:1f9b2707ec7d 1851 }
AzureIoTClient 0:1f9b2707ec7d 1852 case(EDM_DOUBLE_TYPE):
AzureIoTClient 0:1f9b2707ec7d 1853 {
AzureIoTClient 0:1f9b2707ec7d 1854 /*The sprintf function returns the number of characters written in the array, not counting the terminating null character.*/
AzureIoTClient 0:1f9b2707ec7d 1855 /*OData-ABNF says these can be used: nanInfinity = 'NaN' / '-INF' / 'INF'*/
AzureIoTClient 0:1f9b2707ec7d 1856 /*C90 doesn't declare a NaN or Inf in the standard, however, values might be NaN or Inf...*/
AzureIoTClient 0:1f9b2707ec7d 1857 /*C99 ... does*/
AzureIoTClient 0:1f9b2707ec7d 1858 /*C11 is same as C99*/
AzureIoTClient 0:1f9b2707ec7d 1859 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_022:[ EDM_DOUBLE: doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits). The representation shall use DBL_DIG C #define*/
AzureIoTClient 0:1f9b2707ec7d 1860 if(ISNAN(value->value.edmDouble.value))
AzureIoTClient 0:1f9b2707ec7d 1861 {
AzureIoTClient 0:1f9b2707ec7d 1862 if (STRING_concat(destination, NaN_STRING) != 0)
AzureIoTClient 0:1f9b2707ec7d 1863 {
AzureIoTClient 0:1f9b2707ec7d 1864 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1865 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1866 }
AzureIoTClient 0:1f9b2707ec7d 1867 else
AzureIoTClient 0:1f9b2707ec7d 1868 {
AzureIoTClient 0:1f9b2707ec7d 1869 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1870 }
AzureIoTClient 0:1f9b2707ec7d 1871 }
AzureIoTClient 0:1f9b2707ec7d 1872 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_022:[ EDM_DOUBLE: doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits). The representation shall use DBL_DIG C #define*/
AzureIoTClient 0:1f9b2707ec7d 1873 else if (ISNEGATIVEINFINITY(value->value.edmDouble.value))
AzureIoTClient 0:1f9b2707ec7d 1874 {
AzureIoTClient 0:1f9b2707ec7d 1875 if (STRING_concat(destination, MINUSINF_STRING) != 0)
AzureIoTClient 0:1f9b2707ec7d 1876 {
AzureIoTClient 0:1f9b2707ec7d 1877 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1878 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1879 }
AzureIoTClient 0:1f9b2707ec7d 1880 else
AzureIoTClient 0:1f9b2707ec7d 1881 {
AzureIoTClient 0:1f9b2707ec7d 1882 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1883 }
AzureIoTClient 0:1f9b2707ec7d 1884 }
AzureIoTClient 0:1f9b2707ec7d 1885 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_022:[ EDM_DOUBLE: doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits). The representation shall use DBL_DIG C #define*/
AzureIoTClient 0:1f9b2707ec7d 1886 else if (ISPOSITIVEINFINITY(value->value.edmDouble.value))
AzureIoTClient 0:1f9b2707ec7d 1887 {
AzureIoTClient 0:1f9b2707ec7d 1888 if (STRING_concat(destination, PLUSINF_STRING) != 0)
AzureIoTClient 0:1f9b2707ec7d 1889 {
AzureIoTClient 0:1f9b2707ec7d 1890 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1891 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1892 }
AzureIoTClient 0:1f9b2707ec7d 1893 else
AzureIoTClient 0:1f9b2707ec7d 1894 {
AzureIoTClient 0:1f9b2707ec7d 1895 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1896 }
AzureIoTClient 0:1f9b2707ec7d 1897 }
AzureIoTClient 0:1f9b2707ec7d 1898 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_022:[ EDM_DOUBLE: doubleValue = decimalValue [ "e" [SIGN] 1*DIGIT ] / nanInfinity ; IEEE 754 binary64 floating-point number (15-17 decimal digits). The representation shall use DBL_DIG C #define*/
AzureIoTClient 0:1f9b2707ec7d 1899 else if(sprintf_s(tempBuffer, tempBufferSize, "%.*f", DBL_DIG, value->value.edmDouble.value)<0)
AzureIoTClient 0:1f9b2707ec7d 1900 {
AzureIoTClient 0:1f9b2707ec7d 1901 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1902 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1903 }
AzureIoTClient 0:1f9b2707ec7d 1904 else if (STRING_concat(destination, tempBuffer) != 0)
AzureIoTClient 0:1f9b2707ec7d 1905 {
AzureIoTClient 0:1f9b2707ec7d 1906 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1907 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1908 }
AzureIoTClient 0:1f9b2707ec7d 1909 else
AzureIoTClient 0:1f9b2707ec7d 1910 {
AzureIoTClient 0:1f9b2707ec7d 1911 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1912 }
AzureIoTClient 0:1f9b2707ec7d 1913 break;
AzureIoTClient 0:1f9b2707ec7d 1914 }
AzureIoTClient 6:36cc37b1dbc9 1915 #endif
AzureIoTClient 0:1f9b2707ec7d 1916
AzureIoTClient 0:1f9b2707ec7d 1917 case(EDM_COMPLEX_TYPE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 1918 {
AzureIoTClient 0:1f9b2707ec7d 1919 /*to produce an EDM_COMPLEX_TYPE is a recursive process*/
AzureIoTClient 0:1f9b2707ec7d 1920 /*uses JSON encoder*/
AzureIoTClient 0:1f9b2707ec7d 1921 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_062:[ If the AGENT_DATA_TYPE represents a "complex type", then the JSON marshaller shall produce the following JSON value:[...]*/
AzureIoTClient 0:1f9b2707ec7d 1922 MULTITREE_HANDLE treeHandle;
AzureIoTClient 0:1f9b2707ec7d 1923 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 1924 /*SRS_AGENT_TYPE_SYSTEM_99_016:[ When the value cannot be converted to a string AgentDataTypes_ToString shall return AGENT_DATA_TYPES_ERROR.]*/
AzureIoTClient 0:1f9b2707ec7d 1925 treeHandle = MultiTree_Create(NoCloneFunction, NoFreeFunction);
AzureIoTClient 0:1f9b2707ec7d 1926 if (treeHandle == NULL)
AzureIoTClient 0:1f9b2707ec7d 1927 {
AzureIoTClient 0:1f9b2707ec7d 1928 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1929 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1930 }
AzureIoTClient 0:1f9b2707ec7d 1931 else
AzureIoTClient 0:1f9b2707ec7d 1932 {
AzureIoTClient 0:1f9b2707ec7d 1933 size_t i;
AzureIoTClient 0:1f9b2707ec7d 1934 for (i = 0; i < value->value.edmComplexType.nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 1935 {
AzureIoTClient 0:1f9b2707ec7d 1936 if (MultiTree_AddLeaf(treeHandle, value->value.edmComplexType.fields[i].fieldName, value->value.edmComplexType.fields[i].value) != MULTITREE_OK)
AzureIoTClient 0:1f9b2707ec7d 1937 {
AzureIoTClient 0:1f9b2707ec7d 1938 /*SRS_AGENT_TYPE_SYSTEM_99_016:[ When the value cannot be converted to a string AgentDataTypes_ToString shall return AGENT_DATA_TYPES_ERROR.]*/
AzureIoTClient 0:1f9b2707ec7d 1939 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1940 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1941 break;
AzureIoTClient 0:1f9b2707ec7d 1942 }
AzureIoTClient 0:1f9b2707ec7d 1943 else
AzureIoTClient 0:1f9b2707ec7d 1944 {
AzureIoTClient 0:1f9b2707ec7d 1945 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 1946 }
AzureIoTClient 0:1f9b2707ec7d 1947 }
AzureIoTClient 0:1f9b2707ec7d 1948
AzureIoTClient 0:1f9b2707ec7d 1949 if (result == AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 1950 {
AzureIoTClient 0:1f9b2707ec7d 1951 /*SRS_AGENT_TYPE_SYSTEM_99_016:[ When the value cannot be converted to a string AgentDataTypes_ToString shall return AGENT_DATA_TYPES_ERROR.]*/
AzureIoTClient 0:1f9b2707ec7d 1952 if (JSONEncoder_EncodeTree(treeHandle, destination, (JSON_ENCODER_TOSTRING_FUNC)AgentDataTypes_ToString) != JSON_ENCODER_OK)
AzureIoTClient 0:1f9b2707ec7d 1953 {
AzureIoTClient 0:1f9b2707ec7d 1954 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 1955 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 1956 }
AzureIoTClient 0:1f9b2707ec7d 1957 else
AzureIoTClient 0:1f9b2707ec7d 1958 {
AzureIoTClient 0:1f9b2707ec7d 1959 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 1960 }
AzureIoTClient 0:1f9b2707ec7d 1961
AzureIoTClient 0:1f9b2707ec7d 1962 }
AzureIoTClient 0:1f9b2707ec7d 1963
AzureIoTClient 0:1f9b2707ec7d 1964 MultiTree_Destroy(treeHandle);
AzureIoTClient 0:1f9b2707ec7d 1965 }
AzureIoTClient 0:1f9b2707ec7d 1966 break;
AzureIoTClient 0:1f9b2707ec7d 1967 }
AzureIoTClient 0:1f9b2707ec7d 1968 case EDM_GUID_TYPE:
AzureIoTClient 0:1f9b2707ec7d 1969 {
AzureIoTClient 0:1f9b2707ec7d 1970 char tempBuffer2[1 + 8 + 1 + 4 + 1 + 4 + 1 + 4 + 1 + 12 + 1+ 1];
AzureIoTClient 0:1f9b2707ec7d 1971 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_093:[ EDM_GUID: 8HEXDIG "-" 4HEXDIG "-" 4HEXDIG "-" 4HEXDIG "-" 12HEXDIG]*/
AzureIoTClient 0:1f9b2707ec7d 1972 tempBuffer2[0] = '\"';
AzureIoTClient 0:1f9b2707ec7d 1973 tempBuffer2[1] = hexDigitToChar(value->value.edmGuid.GUID[0] / 16);
AzureIoTClient 0:1f9b2707ec7d 1974 tempBuffer2[2] = hexDigitToChar(value->value.edmGuid.GUID[0] % 16);
AzureIoTClient 0:1f9b2707ec7d 1975 tempBuffer2[3] = hexDigitToChar(value->value.edmGuid.GUID[1] / 16);
AzureIoTClient 0:1f9b2707ec7d 1976 tempBuffer2[4] = hexDigitToChar(value->value.edmGuid.GUID[1] % 16);
AzureIoTClient 0:1f9b2707ec7d 1977 tempBuffer2[5] = hexDigitToChar(value->value.edmGuid.GUID[2] / 16);
AzureIoTClient 0:1f9b2707ec7d 1978 tempBuffer2[6] = hexDigitToChar(value->value.edmGuid.GUID[2] % 16);
AzureIoTClient 0:1f9b2707ec7d 1979 tempBuffer2[7] = hexDigitToChar(value->value.edmGuid.GUID[3] / 16);
AzureIoTClient 0:1f9b2707ec7d 1980 tempBuffer2[8] = hexDigitToChar(value->value.edmGuid.GUID[3] % 16);
AzureIoTClient 0:1f9b2707ec7d 1981
AzureIoTClient 0:1f9b2707ec7d 1982 tempBuffer2[9] = '-';
AzureIoTClient 0:1f9b2707ec7d 1983 tempBuffer2[10] = hexDigitToChar(value->value.edmGuid.GUID[4] / 16);
AzureIoTClient 0:1f9b2707ec7d 1984 tempBuffer2[11] = hexDigitToChar(value->value.edmGuid.GUID[4] % 16);
AzureIoTClient 0:1f9b2707ec7d 1985 tempBuffer2[12] = hexDigitToChar(value->value.edmGuid.GUID[5] / 16);
AzureIoTClient 0:1f9b2707ec7d 1986 tempBuffer2[13] = hexDigitToChar(value->value.edmGuid.GUID[5] % 16);
AzureIoTClient 0:1f9b2707ec7d 1987
AzureIoTClient 0:1f9b2707ec7d 1988 tempBuffer2[14] = '-';
AzureIoTClient 0:1f9b2707ec7d 1989 tempBuffer2[15] = hexDigitToChar(value->value.edmGuid.GUID[6] / 16);
AzureIoTClient 0:1f9b2707ec7d 1990 tempBuffer2[16] = hexDigitToChar(value->value.edmGuid.GUID[6] % 16);
AzureIoTClient 0:1f9b2707ec7d 1991 tempBuffer2[17] = hexDigitToChar(value->value.edmGuid.GUID[7] / 16);
AzureIoTClient 0:1f9b2707ec7d 1992 tempBuffer2[18] = hexDigitToChar(value->value.edmGuid.GUID[7] % 16);
AzureIoTClient 0:1f9b2707ec7d 1993
AzureIoTClient 0:1f9b2707ec7d 1994 tempBuffer2[19] = '-';
AzureIoTClient 0:1f9b2707ec7d 1995 tempBuffer2[20] = hexDigitToChar(value->value.edmGuid.GUID[8] / 16);
AzureIoTClient 0:1f9b2707ec7d 1996 tempBuffer2[21] = hexDigitToChar(value->value.edmGuid.GUID[8] % 16);
AzureIoTClient 0:1f9b2707ec7d 1997 tempBuffer2[22] = hexDigitToChar(value->value.edmGuid.GUID[9] / 16);
AzureIoTClient 0:1f9b2707ec7d 1998 tempBuffer2[23] = hexDigitToChar(value->value.edmGuid.GUID[9] % 16);
AzureIoTClient 0:1f9b2707ec7d 1999
AzureIoTClient 0:1f9b2707ec7d 2000 tempBuffer2[24] = '-';
AzureIoTClient 0:1f9b2707ec7d 2001 tempBuffer2[25] = hexDigitToChar(value->value.edmGuid.GUID[10] / 16);
AzureIoTClient 0:1f9b2707ec7d 2002 tempBuffer2[26] = hexDigitToChar(value->value.edmGuid.GUID[10] % 16);
AzureIoTClient 0:1f9b2707ec7d 2003 tempBuffer2[27] = hexDigitToChar(value->value.edmGuid.GUID[11] / 16);
AzureIoTClient 0:1f9b2707ec7d 2004 tempBuffer2[28] = hexDigitToChar(value->value.edmGuid.GUID[11] % 16);
AzureIoTClient 0:1f9b2707ec7d 2005 tempBuffer2[29] = hexDigitToChar(value->value.edmGuid.GUID[12] / 16);
AzureIoTClient 0:1f9b2707ec7d 2006 tempBuffer2[30] = hexDigitToChar(value->value.edmGuid.GUID[12] % 16);
AzureIoTClient 0:1f9b2707ec7d 2007 tempBuffer2[31] = hexDigitToChar(value->value.edmGuid.GUID[13] / 16);
AzureIoTClient 0:1f9b2707ec7d 2008 tempBuffer2[32] = hexDigitToChar(value->value.edmGuid.GUID[13] % 16);
AzureIoTClient 0:1f9b2707ec7d 2009 tempBuffer2[33] = hexDigitToChar(value->value.edmGuid.GUID[14] / 16);
AzureIoTClient 0:1f9b2707ec7d 2010 tempBuffer2[34] = hexDigitToChar(value->value.edmGuid.GUID[14] % 16);
AzureIoTClient 0:1f9b2707ec7d 2011 tempBuffer2[35] = hexDigitToChar(value->value.edmGuid.GUID[15] / 16);
AzureIoTClient 0:1f9b2707ec7d 2012 tempBuffer2[36] = hexDigitToChar(value->value.edmGuid.GUID[15] % 16);
AzureIoTClient 0:1f9b2707ec7d 2013
AzureIoTClient 0:1f9b2707ec7d 2014 tempBuffer2[37] = '\"';
AzureIoTClient 0:1f9b2707ec7d 2015 tempBuffer2[38] = '\0';
AzureIoTClient 0:1f9b2707ec7d 2016
AzureIoTClient 0:1f9b2707ec7d 2017 if (STRING_concat(destination, tempBuffer2) != 0)
AzureIoTClient 0:1f9b2707ec7d 2018 {
AzureIoTClient 0:1f9b2707ec7d 2019 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2020 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2021 }
AzureIoTClient 0:1f9b2707ec7d 2022 else
AzureIoTClient 0:1f9b2707ec7d 2023 {
AzureIoTClient 0:1f9b2707ec7d 2024 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2025 }
AzureIoTClient 0:1f9b2707ec7d 2026 break;
AzureIoTClient 0:1f9b2707ec7d 2027 }
AzureIoTClient 0:1f9b2707ec7d 2028 case EDM_BINARY_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2029 {
AzureIoTClient 0:1f9b2707ec7d 2030 size_t currentPosition = 0;
AzureIoTClient 0:1f9b2707ec7d 2031 char* temp;
AzureIoTClient 0:1f9b2707ec7d 2032 /*binary types */
AzureIoTClient 0:1f9b2707ec7d 2033 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_099:[EDM_BINARY:= *(4base64char)[base64b16 / base64b8]]*/
AzureIoTClient 0:1f9b2707ec7d 2034 /*the following will happen*/
AzureIoTClient 0:1f9b2707ec7d 2035 /*1. the "data" of the binary shall be "eaten" 3 characters at a time and produce 4 base64 encoded characters for as long as there are more than 3 characters still to process*/
AzureIoTClient 0:1f9b2707ec7d 2036 /*2. the remaining characters (1 or 2) shall be encoded.*/
AzureIoTClient 0:1f9b2707ec7d 2037 /*there's a level of assumption that 'a' corresponds to 0b000000 and that '_' corresponds to 0b111111*/
AzureIoTClient 0:1f9b2707ec7d 2038 /*the encoding will use the optional [=] or [==] at the end of the encoded string, so that other less standard aware libraries can do their work*/
AzureIoTClient 0:1f9b2707ec7d 2039 /*these are the bits of the 3 normal bytes to be encoded*/
AzureIoTClient 0:1f9b2707ec7d 2040 size_t neededSize = 2; /*2 because starting and ending quotes */
AzureIoTClient 0:1f9b2707ec7d 2041 neededSize += (value->value.edmBinary.size == 0) ? (0) : ((((value->value.edmBinary.size-1) / 3) + 1) * 4);
AzureIoTClient 0:1f9b2707ec7d 2042 neededSize += 1; /*+1 because \0 at the end of the string*/
AzureIoTClient 0:1f9b2707ec7d 2043 if ((temp = (char*)malloc(neededSize))==NULL)
AzureIoTClient 0:1f9b2707ec7d 2044 {
AzureIoTClient 0:1f9b2707ec7d 2045 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2046 }
AzureIoTClient 0:1f9b2707ec7d 2047 else
AzureIoTClient 0:1f9b2707ec7d 2048 {
AzureIoTClient 0:1f9b2707ec7d 2049 /*b0 b1(+1) b2(+2)
AzureIoTClient 0:1f9b2707ec7d 2050 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
AzureIoTClient 0:1f9b2707ec7d 2051 |----c1---| |----c2---| |----c3---| |----c4---|
AzureIoTClient 0:1f9b2707ec7d 2052 */
AzureIoTClient 0:1f9b2707ec7d 2053
AzureIoTClient 0:1f9b2707ec7d 2054 size_t destinationPointer = 0;
AzureIoTClient 0:1f9b2707ec7d 2055 temp[destinationPointer++] = '"';
AzureIoTClient 0:1f9b2707ec7d 2056 while (value->value.edmBinary.size - currentPosition >= 3)
AzureIoTClient 0:1f9b2707ec7d 2057 {
AzureIoTClient 0:1f9b2707ec7d 2058 char c1 = base64char[value->value.edmBinary.data[currentPosition] >> 2];
AzureIoTClient 0:1f9b2707ec7d 2059 char c2 = base64char[
AzureIoTClient 0:1f9b2707ec7d 2060 ((value->value.edmBinary.data[currentPosition] & 3) << 4) |
AzureIoTClient 0:1f9b2707ec7d 2061 (value->value.edmBinary.data[currentPosition + 1] >> 4)
AzureIoTClient 0:1f9b2707ec7d 2062 ];
AzureIoTClient 0:1f9b2707ec7d 2063 char c3 = base64char[
AzureIoTClient 0:1f9b2707ec7d 2064 ((value->value.edmBinary.data[currentPosition + 1] & 0x0F) << 2) |
AzureIoTClient 0:1f9b2707ec7d 2065 ((value->value.edmBinary.data[currentPosition + 2] >> 6) & 3)
AzureIoTClient 0:1f9b2707ec7d 2066 ];
AzureIoTClient 0:1f9b2707ec7d 2067 char c4 = base64char[
AzureIoTClient 0:1f9b2707ec7d 2068 value->value.edmBinary.data[currentPosition + 2] & 0x3F
AzureIoTClient 0:1f9b2707ec7d 2069 ];
AzureIoTClient 0:1f9b2707ec7d 2070 currentPosition += 3;
AzureIoTClient 0:1f9b2707ec7d 2071 temp[destinationPointer++] = c1;
AzureIoTClient 0:1f9b2707ec7d 2072 temp[destinationPointer++] = c2;
AzureIoTClient 0:1f9b2707ec7d 2073 temp[destinationPointer++] = c3;
AzureIoTClient 0:1f9b2707ec7d 2074 temp[destinationPointer++] = c4;
AzureIoTClient 0:1f9b2707ec7d 2075
AzureIoTClient 0:1f9b2707ec7d 2076 }
AzureIoTClient 0:1f9b2707ec7d 2077 if (value->value.edmBinary.size - currentPosition == 2)
AzureIoTClient 0:1f9b2707ec7d 2078 {
AzureIoTClient 0:1f9b2707ec7d 2079 char c1 = base64char[value->value.edmBinary.data[currentPosition] >> 2];
AzureIoTClient 0:1f9b2707ec7d 2080 char c2 = base64char[
AzureIoTClient 0:1f9b2707ec7d 2081 ((value->value.edmBinary.data[currentPosition] & 0x03) << 4) |
AzureIoTClient 0:1f9b2707ec7d 2082 (value->value.edmBinary.data[currentPosition + 1] >> 4)
AzureIoTClient 0:1f9b2707ec7d 2083 ];
AzureIoTClient 0:1f9b2707ec7d 2084 char c3 = base64b16[value->value.edmBinary.data[currentPosition + 1] & 0x0F];
AzureIoTClient 0:1f9b2707ec7d 2085 temp[destinationPointer++] = c1;
AzureIoTClient 0:1f9b2707ec7d 2086 temp[destinationPointer++] = c2;
AzureIoTClient 0:1f9b2707ec7d 2087 temp[destinationPointer++] = c3;
AzureIoTClient 0:1f9b2707ec7d 2088 temp[destinationPointer++] = '=';
AzureIoTClient 0:1f9b2707ec7d 2089 }
AzureIoTClient 0:1f9b2707ec7d 2090 else if (value->value.edmBinary.size - currentPosition == 1)
AzureIoTClient 0:1f9b2707ec7d 2091 {
AzureIoTClient 0:1f9b2707ec7d 2092 char c1 = base64char[value->value.edmBinary.data[currentPosition] >> 2];
AzureIoTClient 0:1f9b2707ec7d 2093 char c2 = base64b8[value->value.edmBinary.data[currentPosition] & 0x03];
AzureIoTClient 0:1f9b2707ec7d 2094 temp[destinationPointer++] = c1;
AzureIoTClient 0:1f9b2707ec7d 2095 temp[destinationPointer++] = c2;
AzureIoTClient 0:1f9b2707ec7d 2096 temp[destinationPointer++] = '=';
AzureIoTClient 0:1f9b2707ec7d 2097 temp[destinationPointer++] = '=';
AzureIoTClient 0:1f9b2707ec7d 2098 }
AzureIoTClient 0:1f9b2707ec7d 2099
AzureIoTClient 0:1f9b2707ec7d 2100 /*closing quote*/
AzureIoTClient 0:1f9b2707ec7d 2101 temp[destinationPointer++] = '"';
AzureIoTClient 0:1f9b2707ec7d 2102 /*null terminating the string*/
AzureIoTClient 0:1f9b2707ec7d 2103 temp[destinationPointer] = '\0';
AzureIoTClient 0:1f9b2707ec7d 2104
AzureIoTClient 0:1f9b2707ec7d 2105 if (STRING_concat(destination, temp) != 0)
AzureIoTClient 0:1f9b2707ec7d 2106 {
AzureIoTClient 0:1f9b2707ec7d 2107 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2108 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2109 }
AzureIoTClient 0:1f9b2707ec7d 2110 else
AzureIoTClient 0:1f9b2707ec7d 2111 {
AzureIoTClient 0:1f9b2707ec7d 2112 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2113 }
AzureIoTClient 0:1f9b2707ec7d 2114 free(temp);
AzureIoTClient 0:1f9b2707ec7d 2115 }
AzureIoTClient 0:1f9b2707ec7d 2116 break;
AzureIoTClient 0:1f9b2707ec7d 2117 }
AzureIoTClient 0:1f9b2707ec7d 2118 }
AzureIoTClient 0:1f9b2707ec7d 2119 }
AzureIoTClient 0:1f9b2707ec7d 2120 return result;
AzureIoTClient 0:1f9b2707ec7d 2121 }
AzureIoTClient 0:1f9b2707ec7d 2122
AzureIoTClient 0:1f9b2707ec7d 2123 /*return 0 if all names are different than NULL*/
AzureIoTClient 0:1f9b2707ec7d 2124 static int isOneNameNULL(size_t nMemberNames, const char* const * memberNames)
AzureIoTClient 0:1f9b2707ec7d 2125 {
AzureIoTClient 0:1f9b2707ec7d 2126 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2127 int result = 0;
AzureIoTClient 0:1f9b2707ec7d 2128 for (i = 0; i < nMemberNames; i++)
AzureIoTClient 0:1f9b2707ec7d 2129 {
AzureIoTClient 0:1f9b2707ec7d 2130 if (memberNames[i] == NULL)
AzureIoTClient 0:1f9b2707ec7d 2131 {
AzureIoTClient 0:1f9b2707ec7d 2132 result = 1;
AzureIoTClient 0:1f9b2707ec7d 2133 break;
AzureIoTClient 0:1f9b2707ec7d 2134 }
AzureIoTClient 0:1f9b2707ec7d 2135 }
AzureIoTClient 0:1f9b2707ec7d 2136 return result;
AzureIoTClient 0:1f9b2707ec7d 2137 }
AzureIoTClient 0:1f9b2707ec7d 2138
AzureIoTClient 0:1f9b2707ec7d 2139 /*return 0 if all names are different than NULL*/
AzureIoTClient 0:1f9b2707ec7d 2140 static int areThereTwoSameNames(size_t nMemberNames, const char* const * memberNames)
AzureIoTClient 0:1f9b2707ec7d 2141 {
AzureIoTClient 0:1f9b2707ec7d 2142 size_t i, j;
AzureIoTClient 0:1f9b2707ec7d 2143 int result = 0;
AzureIoTClient 0:1f9b2707ec7d 2144 for (i = 0; i < nMemberNames-1; i++)
AzureIoTClient 0:1f9b2707ec7d 2145 {
AzureIoTClient 0:1f9b2707ec7d 2146 for (j = i + 1; j < nMemberNames; j++)
AzureIoTClient 0:1f9b2707ec7d 2147 {
AzureIoTClient 0:1f9b2707ec7d 2148 if (strcmp(memberNames[i], memberNames[j]) == 0)
AzureIoTClient 0:1f9b2707ec7d 2149 {
AzureIoTClient 0:1f9b2707ec7d 2150 result = 1;
AzureIoTClient 0:1f9b2707ec7d 2151 goto out;
AzureIoTClient 0:1f9b2707ec7d 2152 }
AzureIoTClient 0:1f9b2707ec7d 2153 }
AzureIoTClient 0:1f9b2707ec7d 2154 }
AzureIoTClient 0:1f9b2707ec7d 2155 out:
AzureIoTClient 0:1f9b2707ec7d 2156 return result;
AzureIoTClient 0:1f9b2707ec7d 2157 }
AzureIoTClient 0:1f9b2707ec7d 2158
AzureIoTClient 0:1f9b2707ec7d 2159 static void DestroyHalfBakedComplexType(AGENT_DATA_TYPE* agentData)
AzureIoTClient 0:1f9b2707ec7d 2160 {
AzureIoTClient 0:1f9b2707ec7d 2161 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2162 if (agentData != NULL)
AzureIoTClient 0:1f9b2707ec7d 2163 {
AzureIoTClient 0:1f9b2707ec7d 2164 if (agentData->type == EDM_COMPLEX_TYPE_TYPE)
AzureIoTClient 0:1f9b2707ec7d 2165 {
AzureIoTClient 0:1f9b2707ec7d 2166 if (agentData->value.edmComplexType.fields != NULL)
AzureIoTClient 0:1f9b2707ec7d 2167 {
AzureIoTClient 0:1f9b2707ec7d 2168 for (i = 0; i < agentData->value.edmComplexType.nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2169 {
AzureIoTClient 0:1f9b2707ec7d 2170 if (agentData->value.edmComplexType.fields[i].fieldName != NULL)
AzureIoTClient 0:1f9b2707ec7d 2171 {
AzureIoTClient 0:1f9b2707ec7d 2172 free((void*)(agentData->value.edmComplexType.fields[i].fieldName));
AzureIoTClient 0:1f9b2707ec7d 2173 agentData->value.edmComplexType.fields[i].fieldName = NULL;
AzureIoTClient 0:1f9b2707ec7d 2174 }
AzureIoTClient 0:1f9b2707ec7d 2175 if (agentData->value.edmComplexType.fields[i].value != NULL)
AzureIoTClient 0:1f9b2707ec7d 2176 {
AzureIoTClient 0:1f9b2707ec7d 2177 Destroy_AGENT_DATA_TYPE(agentData->value.edmComplexType.fields[i].value);
AzureIoTClient 0:1f9b2707ec7d 2178 free(agentData->value.edmComplexType.fields[i].value);
AzureIoTClient 0:1f9b2707ec7d 2179 agentData->value.edmComplexType.fields[i].value = NULL;
AzureIoTClient 0:1f9b2707ec7d 2180 }
AzureIoTClient 0:1f9b2707ec7d 2181 }
AzureIoTClient 0:1f9b2707ec7d 2182 free(agentData->value.edmComplexType.fields);
AzureIoTClient 0:1f9b2707ec7d 2183 agentData->value.edmComplexType.fields = NULL;
AzureIoTClient 0:1f9b2707ec7d 2184 }
AzureIoTClient 0:1f9b2707ec7d 2185 agentData->type = EDM_NO_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2186 }
AzureIoTClient 0:1f9b2707ec7d 2187 }
AzureIoTClient 0:1f9b2707ec7d 2188 }
AzureIoTClient 0:1f9b2707ec7d 2189
AzureIoTClient 0:1f9b2707ec7d 2190 /* Creates an object of AGENT_DATA_TYPE_TYPE EDM_NULL_TYPE*/
AzureIoTClient 0:1f9b2707ec7d 2191 AGENT_DATA_TYPES_RESULT Create_NULL_AGENT_DATA_TYPE(AGENT_DATA_TYPE* agentData)
AzureIoTClient 0:1f9b2707ec7d 2192 {
AzureIoTClient 0:1f9b2707ec7d 2193 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2194 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 2195 {
AzureIoTClient 0:1f9b2707ec7d 2196 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2197 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2198 }
AzureIoTClient 0:1f9b2707ec7d 2199 else
AzureIoTClient 0:1f9b2707ec7d 2200 {
AzureIoTClient 0:1f9b2707ec7d 2201 agentData->type = EDM_NULL_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2202 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2203 }
AzureIoTClient 0:1f9b2707ec7d 2204 return result;
AzureIoTClient 0:1f9b2707ec7d 2205 }
AzureIoTClient 0:1f9b2707ec7d 2206 /*creates a copy of the AGENT_DATA_TYPE*/
AzureIoTClient 0:1f9b2707ec7d 2207 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE(AGENT_DATA_TYPE* dest, const AGENT_DATA_TYPE* src)
AzureIoTClient 0:1f9b2707ec7d 2208 {
AzureIoTClient 0:1f9b2707ec7d 2209 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2210 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2211 if ((dest == NULL) || (src == NULL))
AzureIoTClient 0:1f9b2707ec7d 2212 {
AzureIoTClient 0:1f9b2707ec7d 2213 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2214 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2215 }
AzureIoTClient 0:1f9b2707ec7d 2216 else
AzureIoTClient 0:1f9b2707ec7d 2217 {
AzureIoTClient 0:1f9b2707ec7d 2218 switch (src->type)
AzureIoTClient 0:1f9b2707ec7d 2219 {
AzureIoTClient 0:1f9b2707ec7d 2220 default:
AzureIoTClient 0:1f9b2707ec7d 2221 {
AzureIoTClient 0:1f9b2707ec7d 2222 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2223 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2224 break;
AzureIoTClient 0:1f9b2707ec7d 2225 }
AzureIoTClient 0:1f9b2707ec7d 2226 case(EDM_NO_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2227 case(EDM_NULL_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2228 {
AzureIoTClient 0:1f9b2707ec7d 2229 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2230 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2231 break;
AzureIoTClient 0:1f9b2707ec7d 2232 }
AzureIoTClient 0:1f9b2707ec7d 2233 case(EDM_BOOLEAN_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2234 {
AzureIoTClient 0:1f9b2707ec7d 2235 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2236 dest->value.edmBoolean= src->value.edmBoolean;
AzureIoTClient 0:1f9b2707ec7d 2237 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2238 break;
AzureIoTClient 0:1f9b2707ec7d 2239 }
AzureIoTClient 0:1f9b2707ec7d 2240 case(EDM_BYTE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2241 {
AzureIoTClient 0:1f9b2707ec7d 2242 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2243 dest->value.edmByte= src->value.edmByte;
AzureIoTClient 0:1f9b2707ec7d 2244 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2245 break;
AzureIoTClient 0:1f9b2707ec7d 2246 }
AzureIoTClient 0:1f9b2707ec7d 2247 case(EDM_DATE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2248 {
AzureIoTClient 0:1f9b2707ec7d 2249 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2250 dest->value.edmDate = src->value.edmDate;
AzureIoTClient 0:1f9b2707ec7d 2251 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2252 break;
AzureIoTClient 0:1f9b2707ec7d 2253 }
AzureIoTClient 0:1f9b2707ec7d 2254 case(EDM_DATE_TIME_OFFSET_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2255 {
AzureIoTClient 0:1f9b2707ec7d 2256 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2257 dest->value.edmDateTimeOffset = src->value.edmDateTimeOffset;
AzureIoTClient 0:1f9b2707ec7d 2258 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2259 break;
AzureIoTClient 0:1f9b2707ec7d 2260 }
AzureIoTClient 0:1f9b2707ec7d 2261 case(EDM_DECIMAL_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2262 {
AzureIoTClient 0:1f9b2707ec7d 2263 if ((dest->value.edmDecimal.value = STRING_clone(src->value.edmDecimal.value)) == NULL)
AzureIoTClient 0:1f9b2707ec7d 2264 {
AzureIoTClient 0:1f9b2707ec7d 2265 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2266 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2267 }
AzureIoTClient 0:1f9b2707ec7d 2268 else
AzureIoTClient 0:1f9b2707ec7d 2269 {
AzureIoTClient 0:1f9b2707ec7d 2270 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2271 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2272 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 2273 }
AzureIoTClient 0:1f9b2707ec7d 2274 break;
AzureIoTClient 0:1f9b2707ec7d 2275 }
AzureIoTClient 0:1f9b2707ec7d 2276 case(EDM_DOUBLE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2277 {
AzureIoTClient 0:1f9b2707ec7d 2278 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2279 dest->value.edmDouble = src->value.edmDouble;
AzureIoTClient 0:1f9b2707ec7d 2280 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2281 break;
AzureIoTClient 0:1f9b2707ec7d 2282 }
AzureIoTClient 0:1f9b2707ec7d 2283 case(EDM_DURATION_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2284 {
AzureIoTClient 0:1f9b2707ec7d 2285 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2286 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2287 break;
AzureIoTClient 0:1f9b2707ec7d 2288 }
AzureIoTClient 0:1f9b2707ec7d 2289 case(EDM_GUID_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2290 {
AzureIoTClient 0:1f9b2707ec7d 2291 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2292 dest->value.edmGuid = src->value.edmGuid;
AzureIoTClient 0:1f9b2707ec7d 2293 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2294 break;
AzureIoTClient 0:1f9b2707ec7d 2295 }
AzureIoTClient 0:1f9b2707ec7d 2296 case EDM_BINARY_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2297 {
AzureIoTClient 0:1f9b2707ec7d 2298 if (src->value.edmBinary.size == 0)
AzureIoTClient 0:1f9b2707ec7d 2299 {
AzureIoTClient 0:1f9b2707ec7d 2300 dest->value.edmBinary.size = 0;
AzureIoTClient 0:1f9b2707ec7d 2301 dest->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 2302 dest->type = EDM_BINARY_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2303 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2304 }
AzureIoTClient 0:1f9b2707ec7d 2305 else
AzureIoTClient 0:1f9b2707ec7d 2306 {
AzureIoTClient 0:1f9b2707ec7d 2307 if ((dest->value.edmBinary.data = (unsigned char*)malloc(src->value.edmBinary.size)) == NULL)
AzureIoTClient 0:1f9b2707ec7d 2308 {
AzureIoTClient 0:1f9b2707ec7d 2309 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2310 }
AzureIoTClient 0:1f9b2707ec7d 2311 else
AzureIoTClient 0:1f9b2707ec7d 2312 {
AzureIoTClient 0:1f9b2707ec7d 2313 dest->value.edmBinary.size = src->value.edmBinary.size;
AzureIoTClient 0:1f9b2707ec7d 2314 memcpy(dest->value.edmBinary.data, src->value.edmBinary.data, src->value.edmBinary.size);
AzureIoTClient 0:1f9b2707ec7d 2315 dest->type = EDM_BINARY_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2316 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2317 }
AzureIoTClient 0:1f9b2707ec7d 2318 }
AzureIoTClient 0:1f9b2707ec7d 2319 break;
AzureIoTClient 0:1f9b2707ec7d 2320 }
AzureIoTClient 0:1f9b2707ec7d 2321 case(EDM_INT16_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2322 {
AzureIoTClient 0:1f9b2707ec7d 2323 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2324 dest->value.edmInt16 = src->value.edmInt16;
AzureIoTClient 0:1f9b2707ec7d 2325 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2326 break;
AzureIoTClient 0:1f9b2707ec7d 2327 }
AzureIoTClient 0:1f9b2707ec7d 2328 case(EDM_INT32_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2329 {
AzureIoTClient 0:1f9b2707ec7d 2330 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2331 dest->value.edmInt32 = src->value.edmInt32;
AzureIoTClient 0:1f9b2707ec7d 2332 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2333 break;
AzureIoTClient 0:1f9b2707ec7d 2334 }
AzureIoTClient 0:1f9b2707ec7d 2335 case(EDM_INT64_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2336 {
AzureIoTClient 0:1f9b2707ec7d 2337 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2338 dest->value.edmInt64 = src->value.edmInt64;
AzureIoTClient 0:1f9b2707ec7d 2339 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2340 break;
AzureIoTClient 0:1f9b2707ec7d 2341 }
AzureIoTClient 0:1f9b2707ec7d 2342 case(EDM_SBYTE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2343 {
AzureIoTClient 0:1f9b2707ec7d 2344 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2345 dest->value.edmSbyte = src->value.edmSbyte;
AzureIoTClient 0:1f9b2707ec7d 2346 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2347 break;
AzureIoTClient 0:1f9b2707ec7d 2348 }
AzureIoTClient 0:1f9b2707ec7d 2349 case(EDM_SINGLE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2350 {
AzureIoTClient 0:1f9b2707ec7d 2351 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2352 dest->value.edmSingle = src->value.edmSingle;
AzureIoTClient 0:1f9b2707ec7d 2353 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2354 break;
AzureIoTClient 0:1f9b2707ec7d 2355 }
AzureIoTClient 0:1f9b2707ec7d 2356 case(EDM_STREAM) :
AzureIoTClient 0:1f9b2707ec7d 2357 {
AzureIoTClient 0:1f9b2707ec7d 2358 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2359 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2360 break;
AzureIoTClient 0:1f9b2707ec7d 2361 } /*not supported, because what is stream?*/
AzureIoTClient 0:1f9b2707ec7d 2362 case(EDM_STRING_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2363 {
AzureIoTClient 0:1f9b2707ec7d 2364 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2365 dest->value.edmString.length = src->value.edmString.length;
AzureIoTClient 0:1f9b2707ec7d 2366 if (mallocAndStrcpy_s((char**)&(dest->value.edmString.chars), (char*)src->value.edmString.chars) != 0)
AzureIoTClient 0:1f9b2707ec7d 2367 {
AzureIoTClient 0:1f9b2707ec7d 2368 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2369 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2370 }
AzureIoTClient 0:1f9b2707ec7d 2371 else
AzureIoTClient 0:1f9b2707ec7d 2372 {
AzureIoTClient 0:1f9b2707ec7d 2373 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2374 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 2375 }
AzureIoTClient 0:1f9b2707ec7d 2376 break;
AzureIoTClient 0:1f9b2707ec7d 2377 }
AzureIoTClient 0:1f9b2707ec7d 2378 case(EDM_STRING_NO_QUOTES_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2379 {
AzureIoTClient 0:1f9b2707ec7d 2380 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2381 dest->value.edmStringNoQuotes.length = src->value.edmStringNoQuotes.length;
AzureIoTClient 0:1f9b2707ec7d 2382 if (mallocAndStrcpy_s((char**)&(dest->value.edmStringNoQuotes.chars), (char*)src->value.edmStringNoQuotes.chars) != 0)
AzureIoTClient 0:1f9b2707ec7d 2383 {
AzureIoTClient 0:1f9b2707ec7d 2384 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2385 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2386 }
AzureIoTClient 0:1f9b2707ec7d 2387 else
AzureIoTClient 0:1f9b2707ec7d 2388 {
AzureIoTClient 0:1f9b2707ec7d 2389 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2390 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 2391 }
AzureIoTClient 0:1f9b2707ec7d 2392 break;
AzureIoTClient 0:1f9b2707ec7d 2393 }
AzureIoTClient 0:1f9b2707ec7d 2394 case(EDM_TIME_OF_DAY_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2395 {
AzureIoTClient 0:1f9b2707ec7d 2396 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2397 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2398 break;
AzureIoTClient 0:1f9b2707ec7d 2399 }
AzureIoTClient 0:1f9b2707ec7d 2400 case(EDM_GEOGRAPHY_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2401 {
AzureIoTClient 0:1f9b2707ec7d 2402 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2403 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2404 break;
AzureIoTClient 0:1f9b2707ec7d 2405 } /*not supported because what is "abstract base type"*/
AzureIoTClient 0:1f9b2707ec7d 2406 case(EDM_GEOGRAPHY_POINT_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2407 {
AzureIoTClient 0:1f9b2707ec7d 2408 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2409 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2410 break;
AzureIoTClient 0:1f9b2707ec7d 2411 }
AzureIoTClient 0:1f9b2707ec7d 2412 case(EDM_GEOGRAPHY_LINE_STRING_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2413 {
AzureIoTClient 0:1f9b2707ec7d 2414 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2415 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2416 break;
AzureIoTClient 0:1f9b2707ec7d 2417 }
AzureIoTClient 0:1f9b2707ec7d 2418 case(EDM_GEOGRAPHY_POLYGON_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2419 {
AzureIoTClient 0:1f9b2707ec7d 2420 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2421 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2422 break;
AzureIoTClient 0:1f9b2707ec7d 2423 }
AzureIoTClient 0:1f9b2707ec7d 2424 case(EDM_GEOGRAPHY_MULTI_POINT_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2425 {
AzureIoTClient 0:1f9b2707ec7d 2426 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2427 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2428 break;
AzureIoTClient 0:1f9b2707ec7d 2429 }
AzureIoTClient 0:1f9b2707ec7d 2430 case(EDM_GEOGRAPHY_MULTI_LINE_STRING_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2431 {
AzureIoTClient 0:1f9b2707ec7d 2432 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2433 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2434 break;
AzureIoTClient 0:1f9b2707ec7d 2435 }
AzureIoTClient 0:1f9b2707ec7d 2436 case(EDM_GEOGRAPHY_MULTI_POLYGON_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2437 {
AzureIoTClient 0:1f9b2707ec7d 2438 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2439 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2440 break;
AzureIoTClient 0:1f9b2707ec7d 2441 }
AzureIoTClient 0:1f9b2707ec7d 2442 case(EDM_GEOGRAPHY_COLLECTION_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2443 {
AzureIoTClient 0:1f9b2707ec7d 2444 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2445 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2446 break;
AzureIoTClient 0:1f9b2707ec7d 2447 }
AzureIoTClient 0:1f9b2707ec7d 2448 case(EDM_GEOMETRY_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2449 {
AzureIoTClient 0:1f9b2707ec7d 2450 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2451 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2452 break;
AzureIoTClient 0:1f9b2707ec7d 2453 } /*not supported because what is "abstract base type"*/
AzureIoTClient 0:1f9b2707ec7d 2454 case(EDM_GEOMETRY_POINT_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2455 {
AzureIoTClient 0:1f9b2707ec7d 2456 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2457 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2458 break;
AzureIoTClient 0:1f9b2707ec7d 2459 }
AzureIoTClient 0:1f9b2707ec7d 2460 case(EDM_GEOMETRY_LINE_STRING_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2461 {
AzureIoTClient 0:1f9b2707ec7d 2462 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2463 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2464 break;
AzureIoTClient 0:1f9b2707ec7d 2465 }
AzureIoTClient 0:1f9b2707ec7d 2466 case(EDM_GEOMETRY_POLYGON_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2467 {
AzureIoTClient 0:1f9b2707ec7d 2468 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2469 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2470 break;
AzureIoTClient 0:1f9b2707ec7d 2471 }
AzureIoTClient 0:1f9b2707ec7d 2472 case(EDM_GEOMETRY_MULTI_POINT_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2473 {
AzureIoTClient 0:1f9b2707ec7d 2474 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2475 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2476 break;
AzureIoTClient 0:1f9b2707ec7d 2477 }
AzureIoTClient 0:1f9b2707ec7d 2478 case(EDM_GEOMETRY_MULTI_LINE_STRING_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2479 {
AzureIoTClient 0:1f9b2707ec7d 2480 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2481 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2482 break;
AzureIoTClient 0:1f9b2707ec7d 2483 }
AzureIoTClient 0:1f9b2707ec7d 2484 case(EDM_GEOMETRY_MULTI_POLYGON_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2485 {
AzureIoTClient 0:1f9b2707ec7d 2486 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2487 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2488 break;
AzureIoTClient 0:1f9b2707ec7d 2489 }
AzureIoTClient 0:1f9b2707ec7d 2490 case(EDM_GEOMETRY_COLLECTION_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2491 {
AzureIoTClient 0:1f9b2707ec7d 2492 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2493 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2494 break;
AzureIoTClient 0:1f9b2707ec7d 2495 }
AzureIoTClient 0:1f9b2707ec7d 2496 case(EDM_COMPLEX_TYPE_TYPE) :
AzureIoTClient 0:1f9b2707ec7d 2497 {
AzureIoTClient 0:1f9b2707ec7d 2498 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2499 /*copying a COMPLEX_TYPE means to copy all its member names and all its fields*/
AzureIoTClient 0:1f9b2707ec7d 2500 dest->type = src->type;
AzureIoTClient 0:1f9b2707ec7d 2501 if (src->value.edmComplexType.nMembers == 0)
AzureIoTClient 0:1f9b2707ec7d 2502 {
AzureIoTClient 0:1f9b2707ec7d 2503 /*error*/
AzureIoTClient 0:1f9b2707ec7d 2504 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2505 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2506 }
AzureIoTClient 0:1f9b2707ec7d 2507 else
AzureIoTClient 0:1f9b2707ec7d 2508 {
AzureIoTClient 0:1f9b2707ec7d 2509 dest->value.edmComplexType.nMembers = src->value.edmComplexType.nMembers;
AzureIoTClient 0:1f9b2707ec7d 2510 dest->value.edmComplexType.fields = (COMPLEX_TYPE_FIELD_TYPE*)malloc(dest->value.edmComplexType.nMembers * sizeof(COMPLEX_TYPE_FIELD_TYPE));
AzureIoTClient 0:1f9b2707ec7d 2511 if (dest->value.edmComplexType.fields == NULL)
AzureIoTClient 0:1f9b2707ec7d 2512 {
AzureIoTClient 0:1f9b2707ec7d 2513 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2514 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2515 }
AzureIoTClient 0:1f9b2707ec7d 2516 else
AzureIoTClient 0:1f9b2707ec7d 2517 {
AzureIoTClient 0:1f9b2707ec7d 2518 for (i = 0; i < dest->value.edmComplexType.nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2519 {
AzureIoTClient 0:1f9b2707ec7d 2520 dest->value.edmComplexType.fields[i].fieldName = NULL;
AzureIoTClient 0:1f9b2707ec7d 2521 dest->value.edmComplexType.fields[i].value = NULL;
AzureIoTClient 0:1f9b2707ec7d 2522 }
AzureIoTClient 0:1f9b2707ec7d 2523
AzureIoTClient 0:1f9b2707ec7d 2524 for (i = 0; i < dest->value.edmComplexType.nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2525 {
AzureIoTClient 0:1f9b2707ec7d 2526 /*copy the name of this field*/
AzureIoTClient 0:1f9b2707ec7d 2527 if (mallocAndStrcpy_s((char**)(&(dest->value.edmComplexType.fields[i].fieldName)), src->value.edmComplexType.fields[i].fieldName) != 0)
AzureIoTClient 0:1f9b2707ec7d 2528 {
AzureIoTClient 0:1f9b2707ec7d 2529 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2530 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2531 break;
AzureIoTClient 0:1f9b2707ec7d 2532 }
AzureIoTClient 0:1f9b2707ec7d 2533 else
AzureIoTClient 0:1f9b2707ec7d 2534 {
AzureIoTClient 0:1f9b2707ec7d 2535 /*field name copied success*/
AzureIoTClient 0:1f9b2707ec7d 2536 /*field value copy follows*/
AzureIoTClient 0:1f9b2707ec7d 2537 dest->value.edmComplexType.fields[i].value = (AGENT_DATA_TYPE*)malloc(sizeof(AGENT_DATA_TYPE));
AzureIoTClient 0:1f9b2707ec7d 2538 if (dest->value.edmComplexType.fields[i].value == NULL)
AzureIoTClient 0:1f9b2707ec7d 2539 {
AzureIoTClient 0:1f9b2707ec7d 2540 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2541 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2542 break;
AzureIoTClient 0:1f9b2707ec7d 2543 }
AzureIoTClient 0:1f9b2707ec7d 2544 else
AzureIoTClient 0:1f9b2707ec7d 2545 {
AzureIoTClient 0:1f9b2707ec7d 2546 if (Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE(dest->value.edmComplexType.fields[i].value, src->value.edmComplexType.fields[i].value) != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2547 {
AzureIoTClient 0:1f9b2707ec7d 2548 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2549 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2550 break;
AzureIoTClient 0:1f9b2707ec7d 2551 }
AzureIoTClient 0:1f9b2707ec7d 2552 else
AzureIoTClient 0:1f9b2707ec7d 2553 {
AzureIoTClient 0:1f9b2707ec7d 2554 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 2555 }
AzureIoTClient 0:1f9b2707ec7d 2556 }
AzureIoTClient 0:1f9b2707ec7d 2557 }
AzureIoTClient 0:1f9b2707ec7d 2558 }
AzureIoTClient 0:1f9b2707ec7d 2559
AzureIoTClient 0:1f9b2707ec7d 2560 if (result != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2561 {
AzureIoTClient 0:1f9b2707ec7d 2562 /*unbuild*/
AzureIoTClient 0:1f9b2707ec7d 2563 DestroyHalfBakedComplexType(dest);
AzureIoTClient 0:1f9b2707ec7d 2564 }
AzureIoTClient 0:1f9b2707ec7d 2565 }
AzureIoTClient 0:1f9b2707ec7d 2566 }
AzureIoTClient 0:1f9b2707ec7d 2567 break;
AzureIoTClient 0:1f9b2707ec7d 2568 } /*ANY CHANGE (?!) here must be reflected in the tool providing the binary file (XML2BINARY) */
AzureIoTClient 0:1f9b2707ec7d 2569 }
AzureIoTClient 0:1f9b2707ec7d 2570
AzureIoTClient 0:1f9b2707ec7d 2571 if (result != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2572 {
AzureIoTClient 0:1f9b2707ec7d 2573 dest->type = EDM_NO_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2574 }
AzureIoTClient 0:1f9b2707ec7d 2575 }
AzureIoTClient 0:1f9b2707ec7d 2576
AzureIoTClient 0:1f9b2707ec7d 2577 return result;
AzureIoTClient 0:1f9b2707ec7d 2578 }
AzureIoTClient 0:1f9b2707ec7d 2579
AzureIoTClient 0:1f9b2707ec7d 2580 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_MemberPointers(AGENT_DATA_TYPE* agentData, const char* typeName, size_t nMembers, const char* const * memberNames, const AGENT_DATA_TYPE** memberPointerValues)
AzureIoTClient 0:1f9b2707ec7d 2581 {
AzureIoTClient 0:1f9b2707ec7d 2582 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2583
AzureIoTClient 0:1f9b2707ec7d 2584 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_109:[ AGENT_DATA_TYPES_INVALID_ARG shall be returned if memberPointerValues parameter is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2585 if (memberPointerValues == NULL)
AzureIoTClient 0:1f9b2707ec7d 2586 {
AzureIoTClient 0:1f9b2707ec7d 2587 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2588 LogError("(result: AGENT_DATA_TYPES_INVALID_ARG)\r\n");
AzureIoTClient 0:1f9b2707ec7d 2589 }
AzureIoTClient 0:1f9b2707ec7d 2590 else
AzureIoTClient 0:1f9b2707ec7d 2591 {
AzureIoTClient 0:1f9b2707ec7d 2592 AGENT_DATA_TYPE* values = (AGENT_DATA_TYPE*)malloc(nMembers* sizeof(AGENT_DATA_TYPE));
AzureIoTClient 0:1f9b2707ec7d 2593 if (values == NULL)
AzureIoTClient 0:1f9b2707ec7d 2594 {
AzureIoTClient 0:1f9b2707ec7d 2595 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2596 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2597 }
AzureIoTClient 0:1f9b2707ec7d 2598 else
AzureIoTClient 0:1f9b2707ec7d 2599 {
AzureIoTClient 0:1f9b2707ec7d 2600 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2601 for (i = 0; i < nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2602 {
AzureIoTClient 0:1f9b2707ec7d 2603 if (Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE(values + i, memberPointerValues[i]) != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2604 {
AzureIoTClient 0:1f9b2707ec7d 2605 size_t j;
AzureIoTClient 0:1f9b2707ec7d 2606 for (j = 0; j < i; j++)
AzureIoTClient 0:1f9b2707ec7d 2607 {
AzureIoTClient 0:1f9b2707ec7d 2608 Destroy_AGENT_DATA_TYPE(values + j);
AzureIoTClient 0:1f9b2707ec7d 2609 }
AzureIoTClient 0:1f9b2707ec7d 2610 break;
AzureIoTClient 0:1f9b2707ec7d 2611 }
AzureIoTClient 0:1f9b2707ec7d 2612 }
AzureIoTClient 0:1f9b2707ec7d 2613
AzureIoTClient 0:1f9b2707ec7d 2614 if (i != nMembers)
AzureIoTClient 0:1f9b2707ec7d 2615 {
AzureIoTClient 0:1f9b2707ec7d 2616 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2617 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2618 }
AzureIoTClient 0:1f9b2707ec7d 2619 else
AzureIoTClient 0:1f9b2707ec7d 2620 {
AzureIoTClient 0:1f9b2707ec7d 2621 /* SRS_AGENT_TYPE_SYSTEM_99_111:[ AGENT_DATA_TYPES_OK shall be returned upon success.] */
AzureIoTClient 0:1f9b2707ec7d 2622 result = Create_AGENT_DATA_TYPE_from_Members(agentData, typeName, nMembers, memberNames, values);
AzureIoTClient 0:1f9b2707ec7d 2623 if (result != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2624 {
AzureIoTClient 0:1f9b2707ec7d 2625 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2626 }
AzureIoTClient 0:1f9b2707ec7d 2627 for (i = 0; i < nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2628 {
AzureIoTClient 0:1f9b2707ec7d 2629 Destroy_AGENT_DATA_TYPE(&values[i]);
AzureIoTClient 0:1f9b2707ec7d 2630 }
AzureIoTClient 0:1f9b2707ec7d 2631 }
AzureIoTClient 0:1f9b2707ec7d 2632 free(values);
AzureIoTClient 0:1f9b2707ec7d 2633 }
AzureIoTClient 0:1f9b2707ec7d 2634 }
AzureIoTClient 0:1f9b2707ec7d 2635 return result;
AzureIoTClient 0:1f9b2707ec7d 2636 }
AzureIoTClient 0:1f9b2707ec7d 2637
AzureIoTClient 0:1f9b2707ec7d 2638 AGENT_DATA_TYPES_RESULT Create_AGENT_DATA_TYPE_from_Members(AGENT_DATA_TYPE* agentData, const char* typeName, size_t nMembers, const char* const * memberNames, const AGENT_DATA_TYPE* memberValues)
AzureIoTClient 0:1f9b2707ec7d 2639 {
AzureIoTClient 0:1f9b2707ec7d 2640 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2641 size_t i;
AzureIoTClient 0:1f9b2707ec7d 2642 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_013:[ All the functions shall check their parameters for validity. When an invalid parameter is detected, the value AGENT_DATA_TYPES_INVALID_ARG shall be returned ]*/
AzureIoTClient 0:1f9b2707ec7d 2643 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 2644 {
AzureIoTClient 0:1f9b2707ec7d 2645 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2646 LogError("(result: AGENT_DATA_TYPES_INVALID_ARG)\r\n");
AzureIoTClient 0:1f9b2707ec7d 2647 }
AzureIoTClient 0:1f9b2707ec7d 2648 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_055:[ If typeName is NULL, the function shall return AGENT_DATA_TYPES_INVALID_ARG .]*/
AzureIoTClient 0:1f9b2707ec7d 2649 else if (typeName==NULL)
AzureIoTClient 0:1f9b2707ec7d 2650 {
AzureIoTClient 0:1f9b2707ec7d 2651 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2652 LogError("(result: AGENT_DATA_TYPES_INVALID_ARG)\r\n");
AzureIoTClient 0:1f9b2707ec7d 2653 }
AzureIoTClient 0:1f9b2707ec7d 2654 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_056:[If nMembers is 0, the function shall return AGENT_DATA_TYPES_INVALID_ARG .]*/
AzureIoTClient 0:1f9b2707ec7d 2655 else if (nMembers == 0)
AzureIoTClient 0:1f9b2707ec7d 2656 {
AzureIoTClient 0:1f9b2707ec7d 2657 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2658 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2659 }
AzureIoTClient 0:1f9b2707ec7d 2660 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_057:[ If memberNames is NULL, the function shall return AGENT_DATA_TYPES_INVALID_ARG .]*/
AzureIoTClient 0:1f9b2707ec7d 2661 else if (memberNames == NULL)
AzureIoTClient 0:1f9b2707ec7d 2662 {
AzureIoTClient 0:1f9b2707ec7d 2663 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2664 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2665 }
AzureIoTClient 0:1f9b2707ec7d 2666 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_058:[ If any of the memberNames[i] is NULL, the function shall return AGENT_DATA_TYPES_INVALID_ARG .]*/
AzureIoTClient 0:1f9b2707ec7d 2667 else if (isOneNameNULL(nMembers, memberNames)!=0)
AzureIoTClient 0:1f9b2707ec7d 2668 {
AzureIoTClient 0:1f9b2707ec7d 2669 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2670 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2671 }
AzureIoTClient 0:1f9b2707ec7d 2672 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_059:[ If memberValues is NULL, the function shall return AGENT_DATA_TYPES_INVALID_ARG .]*/
AzureIoTClient 0:1f9b2707ec7d 2673 else if (memberValues == NULL)
AzureIoTClient 0:1f9b2707ec7d 2674 {
AzureIoTClient 0:1f9b2707ec7d 2675 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2676 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2677 }
AzureIoTClient 0:1f9b2707ec7d 2678 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_063:[ If there are two memberNames with the same name, then the function shall return AGENT_DATA_TYPES_INVALID_ARG.]*/
AzureIoTClient 0:1f9b2707ec7d 2679 else if (areThereTwoSameNames(nMembers, memberNames) != 0)
AzureIoTClient 0:1f9b2707ec7d 2680 {
AzureIoTClient 0:1f9b2707ec7d 2681 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2682 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2683 }
AzureIoTClient 0:1f9b2707ec7d 2684 else
AzureIoTClient 0:1f9b2707ec7d 2685 {
AzureIoTClient 0:1f9b2707ec7d 2686 agentData->value.edmComplexType.nMembers = nMembers;
AzureIoTClient 0:1f9b2707ec7d 2687 agentData->value.edmComplexType.fields = (COMPLEX_TYPE_FIELD_TYPE*)malloc(nMembers *sizeof(COMPLEX_TYPE_FIELD_TYPE));
AzureIoTClient 0:1f9b2707ec7d 2688 if (agentData->value.edmComplexType.fields == NULL)
AzureIoTClient 0:1f9b2707ec7d 2689 {
AzureIoTClient 0:1f9b2707ec7d 2690 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2691 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2692 }
AzureIoTClient 0:1f9b2707ec7d 2693 else
AzureIoTClient 0:1f9b2707ec7d 2694 {
AzureIoTClient 0:1f9b2707ec7d 2695 result = AGENT_DATA_TYPES_OK; /*not liking this, solution might be to use a temp variable*/
AzureIoTClient 0:1f9b2707ec7d 2696
AzureIoTClient 0:1f9b2707ec7d 2697 /*initialize the fields*/
AzureIoTClient 0:1f9b2707ec7d 2698 for (i = 0; i < nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2699 {
AzureIoTClient 0:1f9b2707ec7d 2700 agentData->value.edmComplexType.fields[i].fieldName = NULL;
AzureIoTClient 0:1f9b2707ec7d 2701 agentData->value.edmComplexType.fields[i].value = NULL;
AzureIoTClient 0:1f9b2707ec7d 2702 }
AzureIoTClient 0:1f9b2707ec7d 2703
AzureIoTClient 0:1f9b2707ec7d 2704 for (i = 0; i < nMembers; i++)
AzureIoTClient 0:1f9b2707ec7d 2705 {
AzureIoTClient 0:1f9b2707ec7d 2706 /*copy the name*/
AzureIoTClient 0:1f9b2707ec7d 2707 if (mallocAndStrcpy_s((char**)(&(agentData->value.edmComplexType.fields[i].fieldName)), memberNames[i]) != 0)
AzureIoTClient 0:1f9b2707ec7d 2708 {
AzureIoTClient 0:1f9b2707ec7d 2709 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2710 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2711 break;
AzureIoTClient 0:1f9b2707ec7d 2712 }
AzureIoTClient 0:1f9b2707ec7d 2713 else
AzureIoTClient 0:1f9b2707ec7d 2714 {
AzureIoTClient 0:1f9b2707ec7d 2715 /*field name was transferred successfully*/
AzureIoTClient 0:1f9b2707ec7d 2716 /*copy the rest*/
AzureIoTClient 0:1f9b2707ec7d 2717 agentData->value.edmComplexType.fields[i].value = (AGENT_DATA_TYPE*)malloc(sizeof(AGENT_DATA_TYPE));
AzureIoTClient 0:1f9b2707ec7d 2718 if (agentData->value.edmComplexType.fields[i].value == NULL)
AzureIoTClient 0:1f9b2707ec7d 2719 {
AzureIoTClient 0:1f9b2707ec7d 2720 /*deallocate the name*/
AzureIoTClient 0:1f9b2707ec7d 2721 free((void*)(agentData->value.edmComplexType.fields[i].fieldName));
AzureIoTClient 0:1f9b2707ec7d 2722 agentData->value.edmComplexType.fields[i].fieldName = NULL;
AzureIoTClient 0:1f9b2707ec7d 2723 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2724 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2725 break;
AzureIoTClient 0:1f9b2707ec7d 2726 }
AzureIoTClient 0:1f9b2707ec7d 2727 else
AzureIoTClient 0:1f9b2707ec7d 2728 {
AzureIoTClient 0:1f9b2707ec7d 2729 /*copy the values*/
AzureIoTClient 0:1f9b2707ec7d 2730 if (Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE(agentData->value.edmComplexType.fields[i].value, &(memberValues[i])) != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2731 {
AzureIoTClient 0:1f9b2707ec7d 2732 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 2733 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2734 break;
AzureIoTClient 0:1f9b2707ec7d 2735 }
AzureIoTClient 0:1f9b2707ec7d 2736 else
AzureIoTClient 0:1f9b2707ec7d 2737 {
AzureIoTClient 0:1f9b2707ec7d 2738 /*all is fine*/
AzureIoTClient 0:1f9b2707ec7d 2739 }
AzureIoTClient 0:1f9b2707ec7d 2740 }
AzureIoTClient 0:1f9b2707ec7d 2741 }
AzureIoTClient 0:1f9b2707ec7d 2742
AzureIoTClient 0:1f9b2707ec7d 2743 }
AzureIoTClient 0:1f9b2707ec7d 2744 }
AzureIoTClient 0:1f9b2707ec7d 2745
AzureIoTClient 0:1f9b2707ec7d 2746 if (result != AGENT_DATA_TYPES_OK)
AzureIoTClient 0:1f9b2707ec7d 2747 {
AzureIoTClient 0:1f9b2707ec7d 2748 /*dealloc, something went bad*/
AzureIoTClient 0:1f9b2707ec7d 2749 DestroyHalfBakedComplexType(agentData);
AzureIoTClient 0:1f9b2707ec7d 2750 }
AzureIoTClient 0:1f9b2707ec7d 2751 else
AzureIoTClient 0:1f9b2707ec7d 2752 {
AzureIoTClient 0:1f9b2707ec7d 2753 agentData->type = EDM_COMPLEX_TYPE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2754 }
AzureIoTClient 0:1f9b2707ec7d 2755 }
AzureIoTClient 0:1f9b2707ec7d 2756 return result;
AzureIoTClient 0:1f9b2707ec7d 2757 }
AzureIoTClient 0:1f9b2707ec7d 2758
AzureIoTClient 0:1f9b2707ec7d 2759 #define isLeapYear(y) ((((y) % 400) == 0) || (((y)%4==0)&&(!((y)%100==0))))
AzureIoTClient 0:1f9b2707ec7d 2760
AzureIoTClient 0:1f9b2707ec7d 2761 const int daysInAllPreviousMonths[12] = {
AzureIoTClient 0:1f9b2707ec7d 2762 0,
AzureIoTClient 0:1f9b2707ec7d 2763 31,
AzureIoTClient 0:1f9b2707ec7d 2764 31 + 28,
AzureIoTClient 0:1f9b2707ec7d 2765 31 + 28 + 31,
AzureIoTClient 0:1f9b2707ec7d 2766 31 + 28 + 31 + 30,
AzureIoTClient 0:1f9b2707ec7d 2767 31 + 28 + 31 + 30 + 31,
AzureIoTClient 0:1f9b2707ec7d 2768 31 + 28 + 31 + 30 + 31 + 30,
AzureIoTClient 0:1f9b2707ec7d 2769 31 + 28 + 31 + 30 + 31 + 30 + 31,
AzureIoTClient 0:1f9b2707ec7d 2770 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
AzureIoTClient 0:1f9b2707ec7d 2771 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
AzureIoTClient 0:1f9b2707ec7d 2772 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
AzureIoTClient 0:1f9b2707ec7d 2773 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30
AzureIoTClient 0:1f9b2707ec7d 2774 };
AzureIoTClient 0:1f9b2707ec7d 2775
AzureIoTClient 0:1f9b2707ec7d 2776 /*this function assumes a correctly filled in tm_year, tm_mon and tm_mday and will fill in tm_yday and tm_wday*/
AzureIoTClient 0:1f9b2707ec7d 2777 static void fill_tm_yday_and_tm_wday(struct tm* source)
AzureIoTClient 0:1f9b2707ec7d 2778 {
AzureIoTClient 0:1f9b2707ec7d 2779 /*to fill in tm_yday the function shall add the number of days in every month, not including the current one*/
AzureIoTClient 0:1f9b2707ec7d 2780 /*and then it will add the number of days in the current month*/
AzureIoTClient 0:1f9b2707ec7d 2781 /*1st of Jan is day "0" in a year*/
AzureIoTClient 0:1f9b2707ec7d 2782 int year = source->tm_year + 1900 + 10000;
AzureIoTClient 0:1f9b2707ec7d 2783 int nLeapYearsSinceYearMinus9999 = ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400);
AzureIoTClient 0:1f9b2707ec7d 2784 source->tm_yday = (daysInAllPreviousMonths[source->tm_mon]) + (source->tm_mday - 1) + ((source->tm_mon > 1 /*1 is Feb*/) && isLeapYear(year));
AzureIoTClient 0:1f9b2707ec7d 2785 source->tm_wday = ((365 * year + nLeapYearsSinceYearMinus9999) + source->tm_yday) % 7;
AzureIoTClient 0:1f9b2707ec7d 2786 /*day "0" is 1st jan -9999 (this is how much odata can span*/
AzureIoTClient 0:1f9b2707ec7d 2787 /*the function shall count days */
AzureIoTClient 0:1f9b2707ec7d 2788 }
AzureIoTClient 0:1f9b2707ec7d 2789
AzureIoTClient 0:1f9b2707ec7d 2790 AGENT_DATA_TYPES_RESULT CreateAgentDataType_From_String(const char* source, AGENT_DATA_TYPE_TYPE type, AGENT_DATA_TYPE* agentData)
AzureIoTClient 0:1f9b2707ec7d 2791 {
AzureIoTClient 0:1f9b2707ec7d 2792
AzureIoTClient 0:1f9b2707ec7d 2793 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 2794
AzureIoTClient 0:1f9b2707ec7d 2795 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_073:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2796 if ((source == NULL) ||
AzureIoTClient 0:1f9b2707ec7d 2797 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_074:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if agentData is NULL.] */
AzureIoTClient 0:1f9b2707ec7d 2798 (agentData == NULL))
AzureIoTClient 0:1f9b2707ec7d 2799 {
AzureIoTClient 0:1f9b2707ec7d 2800 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2801 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2802 }
AzureIoTClient 0:1f9b2707ec7d 2803 else
AzureIoTClient 0:1f9b2707ec7d 2804 {
AzureIoTClient 0:1f9b2707ec7d 2805 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_071:[ CreateAgentDataType_From_String shall create an AGENT_DATA_TYPE from a char* representation of the type indicated by type parameter.] */
AzureIoTClient 0:1f9b2707ec7d 2806 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_072:[ The implementation for the transformation of the char* source into AGENT_DATA_TYPE shall be type specific.] */
AzureIoTClient 0:1f9b2707ec7d 2807 switch (type)
AzureIoTClient 0:1f9b2707ec7d 2808 {
AzureIoTClient 0:1f9b2707ec7d 2809 default:
AzureIoTClient 0:1f9b2707ec7d 2810 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_075:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_NOT_IMPLEMENTED if type is not a supported type.] */
AzureIoTClient 0:1f9b2707ec7d 2811 result = AGENT_DATA_TYPES_NOT_IMPLEMENTED;
AzureIoTClient 0:1f9b2707ec7d 2812 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2813 break;
AzureIoTClient 0:1f9b2707ec7d 2814
AzureIoTClient 0:1f9b2707ec7d 2815 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_086:[ EDM_STRING] */
AzureIoTClient 0:1f9b2707ec7d 2816 case EDM_BOOLEAN_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2817 {
AzureIoTClient 0:1f9b2707ec7d 2818 if (strcmp(source, "true") == 0)
AzureIoTClient 0:1f9b2707ec7d 2819 {
AzureIoTClient 0:1f9b2707ec7d 2820 agentData->type = EDM_BOOLEAN_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2821 agentData->value.edmBoolean.value = EDM_TRUE;
AzureIoTClient 0:1f9b2707ec7d 2822 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2823 }
AzureIoTClient 0:1f9b2707ec7d 2824 else if (strcmp(source, "false") == 0)
AzureIoTClient 0:1f9b2707ec7d 2825 {
AzureIoTClient 0:1f9b2707ec7d 2826 agentData->type = EDM_BOOLEAN_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2827 agentData->value.edmBoolean.value = EDM_FALSE;
AzureIoTClient 0:1f9b2707ec7d 2828 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2829 }
AzureIoTClient 0:1f9b2707ec7d 2830 else
AzureIoTClient 0:1f9b2707ec7d 2831 {
AzureIoTClient 0:1f9b2707ec7d 2832 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2833 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2834 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2835 }
AzureIoTClient 0:1f9b2707ec7d 2836
AzureIoTClient 0:1f9b2707ec7d 2837 break;
AzureIoTClient 0:1f9b2707ec7d 2838 }
AzureIoTClient 0:1f9b2707ec7d 2839 case EDM_NULL_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2840 {
AzureIoTClient 0:1f9b2707ec7d 2841 if (strcmp(source, "null") == 0)
AzureIoTClient 0:1f9b2707ec7d 2842 {
AzureIoTClient 0:1f9b2707ec7d 2843 agentData->type = EDM_NULL_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2844 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2845 }
AzureIoTClient 0:1f9b2707ec7d 2846 else
AzureIoTClient 0:1f9b2707ec7d 2847 {
AzureIoTClient 0:1f9b2707ec7d 2848 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2849 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2850 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2851 }
AzureIoTClient 0:1f9b2707ec7d 2852
AzureIoTClient 0:1f9b2707ec7d 2853 break;
AzureIoTClient 0:1f9b2707ec7d 2854 }
AzureIoTClient 0:1f9b2707ec7d 2855
AzureIoTClient 0:1f9b2707ec7d 2856 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_084:[ EDM_SBYTE] */
AzureIoTClient 0:1f9b2707ec7d 2857 case EDM_SBYTE_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2858 {
AzureIoTClient 0:1f9b2707ec7d 2859 int sByteValue;
AzureIoTClient 0:1f9b2707ec7d 2860 if ((sscanf(source, "%d", &sByteValue) != 1) ||
AzureIoTClient 0:1f9b2707ec7d 2861 (sByteValue < -128) ||
AzureIoTClient 0:1f9b2707ec7d 2862 (sByteValue > 127))
AzureIoTClient 0:1f9b2707ec7d 2863 {
AzureIoTClient 0:1f9b2707ec7d 2864 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2865 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2866 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2867 }
AzureIoTClient 0:1f9b2707ec7d 2868 else
AzureIoTClient 0:1f9b2707ec7d 2869 {
AzureIoTClient 0:1f9b2707ec7d 2870 agentData->type = EDM_SBYTE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2871 agentData->value.edmSbyte.value = (int8_t)sByteValue;
AzureIoTClient 0:1f9b2707ec7d 2872 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2873 }
AzureIoTClient 0:1f9b2707ec7d 2874
AzureIoTClient 0:1f9b2707ec7d 2875 break;
AzureIoTClient 0:1f9b2707ec7d 2876 }
AzureIoTClient 0:1f9b2707ec7d 2877
AzureIoTClient 0:1f9b2707ec7d 2878 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_077:[ EDM_BYTE] */
AzureIoTClient 0:1f9b2707ec7d 2879 case EDM_BYTE_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2880 {
AzureIoTClient 0:1f9b2707ec7d 2881 int byteValue;
AzureIoTClient 0:1f9b2707ec7d 2882 if ((sscanf(source, "%d", &byteValue) != 1) ||
AzureIoTClient 0:1f9b2707ec7d 2883 (byteValue < 0) ||
AzureIoTClient 0:1f9b2707ec7d 2884 (byteValue > 255))
AzureIoTClient 0:1f9b2707ec7d 2885 {
AzureIoTClient 0:1f9b2707ec7d 2886 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2887 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2888 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2889 }
AzureIoTClient 0:1f9b2707ec7d 2890 else
AzureIoTClient 0:1f9b2707ec7d 2891 {
AzureIoTClient 0:1f9b2707ec7d 2892 agentData->type = EDM_BYTE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2893 agentData->value.edmByte.value = (uint8_t)byteValue;
AzureIoTClient 0:1f9b2707ec7d 2894 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2895 }
AzureIoTClient 0:1f9b2707ec7d 2896
AzureIoTClient 0:1f9b2707ec7d 2897 break;
AzureIoTClient 0:1f9b2707ec7d 2898 }
AzureIoTClient 0:1f9b2707ec7d 2899
AzureIoTClient 0:1f9b2707ec7d 2900 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_081:[ EDM_INT16] */
AzureIoTClient 0:1f9b2707ec7d 2901 case EDM_INT16_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2902 {
AzureIoTClient 0:1f9b2707ec7d 2903 int int16Value;
AzureIoTClient 0:1f9b2707ec7d 2904 if ((sscanf(source, "%d", &int16Value) != 1) ||
AzureIoTClient 0:1f9b2707ec7d 2905 (int16Value < -32768) ||
AzureIoTClient 0:1f9b2707ec7d 2906 (int16Value > 32767))
AzureIoTClient 0:1f9b2707ec7d 2907 {
AzureIoTClient 0:1f9b2707ec7d 2908 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2909 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2910 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2911 }
AzureIoTClient 0:1f9b2707ec7d 2912 else
AzureIoTClient 0:1f9b2707ec7d 2913 {
AzureIoTClient 0:1f9b2707ec7d 2914 agentData->type = EDM_INT16_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2915 agentData->value.edmInt16.value = (int16_t)int16Value;
AzureIoTClient 0:1f9b2707ec7d 2916 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2917 }
AzureIoTClient 0:1f9b2707ec7d 2918
AzureIoTClient 0:1f9b2707ec7d 2919 break;
AzureIoTClient 0:1f9b2707ec7d 2920 }
AzureIoTClient 0:1f9b2707ec7d 2921
AzureIoTClient 0:1f9b2707ec7d 2922 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_082:[ EDM_INT32] */
AzureIoTClient 0:1f9b2707ec7d 2923 case EDM_INT32_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2924 {
AzureIoTClient 0:1f9b2707ec7d 2925 long long int32Value;
AzureIoTClient 0:1f9b2707ec7d 2926 if ((sscanf(source, "%lld", &int32Value) != 1) ||
AzureIoTClient 0:1f9b2707ec7d 2927 (int32Value < -2147483648LL) ||
AzureIoTClient 0:1f9b2707ec7d 2928 (int32Value > 2147483647))
AzureIoTClient 0:1f9b2707ec7d 2929 {
AzureIoTClient 0:1f9b2707ec7d 2930 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2931 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2932 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2933 }
AzureIoTClient 0:1f9b2707ec7d 2934 else
AzureIoTClient 0:1f9b2707ec7d 2935 {
AzureIoTClient 0:1f9b2707ec7d 2936 agentData->type = EDM_INT32_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2937 agentData->value.edmInt32.value = (int32_t)int32Value;
AzureIoTClient 0:1f9b2707ec7d 2938 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2939 }
AzureIoTClient 0:1f9b2707ec7d 2940
AzureIoTClient 0:1f9b2707ec7d 2941 break;
AzureIoTClient 0:1f9b2707ec7d 2942 }
AzureIoTClient 0:1f9b2707ec7d 2943
AzureIoTClient 0:1f9b2707ec7d 2944 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_083:[ EDM_INT64] */
AzureIoTClient 0:1f9b2707ec7d 2945 case EDM_INT64_TYPE:
AzureIoTClient 0:1f9b2707ec7d 2946 {
AzureIoTClient 0:1f9b2707ec7d 2947 long long int64Value;
AzureIoTClient 0:1f9b2707ec7d 2948 unsigned char isNegative;
AzureIoTClient 0:1f9b2707ec7d 2949 unsigned long long ullValue;
AzureIoTClient 0:1f9b2707ec7d 2950 const char* pos;
AzureIoTClient 0:1f9b2707ec7d 2951 size_t strLength;
AzureIoTClient 0:1f9b2707ec7d 2952
AzureIoTClient 0:1f9b2707ec7d 2953 if (source[0] == '-')
AzureIoTClient 0:1f9b2707ec7d 2954 {
AzureIoTClient 0:1f9b2707ec7d 2955 isNegative = 1;
AzureIoTClient 0:1f9b2707ec7d 2956 pos = &source[1];
AzureIoTClient 0:1f9b2707ec7d 2957 }
AzureIoTClient 0:1f9b2707ec7d 2958 else
AzureIoTClient 0:1f9b2707ec7d 2959 {
AzureIoTClient 0:1f9b2707ec7d 2960 isNegative = 0;
AzureIoTClient 0:1f9b2707ec7d 2961 pos = &source[0];
AzureIoTClient 0:1f9b2707ec7d 2962 }
AzureIoTClient 0:1f9b2707ec7d 2963
AzureIoTClient 0:1f9b2707ec7d 2964 strLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 2965
AzureIoTClient 0:1f9b2707ec7d 2966 if ((sscanf(pos, "%llu", &ullValue) != 1) ||
AzureIoTClient 0:1f9b2707ec7d 2967 (strLength > 20) ||
AzureIoTClient 0:1f9b2707ec7d 2968 ((ullValue > 9223372036854775808ULL) && isNegative) ||
AzureIoTClient 0:1f9b2707ec7d 2969 ((ullValue > 9223372036854775807ULL) && (!isNegative)))
AzureIoTClient 0:1f9b2707ec7d 2970 {
AzureIoTClient 0:1f9b2707ec7d 2971 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 2972 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 2973 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 2974 }
AzureIoTClient 0:1f9b2707ec7d 2975 else
AzureIoTClient 0:1f9b2707ec7d 2976 {
AzureIoTClient 0:1f9b2707ec7d 2977 if (isNegative)
AzureIoTClient 0:1f9b2707ec7d 2978 {
AzureIoTClient 0:1f9b2707ec7d 2979 if (ullValue == 9223372036854775808ULL)
AzureIoTClient 0:1f9b2707ec7d 2980 {
AzureIoTClient 0:1f9b2707ec7d 2981 int64Value = -9223372036854775807LL - 1LL;
AzureIoTClient 0:1f9b2707ec7d 2982 }
AzureIoTClient 0:1f9b2707ec7d 2983 else
AzureIoTClient 0:1f9b2707ec7d 2984 {
AzureIoTClient 0:1f9b2707ec7d 2985 int64Value = -(long long)ullValue;
AzureIoTClient 0:1f9b2707ec7d 2986 }
AzureIoTClient 0:1f9b2707ec7d 2987 }
AzureIoTClient 0:1f9b2707ec7d 2988 else
AzureIoTClient 0:1f9b2707ec7d 2989 {
AzureIoTClient 0:1f9b2707ec7d 2990 int64Value = ullValue;
AzureIoTClient 0:1f9b2707ec7d 2991 }
AzureIoTClient 0:1f9b2707ec7d 2992 agentData->type = EDM_INT64_TYPE;
AzureIoTClient 0:1f9b2707ec7d 2993 agentData->value.edmInt64.value = (int64_t)int64Value;
AzureIoTClient 0:1f9b2707ec7d 2994 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 2995 }
AzureIoTClient 0:1f9b2707ec7d 2996
AzureIoTClient 0:1f9b2707ec7d 2997 break;
AzureIoTClient 0:1f9b2707ec7d 2998 }
AzureIoTClient 0:1f9b2707ec7d 2999
AzureIoTClient 0:1f9b2707ec7d 3000 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_085:[ EDM_DATE] */
AzureIoTClient 0:1f9b2707ec7d 3001 case EDM_DATE_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3002 {
AzureIoTClient 0:1f9b2707ec7d 3003 int year;
AzureIoTClient 0:1f9b2707ec7d 3004 int month;
AzureIoTClient 0:1f9b2707ec7d 3005 int day;
AzureIoTClient 0:1f9b2707ec7d 3006 size_t strLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 3007
AzureIoTClient 0:1f9b2707ec7d 3008 if ((strLength < 2) ||
AzureIoTClient 0:1f9b2707ec7d 3009 (source[0] != '"') ||
AzureIoTClient 0:1f9b2707ec7d 3010 (source[strlen(source) - 1] != '"'))
AzureIoTClient 0:1f9b2707ec7d 3011 {
AzureIoTClient 0:1f9b2707ec7d 3012 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3013 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3014 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3015 }
AzureIoTClient 0:1f9b2707ec7d 3016 else
AzureIoTClient 0:1f9b2707ec7d 3017 {
AzureIoTClient 0:1f9b2707ec7d 3018 size_t pos = 1;
AzureIoTClient 0:1f9b2707ec7d 3019 int sign;
AzureIoTClient 0:1f9b2707ec7d 3020 scanOptionalMinusSign(source, 2, &pos, &sign);
AzureIoTClient 0:1f9b2707ec7d 3021
AzureIoTClient 0:1f9b2707ec7d 3022 if ((scanAndReadNDigitsInt(source, strLength, &pos, &year, 4) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3023 (source[pos++] != '-') ||
AzureIoTClient 0:1f9b2707ec7d 3024 (scanAndReadNDigitsInt(source, strLength, &pos, &month, 2) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3025 (source[pos++] != '-') ||
AzureIoTClient 0:1f9b2707ec7d 3026 (scanAndReadNDigitsInt(source, strLength, &pos, &day, 2) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3027 (Create_AGENT_DATA_TYPE_from_date(agentData, (int16_t)(sign*year), (uint8_t)month, (uint8_t)day) != AGENT_DATA_TYPES_OK))
AzureIoTClient 0:1f9b2707ec7d 3028 {
AzureIoTClient 0:1f9b2707ec7d 3029 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3030 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3031 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3032 }
AzureIoTClient 0:1f9b2707ec7d 3033 else
AzureIoTClient 0:1f9b2707ec7d 3034 {
AzureIoTClient 0:1f9b2707ec7d 3035 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3036 }
AzureIoTClient 0:1f9b2707ec7d 3037 }
AzureIoTClient 0:1f9b2707ec7d 3038
AzureIoTClient 0:1f9b2707ec7d 3039 break;
AzureIoTClient 0:1f9b2707ec7d 3040 }
AzureIoTClient 0:1f9b2707ec7d 3041
AzureIoTClient 0:1f9b2707ec7d 3042 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_078:[ EDM_DATETIMEOFFSET] */
AzureIoTClient 0:1f9b2707ec7d 3043 case EDM_DATE_TIME_OFFSET_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3044 {
AzureIoTClient 0:1f9b2707ec7d 3045 int year;
AzureIoTClient 0:1f9b2707ec7d 3046 int month;
AzureIoTClient 0:1f9b2707ec7d 3047 int day;
AzureIoTClient 0:1f9b2707ec7d 3048 int hour;
AzureIoTClient 0:1f9b2707ec7d 3049 int min;
AzureIoTClient 0:1f9b2707ec7d 3050 int sec = 0;
AzureIoTClient 0:1f9b2707ec7d 3051 int hourOffset;
AzureIoTClient 0:1f9b2707ec7d 3052 int minOffset;
AzureIoTClient 0:1f9b2707ec7d 3053 unsigned long long fractionalSeconds = 0;
AzureIoTClient 0:1f9b2707ec7d 3054 size_t strLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 3055
AzureIoTClient 0:1f9b2707ec7d 3056 agentData->value.edmDateTimeOffset.hasFractionalSecond = 0;
AzureIoTClient 0:1f9b2707ec7d 3057 agentData->value.edmDateTimeOffset.hasTimeZone = 0;
AzureIoTClient 0:1f9b2707ec7d 3058 /* The value of tm_isdst is positive if Daylight Saving Time is in effect, zero if Daylight
AzureIoTClient 0:1f9b2707ec7d 3059 Saving Time is not in effect, and negative if the information is not available.*/
AzureIoTClient 0:1f9b2707ec7d 3060 agentData->value.edmDateTimeOffset.dateTime.tm_isdst = -1;
AzureIoTClient 0:1f9b2707ec7d 3061
AzureIoTClient 0:1f9b2707ec7d 3062 if ((strLength < 2) ||
AzureIoTClient 0:1f9b2707ec7d 3063 (source[0] != '"') ||
AzureIoTClient 0:1f9b2707ec7d 3064 (source[strlen(source) - 1] != '"'))
AzureIoTClient 0:1f9b2707ec7d 3065 {
AzureIoTClient 0:1f9b2707ec7d 3066 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3067 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3068 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3069 }
AzureIoTClient 0:1f9b2707ec7d 3070 else
AzureIoTClient 0:1f9b2707ec7d 3071 {
AzureIoTClient 0:1f9b2707ec7d 3072 size_t pos = 1;
AzureIoTClient 0:1f9b2707ec7d 3073 int sign;
AzureIoTClient 0:1f9b2707ec7d 3074 scanOptionalMinusSign(source, 2, &pos, &sign);
AzureIoTClient 0:1f9b2707ec7d 3075
AzureIoTClient 0:1f9b2707ec7d 3076 if ((scanAndReadNDigitsInt(source, strLength, &pos, &year, 4) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3077 (source[pos++] != '-') ||
AzureIoTClient 0:1f9b2707ec7d 3078 (scanAndReadNDigitsInt(source, strLength, &pos, &month, 2) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3079 (source[pos++] != '-') ||
AzureIoTClient 0:1f9b2707ec7d 3080 (scanAndReadNDigitsInt(source, strLength, &pos, &day, 2) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3081 (source[pos++] != 'T') ||
AzureIoTClient 0:1f9b2707ec7d 3082 (scanAndReadNDigitsInt(source, strLength, &pos, &hour, 2) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3083 (source[pos++] != ':') ||
AzureIoTClient 0:1f9b2707ec7d 3084 (scanAndReadNDigitsInt(source, strLength, &pos, &min, 2) != 0))
AzureIoTClient 0:1f9b2707ec7d 3085 {
AzureIoTClient 0:1f9b2707ec7d 3086 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3087 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3088 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3089 }
AzureIoTClient 0:1f9b2707ec7d 3090 else
AzureIoTClient 0:1f9b2707ec7d 3091 {
AzureIoTClient 0:1f9b2707ec7d 3092 const char* pos2;
AzureIoTClient 0:1f9b2707ec7d 3093 year = year*sign;
AzureIoTClient 0:1f9b2707ec7d 3094 if ((pos2 = strchr(source, ':')) == NULL)
AzureIoTClient 0:1f9b2707ec7d 3095 {
AzureIoTClient 0:1f9b2707ec7d 3096 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3097 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3098 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3099 }
AzureIoTClient 0:1f9b2707ec7d 3100 else
AzureIoTClient 0:1f9b2707ec7d 3101 {
AzureIoTClient 0:1f9b2707ec7d 3102 pos2 += 3;
AzureIoTClient 0:1f9b2707ec7d 3103 if (*pos2 == ':')
AzureIoTClient 0:1f9b2707ec7d 3104 {
AzureIoTClient 0:1f9b2707ec7d 3105 if (sscanf(pos2, ":%02d", &sec) != 1)
AzureIoTClient 0:1f9b2707ec7d 3106 {
AzureIoTClient 0:1f9b2707ec7d 3107 pos2 = NULL;
AzureIoTClient 0:1f9b2707ec7d 3108 }
AzureIoTClient 0:1f9b2707ec7d 3109 else
AzureIoTClient 0:1f9b2707ec7d 3110 {
AzureIoTClient 0:1f9b2707ec7d 3111 pos2 += 3;
AzureIoTClient 0:1f9b2707ec7d 3112 }
AzureIoTClient 0:1f9b2707ec7d 3113 }
AzureIoTClient 0:1f9b2707ec7d 3114
AzureIoTClient 0:1f9b2707ec7d 3115 if ((pos2 != NULL) &&
AzureIoTClient 0:1f9b2707ec7d 3116 (*pos2 == '.'))
AzureIoTClient 0:1f9b2707ec7d 3117 {
AzureIoTClient 0:1f9b2707ec7d 3118 if (sscanf(pos2, ".%llu", &fractionalSeconds) != 1)
AzureIoTClient 0:1f9b2707ec7d 3119 {
AzureIoTClient 0:1f9b2707ec7d 3120 pos2 = NULL;
AzureIoTClient 0:1f9b2707ec7d 3121 }
AzureIoTClient 0:1f9b2707ec7d 3122 else
AzureIoTClient 0:1f9b2707ec7d 3123 {
AzureIoTClient 0:1f9b2707ec7d 3124 pos2++;
AzureIoTClient 0:1f9b2707ec7d 3125
AzureIoTClient 0:1f9b2707ec7d 3126 agentData->value.edmDateTimeOffset.hasFractionalSecond = 1;
AzureIoTClient 0:1f9b2707ec7d 3127
AzureIoTClient 0:1f9b2707ec7d 3128 while ((*pos2 != '\0') &&
AzureIoTClient 0:1f9b2707ec7d 3129 (IS_DIGIT(*pos2)))
AzureIoTClient 0:1f9b2707ec7d 3130 {
AzureIoTClient 0:1f9b2707ec7d 3131 pos2++;
AzureIoTClient 0:1f9b2707ec7d 3132 }
AzureIoTClient 0:1f9b2707ec7d 3133
AzureIoTClient 0:1f9b2707ec7d 3134 if (*pos2 == '\0')
AzureIoTClient 0:1f9b2707ec7d 3135 {
AzureIoTClient 0:1f9b2707ec7d 3136 pos2 = NULL;
AzureIoTClient 0:1f9b2707ec7d 3137 }
AzureIoTClient 0:1f9b2707ec7d 3138 }
AzureIoTClient 0:1f9b2707ec7d 3139 }
AzureIoTClient 0:1f9b2707ec7d 3140
AzureIoTClient 0:1f9b2707ec7d 3141 if (pos2 == NULL)
AzureIoTClient 0:1f9b2707ec7d 3142 {
AzureIoTClient 0:1f9b2707ec7d 3143 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3144 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3145 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3146 }
AzureIoTClient 0:1f9b2707ec7d 3147 else
AzureIoTClient 0:1f9b2707ec7d 3148 {
AzureIoTClient 0:1f9b2707ec7d 3149 hourOffset = 0;
AzureIoTClient 0:1f9b2707ec7d 3150 minOffset = 0;
AzureIoTClient 0:1f9b2707ec7d 3151
AzureIoTClient 0:1f9b2707ec7d 3152 if (sscanf(pos2, "%03d:%02d\"", &hourOffset, &minOffset) == 2)
AzureIoTClient 0:1f9b2707ec7d 3153 {
AzureIoTClient 0:1f9b2707ec7d 3154 agentData->value.edmDateTimeOffset.hasTimeZone = 1;
AzureIoTClient 0:1f9b2707ec7d 3155 }
AzureIoTClient 0:1f9b2707ec7d 3156
AzureIoTClient 0:1f9b2707ec7d 3157 if ((strcmp(pos2, "Z\"") == 0) ||
AzureIoTClient 0:1f9b2707ec7d 3158 agentData->value.edmDateTimeOffset.hasTimeZone)
AzureIoTClient 0:1f9b2707ec7d 3159 {
AzureIoTClient 0:1f9b2707ec7d 3160 if ((ValidateDate(year, month, day) != 0) ||
AzureIoTClient 0:1f9b2707ec7d 3161 (hour < 0) ||
AzureIoTClient 0:1f9b2707ec7d 3162 (hour > 23) ||
AzureIoTClient 0:1f9b2707ec7d 3163 (min < 0) ||
AzureIoTClient 0:1f9b2707ec7d 3164 (min > 59) ||
AzureIoTClient 0:1f9b2707ec7d 3165 (sec < 0) ||
AzureIoTClient 0:1f9b2707ec7d 3166 (sec > 59) ||
AzureIoTClient 0:1f9b2707ec7d 3167 (fractionalSeconds > 999999999999) ||
AzureIoTClient 0:1f9b2707ec7d 3168 (hourOffset < -23) ||
AzureIoTClient 0:1f9b2707ec7d 3169 (hourOffset > 23) ||
AzureIoTClient 0:1f9b2707ec7d 3170 (minOffset < 0) ||
AzureIoTClient 0:1f9b2707ec7d 3171 (minOffset > 59))
AzureIoTClient 0:1f9b2707ec7d 3172 {
AzureIoTClient 0:1f9b2707ec7d 3173 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3174 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3175 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3176 }
AzureIoTClient 0:1f9b2707ec7d 3177 else
AzureIoTClient 0:1f9b2707ec7d 3178 {
AzureIoTClient 0:1f9b2707ec7d 3179 agentData->type = EDM_DATE_TIME_OFFSET_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3180 agentData->value.edmDateTimeOffset.dateTime.tm_year= year-1900;
AzureIoTClient 0:1f9b2707ec7d 3181 agentData->value.edmDateTimeOffset.dateTime.tm_mon = month-1;
AzureIoTClient 0:1f9b2707ec7d 3182 agentData->value.edmDateTimeOffset.dateTime.tm_mday = day;
AzureIoTClient 0:1f9b2707ec7d 3183 agentData->value.edmDateTimeOffset.dateTime.tm_hour = hour;
AzureIoTClient 0:1f9b2707ec7d 3184 agentData->value.edmDateTimeOffset.dateTime.tm_min = min;
AzureIoTClient 0:1f9b2707ec7d 3185 agentData->value.edmDateTimeOffset.dateTime.tm_sec = sec;
AzureIoTClient 0:1f9b2707ec7d 3186 /*fill in tm_wday and tm_yday*/
AzureIoTClient 0:1f9b2707ec7d 3187 fill_tm_yday_and_tm_wday(&agentData->value.edmDateTimeOffset.dateTime);
AzureIoTClient 0:1f9b2707ec7d 3188 agentData->value.edmDateTimeOffset.fractionalSecond = (uint64_t)fractionalSeconds;
AzureIoTClient 0:1f9b2707ec7d 3189 agentData->value.edmDateTimeOffset.timeZoneHour = (int8_t)hourOffset;
AzureIoTClient 0:1f9b2707ec7d 3190 agentData->value.edmDateTimeOffset.timeZoneMinute = (uint8_t)minOffset;
AzureIoTClient 0:1f9b2707ec7d 3191 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3192 }
AzureIoTClient 0:1f9b2707ec7d 3193 }
AzureIoTClient 0:1f9b2707ec7d 3194 else
AzureIoTClient 0:1f9b2707ec7d 3195 {
AzureIoTClient 0:1f9b2707ec7d 3196 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3197 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3198 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3199 }
AzureIoTClient 0:1f9b2707ec7d 3200 }
AzureIoTClient 0:1f9b2707ec7d 3201 }
AzureIoTClient 0:1f9b2707ec7d 3202 }
AzureIoTClient 0:1f9b2707ec7d 3203 }
AzureIoTClient 0:1f9b2707ec7d 3204
AzureIoTClient 0:1f9b2707ec7d 3205 break;
AzureIoTClient 0:1f9b2707ec7d 3206 }
AzureIoTClient 0:1f9b2707ec7d 3207
AzureIoTClient 0:1f9b2707ec7d 3208 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_080:[ EDM_DOUBLE] */
AzureIoTClient 0:1f9b2707ec7d 3209 case EDM_DOUBLE_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3210 {
AzureIoTClient 0:1f9b2707ec7d 3211 if (strcmp(source, "\"NaN\"") == 0)
AzureIoTClient 0:1f9b2707ec7d 3212 {
AzureIoTClient 0:1f9b2707ec7d 3213 agentData->type = EDM_DOUBLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3214 agentData->value.edmDouble.value = NAN;
AzureIoTClient 0:1f9b2707ec7d 3215 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3216 }
AzureIoTClient 0:1f9b2707ec7d 3217 else if (strcmp(source, "\"INF\"") == 0)
AzureIoTClient 0:1f9b2707ec7d 3218 {
AzureIoTClient 0:1f9b2707ec7d 3219 agentData->type = EDM_DOUBLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3220 agentData->value.edmDouble.value = INFINITY;
AzureIoTClient 0:1f9b2707ec7d 3221 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3222 }
AzureIoTClient 0:1f9b2707ec7d 3223 else if (strcmp(source, "\"-INF\"") == 0)
AzureIoTClient 0:1f9b2707ec7d 3224 {
AzureIoTClient 0:1f9b2707ec7d 3225 agentData->type = EDM_DOUBLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3226 #ifdef _MSC_VER
AzureIoTClient 0:1f9b2707ec7d 3227 #pragma warning(push)
AzureIoTClient 0:1f9b2707ec7d 3228 #pragma warning(disable: 4056) /* Known warning for INIFNITY */
AzureIoTClient 0:1f9b2707ec7d 3229 #endif
AzureIoTClient 0:1f9b2707ec7d 3230 agentData->value.edmDouble.value = -INFINITY;
AzureIoTClient 0:1f9b2707ec7d 3231 #ifdef _MSC_VER
AzureIoTClient 0:1f9b2707ec7d 3232 #pragma warning(pop)
AzureIoTClient 0:1f9b2707ec7d 3233 #endif
AzureIoTClient 0:1f9b2707ec7d 3234 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3235 }
AzureIoTClient 0:1f9b2707ec7d 3236 else if (sscanf(source, "%lf", &agentData->value.edmDouble.value) != 1)
AzureIoTClient 0:1f9b2707ec7d 3237 {
AzureIoTClient 0:1f9b2707ec7d 3238 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3239 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3240 }
AzureIoTClient 0:1f9b2707ec7d 3241 else
AzureIoTClient 0:1f9b2707ec7d 3242 {
AzureIoTClient 0:1f9b2707ec7d 3243 agentData->type = EDM_DOUBLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3244 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3245 }
AzureIoTClient 0:1f9b2707ec7d 3246 break;
AzureIoTClient 0:1f9b2707ec7d 3247 }
AzureIoTClient 0:1f9b2707ec7d 3248
AzureIoTClient 0:1f9b2707ec7d 3249 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_089:[EDM_SINGLE] */
AzureIoTClient 0:1f9b2707ec7d 3250 case EDM_SINGLE_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3251 {
AzureIoTClient 0:1f9b2707ec7d 3252 if (strcmp(source, "\"NaN\"") == 0)
AzureIoTClient 0:1f9b2707ec7d 3253 {
AzureIoTClient 0:1f9b2707ec7d 3254 agentData->type = EDM_SINGLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3255 agentData->value.edmSingle.value = NAN;
AzureIoTClient 0:1f9b2707ec7d 3256 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3257 }
AzureIoTClient 0:1f9b2707ec7d 3258 else if (strcmp(source, "\"INF\"") == 0)
AzureIoTClient 0:1f9b2707ec7d 3259 {
AzureIoTClient 0:1f9b2707ec7d 3260 agentData->type = EDM_SINGLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3261 agentData->value.edmSingle.value = INFINITY;
AzureIoTClient 0:1f9b2707ec7d 3262 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3263 }
AzureIoTClient 0:1f9b2707ec7d 3264 else if (strcmp(source, "\"-INF\"") == 0)
AzureIoTClient 0:1f9b2707ec7d 3265 {
AzureIoTClient 0:1f9b2707ec7d 3266 agentData->type = EDM_SINGLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3267 #ifdef _MSC_VER
AzureIoTClient 0:1f9b2707ec7d 3268 #pragma warning(push)
AzureIoTClient 0:1f9b2707ec7d 3269 #pragma warning(disable: 4056) /* Known warning for INIFNITY */
AzureIoTClient 0:1f9b2707ec7d 3270 #endif
AzureIoTClient 0:1f9b2707ec7d 3271 agentData->value.edmSingle.value = -INFINITY;
AzureIoTClient 0:1f9b2707ec7d 3272 #ifdef _MSC_VER
AzureIoTClient 0:1f9b2707ec7d 3273 #pragma warning(pop)
AzureIoTClient 0:1f9b2707ec7d 3274 #endif
AzureIoTClient 0:1f9b2707ec7d 3275 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3276 }
AzureIoTClient 0:1f9b2707ec7d 3277 else if (sscanf(source, "%f", &agentData->value.edmSingle.value) != 1)
AzureIoTClient 0:1f9b2707ec7d 3278 {
AzureIoTClient 0:1f9b2707ec7d 3279 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3280 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3281 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3282 }
AzureIoTClient 0:1f9b2707ec7d 3283 else
AzureIoTClient 0:1f9b2707ec7d 3284 {
AzureIoTClient 0:1f9b2707ec7d 3285 agentData->type = EDM_SINGLE_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3286 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3287 }
AzureIoTClient 0:1f9b2707ec7d 3288 break;
AzureIoTClient 0:1f9b2707ec7d 3289 }
AzureIoTClient 0:1f9b2707ec7d 3290
AzureIoTClient 0:1f9b2707ec7d 3291 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_079:[ EDM_DECIMAL] */
AzureIoTClient 0:1f9b2707ec7d 3292 case EDM_DECIMAL_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3293 {
AzureIoTClient 0:1f9b2707ec7d 3294 size_t strLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 3295 if ((strLength < 2) ||
AzureIoTClient 0:1f9b2707ec7d 3296 (source[0] != '"') ||
AzureIoTClient 0:1f9b2707ec7d 3297 (source[strLength - 1] != '"') ||
AzureIoTClient 0:1f9b2707ec7d 3298 (ValidateDecimal(source + 1, strLength - 2) != 0))
AzureIoTClient 0:1f9b2707ec7d 3299 {
AzureIoTClient 0:1f9b2707ec7d 3300 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3301 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3302 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3303 }
AzureIoTClient 0:1f9b2707ec7d 3304 else
AzureIoTClient 0:1f9b2707ec7d 3305 {
AzureIoTClient 0:1f9b2707ec7d 3306 agentData->type = EDM_DECIMAL_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3307 agentData->value.edmDecimal.value = STRING_construct_n(source + 1, strLength-2);
AzureIoTClient 0:1f9b2707ec7d 3308 if (agentData->value.edmDecimal.value == NULL)
AzureIoTClient 0:1f9b2707ec7d 3309 {
AzureIoTClient 0:1f9b2707ec7d 3310 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_088:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_ERROR if any other error occurs.] */
AzureIoTClient 0:1f9b2707ec7d 3311 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3312 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3313 }
AzureIoTClient 0:1f9b2707ec7d 3314 else
AzureIoTClient 0:1f9b2707ec7d 3315 {
AzureIoTClient 0:1f9b2707ec7d 3316 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3317 }
AzureIoTClient 0:1f9b2707ec7d 3318 }
AzureIoTClient 0:1f9b2707ec7d 3319 break;
AzureIoTClient 0:1f9b2707ec7d 3320 }
AzureIoTClient 0:1f9b2707ec7d 3321
AzureIoTClient 0:1f9b2707ec7d 3322 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_086:[ EDM_STRING] */
AzureIoTClient 0:1f9b2707ec7d 3323 case EDM_STRING_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3324 {
AzureIoTClient 0:1f9b2707ec7d 3325 size_t strLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 3326 if ((strLength < 2) ||
AzureIoTClient 0:1f9b2707ec7d 3327 (source[0] != '"') ||
AzureIoTClient 0:1f9b2707ec7d 3328 (source[strLength - 1] != '"'))
AzureIoTClient 0:1f9b2707ec7d 3329 {
AzureIoTClient 0:1f9b2707ec7d 3330 /* Codes_SRS_AGENT_TYPE_SYSTEM_99_087:[ CreateAgentDataType_From_String shall return AGENT_DATA_TYPES_INVALID_ARG if source is not a valid string for a value of type type.] */
AzureIoTClient 0:1f9b2707ec7d 3331 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3332 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3333 }
AzureIoTClient 0:1f9b2707ec7d 3334 else
AzureIoTClient 0:1f9b2707ec7d 3335 {
AzureIoTClient 0:1f9b2707ec7d 3336 char* temp;
AzureIoTClient 0:1f9b2707ec7d 3337 if ((temp = (char*)malloc(strLength - 1)) == NULL)
AzureIoTClient 0:1f9b2707ec7d 3338 {
AzureIoTClient 0:1f9b2707ec7d 3339 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3340 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3341 }
AzureIoTClient 0:1f9b2707ec7d 3342 else if (strncpy_s(temp, strLength - 1, source + 1, strLength - 2) != 0)
AzureIoTClient 0:1f9b2707ec7d 3343 {
AzureIoTClient 0:1f9b2707ec7d 3344 free(temp);
AzureIoTClient 0:1f9b2707ec7d 3345
AzureIoTClient 0:1f9b2707ec7d 3346 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3347 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3348 }
AzureIoTClient 0:1f9b2707ec7d 3349 else
AzureIoTClient 0:1f9b2707ec7d 3350 {
AzureIoTClient 0:1f9b2707ec7d 3351 temp[strLength - 2] = 0;
AzureIoTClient 0:1f9b2707ec7d 3352
AzureIoTClient 0:1f9b2707ec7d 3353 agentData->type = EDM_STRING_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3354 agentData->value.edmString.chars = temp;
AzureIoTClient 0:1f9b2707ec7d 3355 agentData->value.edmString.length = strLength - 2;
AzureIoTClient 0:1f9b2707ec7d 3356 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3357 }
AzureIoTClient 0:1f9b2707ec7d 3358 }
AzureIoTClient 0:1f9b2707ec7d 3359 break;
AzureIoTClient 0:1f9b2707ec7d 3360 }
AzureIoTClient 0:1f9b2707ec7d 3361 /* Codes_SRS_AGENT_TYPE_SYSTEM_01_004: [EDM_STRING_NO_QUOTES] */
AzureIoTClient 0:1f9b2707ec7d 3362 case EDM_STRING_NO_QUOTES_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3363 {
AzureIoTClient 0:1f9b2707ec7d 3364 char* temp;
AzureIoTClient 0:1f9b2707ec7d 3365 size_t strLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 3366 if (mallocAndStrcpy_s(&temp, source) != 0)
AzureIoTClient 0:1f9b2707ec7d 3367 {
AzureIoTClient 0:1f9b2707ec7d 3368 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3369 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3370 }
AzureIoTClient 0:1f9b2707ec7d 3371 else
AzureIoTClient 0:1f9b2707ec7d 3372 {
AzureIoTClient 0:1f9b2707ec7d 3373 agentData->type = EDM_STRING_NO_QUOTES_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3374 agentData->value.edmStringNoQuotes.chars = temp;
AzureIoTClient 0:1f9b2707ec7d 3375 agentData->value.edmStringNoQuotes.length = strLength;
AzureIoTClient 0:1f9b2707ec7d 3376 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3377 }
AzureIoTClient 0:1f9b2707ec7d 3378 break;
AzureIoTClient 0:1f9b2707ec7d 3379 }
AzureIoTClient 0:1f9b2707ec7d 3380 /*Codes_SRS_AGENT_TYPE_SYSTEM_99_097:[ EDM_GUID]*/
AzureIoTClient 0:1f9b2707ec7d 3381 case EDM_GUID_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3382 {
AzureIoTClient 0:1f9b2707ec7d 3383 if (strlen(source) != GUID_STRING_LENGHT)
AzureIoTClient 0:1f9b2707ec7d 3384 {
AzureIoTClient 0:1f9b2707ec7d 3385 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3386 }
AzureIoTClient 0:1f9b2707ec7d 3387 else
AzureIoTClient 0:1f9b2707ec7d 3388 {
AzureIoTClient 0:1f9b2707ec7d 3389 if (source[0] != '"')
AzureIoTClient 0:1f9b2707ec7d 3390 {
AzureIoTClient 0:1f9b2707ec7d 3391 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3392 }
AzureIoTClient 0:1f9b2707ec7d 3393 else if (scanMandatory2CapitalHexDigits(source + 1, &(agentData->value.edmGuid.GUID[0])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3394 {
AzureIoTClient 0:1f9b2707ec7d 3395 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3396 }
AzureIoTClient 0:1f9b2707ec7d 3397 else if (scanMandatory2CapitalHexDigits(source + 3, &(agentData->value.edmGuid.GUID[1])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3398 {
AzureIoTClient 0:1f9b2707ec7d 3399 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3400 }
AzureIoTClient 0:1f9b2707ec7d 3401 else if (scanMandatory2CapitalHexDigits(source + 5, &(agentData->value.edmGuid.GUID[2])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3402 {
AzureIoTClient 0:1f9b2707ec7d 3403 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3404 }
AzureIoTClient 0:1f9b2707ec7d 3405 else if (scanMandatory2CapitalHexDigits(source + 7, &(agentData->value.edmGuid.GUID[3])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3406 {
AzureIoTClient 0:1f9b2707ec7d 3407 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3408 }
AzureIoTClient 0:1f9b2707ec7d 3409 else if (source[9] != '-')
AzureIoTClient 0:1f9b2707ec7d 3410 {
AzureIoTClient 0:1f9b2707ec7d 3411 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3412 }
AzureIoTClient 0:1f9b2707ec7d 3413 else if (scanMandatory2CapitalHexDigits(source + 10, &(agentData->value.edmGuid.GUID[4])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3414 {
AzureIoTClient 0:1f9b2707ec7d 3415 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3416 }
AzureIoTClient 0:1f9b2707ec7d 3417 else if (scanMandatory2CapitalHexDigits(source + 12, &(agentData->value.edmGuid.GUID[5])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3418 {
AzureIoTClient 0:1f9b2707ec7d 3419 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3420 }
AzureIoTClient 0:1f9b2707ec7d 3421 else if (source[14] != '-')
AzureIoTClient 0:1f9b2707ec7d 3422 {
AzureIoTClient 0:1f9b2707ec7d 3423 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3424 }
AzureIoTClient 0:1f9b2707ec7d 3425 else if (scanMandatory2CapitalHexDigits(source + 15, &(agentData->value.edmGuid.GUID[6])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3426 {
AzureIoTClient 0:1f9b2707ec7d 3427 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3428 }
AzureIoTClient 0:1f9b2707ec7d 3429 else if (scanMandatory2CapitalHexDigits(source + 17, &(agentData->value.edmGuid.GUID[7])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3430 {
AzureIoTClient 0:1f9b2707ec7d 3431 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3432 }
AzureIoTClient 0:1f9b2707ec7d 3433 else if (source[19] != '-')
AzureIoTClient 0:1f9b2707ec7d 3434 {
AzureIoTClient 0:1f9b2707ec7d 3435 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3436 }
AzureIoTClient 0:1f9b2707ec7d 3437 else if (scanMandatory2CapitalHexDigits(source + 20, &(agentData->value.edmGuid.GUID[8])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3438 {
AzureIoTClient 0:1f9b2707ec7d 3439 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3440 }
AzureIoTClient 0:1f9b2707ec7d 3441 else if (scanMandatory2CapitalHexDigits(source + 22, &(agentData->value.edmGuid.GUID[9])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3442 {
AzureIoTClient 0:1f9b2707ec7d 3443 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3444 }
AzureIoTClient 0:1f9b2707ec7d 3445 else if (source[24] != '-')
AzureIoTClient 0:1f9b2707ec7d 3446 {
AzureIoTClient 0:1f9b2707ec7d 3447 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3448 }
AzureIoTClient 0:1f9b2707ec7d 3449 else if (scanMandatory2CapitalHexDigits(source + 25, &(agentData->value.edmGuid.GUID[10])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3450 {
AzureIoTClient 0:1f9b2707ec7d 3451 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3452 }
AzureIoTClient 0:1f9b2707ec7d 3453 else if (scanMandatory2CapitalHexDigits(source + 27, &(agentData->value.edmGuid.GUID[11])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3454 {
AzureIoTClient 0:1f9b2707ec7d 3455 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3456 }
AzureIoTClient 0:1f9b2707ec7d 3457 else if (scanMandatory2CapitalHexDigits(source + 29, &(agentData->value.edmGuid.GUID[12])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3458 {
AzureIoTClient 0:1f9b2707ec7d 3459 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3460 }
AzureIoTClient 0:1f9b2707ec7d 3461 else if (scanMandatory2CapitalHexDigits(source + 31, &(agentData->value.edmGuid.GUID[13])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3462 {
AzureIoTClient 0:1f9b2707ec7d 3463 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3464 }
AzureIoTClient 0:1f9b2707ec7d 3465 else if (scanMandatory2CapitalHexDigits(source + 33, &(agentData->value.edmGuid.GUID[14])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3466 {
AzureIoTClient 0:1f9b2707ec7d 3467 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3468 }
AzureIoTClient 0:1f9b2707ec7d 3469 else if (scanMandatory2CapitalHexDigits(source + 35, &(agentData->value.edmGuid.GUID[15])) != 0)
AzureIoTClient 0:1f9b2707ec7d 3470 {
AzureIoTClient 0:1f9b2707ec7d 3471 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3472 }
AzureIoTClient 0:1f9b2707ec7d 3473 else if (source[37] != '"')
AzureIoTClient 0:1f9b2707ec7d 3474 {
AzureIoTClient 0:1f9b2707ec7d 3475 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3476 }
AzureIoTClient 0:1f9b2707ec7d 3477 else
AzureIoTClient 0:1f9b2707ec7d 3478 {
AzureIoTClient 0:1f9b2707ec7d 3479 agentData->type = EDM_GUID_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3480 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3481 }
AzureIoTClient 0:1f9b2707ec7d 3482 }
AzureIoTClient 0:1f9b2707ec7d 3483 break;
AzureIoTClient 0:1f9b2707ec7d 3484 }
AzureIoTClient 0:1f9b2707ec7d 3485 case EDM_BINARY_TYPE:
AzureIoTClient 0:1f9b2707ec7d 3486 {
AzureIoTClient 0:1f9b2707ec7d 3487 size_t sourceLength = strlen(source);
AzureIoTClient 0:1f9b2707ec7d 3488 if (sourceLength < 2)
AzureIoTClient 0:1f9b2707ec7d 3489 {
AzureIoTClient 0:1f9b2707ec7d 3490 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3491 }
AzureIoTClient 0:1f9b2707ec7d 3492 else if (sourceLength == 2)
AzureIoTClient 0:1f9b2707ec7d 3493 {
AzureIoTClient 0:1f9b2707ec7d 3494 agentData->type = EDM_BINARY_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3495 agentData->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 3496 agentData->value.edmBinary.size = 0;
AzureIoTClient 0:1f9b2707ec7d 3497 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3498 }
AzureIoTClient 0:1f9b2707ec7d 3499 else
AzureIoTClient 0:1f9b2707ec7d 3500 {
AzureIoTClient 0:1f9b2707ec7d 3501 size_t sourcePosition = 0;
AzureIoTClient 0:1f9b2707ec7d 3502 if (source[sourcePosition++] != '"') /*if it doesn't start with a quote then... */
AzureIoTClient 0:1f9b2707ec7d 3503 {
AzureIoTClient 0:1f9b2707ec7d 3504 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3505 }
AzureIoTClient 0:1f9b2707ec7d 3506 else
AzureIoTClient 0:1f9b2707ec7d 3507 {
AzureIoTClient 0:1f9b2707ec7d 3508 /*1. read groups of 4 base64 character and transfer those into groups of 3 "normal" characters.
AzureIoTClient 0:1f9b2707ec7d 3509 2. read the end of the string and produce from that the ending characters*/
AzureIoTClient 0:1f9b2707ec7d 3510
AzureIoTClient 0:1f9b2707ec7d 3511 /*compute the amount of memory to allocate*/
AzureIoTClient 0:1f9b2707ec7d 3512 agentData->value.edmBinary.size = (((sourceLength - 2) + 4) / 4) * 3; /*this is overallocation, shall be trimmed later*/
AzureIoTClient 0:1f9b2707ec7d 3513 agentData->value.edmBinary.data = (unsigned char*)malloc(agentData->value.edmBinary.size); /*this is overallocation, shall be trimmed later*/
AzureIoTClient 0:1f9b2707ec7d 3514 if (agentData->value.edmBinary.data == NULL)
AzureIoTClient 0:1f9b2707ec7d 3515 {
AzureIoTClient 0:1f9b2707ec7d 3516 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3517 }
AzureIoTClient 0:1f9b2707ec7d 3518 else
AzureIoTClient 0:1f9b2707ec7d 3519 {
AzureIoTClient 0:1f9b2707ec7d 3520
AzureIoTClient 0:1f9b2707ec7d 3521 size_t destinationPosition = 0;
AzureIoTClient 0:1f9b2707ec7d 3522 size_t consumed;
AzureIoTClient 0:1f9b2707ec7d 3523 /*read and store "solid" groups of 4 base64 chars*/
AzureIoTClient 0:1f9b2707ec7d 3524 while (scan4base64char(source + sourcePosition, sourceLength - sourcePosition, agentData->value.edmBinary.data + destinationPosition, agentData->value.edmBinary.data + destinationPosition + 1, agentData->value.edmBinary.data + destinationPosition + 2) == 0)
AzureIoTClient 0:1f9b2707ec7d 3525 {
AzureIoTClient 0:1f9b2707ec7d 3526 sourcePosition += 4;
AzureIoTClient 0:1f9b2707ec7d 3527 destinationPosition += 3;
AzureIoTClient 0:1f9b2707ec7d 3528 }
AzureIoTClient 0:1f9b2707ec7d 3529
AzureIoTClient 0:1f9b2707ec7d 3530 if (scanbase64b16(source + sourcePosition, sourceLength - sourcePosition, &consumed, agentData->value.edmBinary.data + destinationPosition, agentData->value.edmBinary.data + destinationPosition + 1) == 0)
AzureIoTClient 0:1f9b2707ec7d 3531 {
AzureIoTClient 0:1f9b2707ec7d 3532 sourcePosition += consumed;
AzureIoTClient 0:1f9b2707ec7d 3533 destinationPosition += 2;
AzureIoTClient 0:1f9b2707ec7d 3534
AzureIoTClient 0:1f9b2707ec7d 3535 }
AzureIoTClient 0:1f9b2707ec7d 3536 else if (scanbase64b8(source + sourcePosition, sourceLength - sourcePosition, &consumed, agentData->value.edmBinary.data + destinationPosition) == 0)
AzureIoTClient 0:1f9b2707ec7d 3537 {
AzureIoTClient 0:1f9b2707ec7d 3538 sourcePosition += consumed;
AzureIoTClient 0:1f9b2707ec7d 3539 destinationPosition += 1;
AzureIoTClient 0:1f9b2707ec7d 3540 }
AzureIoTClient 0:1f9b2707ec7d 3541
AzureIoTClient 0:1f9b2707ec7d 3542 if (source[sourcePosition++] != '"') /*if it doesn't end with " then bail out*/
AzureIoTClient 0:1f9b2707ec7d 3543 {
AzureIoTClient 0:1f9b2707ec7d 3544 free(agentData->value.edmBinary.data);
AzureIoTClient 0:1f9b2707ec7d 3545 agentData->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 3546 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3547 }
AzureIoTClient 0:1f9b2707ec7d 3548 else if (sourcePosition != sourceLength)
AzureIoTClient 0:1f9b2707ec7d 3549 {
AzureIoTClient 0:1f9b2707ec7d 3550 free(agentData->value.edmBinary.data);
AzureIoTClient 0:1f9b2707ec7d 3551 agentData->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 3552 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3553 }
AzureIoTClient 0:1f9b2707ec7d 3554 else
AzureIoTClient 0:1f9b2707ec7d 3555 {
AzureIoTClient 0:1f9b2707ec7d 3556 /*trim the result*/
AzureIoTClient 0:1f9b2707ec7d 3557 void* temp = realloc(agentData->value.edmBinary.data, destinationPosition);
AzureIoTClient 0:1f9b2707ec7d 3558 if (temp == NULL) /*this is extremely unlikely to happen, but whatever*/
AzureIoTClient 0:1f9b2707ec7d 3559 {
AzureIoTClient 0:1f9b2707ec7d 3560 free(agentData->value.edmBinary.data);
AzureIoTClient 0:1f9b2707ec7d 3561 agentData->value.edmBinary.data = NULL;
AzureIoTClient 0:1f9b2707ec7d 3562 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3563 }
AzureIoTClient 0:1f9b2707ec7d 3564 else
AzureIoTClient 0:1f9b2707ec7d 3565 {
AzureIoTClient 0:1f9b2707ec7d 3566 agentData->type = EDM_BINARY_TYPE;
AzureIoTClient 0:1f9b2707ec7d 3567 agentData->value.edmBinary.data = (unsigned char*)temp;
AzureIoTClient 0:1f9b2707ec7d 3568 agentData->value.edmBinary.size = destinationPosition;
AzureIoTClient 0:1f9b2707ec7d 3569 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3570 }
AzureIoTClient 0:1f9b2707ec7d 3571 }
AzureIoTClient 0:1f9b2707ec7d 3572 }
AzureIoTClient 0:1f9b2707ec7d 3573 }
AzureIoTClient 0:1f9b2707ec7d 3574 }
AzureIoTClient 0:1f9b2707ec7d 3575 break;
AzureIoTClient 0:1f9b2707ec7d 3576 }
AzureIoTClient 0:1f9b2707ec7d 3577 }
AzureIoTClient 0:1f9b2707ec7d 3578 }
AzureIoTClient 0:1f9b2707ec7d 3579
AzureIoTClient 0:1f9b2707ec7d 3580 return result;
AzureIoTClient 0:1f9b2707ec7d 3581 }
AzureIoTClient 0:1f9b2707ec7d 3582
AzureIoTClient 0:1f9b2707ec7d 3583 // extern AGENT_DATA_TYPES_RESULT AgentDataType_GetComplexTypeField(AGENT_DATA_TYPE* agentData, size_t index, COMPLEX_TYPE_FIELD_TYPE* complexField);
AzureIoTClient 0:1f9b2707ec7d 3584 COMPLEX_TYPE_FIELD_TYPE* AgentDataType_GetComplexTypeField(AGENT_DATA_TYPE* agentData, size_t index)
AzureIoTClient 0:1f9b2707ec7d 3585 {
AzureIoTClient 0:1f9b2707ec7d 3586 AGENT_DATA_TYPES_RESULT result;
AzureIoTClient 0:1f9b2707ec7d 3587 COMPLEX_TYPE_FIELD_TYPE* complexField = NULL;
AzureIoTClient 0:1f9b2707ec7d 3588 if (agentData == NULL)
AzureIoTClient 0:1f9b2707ec7d 3589 {
AzureIoTClient 0:1f9b2707ec7d 3590 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3591 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3592 }
AzureIoTClient 0:1f9b2707ec7d 3593 else
AzureIoTClient 0:1f9b2707ec7d 3594 {
AzureIoTClient 0:1f9b2707ec7d 3595 if (agentData->type != EDM_COMPLEX_TYPE_TYPE)
AzureIoTClient 0:1f9b2707ec7d 3596 {
AzureIoTClient 0:1f9b2707ec7d 3597 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3598 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3599 }
AzureIoTClient 0:1f9b2707ec7d 3600
AzureIoTClient 0:1f9b2707ec7d 3601 else
AzureIoTClient 0:1f9b2707ec7d 3602 {
AzureIoTClient 0:1f9b2707ec7d 3603 if (index >= agentData->value.edmComplexType.nMembers)
AzureIoTClient 0:1f9b2707ec7d 3604 {
AzureIoTClient 0:1f9b2707ec7d 3605 result = AGENT_DATA_TYPES_INVALID_ARG;
AzureIoTClient 0:1f9b2707ec7d 3606 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3607 }
AzureIoTClient 0:1f9b2707ec7d 3608 else
AzureIoTClient 0:1f9b2707ec7d 3609 {
AzureIoTClient 0:1f9b2707ec7d 3610 complexField = (COMPLEX_TYPE_FIELD_TYPE*)malloc(sizeof(COMPLEX_TYPE_FIELD_TYPE));
AzureIoTClient 0:1f9b2707ec7d 3611 if (complexField == NULL)
AzureIoTClient 0:1f9b2707ec7d 3612 {
AzureIoTClient 0:1f9b2707ec7d 3613 result = AGENT_DATA_TYPES_ERROR;
AzureIoTClient 0:1f9b2707ec7d 3614 LogError("(result = %s)\r\n", ENUM_TO_STRING(AGENT_DATA_TYPES_RESULT, result));
AzureIoTClient 0:1f9b2707ec7d 3615 }
AzureIoTClient 0:1f9b2707ec7d 3616 else
AzureIoTClient 0:1f9b2707ec7d 3617 {
AzureIoTClient 0:1f9b2707ec7d 3618 *complexField = agentData->value.edmComplexType.fields[index];
AzureIoTClient 0:1f9b2707ec7d 3619 result = AGENT_DATA_TYPES_OK;
AzureIoTClient 0:1f9b2707ec7d 3620 }
AzureIoTClient 0:1f9b2707ec7d 3621 }
AzureIoTClient 0:1f9b2707ec7d 3622 }
AzureIoTClient 0:1f9b2707ec7d 3623 }
AzureIoTClient 0:1f9b2707ec7d 3624 return complexField;
AzureIoTClient 0:1f9b2707ec7d 3625 }
AzureIoTClient 0:1f9b2707ec7d 3626