Browse Source

add internal references to the datatypenode hierarchy

Julius Pfrommer 10 years ago
parent
commit
635adfa304
3 changed files with 224 additions and 160 deletions
  1. 223 154
      src/server/ua_server.c
  2. 1 1
      src/ua_types.c
  3. 0 5
      tools/generate_nodeids.py

+ 223 - 154
src/server/ua_server.c

@@ -167,160 +167,6 @@ UA_Server * UA_Server_new(void) {
         UA_LocalizedText_copycstring(NAME, &TARGET->description);   \
     } while(0)
 
-    /**************/
-    /* Data Types */
-    /**************/
-
-    UA_DataTypeNode *booleanNode = UA_DataTypeNode_new();
-    booleanNode->nodeId.identifier.numeric = UA_NS0ID_BOOLEAN;
-    COPYNAMES(booleanNode, "Boolean");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)booleanNode, UA_NULL);
-
-    UA_DataTypeNode *sByteNode = UA_DataTypeNode_new();
-    sByteNode->nodeId.identifier.numeric = UA_NS0ID_SBYTE;
-    COPYNAMES(sByteNode, "SByte");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)sByteNode, UA_NULL);
-
-    UA_DataTypeNode *byteNode = UA_DataTypeNode_new();
-    byteNode->nodeId.identifier.numeric = UA_NS0ID_BYTE;
-    COPYNAMES(byteNode, "Byte");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)byteNode, UA_NULL);
-
-    UA_DataTypeNode *int16Node = UA_DataTypeNode_new();
-    int16Node->nodeId.identifier.numeric = UA_NS0ID_INT16;
-    COPYNAMES(int16Node, "Int16");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)int16Node, UA_NULL);
-
-    UA_DataTypeNode *uInt16Node = UA_DataTypeNode_new();
-    uInt16Node->nodeId.identifier.numeric = UA_NS0ID_UINT16;
-    COPYNAMES(uInt16Node, "UInt16");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)uInt16Node, UA_NULL);
-
-    UA_DataTypeNode *int32Node = UA_DataTypeNode_new();
-    int32Node->nodeId.identifier.numeric = UA_NS0ID_INT32;
-    COPYNAMES(int32Node, "Int32");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)int32Node, UA_NULL);
-
-    UA_DataTypeNode *uInt32Node = UA_DataTypeNode_new();
-    uInt32Node->nodeId.identifier.numeric = UA_NS0ID_UINT32;
-    COPYNAMES(uInt32Node, "UInt32");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)uInt32Node, UA_NULL);
-
-    UA_DataTypeNode *int64Node = UA_DataTypeNode_new();
-    int64Node->nodeId.identifier.numeric = UA_NS0ID_INT64;
-    COPYNAMES(int64Node, "Int64");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)int64Node, UA_NULL);
-
-    UA_DataTypeNode *uInt64Node = UA_DataTypeNode_new();
-    uInt64Node->nodeId.identifier.numeric = UA_NS0ID_UINT64;
-    COPYNAMES(uInt64Node, "UInt64");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)uInt64Node, UA_NULL);
-
-    UA_DataTypeNode *floatNode = UA_DataTypeNode_new();
-    floatNode->nodeId.identifier.numeric = UA_NS0ID_FLOAT;
-    COPYNAMES(floatNode, "Float");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)floatNode, UA_NULL);
-
-    UA_DataTypeNode *doubleNode = UA_DataTypeNode_new();
-    doubleNode->nodeId.identifier.numeric = UA_NS0ID_DOUBLE;
-    COPYNAMES(doubleNode, "Double");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)doubleNode, UA_NULL);
-
-    UA_DataTypeNode *stringNode = UA_DataTypeNode_new();
-    stringNode->nodeId.identifier.numeric = UA_NS0ID_STRING;
-    COPYNAMES(stringNode, "String");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)stringNode, UA_NULL);
-
-    UA_DataTypeNode *dateTimeNode = UA_DataTypeNode_new();
-    dateTimeNode->nodeId.identifier.numeric = UA_NS0ID_DATETIME;
-    COPYNAMES(dateTimeNode, "DateTime");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)dateTimeNode, UA_NULL);
-
-    UA_DataTypeNode *guidNode = UA_DataTypeNode_new();
-    guidNode->nodeId.identifier.numeric = UA_NS0ID_GUID;
-    COPYNAMES(guidNode, "Guid");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)guidNode, UA_NULL);
-
-    UA_DataTypeNode *byteStringNode = UA_DataTypeNode_new();
-    byteStringNode->nodeId.identifier.numeric = UA_NS0ID_BYTESTRING;
-    COPYNAMES(byteStringNode, "ByteString");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)byteStringNode, UA_NULL);
-
-    UA_DataTypeNode *xmlElementNode = UA_DataTypeNode_new();
-    xmlElementNode->nodeId.identifier.numeric = UA_NS0ID_XMLELEMENT;
-    COPYNAMES(xmlElementNode, "XmlElement");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)xmlElementNode, UA_NULL);
-
-    UA_DataTypeNode *nodeIdNode = UA_DataTypeNode_new();
-    nodeIdNode->nodeId.identifier.numeric = UA_NS0ID_NODEID;
-    COPYNAMES(nodeIdNode, "NodeId");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)nodeIdNode, UA_NULL);
-
-    UA_DataTypeNode *expandedNodeIdNode = UA_DataTypeNode_new();
-    expandedNodeIdNode->nodeId.identifier.numeric = UA_NS0ID_EXPANDEDNODEID;
-    COPYNAMES(expandedNodeIdNode, "ExpandedNodeId");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)expandedNodeIdNode, UA_NULL);
-
-    UA_DataTypeNode *statusCodeNode = UA_DataTypeNode_new();
-    statusCodeNode->nodeId.identifier.numeric = UA_NS0ID_STATUSCODE;
-    COPYNAMES(statusCodeNode, "StatusCode");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)statusCodeNode, UA_NULL);
-
-    UA_DataTypeNode *qualifiedNameNode = UA_DataTypeNode_new();
-    qualifiedNameNode->nodeId.identifier.numeric = UA_NS0ID_QUALIFIEDNAME;
-    COPYNAMES(qualifiedNameNode, "QualifiedName");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)qualifiedNameNode, UA_NULL);
-
-    UA_DataTypeNode *localizedTextNode = UA_DataTypeNode_new();
-    localizedTextNode->nodeId.identifier.numeric = UA_NS0ID_LOCALIZEDTEXT;
-    COPYNAMES(localizedTextNode, "LocalizedText");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)localizedTextNode, UA_NULL);
-
-    UA_DataTypeNode *structureNode = UA_DataTypeNode_new();
-    structureNode->nodeId.identifier.numeric = UA_NS0ID_EXTENSIONOBJECT; //todo: why name missmatch?
-    COPYNAMES(structureNode, "Structure");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)structureNode, UA_NULL);
-
-    UA_DataTypeNode *dataValueNode = UA_DataTypeNode_new();
-    dataValueNode->nodeId.identifier.numeric = UA_NS0ID_DATAVALUE;
-    COPYNAMES(dataValueNode, "DataValue");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)dataValueNode, UA_NULL);
-
-    UA_DataTypeNode *baseDataTypeNode = UA_DataTypeNode_new();
-    baseDataTypeNode->nodeId.identifier.numeric = UA_NS0ID_VARIANT; //todo: why name missmatch?
-    COPYNAMES(baseDataTypeNode, "BaseDataType");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)baseDataTypeNode, UA_NULL);
-
-    UA_DataTypeNode *diagnosticInfoNode = UA_DataTypeNode_new();
-    diagnosticInfoNode->nodeId.identifier.numeric = UA_NS0ID_DIAGNOSTICINFO;
-    COPYNAMES(diagnosticInfoNode, "DiagnosticInfo");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)diagnosticInfoNode, UA_NULL);
-
-    UA_DataTypeNode *numberNode = UA_DataTypeNode_new();
-    numberNode->nodeId.identifier.numeric = UA_NS0ID_NUMBER;
-    COPYNAMES(numberNode, "Number");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)numberNode, UA_NULL);
-
-    UA_DataTypeNode *integerNode = UA_DataTypeNode_new();
-    integerNode->nodeId.identifier.numeric = UA_NS0ID_INTEGER;
-    COPYNAMES(integerNode, "Integer");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)integerNode, UA_NULL);
-
-    UA_DataTypeNode *uIntegerNode = UA_DataTypeNode_new();
-    uIntegerNode->nodeId.identifier.numeric = UA_NS0ID_UINTEGER;
-    COPYNAMES(uIntegerNode, "UInteger");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)uIntegerNode, UA_NULL);
-
-    UA_DataTypeNode *enumerationNode = UA_DataTypeNode_new();
-    enumerationNode->nodeId.identifier.numeric = UA_NS0ID_ENUMERATION;
-    COPYNAMES(enumerationNode, "Enumeration");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)enumerationNode, UA_NULL);
-
-    UA_DataTypeNode *imageNode = UA_DataTypeNode_new();
-    imageNode->nodeId.identifier.numeric = UA_NS0ID_IMAGE;
-    COPYNAMES(imageNode, "Image");
-    UA_NodeStore_insert(server->nodestore, (UA_Node*)imageNode, UA_NULL);
-
     /**************/
     /* References */
     /**************/
@@ -661,5 +507,228 @@ UA_Server * UA_Server_new(void) {
     ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_SERVER_SERVERSTATUS), UA_NODEID_STATIC(0, UA_NS0ID_HASCOMPONENT),
                      UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_SERVER_SERVERSTATUS_STATE));
 
+    /**************/
+    /* Data Types */
+    /**************/
+
+    UA_ObjectNode *datatypes = UA_ObjectNode_new();
+    COPYNAMES(datatypes, "DataTypes");
+    datatypes->nodeId.identifier.numeric = UA_NS0ID_DATATYPESFOLDER;
+    UA_Server_addNode(server, (UA_Node*)datatypes,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_TYPESFOLDER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+    ADDREFERENCE(UA_NODEID_STATIC(0, UA_NS0ID_DATATYPESFOLDER), UA_NODEID_STATIC(0, UA_NS0ID_HASTYPEDEFINITION),
+                 UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_FOLDERTYPE));
+
+    UA_DataTypeNode *basedatatype = UA_DataTypeNode_new();
+    basedatatype->nodeId.identifier.numeric = UA_NS0ID_BASEDATATYPE;
+    COPYNAMES(basedatatype, "BaseDataType");
+    UA_Server_addNode(server, (UA_Node*)basedatatype,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_DATATYPESFOLDER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *booleanNode = UA_DataTypeNode_new();
+    booleanNode->nodeId.identifier.numeric = UA_NS0ID_BOOLEAN;
+    COPYNAMES(booleanNode, "Boolean");
+    UA_Server_addNode(server, (UA_Node*)booleanNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *numberNode = UA_DataTypeNode_new();
+    numberNode->nodeId.identifier.numeric = UA_NS0ID_NUMBER;
+    COPYNAMES(numberNode, "Number");
+    UA_Server_addNode(server, (UA_Node*)numberNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+    
+    UA_DataTypeNode *floatNode = UA_DataTypeNode_new();
+    floatNode->nodeId.identifier.numeric = UA_NS0ID_FLOAT;
+    COPYNAMES(floatNode, "Float");
+    UA_Server_addNode(server, (UA_Node*)floatNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_NUMBER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *doubleNode = UA_DataTypeNode_new();
+    doubleNode->nodeId.identifier.numeric = UA_NS0ID_DOUBLE;
+    COPYNAMES(doubleNode, "Double");
+    UA_Server_addNode(server, (UA_Node*)doubleNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_NUMBER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *integerNode = UA_DataTypeNode_new();
+    integerNode->nodeId.identifier.numeric = UA_NS0ID_INTEGER;
+    COPYNAMES(integerNode, "Integer");
+    UA_Server_addNode(server, (UA_Node*)integerNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_NUMBER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *sByteNode = UA_DataTypeNode_new();
+    sByteNode->nodeId.identifier.numeric = UA_NS0ID_SBYTE;
+    COPYNAMES(sByteNode, "SByte");
+    UA_Server_addNode(server, (UA_Node*)sByteNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_INTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *int16Node = UA_DataTypeNode_new();
+    int16Node->nodeId.identifier.numeric = UA_NS0ID_INT16;
+    COPYNAMES(int16Node, "Int16");
+    UA_Server_addNode(server, (UA_Node*)int16Node,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_INTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *int32Node = UA_DataTypeNode_new();
+    int32Node->nodeId.identifier.numeric = UA_NS0ID_INT32;
+    COPYNAMES(int32Node, "Int32");
+    UA_Server_addNode(server, (UA_Node*)int32Node,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_INTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *int64Node = UA_DataTypeNode_new();
+    int64Node->nodeId.identifier.numeric = UA_NS0ID_INT64;
+    COPYNAMES(int64Node, "Int64");
+    UA_Server_addNode(server, (UA_Node*)int64Node,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_INTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *uIntegerNode = UA_DataTypeNode_new();
+    uIntegerNode->nodeId.identifier.numeric = UA_NS0ID_UINTEGER;
+    COPYNAMES(uIntegerNode, "UInteger");
+    UA_Server_addNode(server, (UA_Node*)uIntegerNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_INTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *byteNode = UA_DataTypeNode_new();
+    byteNode->nodeId.identifier.numeric = UA_NS0ID_BYTE;
+    COPYNAMES(byteNode, "Byte");
+    UA_Server_addNode(server, (UA_Node*)byteNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_UINTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *uInt16Node = UA_DataTypeNode_new();
+    uInt16Node->nodeId.identifier.numeric = UA_NS0ID_UINT16;
+    COPYNAMES(uInt16Node, "UInt16");
+    UA_Server_addNode(server, (UA_Node*)uInt16Node,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_UINTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *uInt32Node = UA_DataTypeNode_new();
+    uInt32Node->nodeId.identifier.numeric = UA_NS0ID_UINT32;
+    COPYNAMES(uInt32Node, "UInt32");
+    UA_Server_addNode(server, (UA_Node*)uInt32Node,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_UINTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *uInt64Node = UA_DataTypeNode_new();
+    uInt64Node->nodeId.identifier.numeric = UA_NS0ID_UINT64;
+    COPYNAMES(uInt64Node, "UInt64");
+    UA_Server_addNode(server, (UA_Node*)uInt64Node,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_UINTEGER),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *stringNode = UA_DataTypeNode_new();
+    stringNode->nodeId.identifier.numeric = UA_NS0ID_STRING;
+    COPYNAMES(stringNode, "String");
+    UA_Server_addNode(server, (UA_Node*)stringNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *dateTimeNode = UA_DataTypeNode_new();
+    dateTimeNode->nodeId.identifier.numeric = UA_NS0ID_DATETIME;
+    COPYNAMES(dateTimeNode, "DateTime");
+    UA_Server_addNode(server, (UA_Node*)dateTimeNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *guidNode = UA_DataTypeNode_new();
+    guidNode->nodeId.identifier.numeric = UA_NS0ID_GUID;
+    COPYNAMES(guidNode, "Guid");
+    UA_Server_addNode(server, (UA_Node*)guidNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *byteStringNode = UA_DataTypeNode_new();
+    byteStringNode->nodeId.identifier.numeric = UA_NS0ID_BYTESTRING;
+    COPYNAMES(byteStringNode, "ByteString");
+    UA_Server_addNode(server, (UA_Node*)byteStringNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *xmlElementNode = UA_DataTypeNode_new();
+    xmlElementNode->nodeId.identifier.numeric = UA_NS0ID_XMLELEMENT;
+    COPYNAMES(xmlElementNode, "XmlElement");
+    UA_Server_addNode(server, (UA_Node*)xmlElementNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *nodeIdNode = UA_DataTypeNode_new();
+    nodeIdNode->nodeId.identifier.numeric = UA_NS0ID_NODEID;
+    COPYNAMES(nodeIdNode, "NodeId");
+    UA_Server_addNode(server, (UA_Node*)nodeIdNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *expandedNodeIdNode = UA_DataTypeNode_new();
+    expandedNodeIdNode->nodeId.identifier.numeric = UA_NS0ID_EXPANDEDNODEID;
+    COPYNAMES(expandedNodeIdNode, "ExpandedNodeId");
+    UA_Server_addNode(server, (UA_Node*)expandedNodeIdNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *statusCodeNode = UA_DataTypeNode_new();
+    statusCodeNode->nodeId.identifier.numeric = UA_NS0ID_STATUSCODE;
+    COPYNAMES(statusCodeNode, "StatusCode");
+    UA_Server_addNode(server, (UA_Node*)statusCodeNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *qualifiedNameNode = UA_DataTypeNode_new();
+    qualifiedNameNode->nodeId.identifier.numeric = UA_NS0ID_QUALIFIEDNAME;
+    COPYNAMES(qualifiedNameNode, "QualifiedName");
+    UA_Server_addNode(server, (UA_Node*)qualifiedNameNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *localizedTextNode = UA_DataTypeNode_new();
+    localizedTextNode->nodeId.identifier.numeric = UA_NS0ID_LOCALIZEDTEXT;
+    COPYNAMES(localizedTextNode, "LocalizedText");
+    UA_Server_addNode(server, (UA_Node*)localizedTextNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *structureNode = UA_DataTypeNode_new();
+    structureNode->nodeId.identifier.numeric = UA_NS0ID_STRUCTURE;
+    COPYNAMES(structureNode, "Structure");
+    UA_Server_addNode(server, (UA_Node*)structureNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *dataValueNode = UA_DataTypeNode_new();
+    dataValueNode->nodeId.identifier.numeric = UA_NS0ID_DATAVALUE;
+    COPYNAMES(dataValueNode, "DataValue");
+    UA_Server_addNode(server, (UA_Node*)dataValueNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *baseDataTypeNode = UA_DataTypeNode_new();
+    baseDataTypeNode->nodeId.identifier.numeric = UA_NS0ID_BASEDATATYPE;
+    COPYNAMES(baseDataTypeNode, "BaseDataType");
+    UA_Server_addNode(server, (UA_Node*)baseDataTypeNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *diagnosticInfoNode = UA_DataTypeNode_new();
+    diagnosticInfoNode->nodeId.identifier.numeric = UA_NS0ID_DIAGNOSTICINFO;
+    COPYNAMES(diagnosticInfoNode, "DiagnosticInfo");
+    UA_Server_addNode(server, (UA_Node*)diagnosticInfoNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
+    UA_DataTypeNode *enumerationNode = UA_DataTypeNode_new();
+    enumerationNode->nodeId.identifier.numeric = UA_NS0ID_ENUMERATION;
+    COPYNAMES(enumerationNode, "Enumeration");
+    UA_Server_addNode(server, (UA_Node*)enumerationNode,
+                      &UA_EXPANDEDNODEID_STATIC(0, UA_NS0ID_BASEDATATYPE),
+                      &UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES));
+
     return server;
 }

+ 1 - 1
src/ua_types.c

@@ -491,7 +491,7 @@ void UA_LocalizedText_init(UA_LocalizedText *p) {
 
 UA_TYPE_NEW_DEFAULT(UA_LocalizedText)
 UA_StatusCode UA_LocalizedText_copycstring(char const *src, UA_LocalizedText *dst) {
-    UA_StatusCode retval = UA_String_copycstring("en", &dst->locale); // TODO: Are language codes upper case?
+    UA_StatusCode retval = UA_String_copycstring("", &dst->locale);
     retval |= UA_String_copycstring(src, &dst->text);
     if(retval) {
         UA_LocalizedText_deleteMembers(dst);

+ 0 - 5
tools/generate_nodeids.py

@@ -32,11 +32,6 @@ input_str = f.read() + "\nHasModelParent,50,ReferenceType"
 f.close()
 input_str = input_str.replace('\r','')
 rows = map(lambda x:tuple(x.split(',')), input_str.split('\n'))
-for index, row in enumerate(rows):
-    if row[0] == "BaseDataType":
-    	rows[index]= ("Variant", row[1], row[2])
-    elif row[0] == "Structure":
-    	rows[index] = ("ExtensionObject", row[1], row[2])
 
 fh = open(args.outfile + ".h",'w')
 def printh(string):