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

Dependents:   samplemqtt

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
XinZhangMS 0:f7f1f0d76dd6 1 // Copyright (c) Microsoft. All rights reserved.
XinZhangMS 0:f7f1f0d76dd6 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
XinZhangMS 0:f7f1f0d76dd6 3
XinZhangMS 0:f7f1f0d76dd6 4 #include <stdlib.h>
XinZhangMS 0:f7f1f0d76dd6 5 #include "azure_c_shared_utility/gballoc.h"
XinZhangMS 0:f7f1f0d76dd6 6
XinZhangMS 0:f7f1f0d76dd6 7 #include <stdbool.h>
XinZhangMS 0:f7f1f0d76dd6 8 #include "datapublisher.h"
XinZhangMS 0:f7f1f0d76dd6 9 #include "jsonencoder.h"
XinZhangMS 0:f7f1f0d76dd6 10 #include "datamarshaller.h"
XinZhangMS 0:f7f1f0d76dd6 11 #include "agenttypesystem.h"
XinZhangMS 0:f7f1f0d76dd6 12 #include "schema.h"
XinZhangMS 0:f7f1f0d76dd6 13 #include "azure_c_shared_utility/crt_abstractions.h"
XinZhangMS 0:f7f1f0d76dd6 14 #include "azure_c_shared_utility/xlogging.h"
XinZhangMS 0:f7f1f0d76dd6 15 #include "azure_c_shared_utility/vector.h"
XinZhangMS 0:f7f1f0d76dd6 16
XinZhangMS 0:f7f1f0d76dd6 17 DEFINE_ENUM_STRINGS(DATA_PUBLISHER_RESULT, DATA_PUBLISHER_RESULT_VALUES)
XinZhangMS 0:f7f1f0d76dd6 18
XinZhangMS 0:f7f1f0d76dd6 19 #define LOG_DATA_PUBLISHER_ERROR \
XinZhangMS 0:f7f1f0d76dd6 20 LogError("(result = %s)", ENUM_TO_STRING(DATA_PUBLISHER_RESULT, result))
XinZhangMS 0:f7f1f0d76dd6 21
XinZhangMS 0:f7f1f0d76dd6 22 #define DEFAULT_MAX_BUFFER_SIZE 10240
XinZhangMS 0:f7f1f0d76dd6 23 /* Codes_SRS_DATA_PUBLISHER_99_066:[ A single value shall be used by all instances of DataPublisher.] */
XinZhangMS 0:f7f1f0d76dd6 24 /* Codes_SRS_DATA_PUBLISHER_99_067:[ Before any call to DataPublisher_SetMaxBufferSize, the default max buffer size shall be equal to 10KB.] */
XinZhangMS 0:f7f1f0d76dd6 25 static size_t maxBufferSize_ = DEFAULT_MAX_BUFFER_SIZE;
XinZhangMS 0:f7f1f0d76dd6 26
XinZhangMS 0:f7f1f0d76dd6 27 typedef struct DATA_PUBLISHER_HANDLE_DATA_TAG
XinZhangMS 0:f7f1f0d76dd6 28 {
XinZhangMS 0:f7f1f0d76dd6 29 DATA_MARSHALLER_HANDLE DataMarshallerHandle;
XinZhangMS 0:f7f1f0d76dd6 30 SCHEMA_MODEL_TYPE_HANDLE ModelHandle;
XinZhangMS 0:f7f1f0d76dd6 31 } DATA_PUBLISHER_HANDLE_DATA;
XinZhangMS 0:f7f1f0d76dd6 32
XinZhangMS 0:f7f1f0d76dd6 33 typedef struct TRANSACTION_HANDLE_DATA_TAG
XinZhangMS 0:f7f1f0d76dd6 34 {
XinZhangMS 0:f7f1f0d76dd6 35 DATA_PUBLISHER_HANDLE_DATA* DataPublisherInstance;
XinZhangMS 0:f7f1f0d76dd6 36 size_t ValueCount;
XinZhangMS 0:f7f1f0d76dd6 37 DATA_MARSHALLER_VALUE* Values;
XinZhangMS 0:f7f1f0d76dd6 38 } TRANSACTION_HANDLE_DATA;
XinZhangMS 0:f7f1f0d76dd6 39
XinZhangMS 0:f7f1f0d76dd6 40 typedef struct REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA_TAG
XinZhangMS 0:f7f1f0d76dd6 41 {
XinZhangMS 0:f7f1f0d76dd6 42 DATA_PUBLISHER_HANDLE_DATA* DataPublisherInstance;
XinZhangMS 0:f7f1f0d76dd6 43 VECTOR_HANDLE value; /*holds (DATA_MARSHALLER_VALUE*) */
XinZhangMS 0:f7f1f0d76dd6 44 }REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA;
XinZhangMS 0:f7f1f0d76dd6 45
XinZhangMS 0:f7f1f0d76dd6 46 DATA_PUBLISHER_HANDLE DataPublisher_Create(SCHEMA_MODEL_TYPE_HANDLE modelHandle, bool includePropertyPath)
XinZhangMS 0:f7f1f0d76dd6 47 {
XinZhangMS 0:f7f1f0d76dd6 48 DATA_PUBLISHER_HANDLE_DATA* result;
XinZhangMS 0:f7f1f0d76dd6 49
XinZhangMS 0:f7f1f0d76dd6 50 /* Codes_SRS_DATA_PUBLISHER_99_042:[ If a NULL argument is passed to it, DataPublisher_Create shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 51 if (modelHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 52 {
XinZhangMS 0:f7f1f0d76dd6 53 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 54 LogError("(result = %s)", ENUM_TO_STRING(DATA_PUBLISHER_RESULT, DATA_PUBLISHER_INVALID_ARG));
XinZhangMS 0:f7f1f0d76dd6 55 }
XinZhangMS 0:f7f1f0d76dd6 56 else if ((result = (DATA_PUBLISHER_HANDLE_DATA*)malloc(sizeof(DATA_PUBLISHER_HANDLE_DATA))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 57 {
XinZhangMS 0:f7f1f0d76dd6 58 /* Codes_SRS_DATA_PUBLISHER_99_047:[ For any other error not specified here, DataPublisher_Create shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 59 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 60 LogError("(result = %s)", ENUM_TO_STRING(DATA_PUBLISHER_RESULT, DATA_PUBLISHER_ERROR));
XinZhangMS 0:f7f1f0d76dd6 61 }
XinZhangMS 0:f7f1f0d76dd6 62 else
XinZhangMS 0:f7f1f0d76dd6 63 {
XinZhangMS 0:f7f1f0d76dd6 64 /* Codes_SRS_DATA_PUBLISHER_99_043:[ DataPublisher_Create shall initialize and hold a handle to a DataMarshaller instance.] */
XinZhangMS 0:f7f1f0d76dd6 65 /* Codes_SRS_DATA_PUBLISHER_01_001: [DataPublisher_Create shall pass the includePropertyPath argument to DataMarshaller_Create.] */
XinZhangMS 0:f7f1f0d76dd6 66 if ((result->DataMarshallerHandle = DataMarshaller_Create(modelHandle, includePropertyPath)) == NULL)
XinZhangMS 0:f7f1f0d76dd6 67 {
XinZhangMS 0:f7f1f0d76dd6 68 free(result);
XinZhangMS 0:f7f1f0d76dd6 69
XinZhangMS 0:f7f1f0d76dd6 70 /* Codes_SRS_DATA_PUBLISHER_99_044:[ If the creation of the DataMarshaller instance fails, DataPublisher_Create shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 71 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 72 LogError("(result = %s)", ENUM_TO_STRING(DATA_PUBLISHER_RESULT, DATA_PUBLISHER_MARSHALLER_ERROR));
XinZhangMS 0:f7f1f0d76dd6 73 }
XinZhangMS 0:f7f1f0d76dd6 74 else
XinZhangMS 0:f7f1f0d76dd6 75 {
XinZhangMS 0:f7f1f0d76dd6 76 /* Codes_SRS_DATA_PUBLISHER_99_041:[ DataPublisher_Create shall create a new DataPublisher instance and return a non-NULL handle in case of success.] */
XinZhangMS 0:f7f1f0d76dd6 77 result->ModelHandle = modelHandle;
XinZhangMS 0:f7f1f0d76dd6 78 }
XinZhangMS 0:f7f1f0d76dd6 79 }
XinZhangMS 0:f7f1f0d76dd6 80
XinZhangMS 0:f7f1f0d76dd6 81 return result;
XinZhangMS 0:f7f1f0d76dd6 82 }
XinZhangMS 0:f7f1f0d76dd6 83
XinZhangMS 0:f7f1f0d76dd6 84 void DataPublisher_Destroy(DATA_PUBLISHER_HANDLE dataPublisherHandle)
XinZhangMS 0:f7f1f0d76dd6 85 {
XinZhangMS 0:f7f1f0d76dd6 86 if (dataPublisherHandle != NULL)
XinZhangMS 0:f7f1f0d76dd6 87 {
XinZhangMS 0:f7f1f0d76dd6 88 DATA_PUBLISHER_HANDLE_DATA* dataPublisherInstance = (DATA_PUBLISHER_HANDLE_DATA*)dataPublisherHandle;
XinZhangMS 0:f7f1f0d76dd6 89 DataMarshaller_Destroy(dataPublisherInstance->DataMarshallerHandle);
XinZhangMS 0:f7f1f0d76dd6 90
XinZhangMS 0:f7f1f0d76dd6 91 free(dataPublisherHandle);
XinZhangMS 0:f7f1f0d76dd6 92 }
XinZhangMS 0:f7f1f0d76dd6 93 }
XinZhangMS 0:f7f1f0d76dd6 94
XinZhangMS 0:f7f1f0d76dd6 95 TRANSACTION_HANDLE DataPublisher_StartTransaction(DATA_PUBLISHER_HANDLE dataPublisherHandle)
XinZhangMS 0:f7f1f0d76dd6 96 {
XinZhangMS 0:f7f1f0d76dd6 97 TRANSACTION_HANDLE_DATA* transaction;
XinZhangMS 0:f7f1f0d76dd6 98
XinZhangMS 0:f7f1f0d76dd6 99 /* Codes_SRS_DATA_PUBLISHER_99_038:[ If DataPublisher_StartTransaction is called with a NULL argument it shall return NULL.] */
XinZhangMS 0:f7f1f0d76dd6 100 if (dataPublisherHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 101 {
XinZhangMS 0:f7f1f0d76dd6 102 transaction = NULL;
XinZhangMS 0:f7f1f0d76dd6 103 LogError("(Error code: %s)", ENUM_TO_STRING(DATA_PUBLISHER_RESULT, DATA_PUBLISHER_INVALID_ARG));
XinZhangMS 0:f7f1f0d76dd6 104 }
XinZhangMS 0:f7f1f0d76dd6 105 else
XinZhangMS 0:f7f1f0d76dd6 106 {
XinZhangMS 0:f7f1f0d76dd6 107 /* Codes_SRS_DATA_PUBLISHER_99_007:[ A call to DataPublisher_StartTransaction shall start a new transaction.] */
XinZhangMS 0:f7f1f0d76dd6 108 transaction = (TRANSACTION_HANDLE_DATA*)malloc(sizeof(TRANSACTION_HANDLE_DATA));
XinZhangMS 0:f7f1f0d76dd6 109 if (transaction == NULL)
XinZhangMS 0:f7f1f0d76dd6 110 {
XinZhangMS 0:f7f1f0d76dd6 111 LogError("Allocating transaction failed (Error code: %s)", ENUM_TO_STRING(DATA_PUBLISHER_RESULT, DATA_PUBLISHER_ERROR));
XinZhangMS 0:f7f1f0d76dd6 112 }
XinZhangMS 0:f7f1f0d76dd6 113 else
XinZhangMS 0:f7f1f0d76dd6 114 {
XinZhangMS 0:f7f1f0d76dd6 115 transaction->ValueCount = 0;
XinZhangMS 0:f7f1f0d76dd6 116 transaction->Values = NULL;
XinZhangMS 0:f7f1f0d76dd6 117 transaction->DataPublisherInstance = (DATA_PUBLISHER_HANDLE_DATA*)dataPublisherHandle;
XinZhangMS 0:f7f1f0d76dd6 118 }
XinZhangMS 0:f7f1f0d76dd6 119 }
XinZhangMS 0:f7f1f0d76dd6 120
XinZhangMS 0:f7f1f0d76dd6 121 /* Codes_SRS_DATA_PUBLISHER_99_008:[ DataPublisher_StartTransaction shall return a non-NULL handle upon success.] */
XinZhangMS 0:f7f1f0d76dd6 122 /* Codes_SRS_DATA_PUBLISHER_99_009:[ DataPublisher_StartTransaction shall return NULL upon failure.] */
XinZhangMS 0:f7f1f0d76dd6 123 return transaction;
XinZhangMS 0:f7f1f0d76dd6 124 }
XinZhangMS 0:f7f1f0d76dd6 125
XinZhangMS 0:f7f1f0d76dd6 126 DATA_PUBLISHER_RESULT DataPublisher_PublishTransacted(TRANSACTION_HANDLE transactionHandle, const char* propertyPath, const AGENT_DATA_TYPE* data)
XinZhangMS 0:f7f1f0d76dd6 127 {
XinZhangMS 0:f7f1f0d76dd6 128 DATA_PUBLISHER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 129 char* propertyPathCopy;
XinZhangMS 0:f7f1f0d76dd6 130
XinZhangMS 0:f7f1f0d76dd6 131 /* Codes_SRS_DATA_PUBLISHER_99_017:[ When one or more NULL parameter(s) are specified, DataPublisher_PublishTransacted is called with a NULL transactionHandle, it shall return DATA_PUBLISHER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 132 if ((transactionHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 133 (propertyPath == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 134 (data == NULL))
XinZhangMS 0:f7f1f0d76dd6 135 {
XinZhangMS 0:f7f1f0d76dd6 136 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 137 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 138 }
XinZhangMS 0:f7f1f0d76dd6 139 else if (mallocAndStrcpy_s(&propertyPathCopy, propertyPath) != 0)
XinZhangMS 0:f7f1f0d76dd6 140 {
XinZhangMS 0:f7f1f0d76dd6 141 /* Codes_SRS_DATA_PUBLISHER_99_020:[ For any errors not explicitly mentioned here the DataPublisher APIs shall return DATA_PUBLISHER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 142 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 143 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 144 }
XinZhangMS 0:f7f1f0d76dd6 145 else
XinZhangMS 0:f7f1f0d76dd6 146 {
XinZhangMS 0:f7f1f0d76dd6 147 TRANSACTION_HANDLE_DATA* transaction = (TRANSACTION_HANDLE_DATA*)transactionHandle;
XinZhangMS 0:f7f1f0d76dd6 148 AGENT_DATA_TYPE* propertyValue;
XinZhangMS 0:f7f1f0d76dd6 149
XinZhangMS 0:f7f1f0d76dd6 150 if (!Schema_ModelPropertyByPathExists(transaction->DataPublisherInstance->ModelHandle, propertyPath))
XinZhangMS 0:f7f1f0d76dd6 151 {
XinZhangMS 0:f7f1f0d76dd6 152 free(propertyPathCopy);
XinZhangMS 0:f7f1f0d76dd6 153
XinZhangMS 0:f7f1f0d76dd6 154 /* Codes_SRS_DATA_PUBLISHER_99_040:[ When propertyPath does not exist in the supplied model, DataPublisher_Publish shall return DATA_PUBLISHER_SCHEMA_FAILED without dispatching data.] */
XinZhangMS 0:f7f1f0d76dd6 155 result = DATA_PUBLISHER_SCHEMA_FAILED;
XinZhangMS 0:f7f1f0d76dd6 156 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 157 }
XinZhangMS 0:f7f1f0d76dd6 158 else if ((propertyValue = (AGENT_DATA_TYPE*)malloc(sizeof(AGENT_DATA_TYPE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 159 {
XinZhangMS 0:f7f1f0d76dd6 160 free(propertyPathCopy);
XinZhangMS 0:f7f1f0d76dd6 161
XinZhangMS 0:f7f1f0d76dd6 162 /* Codes_SRS_DATA_PUBLISHER_99_020:[ For any errors not explicitly mentioned here the DataPublisher APIs shall return DATA_PUBLISHER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 163 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 164 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 165 }
XinZhangMS 0:f7f1f0d76dd6 166 else if (Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE(propertyValue, data) != AGENT_DATA_TYPES_OK)
XinZhangMS 0:f7f1f0d76dd6 167 {
XinZhangMS 0:f7f1f0d76dd6 168 free(propertyPathCopy);
XinZhangMS 0:f7f1f0d76dd6 169 free(propertyValue);
XinZhangMS 0:f7f1f0d76dd6 170
XinZhangMS 0:f7f1f0d76dd6 171 /* Codes_SRS_DATA_PUBLISHER_99_028:[ If creating the copy fails then DATA_PUBLISHER_AGENT_DATA_TYPES_ERROR shall be returned.] */
XinZhangMS 0:f7f1f0d76dd6 172 result = DATA_PUBLISHER_AGENT_DATA_TYPES_ERROR;
XinZhangMS 0:f7f1f0d76dd6 173 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 174 }
XinZhangMS 0:f7f1f0d76dd6 175 else
XinZhangMS 0:f7f1f0d76dd6 176 {
XinZhangMS 0:f7f1f0d76dd6 177 size_t i;
XinZhangMS 0:f7f1f0d76dd6 178 DATA_MARSHALLER_VALUE* propertySlot = NULL;
XinZhangMS 0:f7f1f0d76dd6 179
XinZhangMS 0:f7f1f0d76dd6 180 /* Codes_SRS_DATA_PUBLISHER_99_019:[ If the same property is associated twice with a transaction, then the last value shall be kept associated with the transaction.] */
XinZhangMS 0:f7f1f0d76dd6 181 for (i = 0; i < transaction->ValueCount; i++)
XinZhangMS 0:f7f1f0d76dd6 182 {
XinZhangMS 0:f7f1f0d76dd6 183 if (strcmp(transaction->Values[i].PropertyPath, propertyPath) == 0)
XinZhangMS 0:f7f1f0d76dd6 184 {
XinZhangMS 0:f7f1f0d76dd6 185 propertySlot = &transaction->Values[i];
XinZhangMS 0:f7f1f0d76dd6 186 break;
XinZhangMS 0:f7f1f0d76dd6 187 }
XinZhangMS 0:f7f1f0d76dd6 188 }
XinZhangMS 0:f7f1f0d76dd6 189
XinZhangMS 0:f7f1f0d76dd6 190 if (propertySlot == NULL)
XinZhangMS 0:f7f1f0d76dd6 191 {
XinZhangMS 0:f7f1f0d76dd6 192 DATA_MARSHALLER_VALUE* newValues = (DATA_MARSHALLER_VALUE*)realloc(transaction->Values, sizeof(DATA_MARSHALLER_VALUE)* (transaction->ValueCount + 1));
XinZhangMS 0:f7f1f0d76dd6 193 if (newValues != NULL)
XinZhangMS 0:f7f1f0d76dd6 194 {
XinZhangMS 0:f7f1f0d76dd6 195 transaction->Values = newValues;
XinZhangMS 0:f7f1f0d76dd6 196 propertySlot = &transaction->Values[transaction->ValueCount];
XinZhangMS 0:f7f1f0d76dd6 197 propertySlot->Value = NULL;
XinZhangMS 0:f7f1f0d76dd6 198 propertySlot->PropertyPath = NULL;
XinZhangMS 0:f7f1f0d76dd6 199 transaction->ValueCount++;
XinZhangMS 0:f7f1f0d76dd6 200 }
XinZhangMS 0:f7f1f0d76dd6 201 }
XinZhangMS 0:f7f1f0d76dd6 202
XinZhangMS 0:f7f1f0d76dd6 203 if (propertySlot == NULL)
XinZhangMS 0:f7f1f0d76dd6 204 {
XinZhangMS 0:f7f1f0d76dd6 205 Destroy_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)propertyValue);
XinZhangMS 0:f7f1f0d76dd6 206 free(propertyValue);
XinZhangMS 0:f7f1f0d76dd6 207 free(propertyPathCopy);
XinZhangMS 0:f7f1f0d76dd6 208
XinZhangMS 0:f7f1f0d76dd6 209 /* Codes_SRS_DATA_PUBLISHER_99_020:[ For any errors not explicitly mentioned here the DataPublisher APIs shall return DATA_PUBLISHER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 210 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 211 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 212 }
XinZhangMS 0:f7f1f0d76dd6 213 else
XinZhangMS 0:f7f1f0d76dd6 214 {
XinZhangMS 0:f7f1f0d76dd6 215 if (propertySlot->Value != NULL)
XinZhangMS 0:f7f1f0d76dd6 216 {
XinZhangMS 0:f7f1f0d76dd6 217 Destroy_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)propertySlot->Value);
XinZhangMS 0:f7f1f0d76dd6 218 free((AGENT_DATA_TYPE*)propertySlot->Value);
XinZhangMS 0:f7f1f0d76dd6 219 }
XinZhangMS 0:f7f1f0d76dd6 220 if (propertySlot->PropertyPath != NULL)
XinZhangMS 0:f7f1f0d76dd6 221 {
XinZhangMS 0:f7f1f0d76dd6 222 char* existingValue = (char*)propertySlot->PropertyPath;
XinZhangMS 0:f7f1f0d76dd6 223 free(existingValue);
XinZhangMS 0:f7f1f0d76dd6 224 }
XinZhangMS 0:f7f1f0d76dd6 225
XinZhangMS 0:f7f1f0d76dd6 226 /* Codes_SRS_DATA_PUBLISHER_99_016:[ When DataPublisher_PublishTransacted is invoked, DataPublisher shall associate the data with the transaction identified by the transactionHandle argument and return DATA_PUBLISHER_OK. No data shall be dispatched at the time of the call.] */
XinZhangMS 0:f7f1f0d76dd6 227 propertySlot->PropertyPath = propertyPathCopy;
XinZhangMS 0:f7f1f0d76dd6 228 propertySlot->Value = propertyValue;
XinZhangMS 0:f7f1f0d76dd6 229
XinZhangMS 0:f7f1f0d76dd6 230 result = DATA_PUBLISHER_OK;
XinZhangMS 0:f7f1f0d76dd6 231 }
XinZhangMS 0:f7f1f0d76dd6 232 }
XinZhangMS 0:f7f1f0d76dd6 233 }
XinZhangMS 0:f7f1f0d76dd6 234
XinZhangMS 0:f7f1f0d76dd6 235 return result;
XinZhangMS 0:f7f1f0d76dd6 236 }
XinZhangMS 0:f7f1f0d76dd6 237
XinZhangMS 0:f7f1f0d76dd6 238 DATA_PUBLISHER_RESULT DataPublisher_EndTransaction(TRANSACTION_HANDLE transactionHandle, unsigned char** destination, size_t* destinationSize)
XinZhangMS 0:f7f1f0d76dd6 239 {
XinZhangMS 0:f7f1f0d76dd6 240 DATA_PUBLISHER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 241
XinZhangMS 0:f7f1f0d76dd6 242 /*Codes_SRS_DATA_PUBLISHER_02_006: [If the destination argument is NULL, DataPublisher_EndTransaction shall return DATA_PUBLISHER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 243 /*Codes_SRS_DATA_PUBLISHER_02_007: [If the destinationSize argument is NULL, DataPublisher_EndTransaction shall return DATA_PUBLISHER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 244 if (
XinZhangMS 0:f7f1f0d76dd6 245 (transactionHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 246 (destination == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 247 (destinationSize == NULL)
XinZhangMS 0:f7f1f0d76dd6 248 )
XinZhangMS 0:f7f1f0d76dd6 249 {
XinZhangMS 0:f7f1f0d76dd6 250 /* Codes_SRS_DATA_PUBLISHER_99_011:[ If the transactionHandle argument is NULL, DataPublisher_EndTransaction shall return DATA_PUBLISHER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 251 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 252 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 253 }
XinZhangMS 0:f7f1f0d76dd6 254 else
XinZhangMS 0:f7f1f0d76dd6 255 {
XinZhangMS 0:f7f1f0d76dd6 256 TRANSACTION_HANDLE_DATA* transaction = (TRANSACTION_HANDLE_DATA*)transactionHandle;
XinZhangMS 0:f7f1f0d76dd6 257
XinZhangMS 0:f7f1f0d76dd6 258 if (transaction->ValueCount == 0)
XinZhangMS 0:f7f1f0d76dd6 259 {
XinZhangMS 0:f7f1f0d76dd6 260 /* Codes_SRS_DATA_PUBLISHER_99_024:[ If no values have been associated with the transaction, no data shall be dispatched
XinZhangMS 0:f7f1f0d76dd6 261 to DataMarshaller, the transaction shall be discarded and DataPublisher_EndTransaction shall return DATA_PUBLISHER_EMPTY_TRANSACTION.] */
XinZhangMS 0:f7f1f0d76dd6 262 result = DATA_PUBLISHER_EMPTY_TRANSACTION;
XinZhangMS 0:f7f1f0d76dd6 263 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 264 }
XinZhangMS 0:f7f1f0d76dd6 265 /* Codes_SRS_DATA_PUBLISHER_99_010:[ A call to DataPublisher_EndTransaction shall mark the end of a transaction and, trigger a dispatch of all the data grouped by that transaction.] */
XinZhangMS 0:f7f1f0d76dd6 266 else if (DataMarshaller_SendData(transaction->DataPublisherInstance->DataMarshallerHandle, transaction->ValueCount, transaction->Values, destination, destinationSize) != DATA_MARSHALLER_OK)
XinZhangMS 0:f7f1f0d76dd6 267 {
XinZhangMS 0:f7f1f0d76dd6 268 /* Codes_SRS_DATA_PUBLISHER_99_025:[ When the DataMarshaller_SendData call fails, DataPublisher_EndTransaction shall return DATA_PUBLISHER_MARSHALLER_ERROR.] */
XinZhangMS 0:f7f1f0d76dd6 269 result = DATA_PUBLISHER_MARSHALLER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 270 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 271 }
XinZhangMS 0:f7f1f0d76dd6 272 else
XinZhangMS 0:f7f1f0d76dd6 273 {
XinZhangMS 0:f7f1f0d76dd6 274 /* Codes_SRS_DATA_PUBLISHER_99_026:[ On success, DataPublisher_EndTransaction shall return DATA_PUBLISHER_OK.] */
XinZhangMS 0:f7f1f0d76dd6 275 result = DATA_PUBLISHER_OK;
XinZhangMS 0:f7f1f0d76dd6 276 }
XinZhangMS 0:f7f1f0d76dd6 277
XinZhangMS 0:f7f1f0d76dd6 278 /* Codes_SRS_DATA_PUBLISHER_99_012:[ DataPublisher_EndTransaction shall dispose of any resources associated with the transaction.] */
XinZhangMS 0:f7f1f0d76dd6 279 (void)DataPublisher_CancelTransaction(transactionHandle);
XinZhangMS 0:f7f1f0d76dd6 280 }
XinZhangMS 0:f7f1f0d76dd6 281
XinZhangMS 0:f7f1f0d76dd6 282 return result;
XinZhangMS 0:f7f1f0d76dd6 283 }
XinZhangMS 0:f7f1f0d76dd6 284
XinZhangMS 0:f7f1f0d76dd6 285 DATA_PUBLISHER_RESULT DataPublisher_CancelTransaction(TRANSACTION_HANDLE transactionHandle)
XinZhangMS 0:f7f1f0d76dd6 286 {
XinZhangMS 0:f7f1f0d76dd6 287 DATA_PUBLISHER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 288
XinZhangMS 0:f7f1f0d76dd6 289 if (transactionHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 290 {
XinZhangMS 0:f7f1f0d76dd6 291 /* Codes_SRS_DATA_PUBLISHER_99_014:[ If the transactionHandle argument is NULL DataPublisher_CancelTransaction shall return DATA_PUBLISHER_INVALID_ARG.] */
XinZhangMS 0:f7f1f0d76dd6 292 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 293 LOG_DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 294 }
XinZhangMS 0:f7f1f0d76dd6 295 else
XinZhangMS 0:f7f1f0d76dd6 296 {
XinZhangMS 0:f7f1f0d76dd6 297 TRANSACTION_HANDLE_DATA* transaction = (TRANSACTION_HANDLE_DATA*)transactionHandle;
XinZhangMS 0:f7f1f0d76dd6 298 size_t i;
XinZhangMS 0:f7f1f0d76dd6 299
XinZhangMS 0:f7f1f0d76dd6 300 /* Codes_SRS_DATA_PUBLISHER_99_015:[ DataPublisher_CancelTransaction shall dispose of any resources associated with the transaction.] */
XinZhangMS 0:f7f1f0d76dd6 301 for (i = 0; i < transaction->ValueCount; i++)
XinZhangMS 0:f7f1f0d76dd6 302 {
XinZhangMS 0:f7f1f0d76dd6 303 Destroy_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)transaction->Values[i].Value);
XinZhangMS 0:f7f1f0d76dd6 304 free((char*)transaction->Values[i].PropertyPath);
XinZhangMS 0:f7f1f0d76dd6 305 free((AGENT_DATA_TYPE*)transaction->Values[i].Value);
XinZhangMS 0:f7f1f0d76dd6 306 }
XinZhangMS 0:f7f1f0d76dd6 307
XinZhangMS 0:f7f1f0d76dd6 308 /* Codes_SRS_DATA_PUBLISHER_99_015:[ DataPublisher_CancelTransaction shall dispose of any resources associated with the transaction.] */
XinZhangMS 0:f7f1f0d76dd6 309 free(transaction->Values);
XinZhangMS 0:f7f1f0d76dd6 310 free(transaction);
XinZhangMS 0:f7f1f0d76dd6 311
XinZhangMS 0:f7f1f0d76dd6 312 /* Codes_SRS_DATA_PUBLISHER_99_013:[ A call to DataPublisher_CancelTransaction shall dispose of the transaction without dispatching
XinZhangMS 0:f7f1f0d76dd6 313 the data to the DataMarshaller module and it shall return DATA_PUBLISHER_OK.] */
XinZhangMS 0:f7f1f0d76dd6 314 result = DATA_PUBLISHER_OK;
XinZhangMS 0:f7f1f0d76dd6 315 }
XinZhangMS 0:f7f1f0d76dd6 316
XinZhangMS 0:f7f1f0d76dd6 317 return result;
XinZhangMS 0:f7f1f0d76dd6 318 }
XinZhangMS 0:f7f1f0d76dd6 319
XinZhangMS 0:f7f1f0d76dd6 320 /* Codes_SRS_DATA_PUBLISHER_99_065:[ DataPublisher_SetMaxBufferSize shall directly update the value used to limit how much data (in bytes) can be buffered in the BufferStorage instance.] */
XinZhangMS 0:f7f1f0d76dd6 321 void DataPublisher_SetMaxBufferSize(size_t value)
XinZhangMS 0:f7f1f0d76dd6 322 {
XinZhangMS 0:f7f1f0d76dd6 323 maxBufferSize_ = value;
XinZhangMS 0:f7f1f0d76dd6 324 }
XinZhangMS 0:f7f1f0d76dd6 325
XinZhangMS 0:f7f1f0d76dd6 326 /* Codes_SRS_DATA_PUBLISHER_99_069:[ DataMarshaller_GetMaxBufferSize shall return the current max buffer size value used by any new instance of DataMarshaller.] */
XinZhangMS 0:f7f1f0d76dd6 327 size_t DataPublisher_GetMaxBufferSize(void)
XinZhangMS 0:f7f1f0d76dd6 328 {
XinZhangMS 0:f7f1f0d76dd6 329 return maxBufferSize_;
XinZhangMS 0:f7f1f0d76dd6 330 }
XinZhangMS 0:f7f1f0d76dd6 331
XinZhangMS 0:f7f1f0d76dd6 332 REPORTED_PROPERTIES_TRANSACTION_HANDLE DataPublisher_CreateTransaction_ReportedProperties(DATA_PUBLISHER_HANDLE dataPublisherHandle)
XinZhangMS 0:f7f1f0d76dd6 333 {
XinZhangMS 0:f7f1f0d76dd6 334 REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA* result;
XinZhangMS 0:f7f1f0d76dd6 335 /*Codes_SRS_DATA_PUBLISHER_02_027: [ If argument dataPublisherHandle is NULL then DataPublisher_CreateTransaction_ReportedProperties shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 336 if (dataPublisherHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 337 {
XinZhangMS 0:f7f1f0d76dd6 338 LogError("invalid argument DATA_PUBLISHER_HANDLE dataPublisherHandle=%p", dataPublisherHandle);
XinZhangMS 0:f7f1f0d76dd6 339 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 340 }
XinZhangMS 0:f7f1f0d76dd6 341 else
XinZhangMS 0:f7f1f0d76dd6 342 {
XinZhangMS 0:f7f1f0d76dd6 343 /*Codes_SRS_DATA_PUBLISHER_02_028: [ DataPublisher_CreateTransaction_ReportedProperties shall create a VECTOR_HANDLE holding the individual elements of the transaction (DATA_MARSHALLER_VALUE). ]*/
XinZhangMS 0:f7f1f0d76dd6 344 result = (REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA*)malloc(sizeof(REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA));
XinZhangMS 0:f7f1f0d76dd6 345 if (result == NULL)
XinZhangMS 0:f7f1f0d76dd6 346 {
XinZhangMS 0:f7f1f0d76dd6 347 /*Codes_SRS_DATA_PUBLISHER_02_029: [ If any error occurs then DataPublisher_CreateTransaction_ReportedProperties shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 348 LogError("unable to malloc");
XinZhangMS 0:f7f1f0d76dd6 349 /*return as is */
XinZhangMS 0:f7f1f0d76dd6 350 }
XinZhangMS 0:f7f1f0d76dd6 351 else
XinZhangMS 0:f7f1f0d76dd6 352 {
XinZhangMS 0:f7f1f0d76dd6 353 result->value = VECTOR_create(sizeof(DATA_MARSHALLER_VALUE*));
XinZhangMS 0:f7f1f0d76dd6 354 if (result->value == NULL)
XinZhangMS 0:f7f1f0d76dd6 355 {
XinZhangMS 0:f7f1f0d76dd6 356 /*Codes_SRS_DATA_PUBLISHER_02_029: [ If any error occurs then DataPublisher_CreateTransaction_ReportedProperties shall fail and return NULL. ]*/
XinZhangMS 0:f7f1f0d76dd6 357 LogError("unable to VECTOR_create");
XinZhangMS 0:f7f1f0d76dd6 358 free(result);
XinZhangMS 0:f7f1f0d76dd6 359 result = NULL;
XinZhangMS 0:f7f1f0d76dd6 360 }
XinZhangMS 0:f7f1f0d76dd6 361 else
XinZhangMS 0:f7f1f0d76dd6 362 {
XinZhangMS 0:f7f1f0d76dd6 363 /*Codes_SRS_DATA_PUBLISHER_02_030: [ Otherwise DataPublisher_CreateTransaction_ReportedProperties shall succeed and return a non-NULL handle. ]*/
XinZhangMS 0:f7f1f0d76dd6 364 result->DataPublisherInstance = dataPublisherHandle;
XinZhangMS 0:f7f1f0d76dd6 365 }
XinZhangMS 0:f7f1f0d76dd6 366 }
XinZhangMS 0:f7f1f0d76dd6 367 }
XinZhangMS 0:f7f1f0d76dd6 368
XinZhangMS 0:f7f1f0d76dd6 369 return result;
XinZhangMS 0:f7f1f0d76dd6 370 }
XinZhangMS 0:f7f1f0d76dd6 371
XinZhangMS 0:f7f1f0d76dd6 372 static bool reportedPropertyExistsByPath(const void* element, const void* value)
XinZhangMS 0:f7f1f0d76dd6 373 {
XinZhangMS 0:f7f1f0d76dd6 374 DATA_MARSHALLER_VALUE* dataMarshallerValue = *(DATA_MARSHALLER_VALUE**)element;
XinZhangMS 0:f7f1f0d76dd6 375 return (strcmp(dataMarshallerValue->PropertyPath, (const char*)value) == 0);
XinZhangMS 0:f7f1f0d76dd6 376 }
XinZhangMS 0:f7f1f0d76dd6 377
XinZhangMS 0:f7f1f0d76dd6 378 DATA_PUBLISHER_RESULT DataPublisher_PublishTransacted_ReportedProperty(REPORTED_PROPERTIES_TRANSACTION_HANDLE transactionHandle, const char* reportedPropertyPath, const AGENT_DATA_TYPE* data)
XinZhangMS 0:f7f1f0d76dd6 379 {
XinZhangMS 0:f7f1f0d76dd6 380 DATA_PUBLISHER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 381 /*Codes_SRS_DATA_PUBLISHER_02_009: [ If argument transactionHandle is NULL then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 382 /*Codes_SRS_DATA_PUBLISHER_02_010: [ If argument reportedPropertyPath is NULL then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 383 /*Codes_SRS_DATA_PUBLISHER_02_011: [ If argument data is NULL then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 384 if (
XinZhangMS 0:f7f1f0d76dd6 385 (transactionHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 386 (reportedPropertyPath == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 387 (data == NULL)
XinZhangMS 0:f7f1f0d76dd6 388 )
XinZhangMS 0:f7f1f0d76dd6 389 {
XinZhangMS 0:f7f1f0d76dd6 390 LogError("invalid argument REPORTED_PROPERTIES_TRANSACTION_HANDLE transactionHandle=%p, const char* reportedPropertyPath=%p, const AGENT_DATA_TYPE* data=%p", transactionHandle, reportedPropertyPath, data);
XinZhangMS 0:f7f1f0d76dd6 391 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 392 }
XinZhangMS 0:f7f1f0d76dd6 393 else
XinZhangMS 0:f7f1f0d76dd6 394 {
XinZhangMS 0:f7f1f0d76dd6 395 REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA* handleData = (REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA*)transactionHandle;
XinZhangMS 0:f7f1f0d76dd6 396 /*Codes_SRS_DATA_PUBLISHER_02_012: [ DataPublisher_PublishTransacted_ReportedProperty shall verify that a reported property having the path reportedPropertyPath exists in the model by calling Schema_ModelReportedPropertyByPathExists ]*/
XinZhangMS 0:f7f1f0d76dd6 397 if (!Schema_ModelReportedPropertyByPathExists(handleData->DataPublisherInstance->ModelHandle, reportedPropertyPath))
XinZhangMS 0:f7f1f0d76dd6 398 {
XinZhangMS 0:f7f1f0d76dd6 399 /*Codes_SRS_DATA_PUBLISHER_02_013: [ If a reported property with path reportedPropertyPath does not exist in the model then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 400 LogError("unable to find a reported property by path \"%s\"", reportedPropertyPath);
XinZhangMS 0:f7f1f0d76dd6 401 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 402 }
XinZhangMS 0:f7f1f0d76dd6 403 else
XinZhangMS 0:f7f1f0d76dd6 404 {
XinZhangMS 0:f7f1f0d76dd6 405 DATA_MARSHALLER_VALUE** existingValue = VECTOR_find_if(handleData->value, reportedPropertyExistsByPath, reportedPropertyPath);
XinZhangMS 0:f7f1f0d76dd6 406 if(existingValue != NULL)
XinZhangMS 0:f7f1f0d76dd6 407 {
XinZhangMS 0:f7f1f0d76dd6 408 /*Codes_SRS_DATA_PUBLISHER_02_014: [ If the same (by reportedPropertypath) reported property has already been added to the transaction, then DataPublisher_PublishTransacted_ReportedProperty shall overwrite the previous reported property. ]*/
XinZhangMS 0:f7f1f0d76dd6 409 AGENT_DATA_TYPE *clone = (AGENT_DATA_TYPE *)malloc(sizeof(AGENT_DATA_TYPE));
XinZhangMS 0:f7f1f0d76dd6 410 if(clone == NULL)
XinZhangMS 0:f7f1f0d76dd6 411 {
XinZhangMS 0:f7f1f0d76dd6 412 /*Codes_SRS_DATA_PUBLISHER_02_016: [ If any error occurs then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 413 LogError("unable to malloc");
XinZhangMS 0:f7f1f0d76dd6 414 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 415 }
XinZhangMS 0:f7f1f0d76dd6 416 else
XinZhangMS 0:f7f1f0d76dd6 417 {
XinZhangMS 0:f7f1f0d76dd6 418 if (Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE(clone, data) != AGENT_DATA_TYPES_OK)
XinZhangMS 0:f7f1f0d76dd6 419 {
XinZhangMS 0:f7f1f0d76dd6 420 /*Codes_SRS_DATA_PUBLISHER_02_016: [ If any error occurs then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 421 LogError("unable to Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE");
XinZhangMS 0:f7f1f0d76dd6 422 free(clone);
XinZhangMS 0:f7f1f0d76dd6 423 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 424 }
XinZhangMS 0:f7f1f0d76dd6 425 else
XinZhangMS 0:f7f1f0d76dd6 426 {
XinZhangMS 0:f7f1f0d76dd6 427 /*Codes_SRS_DATA_PUBLISHER_02_017: [ Otherwise DataPublisher_PublishTransacted_ReportedProperty shall succeed and return DATA_PUBLISHER_OK. ]*/
XinZhangMS 0:f7f1f0d76dd6 428 Destroy_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)((*existingValue)->Value));
XinZhangMS 0:f7f1f0d76dd6 429 free((void*)((*existingValue)->Value));
XinZhangMS 0:f7f1f0d76dd6 430 (*existingValue)->Value = clone;
XinZhangMS 0:f7f1f0d76dd6 431 result = DATA_PUBLISHER_OK;
XinZhangMS 0:f7f1f0d76dd6 432 }
XinZhangMS 0:f7f1f0d76dd6 433 }
XinZhangMS 0:f7f1f0d76dd6 434 }
XinZhangMS 0:f7f1f0d76dd6 435 else
XinZhangMS 0:f7f1f0d76dd6 436 {
XinZhangMS 0:f7f1f0d76dd6 437 /*totally new reported property*/
XinZhangMS 0:f7f1f0d76dd6 438 DATA_MARSHALLER_VALUE* newValue = (DATA_MARSHALLER_VALUE*)malloc(sizeof(DATA_MARSHALLER_VALUE));
XinZhangMS 0:f7f1f0d76dd6 439 if (newValue == NULL)
XinZhangMS 0:f7f1f0d76dd6 440 {
XinZhangMS 0:f7f1f0d76dd6 441 /*Codes_SRS_DATA_PUBLISHER_02_016: [ If any error occurs then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 442 LogError("unable to malloc");
XinZhangMS 0:f7f1f0d76dd6 443 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 444 }
XinZhangMS 0:f7f1f0d76dd6 445 else
XinZhangMS 0:f7f1f0d76dd6 446 {
XinZhangMS 0:f7f1f0d76dd6 447 if (mallocAndStrcpy_s((char**)&(newValue->PropertyPath), reportedPropertyPath) != 0)
XinZhangMS 0:f7f1f0d76dd6 448 {
XinZhangMS 0:f7f1f0d76dd6 449 /*Codes_SRS_DATA_PUBLISHER_02_016: [ If any error occurs then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 450 LogError("unable to mallocAndStrcpy_s");
XinZhangMS 0:f7f1f0d76dd6 451 free(newValue);
XinZhangMS 0:f7f1f0d76dd6 452 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 453 }
XinZhangMS 0:f7f1f0d76dd6 454 else
XinZhangMS 0:f7f1f0d76dd6 455 {
XinZhangMS 0:f7f1f0d76dd6 456 if ((newValue->Value = (AGENT_DATA_TYPE*)malloc(sizeof(AGENT_DATA_TYPE))) == NULL)
XinZhangMS 0:f7f1f0d76dd6 457 {
XinZhangMS 0:f7f1f0d76dd6 458 LogError("unable to malloc");
XinZhangMS 0:f7f1f0d76dd6 459 free((void*)newValue->PropertyPath);
XinZhangMS 0:f7f1f0d76dd6 460 free(newValue);
XinZhangMS 0:f7f1f0d76dd6 461 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 462 }
XinZhangMS 0:f7f1f0d76dd6 463 else
XinZhangMS 0:f7f1f0d76dd6 464 {
XinZhangMS 0:f7f1f0d76dd6 465 if (Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)newValue->Value, data) != AGENT_DATA_TYPES_OK)
XinZhangMS 0:f7f1f0d76dd6 466 {
XinZhangMS 0:f7f1f0d76dd6 467 /*Codes_SRS_DATA_PUBLISHER_02_016: [ If any error occurs then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 468 LogError("unable to Create_AGENT_DATA_TYPE_from_AGENT_DATA_TYPE");
XinZhangMS 0:f7f1f0d76dd6 469 free((void*)newValue->Value);
XinZhangMS 0:f7f1f0d76dd6 470 free((void*)newValue->PropertyPath);
XinZhangMS 0:f7f1f0d76dd6 471 free(newValue);
XinZhangMS 0:f7f1f0d76dd6 472 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 473 }
XinZhangMS 0:f7f1f0d76dd6 474 else
XinZhangMS 0:f7f1f0d76dd6 475 {
XinZhangMS 0:f7f1f0d76dd6 476 /*Codes_SRS_DATA_PUBLISHER_02_015: [ DataPublisher_PublishTransacted_ReportedProperty shall add a new DATA_MARSHALLER_VALUE to the VECTOR_HANDLE. ]*/
XinZhangMS 0:f7f1f0d76dd6 477 if (VECTOR_push_back(handleData->value, &newValue, 1) != 0)
XinZhangMS 0:f7f1f0d76dd6 478 {
XinZhangMS 0:f7f1f0d76dd6 479 /*Codes_SRS_DATA_PUBLISHER_02_016: [ If any error occurs then DataPublisher_PublishTransacted_ReportedProperty shall fail and return DATA_PUBLISHER_ERROR. */
XinZhangMS 0:f7f1f0d76dd6 480 LogError("unable to VECTOR_push_back");
XinZhangMS 0:f7f1f0d76dd6 481 Destroy_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)newValue->Value);
XinZhangMS 0:f7f1f0d76dd6 482 free((void*)newValue->Value);
XinZhangMS 0:f7f1f0d76dd6 483 free((void*)newValue->PropertyPath);
XinZhangMS 0:f7f1f0d76dd6 484 free(newValue);
XinZhangMS 0:f7f1f0d76dd6 485 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 486 }
XinZhangMS 0:f7f1f0d76dd6 487 else
XinZhangMS 0:f7f1f0d76dd6 488 {
XinZhangMS 0:f7f1f0d76dd6 489 /*Codes_SRS_DATA_PUBLISHER_02_017: [ Otherwise DataPublisher_PublishTransacted_ReportedProperty shall succeed and return DATA_PUBLISHER_OK. ]*/
XinZhangMS 0:f7f1f0d76dd6 490 result = DATA_PUBLISHER_OK;
XinZhangMS 0:f7f1f0d76dd6 491 }
XinZhangMS 0:f7f1f0d76dd6 492 }
XinZhangMS 0:f7f1f0d76dd6 493 }
XinZhangMS 0:f7f1f0d76dd6 494 }
XinZhangMS 0:f7f1f0d76dd6 495 }
XinZhangMS 0:f7f1f0d76dd6 496 }
XinZhangMS 0:f7f1f0d76dd6 497 }
XinZhangMS 0:f7f1f0d76dd6 498 }
XinZhangMS 0:f7f1f0d76dd6 499 return result;
XinZhangMS 0:f7f1f0d76dd6 500 }
XinZhangMS 0:f7f1f0d76dd6 501
XinZhangMS 0:f7f1f0d76dd6 502 DATA_PUBLISHER_RESULT DataPublisher_CommitTransaction_ReportedProperties(REPORTED_PROPERTIES_TRANSACTION_HANDLE transactionHandle, unsigned char** destination, size_t* destinationSize)
XinZhangMS 0:f7f1f0d76dd6 503 {
XinZhangMS 0:f7f1f0d76dd6 504 DATA_PUBLISHER_RESULT result;
XinZhangMS 0:f7f1f0d76dd6 505 /*Codes_SRS_DATA_PUBLISHER_02_019: [ If argument transactionHandle is NULL then DataPublisher_CommitTransaction_ReportedProperties shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 506 /*Codes_SRS_DATA_PUBLISHER_02_020: [ If argument destination is NULL then DataPublisher_CommitTransaction_ReportedProperties shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 507 /*Codes_SRS_DATA_PUBLISHER_02_021: [ If argument destinationSize NULL then DataPublisher_CommitTransaction_ReportedProperties shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 508 if (
XinZhangMS 0:f7f1f0d76dd6 509 (transactionHandle == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 510 (destination == NULL) ||
XinZhangMS 0:f7f1f0d76dd6 511 (destinationSize == NULL)
XinZhangMS 0:f7f1f0d76dd6 512 )
XinZhangMS 0:f7f1f0d76dd6 513 {
XinZhangMS 0:f7f1f0d76dd6 514 LogError("invalid argument REPORTED_PROPERTIES_TRANSACTION_HANDLE transactionHandle=%p, unsigned char** destination=%p, size_t* destinationSize=%p", transactionHandle, destination, destinationSize);
XinZhangMS 0:f7f1f0d76dd6 515 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 516 }
XinZhangMS 0:f7f1f0d76dd6 517 else
XinZhangMS 0:f7f1f0d76dd6 518 {
XinZhangMS 0:f7f1f0d76dd6 519 /*Codes_SRS_DATA_PUBLISHER_02_031: [ If the transaction contains zero elements then DataPublisher_CommitTransaction_ReportedProperties shall fail and return DATA_PUBLISHER_INVALID_ARG. ]*/
XinZhangMS 0:f7f1f0d76dd6 520 REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA* handle = (REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA*)transactionHandle;
XinZhangMS 0:f7f1f0d76dd6 521 if (VECTOR_size(handle->value) == 0)
XinZhangMS 0:f7f1f0d76dd6 522 {
XinZhangMS 0:f7f1f0d76dd6 523 LogError("cannot commit empty transaction");
XinZhangMS 0:f7f1f0d76dd6 524 result = DATA_PUBLISHER_INVALID_ARG;
XinZhangMS 0:f7f1f0d76dd6 525 }
XinZhangMS 0:f7f1f0d76dd6 526 else
XinZhangMS 0:f7f1f0d76dd6 527 {
XinZhangMS 0:f7f1f0d76dd6 528 /*Codes_SRS_DATA_PUBLISHER_02_022: [ DataPublisher_CommitTransaction_ReportedProperties shall call DataMarshaller_SendData_ReportedProperties providing the VECTOR_HANDLE holding the transacted reported properties, destination and destinationSize. ]*/
XinZhangMS 0:f7f1f0d76dd6 529 if (DataMarshaller_SendData_ReportedProperties(handle->DataPublisherInstance->DataMarshallerHandle, handle->value, destination, destinationSize) != DATA_MARSHALLER_OK)
XinZhangMS 0:f7f1f0d76dd6 530 {
XinZhangMS 0:f7f1f0d76dd6 531 /*Codes_SRS_DATA_PUBLISHER_02_023: [ If any error occurs then DataPublisher_CommitTransaction_ReportedProperties shall fail and return DATA_PUBLISHER_ERROR. ]*/
XinZhangMS 0:f7f1f0d76dd6 532 LogError("unable to DataMarshaller_SendData_ReportedProperties");
XinZhangMS 0:f7f1f0d76dd6 533 result = DATA_PUBLISHER_ERROR;
XinZhangMS 0:f7f1f0d76dd6 534 }
XinZhangMS 0:f7f1f0d76dd6 535 else
XinZhangMS 0:f7f1f0d76dd6 536 {
XinZhangMS 0:f7f1f0d76dd6 537 /*Codes_SRS_DATA_PUBLISHER_02_024: [ Otherwise DataPublisher_CommitTransaction_ReportedProperties shall succeed and return DATA_PUBLISHER_OK. ]*/
XinZhangMS 0:f7f1f0d76dd6 538 result = DATA_PUBLISHER_OK;
XinZhangMS 0:f7f1f0d76dd6 539 }
XinZhangMS 0:f7f1f0d76dd6 540 }
XinZhangMS 0:f7f1f0d76dd6 541 }
XinZhangMS 0:f7f1f0d76dd6 542
XinZhangMS 0:f7f1f0d76dd6 543 return result;
XinZhangMS 0:f7f1f0d76dd6 544 }
XinZhangMS 0:f7f1f0d76dd6 545
XinZhangMS 0:f7f1f0d76dd6 546 void DataPublisher_DestroyTransaction_ReportedProperties(REPORTED_PROPERTIES_TRANSACTION_HANDLE transactionHandle)
XinZhangMS 0:f7f1f0d76dd6 547 {
XinZhangMS 0:f7f1f0d76dd6 548 /*Codes_SRS_DATA_PUBLISHER_02_025: [ If argument transactionHandle is NULL then DataPublisher_DestroyTransaction_ReportedProperties shall return. ]*/
XinZhangMS 0:f7f1f0d76dd6 549 if (transactionHandle == NULL)
XinZhangMS 0:f7f1f0d76dd6 550 {
XinZhangMS 0:f7f1f0d76dd6 551 LogError("invalig argument REPORTED_PROPERTIES_TRANSACTION_HANDLE transactionHandle=%p", transactionHandle);
XinZhangMS 0:f7f1f0d76dd6 552 }
XinZhangMS 0:f7f1f0d76dd6 553 else
XinZhangMS 0:f7f1f0d76dd6 554 {
XinZhangMS 0:f7f1f0d76dd6 555 /*Codes_SRS_DATA_PUBLISHER_02_026: [ Otherwise DataPublisher_DestroyTransaction_ReportedProperties shall free all resources associated with the reported properties transactionHandle. ]*/
XinZhangMS 0:f7f1f0d76dd6 556 REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA* handleData = (REPORTED_PROPERTIES_TRANSACTION_HANDLE_DATA*)transactionHandle;
XinZhangMS 0:f7f1f0d76dd6 557 size_t i, nReportedProperties;
XinZhangMS 0:f7f1f0d76dd6 558 nReportedProperties = VECTOR_size(handleData->value);
XinZhangMS 0:f7f1f0d76dd6 559 for (i = 0;i < nReportedProperties;i++)
XinZhangMS 0:f7f1f0d76dd6 560 {
XinZhangMS 0:f7f1f0d76dd6 561 DATA_MARSHALLER_VALUE *value = *(DATA_MARSHALLER_VALUE**)VECTOR_element(handleData->value, i);
XinZhangMS 0:f7f1f0d76dd6 562 Destroy_AGENT_DATA_TYPE((AGENT_DATA_TYPE*)value->Value);
XinZhangMS 0:f7f1f0d76dd6 563 free((void*)value->Value);
XinZhangMS 0:f7f1f0d76dd6 564 free((void*)value->PropertyPath);
XinZhangMS 0:f7f1f0d76dd6 565 free((void*)value);
XinZhangMS 0:f7f1f0d76dd6 566 }
XinZhangMS 0:f7f1f0d76dd6 567 VECTOR_destroy(handleData->value);
XinZhangMS 0:f7f1f0d76dd6 568 free(handleData);
XinZhangMS 0:f7f1f0d76dd6 569 }
XinZhangMS 0:f7f1f0d76dd6 570 return;
XinZhangMS 0:f7f1f0d76dd6 571 }