123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- #include "ua_server_internal.h"
- #include "ua_services.h"
- #include "ua_util.h"
- void Service_FindServers(UA_Server *server, UA_Session *session,
- const UA_FindServersRequest *request, UA_FindServersResponse *response) {
- response->servers = UA_malloc(sizeof(UA_ApplicationDescription));
- if(!response->servers) {
- response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
- return;
- }
- if(UA_ApplicationDescription_copy(&server->description, response->servers) != UA_STATUSCODE_GOOD) {
- UA_free(response->servers);
- response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
- return;
- }
- response->serversSize = 1;
- }
- void Service_GetEndpoints(UA_Server *server, UA_Session *session,
- const UA_GetEndpointsRequest *request, UA_GetEndpointsResponse *response) {
- /* test if the supported binary profile shall be returned */
- #ifdef NO_ALLOCA
- UA_Boolean relevant_endpoints[server->endpointDescriptionsSize];
- #else
- UA_Boolean *relevant_endpoints = UA_alloca(sizeof(UA_Boolean)*server->endpointDescriptionsSize);
- #endif /*NO_ALLOCA */
- size_t relevant_count = 0;
- for(size_t j = 0; j < server->endpointDescriptionsSize; j++) {
- relevant_endpoints[j] = UA_FALSE;
- if(request->profileUrisSize <= 0) {
- relevant_endpoints[j] = UA_TRUE;
- relevant_count++;
- continue;
- }
- for(size_t i = 0; i < request->profileUrisSize; i++) {
- if(UA_String_equal(&request->profileUris[i], &server->endpointDescriptions->transportProfileUri)) {
- relevant_endpoints[j] = UA_TRUE;
- relevant_count++;
- break;
- }
- }
- }
- if(relevant_count == 0) {
- response->endpointsSize = 0;
- return;
- }
- response->endpoints = UA_malloc(sizeof(UA_EndpointDescription) * relevant_count);
- if(!response->endpoints) {
- response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
- return;
- }
- size_t k = 0;
- UA_StatusCode retval = UA_STATUSCODE_GOOD;
- for(size_t j = 0; j < server->endpointDescriptionsSize && retval == UA_STATUSCODE_GOOD; j++) {
- if(relevant_endpoints[j] != UA_TRUE)
- continue;
- retval = UA_EndpointDescription_copy(&server->endpointDescriptions[j], &response->endpoints[k]);
- k++;
- }
- if(retval != UA_STATUSCODE_GOOD) {
- response->responseHeader.serviceResult = retval;
- UA_Array_delete(response->endpoints, --k, &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
- return;
- }
- response->endpointsSize = relevant_count;
- }
|