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:
Azure.IoT Build
Date:
Fri Mar 11 17:01:46 2016 -0800
Revision:
9:747680124ff7
Parent:
8:380e6e830589
Child:
10:c2aee3965a83
1.0.2

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