ua_subscription_manager.c 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "ua_types.h"
  2. #include "ua_server_internal.h"
  3. #include "ua_nodestore.h"
  4. #include "ua_subscription_manager.h"
  5. void SubscriptionManager_init(UA_Session *session) {
  6. UA_SubscriptionManager *manager = &(session->subscriptionManager);
  7. /* FIXME: These init values are empirical. Maybe they should be part
  8. * of the server config? */
  9. manager->globalPublishingInterval = (UA_UInt32_BoundedValue) { .maxValue = 10000, .minValue = 0, .currentValue=0 };
  10. manager->globalLifeTimeCount = (UA_UInt32_BoundedValue) { .maxValue = 15000, .minValue = 0, .currentValue=0 };
  11. manager->globalKeepAliveCount = (UA_UInt32_BoundedValue) { .maxValue = 100, .minValue = 0, .currentValue=0 };
  12. manager->globalNotificationsPerPublish = (UA_UInt32_BoundedValue) { .maxValue = 1000, .minValue = 1, .currentValue=0 };
  13. manager->globalSamplingInterval = (UA_UInt32_BoundedValue) { .maxValue = 1000, .minValue = 5, .currentValue=0 };
  14. manager->globalQueueSize = (UA_UInt32_BoundedValue) { .maxValue = 100, .minValue = 0, .currentValue=0 };
  15. LIST_INIT(&manager->serverSubscriptions);
  16. manager->lastSessionID = (UA_UInt32) UA_DateTime_now();
  17. manager->lastJobGuid = UA_Guid_random();
  18. }
  19. void SubscriptionManager_deleteMembers(UA_Session *session, UA_Server *server) {
  20. UA_SubscriptionManager *manager = &session->subscriptionManager;
  21. UA_Subscription *current, *temp;
  22. LIST_FOREACH_SAFE(current, &manager->serverSubscriptions, listEntry, temp) {
  23. LIST_REMOVE(current, listEntry);
  24. UA_Subscription_deleteMembers(current, server);
  25. UA_free(current);
  26. }
  27. }
  28. void SubscriptionManager_addSubscription(UA_SubscriptionManager *manager, UA_Subscription *newSubscription) {
  29. LIST_INSERT_HEAD(&manager->serverSubscriptions, newSubscription, listEntry);
  30. }
  31. UA_Subscription *
  32. SubscriptionManager_getSubscriptionByID(UA_SubscriptionManager *manager, UA_UInt32 subscriptionID) {
  33. UA_Subscription *sub;
  34. LIST_FOREACH(sub, &manager->serverSubscriptions, listEntry) {
  35. if(sub->subscriptionID == subscriptionID)
  36. break;
  37. }
  38. return sub;
  39. }
  40. UA_StatusCode
  41. SubscriptionManager_deleteMonitoredItem(UA_SubscriptionManager *manager, UA_UInt32 subscriptionID,
  42. UA_UInt32 monitoredItemID) {
  43. UA_Subscription *sub = SubscriptionManager_getSubscriptionByID(manager, subscriptionID);
  44. if(!sub)
  45. return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
  46. UA_MonitoredItem *mon, *tmp_mon;
  47. LIST_FOREACH_SAFE(mon, &sub->MonitoredItems, listEntry, tmp_mon) {
  48. if(mon->itemId == monitoredItemID) {
  49. LIST_REMOVE(mon, listEntry);
  50. MonitoredItem_delete(mon);
  51. return UA_STATUSCODE_GOOD;
  52. }
  53. }
  54. return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
  55. }
  56. UA_StatusCode
  57. SubscriptionManager_deleteSubscription(UA_Server *server, UA_SubscriptionManager *manager,
  58. UA_UInt32 subscriptionID) {
  59. UA_Subscription *sub = SubscriptionManager_getSubscriptionByID(manager, subscriptionID);
  60. if(!sub)
  61. return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
  62. LIST_REMOVE(sub, listEntry);
  63. UA_Subscription_deleteMembers(sub, server);
  64. UA_free(sub);
  65. return UA_STATUSCODE_GOOD;
  66. }
  67. UA_UInt32 SubscriptionManager_getUniqueUIntID(UA_SubscriptionManager *manager) {
  68. UA_UInt32 id = ++(manager->lastSessionID);
  69. return id;
  70. }
  71. UA_Guid SubscriptionManager_getUniqueGUID(UA_SubscriptionManager *manager) {
  72. UA_Guid id;
  73. unsigned long *incremental = (unsigned long *) &manager->lastJobGuid.data4[0];
  74. incremental++;
  75. UA_Guid_copy(&(manager->lastJobGuid), &id);
  76. return id;
  77. }