ua_subscription_manager.c 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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_Int32_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_Int32_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 *SubscriptionManager_getSubscriptionByID(UA_SubscriptionManager *manager,
  32. UA_Int32 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_Int32 SubscriptionManager_deleteMonitoredItem(UA_SubscriptionManager *manager, UA_Int32 subscriptionID,
  41. UA_UInt32 monitoredItemID) {
  42. UA_Subscription *sub = SubscriptionManager_getSubscriptionByID(manager, subscriptionID);
  43. if(!sub)
  44. return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
  45. UA_MonitoredItem *mon, *tmp_mon;
  46. LIST_FOREACH_SAFE(mon, &sub->MonitoredItems, listEntry, tmp_mon) {
  47. if (mon->itemId == monitoredItemID) {
  48. LIST_REMOVE(mon, listEntry);
  49. MonitoredItem_delete(mon);
  50. return UA_STATUSCODE_GOOD;
  51. }
  52. }
  53. return UA_STATUSCODE_BADMONITOREDITEMIDINVALID;
  54. }
  55. UA_Int32 SubscriptionManager_deleteSubscription(UA_Server *server, UA_SubscriptionManager *manager, UA_Int32 subscriptionID) {
  56. UA_Subscription *sub = SubscriptionManager_getSubscriptionByID(manager, subscriptionID);
  57. if(!sub)
  58. return UA_STATUSCODE_BADSUBSCRIPTIONIDINVALID;
  59. LIST_REMOVE(sub, listEntry);
  60. UA_Subscription_deleteMembers(sub, server);
  61. UA_free(sub);
  62. return UA_STATUSCODE_GOOD;
  63. }
  64. UA_UInt32 SubscriptionManager_getUniqueUIntID(UA_SubscriptionManager *manager) {
  65. UA_UInt32 id = ++(manager->lastSessionID);
  66. return id;
  67. }
  68. UA_Guid SubscriptionManager_getUniqueGUID(UA_SubscriptionManager *manager) {
  69. UA_Guid id;
  70. unsigned long *incremental = (unsigned long *) &manager->lastJobGuid.data4[0];
  71. incremental++;
  72. UA_Guid_copy(&(manager->lastJobGuid), &id);
  73. return id;
  74. }