ua_services_discovery.c 2.5 KB

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