|
@@ -161,13 +161,12 @@ typeCheckVariableNode(UA_Server *server, UA_Session *session,
|
|
/* If variable node is created below BaseObjectType and has its default valueRank of -2,
|
|
/* If variable node is created below BaseObjectType and has its default valueRank of -2,
|
|
* skip the test */
|
|
* skip the test */
|
|
const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
|
|
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 &&
|
|
if(node->valueRank != vt->valueRank &&
|
|
node->valueRank != UA_VariableAttributes_default.valueRank &&
|
|
node->valueRank != UA_VariableAttributes_default.valueRank &&
|
|
- !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs , 2)) {
|
|
|
|
|
|
+ !isNodeInTree(&server->config.nodestore, parentNodeId, &objectTypes, refs, 2)) {
|
|
/* Check valueRank against the vt */
|
|
/* Check valueRank against the vt */
|
|
if(!compatibleValueRanks(node->valueRank, vt->valueRank))
|
|
if(!compatibleValueRanks(node->valueRank, vt->valueRank))
|
|
return UA_STATUSCODE_BADTYPEMISMATCH;
|
|
return UA_STATUSCODE_BADTYPEMISMATCH;
|
|
@@ -820,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 variableTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE);
|
|
/* A variable may be of an object type which again is below BaseObjectType */
|
|
/* A variable may be of an object type which again is below BaseObjectType */
|
|
const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
|
|
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,
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
"AddNodes: Type of variable node must "
|
|
"AddNodes: Type of variable node must "
|
|
"be VariableType and not cannot be abstract");
|
|
"be VariableType and not cannot be abstract");
|
|
@@ -839,11 +837,10 @@ Operation_addNode_finish(UA_Server *server, UA_Session *session, const UA_NodeId
|
|
if(((const UA_ObjectTypeNode*)type)->isAbstract) {
|
|
if(((const UA_ObjectTypeNode*)type)->isAbstract) {
|
|
/* Object node created of an abstract ObjectType. Only allowed if within BaseObjectType folder */
|
|
/* Object node created of an abstract ObjectType. Only allowed if within BaseObjectType folder */
|
|
const UA_NodeId objectTypes = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE);
|
|
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,
|
|
UA_LOG_INFO_SESSION(server->config.logger, session,
|
|
"AddNodes: Type of object node must "
|
|
"AddNodes: Type of object node must "
|
|
"be ObjectType and not be abstract");
|
|
"be ObjectType and not be abstract");
|
|
@@ -960,8 +957,7 @@ void
|
|
Service_AddNodes(UA_Server *server, UA_Session *session,
|
|
Service_AddNodes(UA_Server *server, UA_Session *session,
|
|
const UA_AddNodesRequest *request,
|
|
const UA_AddNodesRequest *request,
|
|
UA_AddNodesResponse *response) {
|
|
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 &&
|
|
if(server->config.maxNodesPerNodeManagement != 0 &&
|
|
request->nodesToAddSize > server->config.maxNodesPerNodeManagement) {
|
|
request->nodesToAddSize > server->config.maxNodesPerNodeManagement) {
|
|
@@ -1142,7 +1138,7 @@ removeDeconstructedNode(UA_Server *server, UA_Session *session,
|
|
const UA_Node *node, UA_Boolean removeTargetRefs) {
|
|
const UA_Node *node, UA_Boolean removeTargetRefs) {
|
|
/* Remove all children of the node */
|
|
/* Remove all children of the node */
|
|
removeChildren(server, session, node);
|
|
removeChildren(server, session, node);
|
|
-
|
|
|
|
|
|
+
|
|
/* Remove references to the node (not the references going out, as the node
|
|
/* Remove references to the node (not the references going out, as the node
|
|
* will be deleted anyway) */
|
|
* will be deleted anyway) */
|
|
if(removeTargetRefs)
|
|
if(removeTargetRefs)
|