ua_client_discovery.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. if(client->state == UA_CLIENTSTATE_CONNECTED &&
  11. strncmp((const char*)client->endpointUrl.data, serverUrl, client->endpointUrl.length) != 0) {
  12. // client is already connected but to a different endpoint url.
  13. return UA_STATUSCODE_BADINVALIDARGUMENT;
  14. }
  15. UA_StatusCode retval = __UA_Client_connect(client, serverUrl, UA_FALSE, UA_FALSE);
  16. if(retval == UA_STATUSCODE_GOOD)
  17. retval = __UA_Client_getEndpoints(client, endpointDescriptionsSize, endpointDescriptions);
  18. UA_Client_disconnect(client);
  19. UA_Client_reset(client);
  20. return retval;
  21. }
  22. UA_StatusCode
  23. UA_Client_findServers(UA_Client *client, const char *serverUrl,
  24. size_t serverUrisSize, UA_String *serverUris,
  25. size_t localeIdsSize, UA_String *localeIds,
  26. size_t *registeredServersSize,
  27. UA_ApplicationDescription **registeredServers) {
  28. /* Client is already connected but to a different endpoint url */
  29. if(client->state == UA_CLIENTSTATE_CONNECTED &&
  30. strncmp((const char*)client->endpointUrl.data, serverUrl, client->endpointUrl.length) != 0)
  31. return UA_STATUSCODE_BADINVALIDARGUMENT;
  32. UA_StatusCode retval = __UA_Client_connect(client, serverUrl, UA_TRUE, UA_FALSE);
  33. if(retval != UA_STATUSCODE_GOOD) {
  34. UA_Client_disconnect(client);
  35. UA_Client_reset(client);
  36. return retval;
  37. }
  38. /* Prepare the request */
  39. UA_FindServersRequest request;
  40. UA_FindServersRequest_init(&request);
  41. request.serverUrisSize = serverUrisSize;
  42. request.serverUris = serverUris;
  43. request.localeIdsSize = localeIdsSize;
  44. request.localeIds = localeIds;
  45. /* Send the request */
  46. UA_FindServersResponse response;
  47. UA_FindServersResponse_init(&response);
  48. __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST],
  49. &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]);
  50. /* Process the response */
  51. retval = response.responseHeader.serviceResult;
  52. if(retval == UA_STATUSCODE_GOOD) {
  53. *registeredServersSize = response.serversSize;
  54. *registeredServers = response.servers;
  55. response.serversSize = 0;
  56. response.servers = NULL;
  57. } else {
  58. *registeredServersSize = 0;
  59. *registeredServers = NULL;
  60. }
  61. /* Clean up */
  62. UA_FindServersResponse_deleteMembers(&response);
  63. UA_Client_disconnect(client);
  64. UA_Client_reset(client);
  65. return retval;
  66. }
  67. UA_StatusCode
  68. UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl,
  69. UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn,
  70. size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
  71. size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) {
  72. /* Client is already connected but to a different endpoint url */
  73. if(client->state == UA_CLIENTSTATE_CONNECTED &&
  74. strncmp((const char*)client->endpointUrl.data, serverUrl, client->endpointUrl.length) != 0)
  75. return UA_STATUSCODE_BADINVALIDARGUMENT;
  76. UA_StatusCode retval = __UA_Client_connect(client, serverUrl, UA_TRUE, UA_FALSE);
  77. if(retval != UA_STATUSCODE_GOOD) {
  78. UA_Client_disconnect(client);
  79. UA_Client_reset(client);
  80. return retval;
  81. }
  82. /* Prepare the request */
  83. UA_FindServersOnNetworkRequest request;
  84. UA_FindServersOnNetworkRequest_init(&request);
  85. request.startingRecordId = startingRecordId;
  86. request.maxRecordsToReturn = maxRecordsToReturn;
  87. request.serverCapabilityFilterSize = serverCapabilityFilterSize;
  88. request.serverCapabilityFilter = serverCapabilityFilter;
  89. /* Send the request */
  90. UA_FindServersOnNetworkResponse response;
  91. UA_FindServersOnNetworkResponse_init(&response);
  92. __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST],
  93. &response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]);
  94. /* Process the response */
  95. retval = response.responseHeader.serviceResult;
  96. if(retval == UA_STATUSCODE_GOOD) {
  97. *serverOnNetworkSize = response.serversSize;
  98. *serverOnNetwork = response.servers;
  99. response.serversSize = 0;
  100. response.servers = NULL;
  101. } else {
  102. *serverOnNetworkSize = 0;
  103. *serverOnNetwork = NULL;
  104. }
  105. /* Clean up */
  106. UA_FindServersOnNetworkResponse_deleteMembers(&response);
  107. UA_Client_disconnect(client);
  108. UA_Client_reset(client);
  109. return retval;
  110. }