ua_client_discovery.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSREQUEST],
  54. &response, &UA_TYPES[UA_TYPES_FINDSERVERSRESPONSE]);
  55. /* Process the response */
  56. UA_StatusCode retval = response.responseHeader.serviceResult;
  57. if(retval == UA_STATUSCODE_GOOD) {
  58. *registeredServersSize = response.serversSize;
  59. *registeredServers = response.servers;
  60. response.serversSize = 0;
  61. response.servers = NULL;
  62. } else {
  63. *registeredServersSize = 0;
  64. *registeredServers = NULL;
  65. }
  66. /* Clean up */
  67. UA_FindServersResponse_deleteMembers(&response);
  68. if(!connected)
  69. UA_Client_disconnect(client);
  70. return retval;
  71. }
  72. UA_StatusCode
  73. UA_Client_findServersOnNetwork(UA_Client *client, const char *serverUrl,
  74. UA_UInt32 startingRecordId, UA_UInt32 maxRecordsToReturn,
  75. size_t serverCapabilityFilterSize, UA_String *serverCapabilityFilter,
  76. size_t *serverOnNetworkSize, UA_ServerOnNetwork **serverOnNetwork) {
  77. UA_Boolean connected = (client->state > UA_CLIENTSTATE_DISCONNECTED);
  78. /* Client is already connected to a different server */
  79. if(connected && strncmp((const char*)client->endpointUrl.data, serverUrl,
  80. client->endpointUrl.length) != 0) {
  81. return UA_STATUSCODE_BADINVALIDARGUMENT;
  82. }
  83. if(!connected) {
  84. UA_StatusCode retval = UA_Client_connectInternal(client, serverUrl, UA_TRUE, UA_FALSE);
  85. if(retval != UA_STATUSCODE_GOOD)
  86. return retval;
  87. }
  88. /* Prepare the request */
  89. UA_FindServersOnNetworkRequest request;
  90. UA_FindServersOnNetworkRequest_init(&request);
  91. request.startingRecordId = startingRecordId;
  92. request.maxRecordsToReturn = maxRecordsToReturn;
  93. request.serverCapabilityFilterSize = serverCapabilityFilterSize;
  94. request.serverCapabilityFilter = serverCapabilityFilter;
  95. /* Send the request */
  96. UA_FindServersOnNetworkResponse response;
  97. __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKREQUEST],
  98. &response, &UA_TYPES[UA_TYPES_FINDSERVERSONNETWORKRESPONSE]);
  99. /* Process the response */
  100. UA_StatusCode retval = response.responseHeader.serviceResult;
  101. if(retval == UA_STATUSCODE_GOOD) {
  102. *serverOnNetworkSize = response.serversSize;
  103. *serverOnNetwork = response.servers;
  104. response.serversSize = 0;
  105. response.servers = NULL;
  106. } else {
  107. *serverOnNetworkSize = 0;
  108. *serverOnNetwork = NULL;
  109. }
  110. /* Clean up */
  111. UA_FindServersOnNetworkResponse_deleteMembers(&response);
  112. if(!connected)
  113. UA_Client_disconnect(client);
  114. return retval;
  115. }