Bladeren bron

first outlines of implementing TranslateBrowsePathsToNodeId service

Stasik0 10 jaren geleden
bovenliggende
commit
4563e4a7e3
6 gewijzigde bestanden met toevoegingen van 98 en 1 verwijderingen
  1. 6 0
      src/ua_services.h
  2. 22 0
      src/ua_services_view.c
  3. 4 0
      src/ua_transport_binary_secure.c
  4. 1 1
      tests/Makefile.am
  5. BIN
      tests/check_services_view
  6. 65 0
      tests/check_services_view.c

+ 6 - 0
src/ua_services.h

@@ -125,12 +125,18 @@ UA_Int32 Service_CloseSession(SL_Channel *channel, const UA_CloseSessionRequest
  * also supports a primitive filtering capability.
  */ 
 UA_Int32 Service_Browse(SL_Channel *channel, const UA_BrowseRequest *request, UA_BrowseResponse *response);
+
+/**
+ * @brief This Service is used to translate textual node paths to their respective ids.
+ */
+UA_Int32 Service_TranslateBrowsePathsToNodeIds(SL_Channel *channel, const UA_TranslateBrowsePathsToNodeIdsRequest *request, UA_TranslateBrowsePathsToNodeIdsResponse *response);
 // Service_BrowseNext
 // Service_TranslateBrowsePathsToNodeIds
 // Service_RegisterNodes
 // Service_UnregisterNodes
 /** @} */
 
+
 /* Part 4: 5.9 Query Service Set */
 /**
  * @name Query Service Set

+ 22 - 0
src/ua_services_view.c

@@ -1,4 +1,5 @@
 #include "ua_services.h"
+#include "ua_statuscodes.h"
 
 UA_Int32 Service_Browse(SL_Channel *channel, const UA_BrowseRequest *request, UA_BrowseResponse *response) {
 	UA_Int32 retval = UA_SUCCESS;
@@ -9,3 +10,24 @@ UA_Int32 Service_Browse(SL_Channel *channel, const UA_BrowseRequest *request, UA
 	}
 	return retval;
 }
+
+UA_Int32 Service_TranslateBrowsePathsToNodeIds(SL_Channel *channel, const UA_TranslateBrowsePathsToNodeIdsRequest *request, UA_TranslateBrowsePathsToNodeIdsResponse *response)
+{
+	UA_Int32 retval = UA_SUCCESS;
+
+	DBG_VERBOSE(printf("TranslateBrowsePathsToNodeIdsService - %i path(s)", request->browsePathsSize));
+	//Allocate space for a correct answer
+	UA_Array_new((void***)&(response->results),request->browsePathsSize,UA_BROWSEPATHRESULT);
+
+	response->resultsSize = request->browsePathsSize;
+
+	UA_BrowsePathResult* path;
+	for(UA_Int32 i = 0;i<request->browsePathsSize;i++){
+		UA_BrowsePathResult_new(&path);
+		//FIXME: implement
+		path->statusCode = UA_STATUSCODE_BADQUERYTOOCOMPLEX;
+		(response->results[i]) = path;
+	}
+
+	return retval;
+}

+ 4 - 0
src/ua_transport_binary_secure.c

@@ -147,6 +147,10 @@ UA_Int32 SL_handleRequest(SL_Channel *channel, const UA_ByteString* msg, UA_Int3
 		INVOKE_SERVICE(Read);
 	    responsetype = UA_READRESPONSE_NS0;
 	}
+	else if(serviceid == UA_TRANSLATEBROWSEPATHSTONODEIDSREQUEST_NS0) {
+		INVOKE_SERVICE(TranslateBrowsePathsToNodeIds);
+	    responsetype = UA_TRANSLATEBROWSEPATHSTONODEIDSRESPONSE_NS0;
+	}
 	else {
 		printf("SL_processMessage - unknown request, namespace=%d, request=%d\n", serviceRequestType.namespace,serviceRequestType.identifier.numeric);
 		retval = UA_ERROR;

+ 1 - 1
tests/Makefile.am

@@ -3,7 +3,7 @@ TESTS=
 UNIT_TESTS=
 check_PROGRAMS=
 
-UNIT_TESTS += check_stack check_list check_indexedList check_builtin check_namespace check_memory
+UNIT_TESTS += check_stack check_list check_indexedList check_builtin check_namespace check_memory check_services_view
 TESTS += $(UNIT_TESTS)
 check_PROGRAMS += $(UNIT_TESTS)
 

BIN
tests/check_services_view


+ 65 - 0
tests/check_services_view.c

@@ -0,0 +1,65 @@
+/*
+ ============================================================================
+ Name        : check_stack.c
+ Author      :
+ Version     :
+ Copyright   : Your copyright notice
+ Description :
+ ============================================================================
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "opcua.h"
+#include "ua_services.h"
+#include "ua_statuscodes.h"
+#include "check.h"
+
+
+
+START_TEST(Service_TranslateBrowsePathsToNodeIds_SmokeTest)
+{
+	UA_TranslateBrowsePathsToNodeIdsRequest* request;
+	UA_TranslateBrowsePathsToNodeIdsRequest_new(&request);
+
+	UA_TranslateBrowsePathsToNodeIdsResponse* response;
+	UA_TranslateBrowsePathsToNodeIdsResponse_new(&response);
+
+	request->browsePathsSize = 1;
+	UA_Array_new((void***)&(request->browsePaths),request->browsePathsSize,UA_BROWSEPATH);
+
+	Service_TranslateBrowsePathsToNodeIds(UA_NULL,request,response);
+
+	ck_assert_int_eq(response->resultsSize,request->browsePathsSize);
+	ck_assert_int_eq(response->results[0]->statusCode,UA_STATUSCODE_BADQUERYTOOCOMPLEX);
+}
+END_TEST
+
+Suite* testSuite_Service_TranslateBrowsePathsToNodeIds()
+{
+	Suite *s = suite_create("Service_TranslateBrowsePathsToNodeIds");
+	TCase *tc_core = tcase_create("Core");
+	tcase_add_test(tc_core, Service_TranslateBrowsePathsToNodeIds_SmokeTest);
+	suite_add_tcase(s,tc_core);
+	return s;
+}
+
+int main (void)
+{
+	int number_failed = 0;
+
+	Suite *s;
+	SRunner *sr;
+
+
+	s = testSuite_Service_TranslateBrowsePathsToNodeIds();
+	sr = srunner_create(s);
+	srunner_run_all(sr,CK_NORMAL);
+	number_failed += srunner_ntests_failed(sr);
+	srunner_free(sr);
+
+	return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+