ua_client_discovery.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include "ua_client.h"
  5. #include "ua_client_internal.h"
  6. UA_StatusCode
  7. UA_Client_getEndpoints(UA_Client *client, const char *serverUrl,
  8. size_t* endpointDescriptionsSize,
  9. UA_EndpointDescription** endpointDescriptions) {
  10. UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
  11. /* Client is already connected to a different server */
  12. if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl,
  13. client->endpointUrl.length) != 0) {
  14. return UA_STATUSCODE_BADINVALIDARGUMENT;
  15. }
  16. UA_StatusCode retval;
  17. if(!connected) {
  18. retval = UA_Client_connectInternal(client, serverUrl, UA_FALSE, UA_FALSE);
  19. if(retval != UA_STATUSCODE_GOOD)
  20. return retval;
  21. }
  22. retval = UA_Client_getEndpointsInternal(client, endpointDescriptionsSize, endpointDescriptions);
  23. if(!connected)
  24. UA_Client_disconnect(client);
  25. return retval;
  26. }
  27. UA_StatusCode
  28. UA_Client_findServers(UA_Client *client, const char *serverUrl,
  29. size_t serverUrisSize, UA_String *serverUris,
  30. size_t localeIdsSize, UA_String *localeIds,
  31. size_t *registeredServersSize,
  32. UA_ApplicationDescription **registeredServers) {
  33. UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
  34. /* Client is already connected to a different server */
  35. if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl,
  36. client->endpointUrl.length) != 0) {
  37. return UA_STATUSCODE_BADINVALIDARGUMENT;
  38. }
  39. if(!connected) {
  40. UA_StatusCode retval = UA_Client_connectInternal(client, serverUrl, UA_TRUE, UA_FALSE);
  41. if(retval != UA_STATUSCODE_GOOD)
  42. return retval;
  43. }
  44. /* Prepare the request */
  45. UA_FindServersRequest request;
  46. UA_FindServersRequest_init(&request);
  47. request.serverUrisSize = serverUrisSize;
  48. request.serverUris = serverUris;
  49. request.localeIdsSize = localeIdsSize;
  50. request.localeIds = localeIds;
  51. /* Send the request */
  52. UA_FindServersResponse response;
  53. UA_FindServersResponse_init(&response);
  54. __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST],
  55. &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]);
  56. /* Process the response */
  57. UA_StatusCode retval = response.responseHeader.serviceResult;
  58. if(retval == UA_STATUSCODE_GOOD) {
  59. *registeredServersSize = response.serversSize;
  60. *registeredServers = response.servers;
  61. response.serversSize = 0;
  62. response.servers = NULL;
  63. } else {
  64. *registeredServersSize = 0;
  65. *registeredServers = NULL;
  66. }
  67. /* Clean up */
  68. UA_FindServersResponse_deleteMembers(&response);
  69. if(!connected)
  70. UA_Client_disconnect(client);
  71. return retval;
  72. }
  73. UA_StatusCode
  74. UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl,
  75. UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn,
  76. size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
  77. size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) {
  78. UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
  79. /* Client is already connected to a different server */
  80. if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl,
  81. client->endpointUrl.length) != 0) {
  82. return UA_STATUSCODE_BADINVALIDARGUMENT;
  83. }
  84. if(!connected) {
  85. UA_StatusCode retval = UA_Client_connectInternal(client, serverUrl, UA_TRUE, UA_FALSE);
  86. if(retval != UA_STATUSCODE_GOOD)
  87. return retval;
  88. }
  89. /* Prepare the request */
  90. UA_FindServersOnNetworkRequest request;
  91. UA_FindServersOnNetworkRequest_init(&request);
  92. request.startingRecordId = startingRecordId;
  93. request.maxRecordsToReturn = maxRecordsToReturn;
  94. request.serverCapabilityFilterSize = serverCapabilityFilterSize;
  95. request.serverCapabilityFilter = serverCapabilityFilter;
  96. /* Send the request */
  97. UA_FindServersOnNetworkResponse response;
  98. UA_FindServersOnNetworkResponse_init(&response);
  99. __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST],
  100. &response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]);
  101. /* Process the response */
  102. UA_StatusCode retval = response.responseHeader.serviceResult;
  103. if(retval == UA_STATUSCODE_GOOD) {
  104. *serverOnNetworkSize = response.serversSize;
  105. *serverOnNetwork = response.servers;
  106. response.serversSize = 0;
  107. response.servers = NULL;
  108. } else {
  109. *serverOnNetworkSize = 0;
  110. *serverOnNetwork = NULL;
  111. }
  112. /* Clean up */
  113. UA_FindServersOnNetworkResponse_deleteMembers(&response);
  114. if(!connected)
  115. UA_Client_disconnect(client);
  116. return retval;
  117. }