ua_session.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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_session.h"
  5. #include "ua_types_generated_handling.h"
  6. #include "ua_util.h"
  7. #ifdef UA_ENABLE_SUBSCRIPTIONS
  8. #include "server/ua_subscription.h"
  9. #endif
  10. UA_Session adminSession = {
  11. .clientDescription = {.applicationUri = {0, NULL}, .productUri = {0, NULL},
  12. .applicationName = {.locale = {0, NULL}, .text = {0, NULL}},
  13. .applicationType = UA_APPLICATIONTYPE_CLIENT,
  14. .gatewayServerUri = {0, NULL}, .discoveryProfileUri = {0, NULL},
  15. .discoveryUrlsSize = 0, .discoveryUrls = NULL},
  16. .sessionName = {sizeof("Administrator Session")-1, (UA_Byte*)"Administrator Session"},
  17. .authenticationToken = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
  18. .identifier.numeric = 1},
  19. .sessionId = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC, .identifier.numeric = 1},
  20. .maxRequestMessageSize = UA_UINT32_MAX, .maxResponseMessageSize = UA_UINT32_MAX,
  21. .timeout = (UA_Double)UA_INT64_MAX, .validTill = UA_INT64_MAX, .channel = NULL,
  22. .continuationPoints = {NULL}};
  23. void UA_Session_init(UA_Session *session) {
  24. UA_ApplicationDescription_init(&session->clientDescription);
  25. session->activated = false;
  26. UA_NodeId_init(&session->authenticationToken);
  27. UA_NodeId_init(&session->sessionId);
  28. UA_String_init(&session->sessionName);
  29. session->maxRequestMessageSize = 0;
  30. session->maxResponseMessageSize = 0;
  31. session->timeout = 0;
  32. UA_DateTime_init(&session->validTill);
  33. session->channel = NULL;
  34. session->availableContinuationPoints = UA_MAXCONTINUATIONPOINTS;
  35. LIST_INIT(&session->continuationPoints);
  36. #ifdef UA_ENABLE_SUBSCRIPTIONS
  37. LIST_INIT(&session->serverSubscriptions);
  38. session->lastSubscriptionID = 0;
  39. SIMPLEQ_INIT(&session->responseQueue);
  40. #endif
  41. }
  42. void UA_Session_deleteMembersCleanup(UA_Session *session, UA_Server* server) {
  43. UA_ApplicationDescription_deleteMembers(&session->clientDescription);
  44. UA_NodeId_deleteMembers(&session->authenticationToken);
  45. UA_NodeId_deleteMembers(&session->sessionId);
  46. UA_String_deleteMembers(&session->sessionName);
  47. struct ContinuationPointEntry *cp, *temp;
  48. LIST_FOREACH_SAFE(cp, &session->continuationPoints, pointers, temp) {
  49. LIST_REMOVE(cp, pointers);
  50. UA_ByteString_deleteMembers(&cp->identifier);
  51. UA_BrowseDescription_deleteMembers(&cp->browseDescription);
  52. UA_free(cp);
  53. }
  54. if(session->channel)
  55. UA_SecureChannel_detachSession(session->channel, session);
  56. #ifdef UA_ENABLE_SUBSCRIPTIONS
  57. UA_Subscription *currents, *temps;
  58. LIST_FOREACH_SAFE(currents, &session->serverSubscriptions, listEntry, temps) {
  59. LIST_REMOVE(currents, listEntry);
  60. UA_Subscription_deleteMembers(currents, server);
  61. UA_free(currents);
  62. }
  63. UA_PublishResponseEntry *entry;
  64. while((entry = SIMPLEQ_FIRST(&session->responseQueue))) {
  65. SIMPLEQ_REMOVE_HEAD(&session->responseQueue, listEntry);
  66. UA_PublishResponse_deleteMembers(&entry->response);
  67. UA_free(entry);
  68. }
  69. #endif
  70. }
  71. void UA_Session_updateLifetime(UA_Session *session) {
  72. session->validTill = UA_DateTime_nowMonotonic() +
  73. (UA_DateTime)(session->timeout * UA_MSEC_TO_DATETIME);
  74. }
  75. #ifdef UA_ENABLE_SUBSCRIPTIONS
  76. void UA_Session_addSubscription(UA_Session *session, UA_Subscription *newSubscription) {
  77. LIST_INSERT_HEAD(&session->serverSubscriptions, newSubscription, listEntry);
  78. }
  79. UA_StatusCode
  80. UA_Session_deleteSubscription(UA_Server *server, UA_Session *session,
  81. UA_UInt32 subscriptionID) {
  82. UA_Subscription *sub = UA_Session_getSubscriptionByID(session, subscriptionID);
  83. if(!sub)
  84. return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
  85. LIST_REMOVE(sub, listEntry);
  86. UA_Subscription_deleteMembers(sub, server);
  87. UA_free(sub);
  88. return UA_STATUSCODE_GOOD;
  89. }
  90. UA_Subscription *
  91. UA_Session_getSubscriptionByID(UA_Session *session, UA_UInt32 subscriptionID) {
  92. UA_Subscription *sub;
  93. LIST_FOREACH(sub, &session->serverSubscriptions, listEntry) {
  94. if(sub->subscriptionID == subscriptionID)
  95. break;
  96. }
  97. return sub;
  98. }
  99. UA_UInt32 UA_Session_getUniqueSubscriptionID(UA_Session *session) {
  100. return ++(session->lastSubscriptionID);
  101. }
  102. #endif