Leon Urbas лет назад: 10
Родитель
Сommit
1989cd6665
5 измененных файлов с 34 добавлено и 27 удалено
  1. 14 13
      examples/src/generateSam.c
  2. 0 12
      examples/src/xml2ns0.c
  3. 4 0
      include/ua_basictypes.h
  4. 11 0
      src/ua_basictypes.c
  5. 5 2
      src/ua_xml.c

+ 14 - 13
examples/src/generateSam.c

@@ -13,11 +13,24 @@
 #define F_cls "%c%.*s"
 #define LC_cls(str) tolower((str).data[0]), (str).length-1, &((str).data[1])
 
+/** @brief check if node is root node by scanning it's references for hasProperty
+ */
+_Bool UA_Node_isRootNode(const UA_Node* node) {
+	UA_Int32 i;
+	for (i = 0; i < node->referencesSize; i++ ) {
+		UA_Int32 refId = UA_NodeId_getIdentifier(&(node->references[i]->referenceTypeId));
+		UA_Int32 isInverse = node->references[i]->isInverse;
+		if (isInverse && (refId == 47 || refId == 46)) // HasComponent, HasProperty
+			return UA_FALSE;
+	}
+	return UA_TRUE;
+}
+
 /** @brief declares all the top level objects in the server's application memory
  * FIXME: shall add only top level objects, i.e. those that have no parents
  */
 void sam_declareAttribute(UA_Node const * node) {
-	if (node != UA_NULL && node->nodeClass == UA_NODECLASS_VARIABLE) {
+	if ((node->nodeClass == UA_NODECLASS_VARIABLE || node->nodeClass == UA_NODECLASS_OBJECT) && UA_Node_isRootNode(node)) {
 		UA_VariableNode* vn = (UA_VariableNode*) node;
 		printf("\t%s " F_cls "; // i=%d\n", UA_[UA_ns0ToVTableIndex(vn->dataType.identifier.numeric)].name, LC_cls(node->browseName.name), node->nodeId.identifier.numeric);
 	}
@@ -92,18 +105,6 @@ pattern p[] = {
 };
 
 
-UA_Int16 UA_NodeId_getNamespace(UA_NodeId const * id) {
-	return id->namespace;
-}
-// FIXME: to simple
-UA_Int16 UA_NodeId_getIdentifier(UA_NodeId const * id) {
-	return id->identifier.numeric;
-}
-
-_Bool UA_NodeId_isBasicType(UA_NodeId const * id) {
-	return (UA_NodeId_getNamespace(id) == 0) && (UA_NodeId_getIdentifier(id) <= UA_DIAGNOSTICINFO_NS0);
-}
-
 UA_Int32 Namespace_getNumberOfComponents(Namespace const * ns, UA_NodeId const * id, UA_Int32* number) {
 	UA_Int32 retval = UA_SUCCESS;
 	UA_Node const * node;

+ 0 - 12
examples/src/xml2ns0.c

@@ -99,18 +99,6 @@ void sam_init(Namespace* ns) {
 	sam_attach(ns,2993,UA_LOCALIZEDTEXT,&sam.serverStatus.shutdownReason);
 }
 
-UA_Int16 UA_NodeId_getNamespace(UA_NodeId const * id) {
-	return id->namespace;
-}
-// FIXME: to simple
-UA_Int16 UA_NodeId_getIdentifier(UA_NodeId const * id) {
-	return id->identifier.numeric;
-}
-
-_Bool UA_NodeId_isBasicType(UA_NodeId const * id) {
-	return (UA_NodeId_getNamespace(id) == 0) && (UA_NodeId_getIdentifier(id) <= UA_DIAGNOSTICINFO_NS0);
-}
-
 UA_Int32 Namespace_getNumberOfComponents(Namespace const * ns, UA_NodeId const * id, UA_Int32* number) {
 	UA_Int32 retval = UA_SUCCESS;
 	UA_Node const * node;

+ 4 - 0
include/ua_basictypes.h

@@ -307,6 +307,10 @@ UA_TYPE_METHOD_PROTOTYPES (UA_NodeId)
 UA_Int32 UA_NodeId_compare(const UA_NodeId *n1, const UA_NodeId *n2);
 void UA_NodeId_printf(char* label, const UA_NodeId* node);
 UA_Boolean UA_NodeId_isNull(const UA_NodeId* p);
+UA_Int16 UA_NodeId_getNamespace(UA_NodeId const * id);
+UA_Int16 UA_NodeId_getIdentifier(UA_NodeId const * id);
+_Bool UA_NodeId_isBasicType(UA_NodeId const * id);
+
 
 /* XmlElement - Part: 6, Chapter: 5.2.2.8, Page: 17 */
 typedef struct UA_XmlElement {

+ 11 - 0
src/ua_basictypes.c

@@ -802,6 +802,17 @@ UA_Int32 UA_NodeId_decodeBinary(UA_ByteString const * src, UA_Int32* pos, UA_Nod
 	}
 	return retval;
 }
+UA_Int16 UA_NodeId_getNamespace(UA_NodeId const * id) {
+	return id->namespace;
+}
+// FIXME: to simple
+UA_Int16 UA_NodeId_getIdentifier(UA_NodeId const * id) {
+	return id->identifier.numeric;
+}
+
+_Bool UA_NodeId_isBasicType(UA_NodeId const * id) {
+	return (UA_NodeId_getNamespace(id) == 0) && (UA_NodeId_getIdentifier(id) <= UA_DIAGNOSTICINFO_NS0);
+}
 
 UA_TYPE_METHOD_DELETE_STRUCT(UA_NodeId)
 UA_Int32 UA_NodeId_deleteMembers(UA_NodeId* p) {

+ 5 - 2
src/ua_xml.c

@@ -415,6 +415,7 @@ UA_Int32 UA_ReferenceNode_decodeXML(XML_Stack* s, XML_Attr* attr, UA_ReferenceNo
 				UA_NodeId_copycstring(attr[i + 1], &(dst->referenceTypeId), s->aliases);
 			} else if (0 == strncmp("IsForward", attr[i], strlen("IsForward"))) {
 				UA_Boolean_copycstring(attr[i + 1], &(dst->isInverse));
+				dst->isInverse = !dst->isInverse;
 			} else if (0 == strncmp("Target", attr[i], strlen("Target"))) {
 				UA_ExpandedNodeId_copycstring(attr[i + 1], &(dst->targetId), s->aliases);
 			} else {
@@ -698,7 +699,7 @@ UA_Int32 UA_VariableNode_decodeXML(XML_Stack* s, XML_Attr* attr, UA_VariableNode
 			} else if (0 == strncmp("ValueRank", attr[i], strlen("ValueRank"))) {
 				dst->valueRank = atoi(attr[i + 1]);
 			} else if (0 == strncmp("ParentNodeId", attr[i], strlen("ParentNodeId"))) {
-				// FIXME: I do not know what to do with this parameter
+				// FIXME: this seems to be redundant to the hasProperty-reference
 			} else if (0 == strncmp("BrowseName", attr[i], strlen("BrowseName"))) {
 				UA_String_copycstring(attr[i + 1], &(dst->browseName.name));
 				dst->browseName.namespaceIndex = 0;
@@ -869,7 +870,9 @@ UA_Int32 UA_NodeSet_decodeXML(XML_Stack* s, XML_Attr* attr, UA_NodeSet* dst, _Bo
 		XML_Stack_addChildHandler(s, "Aliases", strlen("Aliases"), (XML_decoder) UA_NodeSetAliases_decodeXML, UA_INVALIDTYPE,
 				&(dst->aliases));
 		XML_Stack_addChildHandler(s, "UADataType", strlen("UADataType"), (XML_decoder) UA_DataTypeNode_decodeXML, UA_DATATYPENODE, UA_NULL);
+		XML_Stack_addChildHandler(s, "UAVariableType", strlen("UAVariableType"), (XML_decoder) UA_VariableTypeNode_decodeXML, UA_VARIABLETYPENODE, UA_NULL);
 		XML_Stack_addChildHandler(s, "UAVariable", strlen("UAVariable"), (XML_decoder) UA_VariableNode_decodeXML, UA_VARIABLENODE, UA_NULL);
+		XML_Stack_addChildHandler(s, "UAObjectType", strlen("UAObjectType"), (XML_decoder) UA_ObjectTypeNode_decodeXML, UA_OBJECTTYPENODE, UA_NULL);
 		XML_Stack_addChildHandler(s, "UAObject", strlen("UAObject"), (XML_decoder) UA_ObjectNode_decodeXML, UA_OBJECTNODE, UA_NULL);
 	} else {
 		if (s->parent[s->depth - 1].activeChild == 0 && attr != UA_NULL) {
@@ -877,7 +880,7 @@ UA_Int32 UA_NodeSet_decodeXML(XML_Stack* s, XML_Attr* attr, UA_NodeSet* dst, _Bo
 			DBG(printf("UA_NodeSet_decodeXML - finished aliases: aliases=%p, size=%d\n",(void*)aliases,(aliases==UA_NULL)?-1:aliases->size));
 			s->aliases = aliases;
 			s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
-		} else if (s->parent[s->depth - 1].activeChild >= 1 &&  s->parent[s->depth - 1].activeChild <= 3 && attr != UA_NULL) {
+		} else if (attr != UA_NULL && (s->parent[s->depth - 1].activeChild == 3 ||  s->parent[s->depth - 1].activeChild == 5)) {
 			UA_Node* node = (UA_Node*) attr;
 			DBG(printf("UA_NodeSet_decodeXML - finished node: node=%p\n", (void* )node));
 			Namespace_insert(dst->ns, node);