|
@@ -35,6 +35,42 @@ UA_Int32 UA_NodeSetAlias_new(UA_NodeSetAlias** p) {
|
|
UA_NodeSetAlias_init(*p);
|
|
UA_NodeSetAlias_init(*p);
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
}
|
|
}
|
|
|
|
+/* References */
|
|
|
|
+typedef struct UA_NodeSetReferences_T {
|
|
|
|
+ UA_Int32 size;
|
|
|
|
+ UA_ReferenceNode** references;
|
|
|
|
+} UA_NodeSetReferences;
|
|
|
|
+UA_Int32 UA_NodeSetReferences_init(UA_NodeSetReferences* p) {
|
|
|
|
+ p->size = -1;
|
|
|
|
+ p->references = UA_NULL;
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_NodeSetReferences_new(UA_NodeSetReferences** p) {
|
|
|
|
+ UA_alloc((void** )p, sizeof(UA_NodeSetReferences));
|
|
|
|
+ UA_NodeSetReferences_init(*p);
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_ReferenceNode_println(cstring_t label, UA_ReferenceNode *a) {
|
|
|
|
+ printf("%s{referenceType=%d, target=%d, isInverse=%d}\n",
|
|
|
|
+ label,
|
|
|
|
+ a->referenceTypeId.identifier.numeric,
|
|
|
|
+ a->targetId.nodeId.identifier.numeric,
|
|
|
|
+ a->isInverse);
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_NodeSetReferences_println(cstring_t label, UA_NodeSetReferences *p) {
|
|
|
|
+ UA_Int32 i;
|
|
|
|
+ for (i = 0; i < p->size; i++) {
|
|
|
|
+ UA_ReferenceNode* a = p->references[i];
|
|
|
|
+ printf("References addr=%p, ", (void*) a);
|
|
|
|
+ if (a) {
|
|
|
|
+ UA_ReferenceNode_println("node=",a);
|
|
|
|
+ }
|
|
|
|
+ printf("\n");
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
/* The current set of aliases */
|
|
/* The current set of aliases */
|
|
typedef struct UA_NodeSetAliases_T {
|
|
typedef struct UA_NodeSetAliases_T {
|
|
UA_Int32 size;
|
|
UA_Int32 size;
|
|
@@ -54,9 +90,9 @@ UA_Int32 UA_NodeSetAliases_println(cstring_t label, UA_NodeSetAliases *p) {
|
|
UA_Int32 i;
|
|
UA_Int32 i;
|
|
for (i = 0; i < p->size; i++) {
|
|
for (i = 0; i < p->size; i++) {
|
|
UA_NodeSetAlias* a = p->aliases[i];
|
|
UA_NodeSetAlias* a = p->aliases[i];
|
|
- printf("Alias addr=%p", (void*)a);
|
|
|
|
|
|
+ printf("Alias addr=%p, ", (void*) a);
|
|
if (a) {
|
|
if (a) {
|
|
- printf("'%.*s'='%.*s", a->alias.length, a->alias.data, a->value.length, a->value.data);
|
|
|
|
|
|
+ printf("alias='%.*s', value='%.*s'", a->alias.length, a->alias.data, a->value.length, a->value.data);
|
|
}
|
|
}
|
|
printf("\n");
|
|
printf("\n");
|
|
}
|
|
}
|
|
@@ -65,11 +101,11 @@ UA_Int32 UA_NodeSetAliases_println(cstring_t label, UA_NodeSetAliases *p) {
|
|
|
|
|
|
/* A nodeset consist of a namespace and a list of aliases */
|
|
/* A nodeset consist of a namespace and a list of aliases */
|
|
typedef struct T_UA_NodeSet {
|
|
typedef struct T_UA_NodeSet {
|
|
- namespace* ns;
|
|
|
|
|
|
+ Namespace* ns;
|
|
UA_NodeSetAliases aliases;
|
|
UA_NodeSetAliases aliases;
|
|
} UA_NodeSet;
|
|
} UA_NodeSet;
|
|
UA_Int32 UA_NodeSet_init(UA_NodeSet* p) {
|
|
UA_Int32 UA_NodeSet_init(UA_NodeSet* p) {
|
|
- create_ns(&(p->ns), 100);
|
|
|
|
|
|
+ Namespace_create(&(p->ns), 100);
|
|
p->aliases.size = -1;
|
|
p->aliases.size = -1;
|
|
p->aliases.aliases = UA_NULL;
|
|
p->aliases.aliases = UA_NULL;
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
@@ -82,8 +118,31 @@ UA_Int32 UA_NodeSet_new(UA_NodeSet** p) {
|
|
UA_Int32 UA_NodeId_copycstring(cstring_t src, UA_NodeId* dst, UA_NodeSetAliases* aliases) {
|
|
UA_Int32 UA_NodeId_copycstring(cstring_t src, UA_NodeId* dst, UA_NodeSetAliases* aliases) {
|
|
dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
|
|
dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
|
|
dst->namespace = 0;
|
|
dst->namespace = 0;
|
|
|
|
+ dst->identifier.numeric = 0;
|
|
|
|
+ // FIXME: assumes i=nnnn, does not care for aliases as of now
|
|
|
|
+ if (src[1] == '=') {
|
|
|
|
+ dst->identifier.numeric = atoi(&src[2]);
|
|
|
|
+ } else {
|
|
|
|
+ UA_Int32 i;
|
|
|
|
+ for (i = 0; i < aliases->size && dst->identifier.numeric == 0; ++i) {
|
|
|
|
+ if (0
|
|
|
|
+ == strncmp((char const*) src, (char const*) aliases->aliases[i]->alias.data,
|
|
|
|
+ aliases->aliases[i]->alias.length)) {
|
|
|
|
+ dst->identifier.numeric = atoi((char const*) &(aliases->aliases[i]->value.data[2]));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ DBG_VERBOSE(printf("UA_NodeId_copycstring src=%s,id=%d\n", src, dst->identifier.numeric));
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+UA_Int32 UA_ExpandedNodeId_copycstring(cstring_t src, UA_ExpandedNodeId* dst, UA_NodeSetAliases* aliases) {
|
|
|
|
+ dst->nodeId.encodingByte = UA_NODEIDTYPE_FOURBYTE;
|
|
|
|
+ dst->nodeId.namespace = 0;
|
|
|
|
+ dst->nodeId.identifier.numeric = 0;
|
|
// FIXME: assumes i=nnnn, does not care for aliases as of now
|
|
// FIXME: assumes i=nnnn, does not care for aliases as of now
|
|
- dst->identifier.numeric = atoi(&src[2]);
|
|
|
|
|
|
+ UA_NodeId_copycstring(src, &(dst->nodeId), aliases);
|
|
|
|
+ DBG_VERBOSE(printf("UA_ExpandedNodeId_copycstring src=%s,id=%d\n", src, dst->nodeId.identifier.numeric));
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -141,7 +200,7 @@ void XML_Stack_print(XML_Stack_t* s) {
|
|
}
|
|
}
|
|
|
|
|
|
// FIXME: we might want to calculate textAttribIdx
|
|
// FIXME: we might want to calculate textAttribIdx
|
|
-void XML_Stack_handleTextAs(XML_Stack_t* p, cstring_t textAttrib, unsigned int textAttribIdx) {
|
|
|
|
|
|
+void XML_Stack_handleTextAsElementOf(XML_Stack_t* p, cstring_t textAttrib, unsigned int textAttribIdx) {
|
|
p->parent[p->depth].textAttrib = textAttrib;
|
|
p->parent[p->depth].textAttrib = textAttrib;
|
|
p->parent[p->depth].textAttribIdx = textAttribIdx;
|
|
p->parent[p->depth].textAttribIdx = textAttribIdx;
|
|
}
|
|
}
|
|
@@ -160,8 +219,55 @@ UA_Int32 UA_Array_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, void* dst, _Bool i
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+UA_Int32 UA_Boolean_copycstring(cstring_t src, UA_Boolean* dst) {
|
|
|
|
+ *dst = UA_FALSE;
|
|
|
|
+ if (0 == strncmp(src, "true", 4) || 0 == strncmp(src, "TRUE", 4)) {
|
|
|
|
+ *dst = UA_TRUE;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_Boolean_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Boolean* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_Boolean entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ if (isStart) {
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_Boolean_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ UA_Boolean_copycstring((cstring_t) attr[1], dst);
|
|
|
|
+ } else {
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
|
|
+ UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+UA_Int32 UA_Int16_copycstring(cstring_t src, UA_Int16* dst) {
|
|
|
|
+ *dst = atoi(src);
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_UInt16_copycstring(cstring_t src, UA_UInt16* dst) {
|
|
|
|
+ *dst = atoi(src);
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_Int16_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Int16* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_Int32 entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ if (isStart) {
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_Int16_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ UA_Int16_copycstring((cstring_t) attr[1], dst);
|
|
|
|
+ } else {
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
|
|
+ UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
UA_Int32 UA_Int32_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Int32* dst, _Bool isStart) {
|
|
UA_Int32 UA_Int32_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Int32* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_Int32 entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_Int32 entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
if (isStart) {
|
|
if (isStart) {
|
|
if (dst == UA_NULL) {
|
|
if (dst == UA_NULL) {
|
|
UA_Int32_new(&dst);
|
|
UA_Int32_new(&dst);
|
|
@@ -177,7 +283,7 @@ UA_Int32 UA_Int32_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Int32* dst, _Bo
|
|
}
|
|
}
|
|
|
|
|
|
UA_Int32 UA_String_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_String* dst, _Bool isStart) {
|
|
UA_Int32 UA_String_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_String* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_String entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_String entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
UA_UInt32 i;
|
|
UA_UInt32 i;
|
|
if (isStart) {
|
|
if (isStart) {
|
|
if (dst == UA_NULL) {
|
|
if (dst == UA_NULL) {
|
|
@@ -187,26 +293,107 @@ UA_Int32 UA_String_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_String* dst, _
|
|
s->parent[s->depth].len = 0;
|
|
s->parent[s->depth].len = 0;
|
|
XML_Stack_addChildHandler(s, "Data", (XML_decoder) UA_Array_decodeXML, UA_BYTE, &(dst->data));
|
|
XML_Stack_addChildHandler(s, "Data", (XML_decoder) UA_Array_decodeXML, UA_BYTE, &(dst->data));
|
|
XML_Stack_addChildHandler(s, "Length", (XML_decoder) UA_Int32_decodeXML, UA_INT32, &(dst->length));
|
|
XML_Stack_addChildHandler(s, "Length", (XML_decoder) UA_Int32_decodeXML, UA_INT32, &(dst->length));
|
|
- XML_Stack_handleTextAs(s, "Data", 0);
|
|
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "Data", 0);
|
|
|
|
|
|
// set attributes
|
|
// set attributes
|
|
for (i = 0; attr[i]; i += 2) {
|
|
for (i = 0; attr[i]; i += 2) {
|
|
if (0 == strncmp("Data", attr[i], strlen("Data"))) {
|
|
if (0 == strncmp("Data", attr[i], strlen("Data"))) {
|
|
UA_String_copycstring(attr[i + 1], dst);
|
|
UA_String_copycstring(attr[i + 1], dst);
|
|
} else {
|
|
} else {
|
|
- perror("Unknown attribute");
|
|
|
|
|
|
+ printf("UA_String_decodeXML - Unknown attribute - name=%s, value=%s\n", attr[i], attr[i+1]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
- DBG_VERBOSE(printf("UA_String clears %p\n", (void*) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
- s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_String clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+UA_Int32 UA_NodeId_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeId* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_NodeId entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ UA_UInt32 i;
|
|
|
|
+ if (isStart) {
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_NodeId_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ s->parent[s->depth].len = 0;
|
|
|
|
+ XML_Stack_addChildHandler(s, "Namespace", (XML_decoder) UA_Int16_decodeXML, UA_INT16, &(dst->namespace));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Numeric", (XML_decoder) UA_Int32_decodeXML, UA_INT32, &(dst->identifier.numeric));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Id", (XML_decoder) UA_String_decodeXML, UA_STRING, UA_NULL);
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "Data", 2);
|
|
|
|
+
|
|
|
|
+ // set attributes
|
|
|
|
+ for (i = 0; attr[i]; i += 2) {
|
|
|
|
+ if (0 == strncmp("Namespace", attr[i], strlen("Namespace"))) {
|
|
|
|
+ dst->namespace = atoi(attr[i + 1]);
|
|
|
|
+ } else if (0 == strncmp("Numeric", attr[i], strlen("Numeric"))) {
|
|
|
|
+ dst->identifier.numeric = atoi(attr[i + 1]);
|
|
|
|
+ dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
|
|
|
|
+ } else {
|
|
|
|
+ printf("UA_NodeId_decodeXML - Unknown attribute name=%s, value=%s\n", attr[i], attr[i+1]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ switch (s->parent[s->depth - 1].activeChild) {
|
|
|
|
+ case 2:
|
|
|
|
+ UA_NodeId_copycstring((cstring_t)((UA_String*)attr)->data,dst,s->aliases);
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_String clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+UA_Int32 UA_ExpandedNodeId_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_ExpandedNodeId* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_ExpandedNodeId entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ UA_UInt32 i;
|
|
|
|
+ if (isStart) {
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_ExpandedNodeId_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ s->parent[s->depth].len = 0;
|
|
|
|
+ XML_Stack_addChildHandler(s, "NodeId", (XML_decoder) UA_NodeId_decodeXML, UA_NODEID, &(dst->nodeId));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Namespace", (XML_decoder) UA_Int16_decodeXML, UA_INT16, &(dst->nodeId.namespace));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Numeric", (XML_decoder) UA_Int32_decodeXML, UA_INT32,
|
|
|
|
+ &(dst->nodeId.identifier.numeric));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Id", (XML_decoder) UA_String_decodeXML, UA_STRING, UA_NULL);
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "Data", 3);
|
|
|
|
+
|
|
|
|
+ // set attributes
|
|
|
|
+ for (i = 0; attr[i]; i += 2) {
|
|
|
|
+ if (0 == strncmp("Namespace", attr[i], strlen("Namespace"))) {
|
|
|
|
+ UA_UInt16_copycstring((cstring_t) attr[i + 1], &(dst->nodeId.namespace));
|
|
|
|
+ } else if (0 == strncmp("Numeric", attr[i], strlen("Numeric"))) {
|
|
|
|
+ UA_NodeId_copycstring((cstring_t) attr[i + 1], &(dst->nodeId), s->aliases);
|
|
|
|
+ } else if (0 == strncmp("NodeId", attr[i], strlen("NodeId"))) {
|
|
|
|
+ UA_NodeId_copycstring((cstring_t) attr[i + 1], &(dst->nodeId), s->aliases);
|
|
|
|
+ } else {
|
|
|
|
+ printf("UA_ExpandedNodeId_decodeXML - unknown attribute name=%s, value=%s\n", attr[i], attr[i+1]);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_String clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
}
|
|
}
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
UA_Int32 UA_LocalizedText_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_LocalizedText* dst, _Bool isStart) {
|
|
UA_Int32 UA_LocalizedText_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_LocalizedText* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_LocalizedText entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_LocalizedText entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
UA_UInt32 i;
|
|
UA_UInt32 i;
|
|
if (isStart) {
|
|
if (isStart) {
|
|
if (dst == UA_NULL) {
|
|
if (dst == UA_NULL) {
|
|
@@ -216,7 +403,7 @@ UA_Int32 UA_LocalizedText_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Localiz
|
|
s->parent[s->depth].len = 0;
|
|
s->parent[s->depth].len = 0;
|
|
XML_Stack_addChildHandler(s, "Text", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->text));
|
|
XML_Stack_addChildHandler(s, "Text", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->text));
|
|
XML_Stack_addChildHandler(s, "Locale", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->locale));
|
|
XML_Stack_addChildHandler(s, "Locale", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->locale));
|
|
- XML_Stack_handleTextAs(s, "Data", 0);
|
|
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "Data", 0);
|
|
|
|
|
|
// set attributes
|
|
// set attributes
|
|
for (i = 0; attr[i]; i += 2) {
|
|
for (i = 0; attr[i]; i += 2) {
|
|
@@ -233,23 +420,136 @@ UA_Int32 UA_LocalizedText_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_Localiz
|
|
} else {
|
|
} else {
|
|
switch (s->parent[s->depth - 1].activeChild) {
|
|
switch (s->parent[s->depth - 1].activeChild) {
|
|
case 0:
|
|
case 0:
|
|
- dst->encodingMask |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
|
|
|
|
|
|
+ dst->encodingMask |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
|
|
break;
|
|
break;
|
|
case 1:
|
|
case 1:
|
|
- dst->encodingMask |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE;
|
|
|
|
|
|
+ dst->encodingMask |= UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_LOCALE;
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
// TODO: I think it is a design flaw that we need to do this here, isn't it?
|
|
// TODO: I think it is a design flaw that we need to do this here, isn't it?
|
|
- DBG_VERBOSE(printf("UA_LocalizedText clears %p\n", (void*) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_LocalizedText clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+UA_Int32 UA_QualifiedName_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_QualifiedName* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_QualifiedName entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ UA_UInt32 i;
|
|
|
|
+ if (isStart) {
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_QualifiedName_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ s->parent[s->depth].len = 0;
|
|
|
|
+ XML_Stack_addChildHandler(s, "Name", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->name));
|
|
|
|
+ XML_Stack_addChildHandler(s, "NamespaceIndex", (XML_decoder) UA_Int16_decodeXML, UA_STRING,
|
|
|
|
+ &(dst->namespaceIndex));
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "Data", 0);
|
|
|
|
+
|
|
|
|
+ // set attributes
|
|
|
|
+ for (i = 0; attr[i]; i += 2) {
|
|
|
|
+ if (0 == strncmp("NamespaceIndex", attr[i], strlen("NamespaceIndex"))) {
|
|
|
|
+ dst->namespaceIndex = atoi(attr[i + 1]);
|
|
|
|
+ } else if (0 == strncmp("Name", attr[i], strlen("Name"))) {
|
|
|
|
+ UA_String_copycstring(attr[i + 1], &(dst->name));
|
|
|
|
+ } else {
|
|
|
|
+ perror("Unknown attribute");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // TODO: I think it is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_LocalizedText clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+UA_Int32 UA_ReferenceNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_ReferenceNode* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_ReferenceNode_decodeXML entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ if (isStart) {
|
|
|
|
+ // create if necessary
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_ReferenceNode_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ // set handlers
|
|
|
|
+ s->parent[s->depth].len = 0;
|
|
|
|
+ XML_Stack_addChildHandler(s, "ReferenceType", (XML_decoder) UA_NodeId_decodeXML, UA_STRING,
|
|
|
|
+ &(dst->referenceTypeId));
|
|
|
|
+ XML_Stack_addChildHandler(s, "IsForward", (XML_decoder) UA_Boolean_decodeXML, UA_STRING, &(dst->isInverse));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Target", (XML_decoder) UA_ExpandedNodeId_decodeXML, UA_STRING, &(dst->targetId));
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "NodeId", 2);
|
|
|
|
+
|
|
|
|
+ // set attributes
|
|
|
|
+ UA_Int32 i;
|
|
|
|
+ for (i = 0; attr[i]; i += 2) {
|
|
|
|
+ if (0 == strncmp("ReferenceType", attr[i], strlen("ReferenceType"))) {
|
|
|
|
+ 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));
|
|
|
|
+ } else if (0 == strncmp("Target", attr[i], strlen("Target"))) {
|
|
|
|
+ UA_ExpandedNodeId_copycstring(attr[i + 1], &(dst->targetId), s->aliases);
|
|
|
|
+ } else {
|
|
|
|
+ DBG_ERR(XML_Stack_print(s));DBG_ERR(printf("%s - unknown attribute\n", attr[i]));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ // sub element is ready
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_ReferenceNode clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
}
|
|
}
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+UA_Int32 UA_NodeSetReferences_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetReferences* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_NodeSetReferences entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ if (isStart) {
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_NodeSetReferences_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+ s->parent[s->depth].len = 0;
|
|
|
|
+ XML_Stack_addChildHandler(s, "Reference", (XML_decoder) UA_ReferenceNode_decodeXML, UA_REFERENCENODE, UA_NULL);
|
|
|
|
+ } else {
|
|
|
|
+ // sub element is ready, add to array
|
|
|
|
+ if (dst->size < 0 || dst->size == 0) {
|
|
|
|
+ dst->size = 1;
|
|
|
|
+ UA_alloc((void** )&(dst->references), dst->size * sizeof(UA_ReferenceNode*));
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("allocate references:dst=%p, aliases=%p, size=%d\n", (void* )dst, (void* )(dst->references),
|
|
|
|
+ dst->size));
|
|
|
|
+ } else {
|
|
|
|
+ dst->size++;
|
|
|
|
+ dst->references = realloc(dst->references, dst->size * sizeof(UA_NodeSetAlias*));
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("reallocate references:dst=%p, aliases=%p, size=%d\n", (void* )dst,
|
|
|
|
+ (void* )(dst->references), dst->size));
|
|
|
|
+ }
|
|
|
|
+ // index starts with 0, therefore size-1
|
|
|
|
+ DBG_VERBOSE(printf("assign alias:dst=%p, src=%p\n", (void* )dst->references[dst->size - 1], (void* )attr));
|
|
|
|
+ dst->references[dst->size - 1] = (UA_ReferenceNode*) attr;
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_NodeSetReferences clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
|
|
+ UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
UA_Int32 UA_DataTypeNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_DataTypeNode* dst, _Bool isStart) {
|
|
UA_Int32 UA_DataTypeNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_DataTypeNode* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_DataTypeNode entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_DataTypeNode entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
UA_UInt32 i;
|
|
UA_UInt32 i;
|
|
|
|
|
|
if (isStart) {
|
|
if (isStart) {
|
|
@@ -260,8 +560,14 @@ UA_Int32 UA_DataTypeNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_DataType
|
|
}
|
|
}
|
|
|
|
|
|
s->parent[s->depth].len = 0;
|
|
s->parent[s->depth].len = 0;
|
|
- XML_Stack_addChildHandler(s, "DisplayName", (XML_decoder) UA_LocalizedText_decodeXML, UA_LOCALIZEDTEXT, &(dst->displayName));
|
|
|
|
- XML_Stack_addChildHandler(s, "Description", (XML_decoder) UA_LocalizedText_decodeXML, UA_LOCALIZEDTEXT, &(dst->description));
|
|
|
|
|
|
+ XML_Stack_addChildHandler(s, "DisplayName", (XML_decoder) UA_LocalizedText_decodeXML, UA_LOCALIZEDTEXT,
|
|
|
|
+ &(dst->displayName));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Description", (XML_decoder) UA_LocalizedText_decodeXML, UA_LOCALIZEDTEXT,
|
|
|
|
+ &(dst->description));
|
|
|
|
+ XML_Stack_addChildHandler(s, "BrowseName", (XML_decoder) UA_QualifiedName_decodeXML, UA_QUALIFIEDNAME,
|
|
|
|
+ &(dst->description));
|
|
|
|
+ XML_Stack_addChildHandler(s, "References", (XML_decoder) UA_NodeSetReferences_decodeXML, UA_INVALIDTYPE,
|
|
|
|
+ UA_NULL);
|
|
|
|
|
|
// set missing default attributes
|
|
// set missing default attributes
|
|
dst->nodeClass = UA_NODECLASS_DATATYPE;
|
|
dst->nodeClass = UA_NODECLASS_DATATYPE;
|
|
@@ -280,12 +586,98 @@ UA_Int32 UA_DataTypeNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_DataType
|
|
UA_String_copycstring(attr[i + 1], &(dst->description.text));
|
|
UA_String_copycstring(attr[i + 1], &(dst->description.text));
|
|
dst->description.encodingMask = UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
|
|
dst->description.encodingMask = UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
|
|
} else {
|
|
} else {
|
|
- DBG_ERR(XML_Stack_print(s));DBG_ERR(printf("%s - unknown attribute\n",attr[i]));
|
|
|
|
|
|
+ DBG_ERR(XML_Stack_print(s));DBG_ERR(printf("%s - unknown attribute\n", attr[i]));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
|
|
+ switch (s->parent[s->depth - 1].activeChild) {
|
|
|
|
+ case 3: // References
|
|
|
|
+ if (attr != UA_NULL) {
|
|
|
|
+ UA_NodeSetReferences* references = (UA_NodeSetReferences*) attr;
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("finished aliases: references=%p, size=%d\n",(void*)references,(references==UA_NULL)?-1:references->size));
|
|
|
|
+ dst->referencesSize = references->size;
|
|
|
|
+ dst->references = references->references;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
- DBG_VERBOSE(printf("UA_DataTypeNode clears %p\n", (void*) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_DataTypeNode clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
|
|
+ UA_NULL;
|
|
|
|
+ }
|
|
|
|
+ return UA_SUCCESS;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+UA_Int32 UA_VariableNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_VariableNode* dst, _Bool isStart) {
|
|
|
|
+ DBG_VERBOSE(printf("UA_VariableNode entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
|
|
+ UA_UInt32 i;
|
|
|
|
+
|
|
|
|
+ if (isStart) {
|
|
|
|
+ // create a new object if called with UA_NULL
|
|
|
|
+ if (dst == UA_NULL) {
|
|
|
|
+ UA_VariableNode_new(&dst);
|
|
|
|
+ s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ s->parent[s->depth].len = 0;
|
|
|
|
+ XML_Stack_addChildHandler(s, "DisplayName", (XML_decoder) UA_LocalizedText_decodeXML, UA_LOCALIZEDTEXT,
|
|
|
|
+ &(dst->displayName));
|
|
|
|
+ XML_Stack_addChildHandler(s, "Description", (XML_decoder) UA_LocalizedText_decodeXML, UA_LOCALIZEDTEXT,
|
|
|
|
+ &(dst->description));
|
|
|
|
+ // XML_Stack_addChildHandler(s, "DataType", (XML_decoder) UA_NodeId_decodeXML, UA_NODEID, &(dst->dataType));
|
|
|
|
+ XML_Stack_addChildHandler(s, "ValueRank", (XML_decoder) UA_Int32_decodeXML, UA_INT32, &(dst->valueRank));
|
|
|
|
+ XML_Stack_addChildHandler(s, "References", (XML_decoder) UA_NodeSetReferences_decodeXML, UA_INVALIDTYPE,
|
|
|
|
+ UA_NULL);
|
|
|
|
+
|
|
|
|
+ // set missing default attributes
|
|
|
|
+ dst->nodeClass = UA_NODECLASS_VARIABLE;
|
|
|
|
+
|
|
|
|
+ // set attributes
|
|
|
|
+ for (i = 0; attr[i]; i += 2) {
|
|
|
|
+ if (0 == strncmp("NodeId", attr[i], strlen("NodeId"))) {
|
|
|
|
+ UA_NodeId_copycstring(attr[i + 1], &(dst->nodeId), s->aliases);
|
|
|
|
+ } else if (0 == strncmp("DataType", attr[i], strlen("DataType"))) {
|
|
|
|
+ UA_NodeId_copycstring(attr[i + 1], &(dst->dataType), s->aliases);
|
|
|
|
+ } 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
|
|
|
|
+ } else if (0 == strncmp("BrowseName", attr[i], strlen("BrowseName"))) {
|
|
|
|
+ UA_String_copycstring(attr[i + 1], &(dst->browseName.name));
|
|
|
|
+ dst->browseName.namespaceIndex = 0;
|
|
|
|
+ } else if (0 == strncmp("DisplayName", attr[i], strlen("DisplayName"))) {
|
|
|
|
+ UA_String_copycstring(attr[i + 1], &(dst->displayName.text));
|
|
|
|
+ dst->displayName.encodingMask = UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
|
|
|
|
+ } else if (0 == strncmp("Description", attr[i], strlen("Description"))) {
|
|
|
|
+ UA_String_copycstring(attr[i + 1], &(dst->description.text));
|
|
|
|
+ dst->description.encodingMask = UA_LOCALIZEDTEXT_ENCODINGMASKTYPE_TEXT;
|
|
|
|
+ } else {
|
|
|
|
+ DBG_ERR(XML_Stack_print(s));DBG_ERR(printf("%s - unknown attribute\n", attr[i]));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ switch (s->parent[s->depth - 1].activeChild) {
|
|
|
|
+ case 3: // References
|
|
|
|
+ if (attr != UA_NULL) {
|
|
|
|
+ UA_NodeSetReferences* references = (UA_NodeSetReferences*) attr;
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("finished aliases: references=%p, size=%d\n",(void*)references,(references==UA_NULL)?-1:references->size));
|
|
|
|
+ dst->referencesSize = references->size;
|
|
|
|
+ dst->references = references->references;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ // TODO: It is a design flaw that we need to do this here, isn't it?
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_DataTypeNode clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
UA_NULL;
|
|
UA_NULL;
|
|
}
|
|
}
|
|
@@ -294,13 +686,42 @@ UA_Int32 UA_DataTypeNode_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_DataType
|
|
|
|
|
|
void print_node(UA_Node const * node) {
|
|
void print_node(UA_Node const * node) {
|
|
if (node != UA_NULL) {
|
|
if (node != UA_NULL) {
|
|
- UA_NodeId_printf("---------------------------\nnode.NodeId=", &(node->nodeId));
|
|
|
|
- printf("node.browseName='%.*s'\n", node->browseName.name.length, node->browseName.name.data);
|
|
|
|
|
|
+ UA_NodeId_printf("--- node.nodeId=", &(node->nodeId));
|
|
|
|
+ printf("\t.browseName='%.*s'\n", node->browseName.name.length, node->browseName.name.data);
|
|
|
|
+ printf("\t.displayName='%.*s'\n", node->displayName.text.length, node->displayName.text.data);
|
|
|
|
+ printf("\t.description='%.*s%s'\n", node->description.text.length > 40 ? 40 : node->description.text.length,
|
|
|
|
+ node->description.text.data, node->description.text.length > 40 ? "..." : "");
|
|
|
|
+ printf("\t.nodeClass=%d\n", node->nodeClass);
|
|
|
|
+ printf("\t.writeMask=%d\n", node->writeMask);
|
|
|
|
+ printf("\t.userWriteMask=%d\n", node->userWriteMask);
|
|
|
|
+ printf("\t.referencesSize=%d\n", node->referencesSize);
|
|
|
|
+ UA_Int32 i;
|
|
|
|
+ for (i=0;i<node->referencesSize;i++) {
|
|
|
|
+ printf("\t .references[%d]", i);
|
|
|
|
+ UA_ReferenceNode_println("=",node->references[i]);
|
|
|
|
+ }
|
|
|
|
+ switch (node->nodeClass) {
|
|
|
|
+ case UA_NODECLASS_VARIABLE: {
|
|
|
|
+ UA_VariableNode const * p = (UA_VariableNode const *) node;
|
|
|
|
+ printf("\t----- UA_VariableNode ----- \n");
|
|
|
|
+ UA_NodeId_printf("\t.dataType=", &(p->dataType));
|
|
|
|
+ printf("\t.valueRank=%d\n", p->valueRank);
|
|
|
|
+ printf("\t.accessLevel=%d\n", p->accessLevel);
|
|
|
|
+ printf("\t.userAccessLevel=%d\n", p->userAccessLevel);
|
|
|
|
+ printf("\t.arrayDimensionsSize=%d\n", p->arrayDimensionsSize);
|
|
|
|
+ printf("\t.minimumSamplingInterval=%f\n", p->minimumSamplingInterval);
|
|
|
|
+ printf("\t.historizing=%d\n", p->historizing);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ // case UA_NODECLASS_DATATYPE:
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
UA_Int32 UA_NodeSetAlias_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetAlias* dst, _Bool isStart) {
|
|
UA_Int32 UA_NodeSetAlias_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetAlias* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_NodeSetAlias entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_NodeSetAlias entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
if (isStart) {
|
|
if (isStart) {
|
|
// create if necessary
|
|
// create if necessary
|
|
if (dst == UA_NULL) {
|
|
if (dst == UA_NULL) {
|
|
@@ -311,7 +732,7 @@ UA_Int32 UA_NodeSetAlias_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetA
|
|
s->parent[s->depth].len = 0;
|
|
s->parent[s->depth].len = 0;
|
|
XML_Stack_addChildHandler(s, "Alias", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->alias));
|
|
XML_Stack_addChildHandler(s, "Alias", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->alias));
|
|
XML_Stack_addChildHandler(s, "Value", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->value));
|
|
XML_Stack_addChildHandler(s, "Value", (XML_decoder) UA_String_decodeXML, UA_STRING, &(dst->value));
|
|
- XML_Stack_handleTextAs(s, "Data", 1);
|
|
|
|
|
|
+ XML_Stack_handleTextAsElementOf(s, "Data", 1);
|
|
|
|
|
|
// set attributes
|
|
// set attributes
|
|
UA_Int32 i;
|
|
UA_Int32 i;
|
|
@@ -321,20 +742,22 @@ UA_Int32 UA_NodeSetAlias_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetA
|
|
} else if (0 == strncmp("Value", attr[i], strlen("Value"))) {
|
|
} else if (0 == strncmp("Value", attr[i], strlen("Value"))) {
|
|
UA_String_copycstring(attr[i + 1], &(dst->value));
|
|
UA_String_copycstring(attr[i + 1], &(dst->value));
|
|
} else {
|
|
} else {
|
|
- DBG_ERR(XML_Stack_print(s));DBG_ERR(printf("%s - unknown attribute\n",attr[i]));
|
|
|
|
|
|
+ DBG_ERR(XML_Stack_print(s));DBG_ERR(printf("%s - unknown attribute\n", attr[i]));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
// sub element is ready
|
|
// sub element is ready
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
- DBG_VERBOSE(printf("UA_NodeSetAlias clears %p\n", (void*) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_NodeSetAlias clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
}
|
|
}
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
}
|
|
}
|
|
|
|
|
|
UA_Int32 UA_NodeSetAliases_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetAliases* dst, _Bool isStart) {
|
|
UA_Int32 UA_NodeSetAliases_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSetAliases* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_NodeSetALiases entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_NodeSetALiases entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
if (isStart) {
|
|
if (isStart) {
|
|
if (dst == UA_NULL) {
|
|
if (dst == UA_NULL) {
|
|
UA_NodeSetAliases_new(&dst);
|
|
UA_NodeSetAliases_new(&dst);
|
|
@@ -347,17 +770,23 @@ UA_Int32 UA_NodeSetAliases_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSe
|
|
if (dst->size < 0 || dst->size == 0) {
|
|
if (dst->size < 0 || dst->size == 0) {
|
|
dst->size = 1;
|
|
dst->size = 1;
|
|
UA_alloc((void** )&(dst->aliases), dst->size * sizeof(UA_NodeSetAlias*));
|
|
UA_alloc((void** )&(dst->aliases), dst->size * sizeof(UA_NodeSetAlias*));
|
|
- DBG_VERBOSE(printf("allocate aliases:dst=%p, aliases=%p, size=%d\n",(void*)dst,(void*)(dst->aliases),dst->size));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("allocate aliases:dst=%p, aliases=%p, size=%d\n", (void* )dst, (void* )(dst->aliases),
|
|
|
|
+ dst->size));
|
|
} else {
|
|
} else {
|
|
dst->size++;
|
|
dst->size++;
|
|
dst->aliases = realloc(dst->aliases, dst->size * sizeof(UA_NodeSetAlias*));
|
|
dst->aliases = realloc(dst->aliases, dst->size * sizeof(UA_NodeSetAlias*));
|
|
- DBG_VERBOSE(printf("reallocate aliases:dst=%p, aliases=%p, size=%d\n",(void*)dst,(void*)(dst->aliases),dst->size));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("reallocate aliases:dst=%p, aliases=%p, size=%d\n", (void* )dst, (void* )(dst->aliases),
|
|
|
|
+ dst->size));
|
|
}
|
|
}
|
|
// index starts with 0, therefore size-1
|
|
// index starts with 0, therefore size-1
|
|
- DBG_VERBOSE(printf("assign alias:dst=%p, src=%p\n",(void*)dst->aliases[dst->size - 1],(void*)attr));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("assign alias:dst=%p, src=%p\n", (void* )dst->aliases[dst->size - 1], (void* )attr));
|
|
dst->aliases[dst->size - 1] = (UA_NodeSetAlias*) attr;
|
|
dst->aliases[dst->size - 1] = (UA_NodeSetAlias*) attr;
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
- DBG_VERBOSE(printf("UA_NodeSetAliases clears %p\n", (void*) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_NodeSetAliases clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj =
|
|
UA_NULL;
|
|
UA_NULL;
|
|
}
|
|
}
|
|
@@ -365,37 +794,43 @@ UA_Int32 UA_NodeSetAliases_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSe
|
|
}
|
|
}
|
|
|
|
|
|
UA_Int32 UA_NodeSet_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSet* dst, _Bool isStart) {
|
|
UA_Int32 UA_NodeSet_decodeXML(XML_Stack_t* s, XML_Attr_t* attr, UA_NodeSet* dst, _Bool isStart) {
|
|
- DBG_VERBOSE(printf("UA_NodeSet entered with dst=%p,isStart=%d\n", (void*) dst,isStart));
|
|
|
|
|
|
+ DBG_VERBOSE(printf("UA_NodeSet entered with dst=%p,isStart=%d\n", (void* ) dst, isStart));
|
|
if (isStart) {
|
|
if (isStart) {
|
|
if (dst == UA_NULL) {
|
|
if (dst == UA_NULL) {
|
|
UA_NodeSet_new(&dst);
|
|
UA_NodeSet_new(&dst);
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = (void*) dst;
|
|
}
|
|
}
|
|
s->parent[s->depth].len = 0;
|
|
s->parent[s->depth].len = 0;
|
|
- XML_Stack_addChildHandler(s, "Aliases", (XML_decoder) UA_NodeSetAliases_decodeXML, UA_INVALIDTYPE, &(dst->aliases));
|
|
|
|
|
|
+ XML_Stack_addChildHandler(s, "Aliases", (XML_decoder) UA_NodeSetAliases_decodeXML, UA_INVALIDTYPE,
|
|
|
|
+ &(dst->aliases));
|
|
XML_Stack_addChildHandler(s, "UADataType", (XML_decoder) UA_DataTypeNode_decodeXML, UA_DATATYPENODE, UA_NULL);
|
|
XML_Stack_addChildHandler(s, "UADataType", (XML_decoder) UA_DataTypeNode_decodeXML, UA_DATATYPENODE, UA_NULL);
|
|
|
|
+ XML_Stack_addChildHandler(s, "UAVariable", (XML_decoder) UA_VariableNode_decodeXML, UA_VARIABLENODE, UA_NULL);
|
|
} else {
|
|
} else {
|
|
switch (s->parent[s->depth - 1].activeChild) {
|
|
switch (s->parent[s->depth - 1].activeChild) {
|
|
case 0: // Aliases
|
|
case 0: // Aliases
|
|
- if (attr != UA_NULL) {
|
|
|
|
- UA_NodeSetAliases* aliases = (UA_NodeSetAliases*) attr;
|
|
|
|
- DBG_VERBOSE(printf("finished aliases: aliases=%p, size=%d\n",(void*)aliases,(aliases==UA_NULL)?-1:aliases->size));
|
|
|
|
- s->aliases = aliases;
|
|
|
|
- }
|
|
|
|
|
|
+ if (attr != UA_NULL) {
|
|
|
|
+ UA_NodeSetAliases* aliases = (UA_NodeSetAliases*) attr;
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("finished aliases: aliases=%p, size=%d\n",(void*)aliases,(aliases==UA_NULL)?-1:aliases->size));
|
|
|
|
+ s->aliases = aliases;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
case 1:
|
|
case 1:
|
|
- if (attr != UA_NULL) {
|
|
|
|
- UA_Node* node = (UA_Node*) attr;
|
|
|
|
- DBG_VERBOSE(printf("finished node: node=%p\n",(void*)node));
|
|
|
|
- insert_node(dst->ns, node);
|
|
|
|
- DBG_VERBOSE(printf("Inserting "));DBG_VERBOSE(print_node(node));
|
|
|
|
- }
|
|
|
|
|
|
+ case 2:
|
|
|
|
+ if (attr != UA_NULL) {
|
|
|
|
+ UA_Node* node = (UA_Node*) attr;
|
|
|
|
+ DBG_VERBOSE(printf("finished node: node=%p\n", (void* )node));
|
|
|
|
+ Namespace_insert(dst->ns, node);
|
|
|
|
+ DBG_VERBOSE(printf("Inserting "));DBG_VERBOSE(print_node(node));
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
// TODO: It is a design flaw that we need to do this here, isn't it?
|
|
- DBG_VERBOSE(printf("UA_NodeSet clears %p\n", (void*) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("UA_NodeSet clears %p\n",
|
|
|
|
+ (void* ) (s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj)));
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
s->parent[s->depth - 1].children[s->parent[s->depth - 1].activeChild].obj = UA_NULL;
|
|
}
|
|
}
|
|
return UA_SUCCESS;
|
|
return UA_SUCCESS;
|
|
@@ -410,7 +845,8 @@ void XML_Stack_startElement(void * data, const char *el, const char **attr) {
|
|
XML_Parent_t* cp = &s->parent[s->depth];
|
|
XML_Parent_t* cp = &s->parent[s->depth];
|
|
for (i = 0; i < cp->len; i++) {
|
|
for (i = 0; i < cp->len; i++) {
|
|
if (0 == strncmp(cp->children[i].name, el, strlen(cp->children[i].name))) {
|
|
if (0 == strncmp(cp->children[i].name, el, strlen(cp->children[i].name))) {
|
|
- DBG_VERBOSE(XML_Stack_print(s));DBG_VERBOSE(printf("%s - processing\n",el));
|
|
|
|
|
|
+ DBG_VERBOSE(XML_Stack_print(s));
|
|
|
|
+ DBG_VERBOSE(printf("%s - processing\n", el));
|
|
|
|
|
|
cp->activeChild = i;
|
|
cp->activeChild = i;
|
|
|
|
|
|
@@ -427,7 +863,8 @@ void XML_Stack_startElement(void * data, const char *el, const char **attr) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// if we come here we rejected the processing of el
|
|
// if we come here we rejected the processing of el
|
|
- DBG_VERBOSE(XML_Stack_print(s));DBG_VERBOSE(printf("%s - rejected\n",el));
|
|
|
|
|
|
+ DBG_VERBOSE(XML_Stack_print(s));
|
|
|
|
+ DBG_VERBOSE(printf("%s - rejected\n", el));
|
|
s->depth++;
|
|
s->depth++;
|
|
s->parent[s->depth].name = el;
|
|
s->parent[s->depth].name = el;
|
|
// this should be sufficient to reject the children as well
|
|
// this should be sufficient to reject the children as well
|
|
@@ -456,14 +893,18 @@ void XML_Stack_handleText(void * data, const char *txt, int len) {
|
|
UA_alloc((void** )&buf, len + 1);
|
|
UA_alloc((void** )&buf, len + 1);
|
|
strncpy(buf, txt, len);
|
|
strncpy(buf, txt, len);
|
|
buf[len] = 0;
|
|
buf[len] = 0;
|
|
- // XML_Attr_t attr[3] = { cp->textAttrib, buf, UA_NULL };
|
|
|
|
- DBG_VERBOSE(printf("handleText calls start elementHandler %s with dst=%p, attr=%p\n", cp->children[cp->activeChild].name, cp->children[cp->activeChild].obj, (void*) attr));
|
|
|
|
- // cp->children[cp->activeChild].elementHandler(s, attr, cp->children[cp->activeChild].obj, TRUE);
|
|
|
|
- DBG_VERBOSE(printf("handleText calls finish elementHandler %s with dst=%p, attr=(nil)\n", cp->children[cp->activeChild].name, cp->children[cp->activeChild].obj));
|
|
|
|
|
|
+ XML_Attr_t attr[3] = { cp->textAttrib, buf, UA_NULL };
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf("handleText calls start elementHandler %s with dst=%p, attr=%p\n",
|
|
|
|
+ cp->children[cp->activeChild].name, cp->children[cp->activeChild].obj, (void* ) attr));
|
|
|
|
+ cp->children[cp->activeChild].elementHandler(s, attr, cp->children[cp->activeChild].obj, TRUE);
|
|
|
|
+ // FIXME: The indices of this call are simply wrong, so no finishing as of yet
|
|
|
|
+ // DBG_VERBOSE(printf("handleText calls finish elementHandler %s with dst=%p, attr=(nil)\n", cp->children[cp->activeChild].name, cp->children[cp->activeChild].obj));
|
|
// cp->children[cp->activeChild].elementHandler(s, UA_NULL, cp->children[cp->activeChild].obj, FALSE);
|
|
// cp->children[cp->activeChild].elementHandler(s, UA_NULL, cp->children[cp->activeChild].obj, FALSE);
|
|
UA_free(buf);
|
|
UA_free(buf);
|
|
} else {
|
|
} else {
|
|
- DBG_VERBOSE(XML_Stack_print(s));DBG_VERBOSE(printf("textData - ignore text data '%.*s'\n",len,txt));
|
|
|
|
|
|
+ DBG_VERBOSE(XML_Stack_print(s));
|
|
|
|
+ DBG_VERBOSE(printf("textData - ignore text data '%.*s'\n", len, txt));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -478,8 +919,12 @@ void XML_Stack_endElement(void *data, const char *el) {
|
|
XML_Parent_t* cp = &(s->parent[s->depth - 1]);
|
|
XML_Parent_t* cp = &(s->parent[s->depth - 1]);
|
|
XML_Parent_t* cpp = &(s->parent[s->depth - 2]);
|
|
XML_Parent_t* cpp = &(s->parent[s->depth - 2]);
|
|
if (cpp->activeChild >= 0 && cp->activeChild >= 0) {
|
|
if (cpp->activeChild >= 0 && cp->activeChild >= 0) {
|
|
- DBG_VERBOSE(XML_Stack_print(s));DBG_VERBOSE(printf(" - inform pop %s, arg=%p\n", cpp->children[cpp->activeChild].name, (void*) cp->children[cp->activeChild].obj));
|
|
|
|
- cpp->children[cpp->activeChild].elementHandler(s, (XML_Attr_t*) cp->children[cp->activeChild].obj, cpp->children[cpp->activeChild].obj, FALSE);
|
|
|
|
|
|
+ DBG_VERBOSE(XML_Stack_print(s));
|
|
|
|
+ DBG_VERBOSE(
|
|
|
|
+ printf(" - inform pop %s, arg=%p\n", cpp->children[cpp->activeChild].name,
|
|
|
|
+ (void* ) cp->children[cp->activeChild].obj));
|
|
|
|
+ cpp->children[cpp->activeChild].elementHandler(s, (XML_Attr_t*) cp->children[cp->activeChild].obj,
|
|
|
|
+ cpp->children[cpp->activeChild].obj, FALSE);
|
|
}
|
|
}
|
|
// reset
|
|
// reset
|
|
cp->activeChild = -1;
|
|
cp->activeChild = -1;
|
|
@@ -506,8 +951,8 @@ int main() {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
XML_ParserFree(parser);
|
|
XML_ParserFree(parser);
|
|
- iterate_ns(n.ns, print_node);
|
|
|
|
- DBG_VERBOSE(printf("aliases addr=%p\n",(void*)&(n.aliases)));
|
|
|
|
- DBG_VERBOSE(UA_NodeSetAliases_println("aliases in nodeset: ",&n.aliases));
|
|
|
|
|
|
+ Namespace_iterate(n.ns, print_node);
|
|
|
|
+ printf("aliases addr=%p, size=%d\n", (void*) &(n.aliases), n.aliases.size);
|
|
|
|
+ UA_NodeSetAliases_println("aliases in nodeset: ", &n.aliases);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|