Selaa lähdekoodia

almost done with browse implementation

FlorianPalm 10 vuotta sitten
vanhempi
commit
ab666d8d57
3 muutettua tiedostoa jossa 126 lisäystä ja 18 poistoa
  1. 11 0
      src/ua_application.c
  2. 114 17
      src/ua_services_view.c
  3. 1 1
      src/ua_types.h

+ 11 - 0
src/ua_application.c

@@ -82,7 +82,18 @@ void appMockup_init() {
 		{RefTypeId_Organizes, UA_FALSE, ObjId_ViewsFolder}};
 
 	Namespace_insert(ns0,(UA_Node*)root);
+	/*TEST */
+	const UA_Node * foundNode1;
+	const UA_Node * foundNode2;
+	Namespace_Entry_Lock *lock1;
 
+	Namespace_get(ns0, &root->nodeId,
+			&foundNode1, &lock1);
+
+	Namespace_get(ns0, &foundNode1->references[0].targetId.nodeId,
+			&foundNode2, &lock1);
+
+	/*TEST END*/
 	// Objects
 	UA_ObjectNode *objects;
 	UA_ObjectNode_new(&objects);

+ 114 - 17
src/ua_services_view.c

@@ -1,31 +1,128 @@
 #include "ua_services.h"
 #include "ua_statuscodes.h"
 
-UA_Int32 Service_Browse(SL_Channel *channel, const UA_BrowseRequest *request, UA_BrowseResponse *response) {
+UA_Int32 Service_Browse(SL_Channel *channel, const UA_BrowseRequest *request,
+		UA_BrowseResponse *response) {
 	UA_Int32 retval = UA_SUCCESS;
 	DBG_VERBOSE(UA_NodeId_printf("BrowseService - view=", &request->view.viewId));
 	UA_Int32 i = 0;
-	for (i=0;request->nodesToBrowseSize > 0 && i<request->nodesToBrowseSize;i++) {
-		UA_NodeId_printf("BrowseService - nodesToBrowse=", &request->nodesToBrowse[i].nodeId);
+
+	UA_Array_new((void**)&(response->results), request->nodesToBrowseSize, &UA_.types[UA_BROWSERESULT]);
+	response->resultsSize = request->nodesToBrowseSize;
+
+	for (i = 0;
+			request->nodesToBrowseSize > 0 && i < request->nodesToBrowseSize;
+			i++)
+	{
+		UA_list_List referencesToReturn;
+		UA_list_init(&referencesToReturn);
+		UA_UInt32 j = 0;
+		Namespace *ns = UA_indexedList_findValue(
+				channel->session->application->namespaces,
+				request->nodesToBrowse[i].nodeId.namespace);
+		const UA_Node *node;
+		Namespace_Entry_Lock *lock;
+		Namespace_get(ns, &request->nodesToBrowse[i].nodeId, (&node), &lock);
+
+		if (request->requestedMaxReferencesPerNode > 0) {
+			UA_Int32 k = 0;
+			while (j < request->requestedMaxReferencesPerNode
+					&& k < node->referencesSize) {
+				//TODO include subtypes missing how to determine a subtype?
+				if (((node->references[k].isInverse)
+						&& ((request->nodesToBrowse->browseDirection
+								== UA_BROWSEDIRECTION_INVERSE)
+								|| (request->nodesToBrowse->browseDirection
+										== UA_BROWSEDIRECTION_BOTH)))
+						|| (!node->references[k].isInverse
+								&& ((request->nodesToBrowse->browseDirection
+										== UA_BROWSEDIRECTION_BOTH)
+										|| (request->nodesToBrowse->browseDirection
+												== UA_BROWSEDIRECTION_FORWARD)))) {
+					UA_ReferenceDescription *rd;
+					UA_ReferenceDescription_new(&rd);
+					const UA_Node* foundNode;
+						Namespace_Entry_Lock *lock1;
+						Namespace_get(ns, &node->references[k].targetId.nodeId,
+								&foundNode, &lock1);
+
+					if (foundNode && (request->nodesToBrowse->nodeClassMask & foundNode->nodeClass)) {
+						if (request->nodesToBrowse->resultMask & (1 << 0)) {
+							UA_NodeId_copy(&node->references[k].referenceTypeId,
+									&rd->referenceTypeId);
+						}
+						if (request->nodesToBrowse->resultMask & (1 << 1)) {
+							rd->isForward = !node->references[k].isInverse;
+						}
+
+						UA_ExpandedNodeId_copy(&node->references[k].targetId,
+								&rd->nodeId);
+
+
+						if (request->nodesToBrowse->resultMask & (1 << 2)) {
+							UA_NodeClass_copy(&foundNode->nodeClass,
+									&rd->nodeClass);
+						}
+						if (request->nodesToBrowse->resultMask & (1 << 3)) {
+							UA_QualifiedName_copy(&foundNode->browseName,
+									&rd->browseName);
+						}
+						if (request->nodesToBrowse->resultMask & (1 << 4)) {
+							UA_LocalizedText_copy(&foundNode->displayName,
+									&rd->displayName);
+						}
+						if (rd->nodeClass == UA_NODECLASS_OBJECT
+								|| rd->nodeClass == UA_NODECLASS_VARIABLE) {
+							//FIXME correct? to use that nodeId for typedefinition?
+							//UA_ExpandedNodeId_copy(&foundNode->references->, &rd->typeDefinition);
+						} else {
+							//rd->typeDefinition = UA_NULL;
+						}
+						UA_list_addPayloadToBack(&referencesToReturn,
+								&node->references[k]);
+
+						j++;
+					}
+				}
+				k++;
+			}
+		}
+		UA_Array_new((void**)&response->results[i].references,j,&UA_.types[UA_REFERENCEDESCRIPTION]);
+		response->results[i].referencesSize = j;
+		UA_list_Element *element = referencesToReturn.first;
+		UA_UInt32 l = 0;
+
+		for(l=0;l<j;l++){
+			UA_ReferenceDescription_copy((UA_ReferenceDescription*)element->payload, &response->results[i].references[l]);
+			element = element->next;
+		}
+		UA_list_destroy(&referencesToReturn,(UA_list_PayloadVisitor)UA_ReferenceDescription_delete);
 	}
-	return retval;
+return retval;
 }
+								//UA_BrowseResult br;
+								//UA_ReferenceNode rn;
 
-UA_Int32 Service_TranslateBrowsePathsToNodeIds(SL_Channel *channel, const UA_TranslateBrowsePathsToNodeIdsRequest *request, UA_TranslateBrowsePathsToNodeIdsResponse *response)
-{
-	UA_Int32 retval = UA_SUCCESS;
+								//UA_Array_new(&response->results,j,UA_BROWSERESULT_NS0)
+								//UA_NodeId_printf("BrowseService - nodesToBrowse=", &request->nodesToBrowse[i].nodeId);
 
-	DBG_VERBOSE(printf("TranslateBrowsePathsToNodeIdsService - %i path(s)", request->browsePathsSize));
-	//Allocate space for a correct answer
-	UA_Array_new((void**)&response->results, request->browsePathsSize, &UA_.types[UA_BROWSEPATHRESULT]);
+UA_Int32 Service_TranslateBrowsePathsToNodeIds(SL_Channel *channel,
+	const UA_TranslateBrowsePathsToNodeIdsRequest *request,
+	UA_TranslateBrowsePathsToNodeIdsResponse *response) {
+UA_Int32 retval = UA_SUCCESS;
 
-	response->resultsSize = request->browsePathsSize;
+DBG_VERBOSE(printf("TranslateBrowsePathsToNodeIdsService - %i path(s)", request->browsePathsSize));
+//Allocate space for a correct answer
+UA_Array_new((void**) &response->results, request->browsePathsSize,
+		&UA_.types[UA_BROWSEPATHRESULT]);
 
-	for(UA_Int32 i = 0;i<request->browsePathsSize;i++){
-		UA_BrowsePathResult_init(&response->results[i]);
-		//FIXME: implement
-		response->results[i].statusCode = UA_STATUSCODE_BADQUERYTOOCOMPLEX;
-	}
+response->resultsSize = request->browsePathsSize;
+
+for (UA_Int32 i = 0; i < request->browsePathsSize; i++) {
+	UA_BrowsePathResult_init(&response->results[i]);
+//FIXME: implement
+	response->results[i].statusCode = UA_STATUSCODE_BADQUERYTOOCOMPLEX;
+}
 
-	return retval;
+return retval;
 }

+ 1 - 1
src/ua_types.h

@@ -120,7 +120,7 @@ typedef struct UA_NodeId {
 } UA_NodeId;
 
 #define NS0NODEID(NUMERIC_ID) \
-	(UA_NodeId){.encodingByte = 1 /*UA_NODEIDTYPE_FOURBYTE*/, .namespace = 0, .identifier.numeric = NUMERIC_ID}
+	(UA_NodeId){.encodingByte = 0 /*UA_NODEIDTYPE_TWOBYTE*/, .namespace = 0, .identifier.numeric = NUMERIC_ID}
 
 #define UA_NODEIDTYPE_NAMESPACE_URI_FLAG 0x80
 #define UA_NODEIDTYPE_SERVERINDEX_FLAG 0x40