|
@@ -76,17 +76,16 @@ checkParentReference(UA_Server *server, UA_Session *session, UA_NodeClass nodeCl
|
|
|
return UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
|
|
|
}
|
|
|
|
|
|
- UA_NodeClass referenceTypeNodeClass = referenceType->nodeClass;
|
|
|
- UA_Boolean referenceTypeIsAbstract = referenceType->isAbstract;
|
|
|
- UA_Nodestore_release(server, (const UA_Node*)referenceType);
|
|
|
-
|
|
|
|
|
|
- if(referenceTypeNodeClass != UA_NODECLASS_REFERENCETYPE) {
|
|
|
+ if(referenceType->nodeClass != UA_NODECLASS_REFERENCETYPE) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
|
"AddNodes: Reference type to the parent invalid");
|
|
|
+ UA_Nodestore_release(server, (const UA_Node*)referenceType);
|
|
|
return UA_STATUSCODE_BADREFERENCETYPEIDINVALID;
|
|
|
}
|
|
|
|
|
|
+ UA_Boolean referenceTypeIsAbstract = referenceType->isAbstract;
|
|
|
+ UA_Nodestore_release(server, (const UA_Node*)referenceType);
|
|
|
|
|
|
if(referenceTypeIsAbstract == true) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
@@ -162,13 +161,12 @@ typeCheckVariableNode(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
* skip the test */
|
|
|
const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
|
|
|
- const UA_NodeId refs[2] = {
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT)
|
|
|
- };
|
|
|
+ UA_NodeId refs[2];
|
|
|
+ refs[0] = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
|
|
|
+ refs[1] = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
|
|
|
if(node->valueRank != vt->valueRank &&
|
|
|
node->valueRank != UA_VariableAttributes_default.valueRank &&
|
|
|
- !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs , 2)) {
|
|
|
+ !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs, 2)) {
|
|
|
|
|
|
if(!compatibleValueRanks(node->valueRank, vt->valueRank))
|
|
|
return UA_STATUSCODE_BADTYPEMISMATCH;
|
|
@@ -221,8 +219,10 @@ useVariableTypeAttributes(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
const UA_VariableTypeNode *vt = (const UA_VariableTypeNode*)
|
|
|
UA_Nodestore_get(server, typeDefinition);
|
|
|
- if(!vt || vt->nodeClass != UA_NODECLASS_VARIABLETYPE)
|
|
|
+ if(!vt || vt->nodeClass != UA_NODECLASS_VARIABLETYPE) {
|
|
|
+ UA_Nodestore_release(server, (const UA_Node*)vt);
|
|
|
return UA_STATUSCODE_BADTYPEMISMATCH;
|
|
|
+ }
|
|
|
|
|
|
|
|
|
* be done before copying the datatype from the vt, as setting the datatype
|
|
@@ -276,7 +276,8 @@ findChildByBrowsename(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
UA_BrowseResult br;
|
|
|
UA_BrowseResult_init(&br);
|
|
|
- Service_Browse_single(server, session, NULL, &bd, 0, &br);
|
|
|
+ UA_UInt32 maxrefs = 0;
|
|
|
+ Operation_Browse(server, session, &maxrefs, &bd, &br);
|
|
|
if(br.statusCode != UA_STATUSCODE_GOOD)
|
|
|
return br.statusCode;
|
|
|
|
|
@@ -332,8 +333,8 @@ copyChildNodes(UA_Server *server, UA_Session *session,
|
|
|
const UA_NodeId *destinationNodeId);
|
|
|
|
|
|
static void
|
|
|
-addReference(UA_Server *server, UA_Session *session,
|
|
|
- const UA_AddReferencesItem *item, UA_StatusCode *retval);
|
|
|
+Operation_addReference(UA_Server *server, UA_Session *session, void *context,
|
|
|
+ const UA_AddReferencesItem *item, UA_StatusCode *retval);
|
|
|
|
|
|
|
|
|
|
|
@@ -341,7 +342,7 @@ addReference(UA_Server *server, UA_Session *session,
|
|
|
* Could be used to e.g. delete all the references, except 'HASMODELINGRULE'
|
|
|
*/
|
|
|
static void deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, UA_NodeId* referencesSkip) {
|
|
|
- if (referencesSkipSize == 0) {
|
|
|
+ if(referencesSkipSize == 0) {
|
|
|
UA_Node_deleteReferences(node);
|
|
|
return;
|
|
|
}
|
|
@@ -350,13 +351,13 @@ static void deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, UA_
|
|
|
* It's faster */
|
|
|
size_t newSize = 0;
|
|
|
for(size_t i = 0; i < node->referencesSize; ++i) {
|
|
|
- for (size_t j = 0; j < referencesSkipSize; j++) {
|
|
|
- if (UA_NodeId_equal(&node->references[i].referenceTypeId, &referencesSkip[j])) {
|
|
|
+ for(size_t j = 0; j < referencesSkipSize; j++) {
|
|
|
+ if(UA_NodeId_equal(&node->references[i].referenceTypeId, &referencesSkip[j])) {
|
|
|
newSize++;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (newSize == 0){
|
|
|
+ if(newSize == 0) {
|
|
|
UA_Node_deleteReferences(node);
|
|
|
return;
|
|
|
}
|
|
@@ -366,8 +367,8 @@ static void deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, UA_
|
|
|
size_t curr = 0;
|
|
|
UA_StatusCode retval = UA_STATUSCODE_GOOD;
|
|
|
for(size_t i = 0; i < node->referencesSize && retval == UA_STATUSCODE_GOOD; ++i) {
|
|
|
- for (size_t j = 0; j < referencesSkipSize; j++) {
|
|
|
- if (!UA_NodeId_equal(&node->references[i].referenceTypeId, &referencesSkip[j]))
|
|
|
+ for(size_t j = 0; j < referencesSkipSize; j++) {
|
|
|
+ if(!UA_NodeId_equal(&node->references[i].referenceTypeId, &referencesSkip[j]))
|
|
|
continue;
|
|
|
|
|
|
|
|
@@ -385,8 +386,8 @@ static void deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, UA_
|
|
|
drefs->targetIdsSize = srefs->targetIdsSize;
|
|
|
break;
|
|
|
}
|
|
|
- if (retval != UA_STATUSCODE_GOOD) {
|
|
|
- for (size_t k=0; k<i; k++) {
|
|
|
+ if(retval != UA_STATUSCODE_GOOD) {
|
|
|
+ for(size_t k=0; k<i; k++) {
|
|
|
UA_NodeReferenceKind *refs = &newReferences[i];
|
|
|
for(size_t j = 0; j < refs->targetIdsSize; ++j)
|
|
|
UA_ExpandedNodeId_deleteMembers(&refs->targetIds[j]);
|
|
@@ -397,7 +398,7 @@ static void deleteReferencesSubset(UA_Node *node, size_t referencesSkipSize, UA_
|
|
|
}
|
|
|
|
|
|
UA_Node_deleteReferences(node);
|
|
|
- if (retval == UA_STATUSCODE_GOOD) {
|
|
|
+ if(retval == UA_STATUSCODE_GOOD) {
|
|
|
node->references = newReferences;
|
|
|
node->referencesSize = newSize;
|
|
|
} else {
|
|
@@ -440,7 +441,7 @@ copyChildNode(UA_Server *server, UA_Session *session,
|
|
|
newItem.isForward = true;
|
|
|
newItem.targetNodeId = rd->nodeId;
|
|
|
newItem.targetNodeClass = UA_NODECLASS_METHOD;
|
|
|
- addReference(server, session, &newItem, &retval);
|
|
|
+ Operation_addReference(server, session, NULL, &newItem, &retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -515,7 +516,8 @@ copyChildNodes(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
UA_BrowseResult br;
|
|
|
UA_BrowseResult_init(&br);
|
|
|
- Service_Browse_single(server, session, NULL, &bd, 0, &br);
|
|
|
+ UA_UInt32 maxrefs = 0;
|
|
|
+ Operation_Browse(server, session, &maxrefs, &bd, &br);
|
|
|
if(br.statusCode != UA_STATUSCODE_GOOD)
|
|
|
return br.statusCode;
|
|
|
|
|
@@ -600,7 +602,7 @@ addTypeDefRef(UA_Server *server, UA_Session *session,
|
|
|
addref.referenceTypeId = UA_NODEID_NUMERIC(0, UA_NS0ID_HASTYPEDEFINITION);
|
|
|
addref.isForward = true;
|
|
|
addref.targetNodeId.nodeId = type->nodeId;
|
|
|
- addReference(server, session, &addref, &retval);
|
|
|
+ Operation_addReference(server, session, NULL, &addref, &retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -616,7 +618,7 @@ addParentRef(UA_Server *server, UA_Session *session,
|
|
|
ref_item.referenceTypeId = *referenceTypeId;
|
|
|
ref_item.isForward = false;
|
|
|
ref_item.targetNodeId.nodeId = *parentNodeId;
|
|
|
- addReference(server, session, &ref_item, &retval);
|
|
|
+ Operation_addReference(server, session, NULL, &ref_item, &retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -626,9 +628,8 @@ addParentRef(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
|
|
|
UA_StatusCode
|
|
|
-Operation_addNode_begin(UA_Server *server, UA_Session *session,
|
|
|
- const UA_AddNodesItem *item, void *nodeContext,
|
|
|
- UA_NodeId *outNewNodeId) {
|
|
|
+Operation_addNode_begin(UA_Server *server, UA_Session *session, void *nodeContext,
|
|
|
+ const UA_AddNodesItem *item, UA_NodeId *outNewNodeId) {
|
|
|
|
|
|
if(item->requestedNewNodeId.nodeId.namespaceIndex >= server->namespacesSize) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
@@ -724,11 +725,11 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
node->nodeClass == UA_NODECLASS_OBJECTTYPE ||
|
|
|
node->nodeClass == UA_NODECLASS_REFERENCETYPE ||
|
|
|
node->nodeClass == UA_NODECLASS_DATATYPE) {
|
|
|
- if (UA_NodeId_equal(referenceTypeId, &UA_NODEID_NULL))
|
|
|
+ if(UA_NodeId_equal(referenceTypeId, &UA_NODEID_NULL))
|
|
|
referenceTypeId = &hasSubtype;
|
|
|
const UA_Node *parentNode = UA_Nodestore_get(server, parentNodeId);
|
|
|
- if (parentNode) {
|
|
|
- if (parentNode->nodeClass == node->nodeClass)
|
|
|
+ if(parentNode) {
|
|
|
+ if(parentNode->nodeClass == node->nodeClass)
|
|
|
typeDefinitionId = parentNodeId;
|
|
|
UA_Nodestore_release(server, parentNode);
|
|
|
}
|
|
@@ -775,7 +776,7 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
}
|
|
|
|
|
|
UA_Boolean typeOk = UA_FALSE;
|
|
|
- switch (node->nodeClass) {
|
|
|
+ switch(node->nodeClass) {
|
|
|
case UA_NODECLASS_DATATYPE:
|
|
|
typeOk = type->nodeClass == UA_NODECLASS_DATATYPE;
|
|
|
break;
|
|
@@ -803,7 +804,7 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
default:
|
|
|
typeOk = UA_FALSE;
|
|
|
}
|
|
|
- if (!typeOk) {
|
|
|
+ if(!typeOk) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
|
"AddNodes: Type does not match node class");
|
|
|
retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
|
|
@@ -818,12 +819,11 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
const UA_NodeId variableTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
|
|
|
|
|
|
const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
|
|
|
- const UA_NodeId refs[2] = {
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT)
|
|
|
- };
|
|
|
- if(!isNodeInTree(&server->config.nodestore, parentNodeId, &variableTypes, refs , 2) &&
|
|
|
- !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs , 2)) {
|
|
|
+ UA_NodeId refs[2];
|
|
|
+ refs[0] = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
|
|
|
+ refs[1] = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
|
|
|
+ if(!isNodeInTree(&server->config.nodestore, parentNodeId, &variableTypes, refs, 2) &&
|
|
|
+ !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs, 2)) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
|
"AddNodes: Type of variable node must "
|
|
|
"be VariableType and not cannot be abstract");
|
|
@@ -837,11 +837,10 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
if(((const UA_ObjectTypeNode*)type)->isAbstract) {
|
|
|
|
|
|
const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
|
|
|
- const UA_NodeId refs[2] = {
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT)
|
|
|
- };
|
|
|
- if(!isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs , 2)) {
|
|
|
+ UA_NodeId refs[2];
|
|
|
+ refs[0] = UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE);
|
|
|
+ refs[1] = UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT);
|
|
|
+ if(!isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs, 2)) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
|
"AddNodes: Type of object node must "
|
|
|
"be ObjectType and not be abstract");
|
|
@@ -873,7 +872,7 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
node->nodeClass == UA_NODECLASS_OBJECT) {
|
|
|
UA_assert(type != NULL);
|
|
|
|
|
|
- if (!server->bootstrapNS0) {
|
|
|
+ if(!server->bootstrapNS0) {
|
|
|
retval = addChildren(server, session, node, type);
|
|
|
if(retval != UA_STATUSCODE_GOOD) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
@@ -896,7 +895,7 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
|
|
|
|
|
|
if(!UA_NodeId_isNull(parentNodeId)) {
|
|
|
- if (UA_NodeId_isNull(referenceTypeId)) {
|
|
|
+ if(UA_NodeId_isNull(referenceTypeId)) {
|
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
|
"AddNodes: Reference to parent cannot be null");
|
|
|
retval = UA_STATUSCODE_BADTYPEDEFINITIONINVALID;
|
|
@@ -929,8 +928,8 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-Operation_addNode(UA_Server *server, UA_Session *session, const UA_AddNodesItem *item,
|
|
|
- void *nodeContext, UA_AddNodesResult *result) {
|
|
|
+Operation_addNode(UA_Server *server, UA_Session *session, void *nodeContext,
|
|
|
+ const UA_AddNodesItem *item, UA_AddNodesResult *result) {
|
|
|
|
|
|
if(session != &adminSession && server->config.accessControl.allowAddNode &&
|
|
|
!server->config.accessControl.allowAddNode(&session->sessionId, session->sessionHandle, item)) {
|
|
@@ -938,8 +937,8 @@ Operation_addNode(UA_Server *server, UA_Session *session, const UA_AddNodesItem
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- result->statusCode = Operation_addNode_begin(server, session, item, nodeContext,
|
|
|
- &result->addedNodeId);
|
|
|
+ result->statusCode = Operation_addNode_begin(server, session, nodeContext,
|
|
|
+ item, &result->addedNodeId);
|
|
|
if(result->statusCode != UA_STATUSCODE_GOOD)
|
|
|
return;
|
|
|
|
|
@@ -954,19 +953,11 @@ Operation_addNode(UA_Server *server, UA_Session *session, const UA_AddNodesItem
|
|
|
UA_NodeId_deleteMembers(&result->addedNodeId);
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-Service_AddNode(UA_Server *server, UA_Session *session,
|
|
|
- const UA_AddNodesItem *item,
|
|
|
- UA_AddNodesResult *result) {
|
|
|
- Operation_addNode(server, session, item, NULL, result);
|
|
|
-}
|
|
|
-
|
|
|
void
|
|
|
Service_AddNodes(UA_Server *server, UA_Session *session,
|
|
|
const UA_AddNodesRequest *request,
|
|
|
UA_AddNodesResponse *response) {
|
|
|
- UA_LOG_DEBUG_SESSION(server->config.logger, session,
|
|
|
- "Processing AddNodesRequest");
|
|
|
+ UA_LOG_DEBUG_SESSION(server->config.logger, session, "Processing AddNodesRequest");
|
|
|
|
|
|
if(server->config.maxNodesPerNodeManagement != 0 &&
|
|
|
request->nodesToAddSize > server->config.maxNodesPerNodeManagement) {
|
|
@@ -975,10 +966,9 @@ Service_AddNodes(UA_Server *server, UA_Session *session,
|
|
|
}
|
|
|
|
|
|
response->responseHeader.serviceResult =
|
|
|
- UA_Server_processServiceOperations(server, session,
|
|
|
- (UA_ServiceOperation)Service_AddNode,
|
|
|
- &request->nodesToAddSize, &UA_TYPES[UA_TYPES_ADDNODESITEM],
|
|
|
- &response->resultsSize, &UA_TYPES[UA_TYPES_ADDNODESRESULT]);
|
|
|
+ UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_addNode, NULL,
|
|
|
+ &request->nodesToAddSize, &UA_TYPES[UA_TYPES_ADDNODESITEM],
|
|
|
+ &response->resultsSize, &UA_TYPES[UA_TYPES_ADDNODESRESULT]);
|
|
|
}
|
|
|
|
|
|
UA_StatusCode
|
|
@@ -1007,7 +997,7 @@ __UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass,
|
|
|
|
|
|
UA_AddNodesResult result;
|
|
|
UA_AddNodesResult_init(&result);
|
|
|
- Operation_addNode(server, &adminSession, &item, nodeContext, &result);
|
|
|
+ Operation_addNode(server, &adminSession, nodeContext, &item, &result);
|
|
|
if(outNewNodeId)
|
|
|
*outNewNodeId = result.addedNodeId;
|
|
|
else
|
|
@@ -1031,8 +1021,8 @@ UA_Server_addNode_begin(UA_Server *server, const UA_NodeClass nodeClass,
|
|
|
item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
|
|
|
item.nodeAttributes.content.decoded.type = attributeType;
|
|
|
item.nodeAttributes.content.decoded.data = (void*)(uintptr_t)attr;
|
|
|
- return Operation_addNode_begin(server, &adminSession, &item,
|
|
|
- nodeContext, outNewNodeId);
|
|
|
+ return Operation_addNode_begin(server, &adminSession, nodeContext,
|
|
|
+ &item, outNewNodeId);
|
|
|
}
|
|
|
|
|
|
UA_StatusCode
|
|
@@ -1049,9 +1039,8 @@ UA_Server_addNode_finish(UA_Server *server, const UA_NodeId nodeId,
|
|
|
|
|
|
|
|
|
static void
|
|
|
-deleteReference(UA_Server *server, UA_Session *session,
|
|
|
- const UA_DeleteReferencesItem *item,
|
|
|
- UA_StatusCode *retval);
|
|
|
+Operation_deleteReference(UA_Server *server, UA_Session *session, void *context,
|
|
|
+ const UA_DeleteReferencesItem *item, UA_StatusCode *retval);
|
|
|
|
|
|
|
|
|
static void
|
|
@@ -1068,7 +1057,7 @@ removeIncomingReferences(UA_Server *server, UA_Session *session,
|
|
|
item.referenceTypeId = refs->referenceTypeId;
|
|
|
for(size_t j = 0; j < refs->targetIdsSize; ++j) {
|
|
|
item.sourceNodeId = refs->targetIds[j].nodeId;
|
|
|
- deleteReference(server, session, &item, &dummy);
|
|
|
+ Operation_deleteReference(server, session, NULL, &item, &dummy);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1104,7 +1093,7 @@ deconstructNode(UA_Server *server, UA_Session *session,
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-deleteNodeOperation(UA_Server *server, UA_Session *session,
|
|
|
+deleteNodeOperation(UA_Server *server, UA_Session *session, void *context,
|
|
|
const UA_DeleteNodesItem *item, UA_StatusCode *result);
|
|
|
|
|
|
static void
|
|
@@ -1122,7 +1111,8 @@ removeChildren(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
UA_BrowseResult br;
|
|
|
UA_BrowseResult_init(&br);
|
|
|
- Service_Browse_single(server, session, NULL, &bd, 0, &br);
|
|
|
+ UA_UInt32 maxrefs = 0;
|
|
|
+ Operation_Browse(server, session, &maxrefs, &bd, &br);
|
|
|
if(br.statusCode != UA_STATUSCODE_GOOD)
|
|
|
return;
|
|
|
|
|
@@ -1132,9 +1122,12 @@ removeChildren(UA_Server *server, UA_Session *session,
|
|
|
|
|
|
for(size_t i = 0; i < br.referencesSize; ++i) {
|
|
|
UA_ReferenceDescription *rd = &br.references[i];
|
|
|
+
|
|
|
+ if(UA_NodeId_equal(&node->nodeId, &rd->nodeId.nodeId))
|
|
|
+ continue;
|
|
|
item.nodeId = rd->nodeId.nodeId;
|
|
|
UA_StatusCode retval;
|
|
|
- deleteNodeOperation(server, session, &item, &retval);
|
|
|
+ deleteNodeOperation(server, session, NULL, &item, &retval);
|
|
|
}
|
|
|
|
|
|
UA_BrowseResult_deleteMembers(&br);
|
|
@@ -1145,7 +1138,7 @@ removeDeconstructedNode(UA_Server *server, UA_Session *session,
|
|
|
const UA_Node *node, UA_Boolean removeTargetRefs) {
|
|
|
|
|
|
removeChildren(server, session, node);
|
|
|
-
|
|
|
+
|
|
|
|
|
|
* will be deleted anyway) */
|
|
|
if(removeTargetRefs)
|
|
@@ -1156,7 +1149,7 @@ removeDeconstructedNode(UA_Server *server, UA_Session *session,
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-deleteNodeOperation(UA_Server *server, UA_Session *session,
|
|
|
+deleteNodeOperation(UA_Server *server, UA_Session *session, void *context,
|
|
|
const UA_DeleteNodesItem *item, UA_StatusCode *result) {
|
|
|
|
|
|
if(session != &adminSession && server->config.accessControl.allowDeleteNode &&
|
|
@@ -1201,12 +1194,9 @@ void Service_DeleteNodes(UA_Server *server, UA_Session *session,
|
|
|
}
|
|
|
|
|
|
response->responseHeader.serviceResult =
|
|
|
- UA_Server_processServiceOperations(server, session,
|
|
|
- (UA_ServiceOperation)deleteNodeOperation,
|
|
|
- &request->nodesToDeleteSize,
|
|
|
- &UA_TYPES[UA_TYPES_DELETENODESITEM],
|
|
|
- &response->resultsSize,
|
|
|
- &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
+ UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)deleteNodeOperation, NULL,
|
|
|
+ &request->nodesToDeleteSize, &UA_TYPES[UA_TYPES_DELETENODESITEM],
|
|
|
+ &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
}
|
|
|
|
|
|
UA_StatusCode
|
|
@@ -1216,7 +1206,7 @@ UA_Server_deleteNode(UA_Server *server, const UA_NodeId nodeId,
|
|
|
item.deleteTargetReferences = deleteReferences;
|
|
|
item.nodeId = nodeId;
|
|
|
UA_StatusCode retval = UA_STATUSCODE_GOOD;
|
|
|
- deleteNodeOperation(server, &adminSession, &item, &retval);
|
|
|
+ deleteNodeOperation(server, &adminSession, NULL, &item, &retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -1237,8 +1227,8 @@ deleteOneWayReference(UA_Server *server, UA_Session *session, UA_Node *node,
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
-addReference(UA_Server *server, UA_Session *session,
|
|
|
- const UA_AddReferencesItem *item, UA_StatusCode *retval) {
|
|
|
+Operation_addReference(UA_Server *server, UA_Session *session, void *context,
|
|
|
+ const UA_AddReferencesItem *item, UA_StatusCode *retval) {
|
|
|
|
|
|
if(session != &adminSession && server->config.accessControl.allowAddReference &&
|
|
|
!server->config.accessControl. allowAddReference(&session->sessionId, session->sessionHandle, item)) {
|
|
@@ -1296,12 +1286,9 @@ void Service_AddReferences(UA_Server *server, UA_Session *session,
|
|
|
}
|
|
|
|
|
|
response->responseHeader.serviceResult =
|
|
|
- UA_Server_processServiceOperations(server, session,
|
|
|
- (UA_ServiceOperation) addReference,
|
|
|
- &request->referencesToAddSize,
|
|
|
- &UA_TYPES[UA_TYPES_ADDREFERENCESITEM],
|
|
|
- &response->resultsSize,
|
|
|
- &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
+ UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_addReference, NULL,
|
|
|
+ &request->referencesToAddSize, &UA_TYPES[UA_TYPES_ADDREFERENCESITEM],
|
|
|
+ &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
}
|
|
|
|
|
|
UA_StatusCode
|
|
@@ -1317,7 +1304,7 @@ UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
|
|
|
item.targetNodeId = targetId;
|
|
|
|
|
|
UA_StatusCode retval = UA_STATUSCODE_GOOD;
|
|
|
- addReference(server, &adminSession, &item, &retval);
|
|
|
+ Operation_addReference(server, &adminSession, NULL, &item, &retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -1326,8 +1313,8 @@ UA_Server_addReference(UA_Server *server, const UA_NodeId sourceId,
|
|
|
|
|
|
|
|
|
static void
|
|
|
-deleteReference(UA_Server *server, UA_Session *session,
|
|
|
- const UA_DeleteReferencesItem *item, UA_StatusCode *retval) {
|
|
|
+Operation_deleteReference(UA_Server *server, UA_Session *session, void *context,
|
|
|
+ const UA_DeleteReferencesItem *item, UA_StatusCode *retval) {
|
|
|
|
|
|
if(session != &adminSession && server->config.accessControl.allowDeleteReference &&
|
|
|
!server->config.accessControl.allowDeleteReference(&session->sessionId, session->sessionHandle, item)) {
|
|
@@ -1369,12 +1356,9 @@ Service_DeleteReferences(UA_Server *server, UA_Session *session,
|
|
|
}
|
|
|
|
|
|
response->responseHeader.serviceResult =
|
|
|
- UA_Server_processServiceOperations(server, session,
|
|
|
- (UA_ServiceOperation) deleteReference,
|
|
|
- &request->referencesToDeleteSize,
|
|
|
- &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM],
|
|
|
- &response->resultsSize,
|
|
|
- &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
+ UA_Server_processServiceOperations(server, session, (UA_ServiceOperation)Operation_deleteReference, NULL,
|
|
|
+ &request->referencesToDeleteSize, &UA_TYPES[UA_TYPES_DELETEREFERENCESITEM],
|
|
|
+ &response->resultsSize, &UA_TYPES[UA_TYPES_STATUSCODE]);
|
|
|
}
|
|
|
|
|
|
UA_StatusCode
|
|
@@ -1390,7 +1374,7 @@ UA_Server_deleteReference(UA_Server *server, const UA_NodeId sourceNodeId,
|
|
|
item.deleteBidirectional = deleteBidirectional;
|
|
|
|
|
|
UA_StatusCode retval = UA_STATUSCODE_GOOD;
|
|
|
- deleteReference(server, &adminSession, &item, &retval);
|
|
|
+ Operation_deleteReference(server, &adminSession, NULL, &item, &retval);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
@@ -1440,8 +1424,8 @@ UA_Server_addDataSourceVariableNode(UA_Server *server, const UA_NodeId requested
|
|
|
outNewNodeId = &newNodeId;
|
|
|
deleteNodeId = UA_TRUE;
|
|
|
}
|
|
|
- UA_StatusCode retval = Operation_addNode_begin(server, &adminSession, &item,
|
|
|
- nodeContext, outNewNodeId);
|
|
|
+ UA_StatusCode retval = Operation_addNode_begin(server, &adminSession, nodeContext,
|
|
|
+ &item, outNewNodeId);
|
|
|
if(retval != UA_STATUSCODE_GOOD)
|
|
|
return retval;
|
|
|
retval = UA_Server_setVariableNode_dataSource(server, *outNewNodeId, dataSource);
|
|
@@ -1500,7 +1484,8 @@ UA_Server_addMethodNode_finish(UA_Server *server, const UA_NodeId nodeId,
|
|
|
|
|
|
UA_BrowseResult br;
|
|
|
UA_BrowseResult_init(&br);
|
|
|
- Service_Browse_single(server, &adminSession, NULL, &bd, 0, &br);
|
|
|
+ UA_UInt32 maxrefs = 0;
|
|
|
+ Operation_Browse(server, &adminSession, &maxrefs, &bd, &br);
|
|
|
|
|
|
UA_StatusCode retval = br.statusCode;
|
|
|
if(retval != UA_STATUSCODE_GOOD) {
|
|
@@ -1595,8 +1580,8 @@ UA_Server_addMethodNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
|
|
|
outNewNodeId = &newId;
|
|
|
}
|
|
|
|
|
|
- UA_StatusCode retval = Operation_addNode_begin(server, &adminSession, &item,
|
|
|
- nodeContext, outNewNodeId);
|
|
|
+ UA_StatusCode retval = Operation_addNode_begin(server, &adminSession, nodeContext,
|
|
|
+ &item, outNewNodeId);
|
|
|
if(retval != UA_STATUSCODE_GOOD)
|
|
|
return retval;
|
|
|
|