ua_services_discovery.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "ua_server_internal.h"
  2. #include "ua_services.h"
  3. #include "ua_util.h"
  4. void Service_FindServers(UA_Server *server, UA_Session *session,
  5. const UA_FindServersRequest *request, UA_FindServersResponse *response) {
  6. response->servers = UA_malloc(sizeof(UA_ApplicationDescription));
  7. if(!response->servers) {
  8. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  9. return;
  10. }
  11. if(UA_ApplicationDescription_copy(&server->description, response->servers) != UA_STATUSCODE_GOOD) {
  12. UA_free(response->servers);
  13. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  14. return;
  15. }
  16. response->serversSize = 1;
  17. }
  18. void Service_GetEndpoints(UA_Server *server, UA_Session *session,
  19. const UA_GetEndpointsRequest *request, UA_GetEndpointsResponse *response) {
  20. /* test if the supported binary profile shall be returned */
  21. #ifdef NO_ALLOCA
  22. UA_Boolean relevant_endpoints[server->endpointDescriptionsSize];
  23. #else
  24. UA_Boolean *relevant_endpoints = UA_alloca(sizeof(UA_Boolean)*server->endpointDescriptionsSize);
  25. #endif /*NO_ALLOCA */
  26. size_t relevant_count = 0;
  27. for(size_t j = 0; j < server->endpointDescriptionsSize; j++) {
  28. relevant_endpoints[j] = UA_FALSE;
  29. if(request->profileUrisSize <= 0) {
  30. relevant_endpoints[j] = UA_TRUE;
  31. relevant_count++;
  32. continue;
  33. }
  34. for(size_t i = 0; i < request->profileUrisSize; i++) {
  35. if(UA_String_equal(&request->profileUris[i], &server->endpointDescriptions->transportProfileUri)) {
  36. relevant_endpoints[j] = UA_TRUE;
  37. relevant_count++;
  38. break;
  39. }
  40. }
  41. }
  42. if(relevant_count == 0) {
  43. response->endpointsSize = 0;
  44. return;
  45. }
  46. response->endpoints = UA_malloc(sizeof(UA_EndpointDescription) * relevant_count);
  47. if(!response->endpoints) {
  48. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  49. return;
  50. }
  51. size_t k = 0;
  52. UA_StatusCode retval = UA_STATUSCODE_GOOD;
  53. for(size_t j = 0; j < server->endpointDescriptionsSize && retval == UA_STATUSCODE_GOOD; j++) {
  54. if(relevant_endpoints[j] != UA_TRUE)
  55. continue;
  56. retval = UA_EndpointDescription_copy(&server->endpointDescriptions[j], &response->endpoints[k]);
  57. k++;
  58. }
  59. if(retval != UA_STATUSCODE_GOOD) {
  60. response->responseHeader.serviceResult = retval;
  61. UA_Array_delete(response->endpoints, --k, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
  62. return;
  63. }
  64. response->endpointsSize = relevant_count;
  65. }