Sfoglia il codice sorgente

resultMask added in browse service

open62541 10 anni fa
parent
commit
c7e139fe53
3 ha cambiato i file con 85 aggiunte e 68 eliminazioni
  1. 6 0
      src/ua_application.c
  2. 1 1
      src/ua_services_subscription.c
  3. 78 67
      src/ua_services_view.c

+ 6 - 0
src/ua_application.c

@@ -67,6 +67,7 @@ void appMockup_init() {
 	UA_ExpandedNodeId ObjId_ServerCapabilities = NS0EXPANDEDNODEID(2268);
 	UA_ExpandedNodeId ObjId_State = NS0EXPANDEDNODEID(2259);
 
+
 	// FolderType
 	UA_ObjectNode *folderType;
 	UA_ObjectNode_new(&folderType);
@@ -201,6 +202,8 @@ void appMockup_init() {
  
 	Namespace_insert(ns0,(UA_Node*)serverstatus);
 
+
+
 	// State (Component of ServerStatus)
 	UA_VariableNode *state;
 	UA_VariableNode_new(&state);
@@ -212,6 +215,9 @@ void appMockup_init() {
 	state->value.vt = &UA_borrowed_.types[UA_SERVERSTATE];
 	state->value.arrayLength = 1;
 	state->value.data = &status->state; // points into the other object.
+
+	state->referencesSize = 0;
+	state->references = UA_NULL;
 	Namespace_insert(ns0,(UA_Node*)state);
 
 	//TODO: free(namespaceArray->value.data) later or forget it

+ 1 - 1
src/ua_services_subscription.c

@@ -11,7 +11,7 @@ UA_Int32 Service_CreateSubscription(SL_Channel *channel, const UA_CreateSubscrip
 {
 
 	response->subscriptionId = 42;
-	response->revisedPublishingInterval = 10000;
+	response->revisedPublishingInterval = 100000;
 	response->revisedLifetimeCount = 120000;
 	response->revisedMaxKeepAliveCount = 50;
 	return UA_SUCCESS;

+ 78 - 67
src/ua_services_view.c

@@ -5,15 +5,15 @@ 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;
+	UA_Int32 i = 0;
 
-	UA_Array_new((void**)&(response->results), request->nodesToBrowseSize, &UA_.types[UA_BROWSERESULT]);
+	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++)
-	{
+			i++) {
 		UA_list_List referencesToReturn;
 		UA_list_init(&referencesToReturn);
 		UA_UInt32 j = 0;
@@ -41,91 +41,102 @@ UA_Int32 Service_Browse(SL_Channel *channel, const UA_BrowseRequest *request,
 												== 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);
+					const UA_Node* targetNode;
+					Namespace_Entry_Lock *lock1;
+					UA_Int32 ret = Namespace_get(ns, &node->references[k].targetId.nodeId,
+							&targetNode, &lock1);
+
+					if (ret==UA_SUCCESS &&targetNode
+							&& (request->nodesToBrowse->nodeClassMask
+									& targetNode->nodeClass)) {
+						UA_UInt32 mask = 0;
+						rd->resultMask = 0;
+						for (mask = 0x01; mask <= 0x40; mask *= 2) {
+							switch (mask & (request->nodesToBrowse->resultMask)) {
+							case 1:
+								UA_NodeId_copy(
+										&node->references[k].referenceTypeId,
+										&rd->referenceTypeId);
+								rd->resultMask |= (1 << 0);
+								break;
+							case 2:
+								rd->isForward = !node->references[k].isInverse;
+								rd->resultMask |= (1 << 1);
+								break;
+							case 4:
+								UA_NodeClass_copy(&targetNode->nodeClass,
+										&rd->nodeClass);
+								rd->resultMask |= (1 << 2);
+								break;
+							case 8:
+								UA_QualifiedName_copy(&targetNode->browseName,
+										&rd->browseName);
+								rd->resultMask |= (1 << 3);
+								break;
+							case 16:
+								UA_LocalizedText_copy(&targetNode->displayName,
+										&rd->displayName);
+								rd->resultMask |= (1 << 4);
+								break;
+							case 32:
+								if (rd->nodeClass == UA_NODECLASS_OBJECT
+										|| rd->nodeClass
+												== UA_NODECLASS_VARIABLE) {
+									UA_NodeId_copy(&targetNode->nodeId,
+											&rd->typeDefinition.nodeId);
+									rd->resultMask |= (1 << 5);
+								}
+								break;
+							}
+							UA_list_addPayloadToBack(&referencesToReturn, rd);
+							j++;
 						}
-						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,
-								rd);
-
-						j++;
 					}
 				}
 				k++;
 			}
 		}
-		UA_Array_new((void**)&response->results[i].references,j,&UA_.types[UA_REFERENCEDESCRIPTION]);
+		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]);
+		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);
+		UA_list_destroy(&referencesToReturn,
+				(UA_list_PayloadVisitor) UA_ReferenceDescription_delete);
 	}
-*/
-return retval;
+	return retval;
 
 }
-								//UA_BrowseResult br;
-								//UA_ReferenceNode rn;
+//UA_BrowseResult br;
+//UA_ReferenceNode rn;
 
-								//UA_Array_new(&response->results,j,UA_BROWSERESULT_NS0)
-								//UA_NodeId_printf("BrowseService - nodesToBrowse=", &request->nodesToBrowse[i].nodeId);
+//UA_Array_new(&response->results,j,UA_BROWSERESULT_NS0)
+//UA_NodeId_printf("BrowseService - nodesToBrowse=", &request->nodesToBrowse[i].nodeId);
 
 UA_Int32 Service_TranslateBrowsePathsToNodeIds(SL_Channel *channel,
-	const UA_TranslateBrowsePathsToNodeIdsRequest *request,
-	UA_TranslateBrowsePathsToNodeIdsResponse *response) {
-UA_Int32 retval = UA_SUCCESS;
+		const UA_TranslateBrowsePathsToNodeIdsRequest *request,
+		UA_TranslateBrowsePathsToNodeIdsResponse *response) {
+	UA_Int32 retval = UA_SUCCESS;
 
-DBG_VERBOSE(printf("TranslateBrowsePathsToNodeIdsService - %i path(s)", 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]);
+	UA_Array_new((void**) &response->results, request->browsePathsSize,
+			&UA_.types[UA_BROWSEPATHRESULT]);
 
-response->resultsSize = request->browsePathsSize;
+	response->resultsSize = request->browsePathsSize;
 
-for (UA_Int32 i = 0; i < request->browsePathsSize; i++) {
-	UA_BrowsePathResult_init(&response->results[i]);
+	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->results[i].statusCode = UA_STATUSCODE_BADQUERYTOOCOMPLEX;
+	}
 
-return retval;
+	return retval;
 }