|
@@ -29,6 +29,9 @@ static const UA_NodeId nodeIdHasProperty = {
|
|
|
static const UA_NodeId nodeIdOrganizes = {
|
|
|
.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
|
|
|
.identifier.numeric = UA_NS0ID_ORGANIZES};
|
|
|
+static const UA_NodeId nodeIdFolderType = {
|
|
|
+ .namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
|
|
|
+ .identifier.numeric = UA_NS0ID_FOLDERTYPE};
|
|
|
|
|
|
static const UA_ExpandedNodeId expandedNodeIdBaseDataVariabletype = {
|
|
|
.nodeId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
|
|
@@ -189,6 +192,18 @@ addNodeInternal(UA_Server *server, UA_Node *node, const UA_NodeId parentNodeId,
|
|
|
return res;
|
|
|
}
|
|
|
|
|
|
+static UA_AddNodesResult
|
|
|
+addNodeInternalWithType(UA_Server *server, UA_Node *node, const UA_NodeId parentNodeId,
|
|
|
+ const UA_NodeId referenceTypeId, const UA_NodeId typeIdentifier) {
|
|
|
+ UA_AddNodesResult res;
|
|
|
+ UA_AddNodesResult_init(&res);
|
|
|
+ UA_RCU_LOCK();
|
|
|
+ Service_AddNodes_existing(server, &adminSession, node, &parentNodeId,
|
|
|
+ &referenceTypeId, &typeIdentifier, NULL, &res);
|
|
|
+ UA_RCU_UNLOCK();
|
|
|
+ return res;
|
|
|
+}
|
|
|
+
|
|
|
UA_StatusCode
|
|
|
__UA_Server_addNode(UA_Server *server, const UA_NodeClass nodeClass,
|
|
|
const UA_NodeId requestedNewNodeId, const UA_NodeId parentNodeId,
|
|
@@ -722,30 +737,31 @@ UA_Server * UA_Server_new(const UA_ServerConfig config) {
|
|
|
UA_NodeStore_insert(server->nodestore, (UA_Node*)root);
|
|
|
UA_NodeStore_insert(server->nodestore, (UA_Node*)baseobjtype);
|
|
|
UA_RCU_UNLOCK();
|
|
|
+ addObjectTypeNode(server, "FolderType", UA_NS0ID_FOLDERTYPE, UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_HASSUBTYPE);
|
|
|
|
|
|
UA_ObjectNode *objects = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)objects, "Objects");
|
|
|
objects->nodeId.identifier.numeric = UA_NS0ID_OBJECTSFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)objects, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
|
|
|
- nodeIdOrganizes);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)objects, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
|
|
|
UA_ObjectNode *types = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)types, "Types");
|
|
|
types->nodeId.identifier.numeric = UA_NS0ID_TYPESFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)types, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
|
|
|
- nodeIdOrganizes);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)types, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
|
|
|
UA_ObjectNode *views = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)views, "Views");
|
|
|
views->nodeId.identifier.numeric = UA_NS0ID_VIEWSFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)views, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
|
|
|
- nodeIdOrganizes);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)views, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
|
|
|
UA_ObjectNode *referencetypes = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)referencetypes, "ReferenceTypes");
|
|
|
referencetypes->nodeId.identifier.numeric = UA_NS0ID_REFERENCETYPESFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)referencetypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
- nodeIdOrganizes);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)referencetypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
|
|
|
addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_REFERENCETYPESFOLDER), nodeIdOrganizes,
|
|
|
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_REFERENCES), true);
|
|
@@ -757,26 +773,12 @@ UA_Server * UA_Server_new(const UA_ServerConfig config) {
|
|
|
UA_ObjectNode *objecttypes = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)objecttypes, "ObjectTypes");
|
|
|
objecttypes->nodeId.identifier.numeric = UA_NS0ID_OBJECTTYPESFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)objecttypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
- nodeIdOrganizes);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)objecttypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
/* Link in the bootstrapped baseobjecttype */
|
|
|
addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTTYPESFOLDER), nodeIdOrganizes,
|
|
|
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE), true);
|
|
|
|
|
|
- addObjectTypeNode(server, "FolderType", UA_NS0ID_FOLDERTYPE, UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_HASSUBTYPE);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTTYPESFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_ROOTFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_VIEWSFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_REFERENCETYPESFOLDER),
|
|
|
- nodeIdHasTypeDefinition, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
-
|
|
|
addObjectTypeNode(server, "ServerType", UA_NS0ID_SERVERTYPE, UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_HASSUBTYPE);
|
|
|
addObjectTypeNode(server, "ServerDiagnosticsType", UA_NS0ID_SERVERDIAGNOSTICSTYPE,
|
|
|
UA_NS0ID_BASEOBJECTTYPE, UA_NS0ID_HASSUBTYPE);
|
|
@@ -794,9 +796,8 @@ UA_Server * UA_Server_new(const UA_ServerConfig config) {
|
|
|
UA_ObjectNode *datatypes = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)datatypes, "DataTypes");
|
|
|
datatypes->nodeId.identifier.numeric = UA_NS0ID_DATATYPESFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)datatypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER), nodeIdOrganizes);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_DATATYPESFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)datatypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
|
|
|
addDataTypeNode(server, "BaseDataType", UA_NS0ID_BASEDATATYPE, UA_NS0ID_DATATYPESFOLDER);
|
|
|
addDataTypeNode(server, "Boolean", UA_NS0ID_BOOLEAN, UA_NS0ID_BASEDATATYPE);
|
|
@@ -834,10 +835,8 @@ UA_Server * UA_Server_new(const UA_ServerConfig config) {
|
|
|
UA_ObjectNode *variabletypes = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)variabletypes, "VariableTypes");
|
|
|
variabletypes->nodeId.identifier.numeric = UA_NS0ID_VARIABLETYPESFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)variabletypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
- nodeIdOrganizes);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_VARIABLETYPESFOLDER),
|
|
|
- nodeIdHasTypeDefinition, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)variabletypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
addVariableTypeNode_organized(server, "BaseVariableType", UA_NS0ID_BASEVARIABLETYPE,
|
|
|
UA_NS0ID_VARIABLETYPESFOLDER, true);
|
|
|
addVariableTypeNode_subtype(server, "BaseDataVariableType", UA_NS0ID_BASEDATAVARIABLETYPE,
|
|
@@ -852,9 +851,8 @@ UA_Server * UA_Server_new(const UA_ServerConfig config) {
|
|
|
UA_ObjectNode *eventtypes = UA_NodeStore_newObjectNode();
|
|
|
copyNames((UA_Node*)eventtypes, "EventTypes");
|
|
|
eventtypes->nodeId.identifier.numeric = UA_NS0ID_EVENTTYPESFOLDER;
|
|
|
- addNodeInternal(server, (UA_Node*)eventtypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER), nodeIdOrganizes);
|
|
|
- addReferenceInternal(server, UA_NODEID_NUMERIC(0, UA_NS0ID_EVENTTYPESFOLDER), nodeIdHasTypeDefinition,
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), true);
|
|
|
+ addNodeInternalWithType(server, (UA_Node*)eventtypes, UA_NODEID_NUMERIC(0, UA_NS0ID_TYPESFOLDER),
|
|
|
+ nodeIdOrganizes, nodeIdFolderType);
|
|
|
#endif
|
|
|
|
|
|
#ifdef UA_ENABLE_GENERATE_NAMESPACE0
|