blob: 2136a75cb2356f4e9d1fb14bbc46562ef81df1ef [file] [log] [blame]
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 2017 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
* Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
* Copyright 2017 (c) Stefan Profanter, fortiss GmbH
*/
#include "ua_client_internal.h"
UA_StatusCode
UA_Client_getEndpoints(UA_Client *client, const char *serverUrl,
size_t* endpointDescriptionsSize,
UA_EndpointDescription** endpointDescriptions) {
UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
/* Client is already connected to a different server */
if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl,
client->config.endpoint.endpointUrl.length) != 0) {
return UA_STATUSCODE_BADINVALIDARGUMENT;
}
UA_StatusCode retval;
const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl);
if(!connected) {
retval = UA_Client_connectTCPSecureChannel(client, url);
if(retval != UA_STATUSCODE_GOOD)
return retval;
}
retval = UA_Client_getEndpointsInternal(client, url, endpointDescriptionsSize,
endpointDescriptions);
if(!connected)
UA_Client_disconnect(client);
return retval;
}
UA_StatusCode
UA_Client_findServers(UA_Client *client, const char *serverUrl,
size_t serverUrisSize, UA_String *serverUris,
size_t localeIdsSize, UA_String *localeIds,
size_t *registeredServersSize,
UA_ApplicationDescription **registeredServers) {
UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
/* Client is already connected to a different server */
if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl,
client->config.endpoint.endpointUrl.length) != 0) {
return UA_STATUSCODE_BADINVALIDARGUMENT;
}
UA_StatusCode retval;
const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl);
if(!connected) {
retval = UA_Client_connectTCPSecureChannel(client, url);
if(retval != UA_STATUSCODE_GOOD)
return retval;
}
/* Prepare the request */
UA_FindServersRequest request;
UA_FindServersRequest_init(&request);
request.serverUrisSize = serverUrisSize;
request.serverUris = serverUris;
request.localeIdsSize = localeIdsSize;
request.localeIds = localeIds;
/* Send the request */
UA_FindServersResponse response;
__UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST],
&response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]);
/* Process the response */
retval = response.responseHeader.serviceResult;
if(retval == UA_STATUSCODE_GOOD) {
*registeredServersSize = response.serversSize;
*registeredServers = response.servers;
response.serversSize = 0;
response.servers = NULL;
} else {
*registeredServersSize = 0;
*registeredServers = NULL;
}
/* Clean up */
UA_FindServersResponse_deleteMembers(&response);
if(!connected)
UA_Client_disconnect(client);
return retval;
}
#ifdef UA_ENABLE_DISCOVERY
UA_StatusCode
UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl,
UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn,
size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) {
UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
/* Client is already connected to a different server */
if(connected && strncmp((const char*)client->config.endpoint.endpointUrl.data, serverUrl,
client->config.endpoint.endpointUrl.length) != 0) {
return UA_STATUSCODE_BADINVALIDARGUMENT;
}
UA_StatusCode retval;
const UA_String url = UA_STRING((char*)(uintptr_t)serverUrl);
if(!connected) {
retval = UA_Client_connectTCPSecureChannel(client, url);
if(retval != UA_STATUSCODE_GOOD)
return retval;
}
/* Prepare the request */
UA_FindServersOnNetworkRequest request;
UA_FindServersOnNetworkRequest_init(&request);
request.startingRecordId = startingRecordId;
request.maxRecordsToReturn = maxRecordsToReturn;
request.serverCapabilityFilterSize = serverCapabilityFilterSize;
request.serverCapabilityFilter = serverCapabilityFilter;
/* Send the request */
UA_FindServersOnNetworkResponse response;
__UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST],
&response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]);
/* Process the response */
retval = response.responseHeader.serviceResult;
if(retval == UA_STATUSCODE_GOOD) {
*serverOnNetworkSize = response.serversSize;
*serverOnNetwork = response.servers;
response.serversSize = 0;
response.servers = NULL;
} else {
*serverOnNetworkSize = 0;
*serverOnNetwork = NULL;
}
/* Clean up */
UA_FindServersOnNetworkResponse_deleteMembers(&response);
if(!connected)
UA_Client_disconnect(client);
return retval;
}
#endif