|
@@ -260,19 +260,26 @@ UA_Server_addDataSetField(UA_Server *server, const UA_NodeId publishedDataSet,
|
|
const UA_DataSetFieldConfig *fieldConfig,
|
|
const UA_DataSetFieldConfig *fieldConfig,
|
|
UA_NodeId *fieldIdentifier) {
|
|
UA_NodeId *fieldIdentifier) {
|
|
UA_StatusCode retVal = UA_STATUSCODE_GOOD;
|
|
UA_StatusCode retVal = UA_STATUSCODE_GOOD;
|
|
|
|
+ UA_DataSetFieldResult result = {UA_STATUSCODE_BADINVALIDARGUMENT, {0, 0}};
|
|
if(!fieldConfig)
|
|
if(!fieldConfig)
|
|
- return (UA_DataSetFieldResult) {UA_STATUSCODE_BADINVALIDARGUMENT, {0, 0}};
|
|
|
|
|
|
+ return result;
|
|
|
|
|
|
UA_PublishedDataSet *currentDataSet = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet);
|
|
UA_PublishedDataSet *currentDataSet = UA_PublishedDataSet_findPDSbyId(server, publishedDataSet);
|
|
- if(currentDataSet == NULL)
|
|
|
|
- return (UA_DataSetFieldResult) {UA_STATUSCODE_BADNOTFOUND, {0, 0}};
|
|
|
|
|
|
+ if(currentDataSet == NULL){
|
|
|
|
+ result.result = UA_STATUSCODE_BADNOTFOUND;
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
|
|
- if(currentDataSet->config.publishedDataSetType != UA_PUBSUB_DATASET_PUBLISHEDITEMS)
|
|
|
|
- return (UA_DataSetFieldResult) {UA_STATUSCODE_BADNOTIMPLEMENTED, {0, 0}};
|
|
|
|
|
|
+ if(currentDataSet->config.publishedDataSetType != UA_PUBSUB_DATASET_PUBLISHEDITEMS){
|
|
|
|
+ result.result = UA_STATUSCODE_BADNOTIMPLEMENTED;
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
|
|
UA_DataSetField *newField = (UA_DataSetField *) UA_calloc(1, sizeof(UA_DataSetField));
|
|
UA_DataSetField *newField = (UA_DataSetField *) UA_calloc(1, sizeof(UA_DataSetField));
|
|
- if(!newField)
|
|
|
|
- return (UA_DataSetFieldResult) {UA_STATUSCODE_BADINTERNALERROR, {0, 0}};
|
|
|
|
|
|
+ if(!newField){
|
|
|
|
+ result.result = UA_STATUSCODE_BADINTERNALERROR;
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
|
|
UA_DataSetFieldConfig tmpFieldConfig;
|
|
UA_DataSetFieldConfig tmpFieldConfig;
|
|
retVal |= UA_DataSetFieldConfig_copy(fieldConfig, &tmpFieldConfig);
|
|
retVal |= UA_DataSetFieldConfig_copy(fieldConfig, &tmpFieldConfig);
|
|
@@ -288,22 +295,23 @@ UA_Server_addDataSetField(UA_Server *server, const UA_NodeId publishedDataSet,
|
|
if(newField->config.field.variable.promotedField)
|
|
if(newField->config.field.variable.promotedField)
|
|
currentDataSet->promotedFieldsCount++;
|
|
currentDataSet->promotedFieldsCount++;
|
|
currentDataSet->fieldSize++;
|
|
currentDataSet->fieldSize++;
|
|
- UA_DataSetFieldResult result =
|
|
|
|
- {retVal, {currentDataSet->dataSetMetaData.configurationVersion.majorVersion,
|
|
|
|
- currentDataSet->dataSetMetaData.configurationVersion.minorVersion}};
|
|
|
|
|
|
+ result.result = retVal;
|
|
|
|
+ result.configurationVersion.majorVersion = currentDataSet->dataSetMetaData.configurationVersion.majorVersion;
|
|
|
|
+ result.configurationVersion.minorVersion = currentDataSet->dataSetMetaData.configurationVersion.minorVersion;
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
UA_DataSetFieldResult
|
|
UA_DataSetFieldResult
|
|
UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf) {
|
|
UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf) {
|
|
UA_DataSetField *currentField = UA_DataSetField_findDSFbyId(server, dsf);
|
|
UA_DataSetField *currentField = UA_DataSetField_findDSFbyId(server, dsf);
|
|
- if(!currentField)
|
|
|
|
- return (UA_DataSetFieldResult) {UA_STATUSCODE_BADNOTFOUND, {0, 0}};
|
|
|
|
|
|
+ UA_DataSetFieldResult result = {UA_STATUSCODE_BADNOTFOUND, {0, 0}};
|
|
|
|
+ if(!currentField)
|
|
|
|
+ return result;
|
|
|
|
|
|
UA_PublishedDataSet *parentPublishedDataSet =
|
|
UA_PublishedDataSet *parentPublishedDataSet =
|
|
UA_PublishedDataSet_findPDSbyId(server, currentField->publishedDataSet);
|
|
UA_PublishedDataSet_findPDSbyId(server, currentField->publishedDataSet);
|
|
if(!parentPublishedDataSet)
|
|
if(!parentPublishedDataSet)
|
|
- return (UA_DataSetFieldResult) {UA_STATUSCODE_BADNOTFOUND, {0, 0}};
|
|
|
|
|
|
+ return result;
|
|
|
|
|
|
parentPublishedDataSet->fieldSize--;
|
|
parentPublishedDataSet->fieldSize--;
|
|
if(currentField->config.field.variable.promotedField)
|
|
if(currentField->config.field.variable.promotedField)
|
|
@@ -314,9 +322,9 @@ UA_Server_removeDataSetField(UA_Server *server, const UA_NodeId dsf) {
|
|
UA_PubSubConfigurationVersionTimeDifference();
|
|
UA_PubSubConfigurationVersionTimeDifference();
|
|
UA_DataSetField_deleteMembers(currentField);
|
|
UA_DataSetField_deleteMembers(currentField);
|
|
UA_free(currentField);
|
|
UA_free(currentField);
|
|
- UA_DataSetFieldResult result =
|
|
|
|
- {UA_STATUSCODE_GOOD, {parentPublishedDataSet->dataSetMetaData.configurationVersion.majorVersion,
|
|
|
|
- parentPublishedDataSet->dataSetMetaData.configurationVersion.minorVersion}};
|
|
|
|
|
|
+ result.result = UA_STATUSCODE_GOOD;
|
|
|
|
+ result.configurationVersion.majorVersion = parentPublishedDataSet->dataSetMetaData.configurationVersion.majorVersion;
|
|
|
|
+ result.configurationVersion.minorVersion = parentPublishedDataSet->dataSetMetaData.configurationVersion.minorVersion;
|
|
return result;
|
|
return result;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -990,6 +998,11 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
|
|
UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, "Unknown encoding type.");
|
|
UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, "Unknown encoding type.");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, writerGroup->linkedConnection);
|
|
|
|
+ if(!connection){
|
|
|
|
+ UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, "Publish failed. PubSubConnection invalid.");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
//prevent error if the maxEncapsulatedDataSetMessageCount is set to 0->1
|
|
//prevent error if the maxEncapsulatedDataSetMessageCount is set to 0->1
|
|
writerGroup->config.maxEncapsulatedDataSetMessageCount = (UA_UInt16) (writerGroup->config.maxEncapsulatedDataSetMessageCount == 0 ||
|
|
writerGroup->config.maxEncapsulatedDataSetMessageCount = (UA_UInt16) (writerGroup->config.maxEncapsulatedDataSetMessageCount == 0 ||
|
|
writerGroup->config.maxEncapsulatedDataSetMessageCount > UA_BYTE_MAX
|
|
writerGroup->config.maxEncapsulatedDataSetMessageCount > UA_BYTE_MAX
|
|
@@ -1056,6 +1069,14 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
|
|
(combinedNetworkMessageCount % writerGroup->config.maxEncapsulatedDataSetMessageCount) == 0 ? 0 : 1);
|
|
(combinedNetworkMessageCount % writerGroup->config.maxEncapsulatedDataSetMessageCount) == 0 ? 0 : 1);
|
|
networkMessageCount += combinedNetworkMessageCount;
|
|
networkMessageCount += combinedNetworkMessageCount;
|
|
}
|
|
}
|
|
|
|
+ if(networkMessageCount < 1){
|
|
|
|
+ for(size_t i = 0; i < writerGroup->writersCount; i++){
|
|
|
|
+ UA_DataSetMessage_free(&dsmStore[i]);
|
|
|
|
+ }
|
|
|
|
+ UA_free(dsmStore);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
//Alloc memory for the NetworkMessages on the stack
|
|
//Alloc memory for the NetworkMessages on the stack
|
|
UA_STACKARRAY(UA_NetworkMessage, nmStore, networkMessageCount);
|
|
UA_STACKARRAY(UA_NetworkMessage, nmStore, networkMessageCount);
|
|
memset(nmStore, 0, networkMessageCount * sizeof(UA_NetworkMessage));
|
|
memset(nmStore, 0, networkMessageCount * sizeof(UA_NetworkMessage));
|
|
@@ -1093,11 +1114,6 @@ UA_WriterGroup_publishCallback(UA_Server *server, UA_WriterGroup *writerGroup) {
|
|
nmStore->payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
|
|
nmStore->payload.dataSetPayload.sizes = &dsmSizes[currentDSMPosition];
|
|
nmStore->payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
|
|
nmStore->payloadHeader.dataSetPayloadHeader.dataSetWriterIds = &dsWriterIds[currentDSMPosition];
|
|
}
|
|
}
|
|
- UA_PubSubConnection *connection = UA_PubSubConnection_findConnectionbyId(server, writerGroup->linkedConnection);
|
|
|
|
- if(!connection){
|
|
|
|
- UA_LOG_ERROR(server->config.logger, UA_LOGCATEGORY_SERVER, "Publish failed. PubSubConnection invalid.");
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
//send the prepared messages
|
|
//send the prepared messages
|
|
UA_ByteString buf;
|
|
UA_ByteString buf;
|
|
size_t msgSize = UA_NetworkMessage_calcSizeBinary(&nmStore[i]);
|
|
size_t msgSize = UA_NetworkMessage_calcSizeBinary(&nmStore[i]);
|