subscription_manager.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #ifndef __SUBSCRIPTION_MANAGER_H
  2. #define __SUBSCRIPTION_MANAGER_H
  3. #include <cds/sstr.h>
  4. #include "time_event_manager.h"
  5. #include "../../modules/tm/dlg.h"
  6. #include "trace.h"
  7. struct _subscription_data_t;
  8. typedef enum {
  9. auth_rejected,
  10. auth_polite_block,
  11. auth_unresolved,
  12. auth_granted
  13. } authorization_result_t;
  14. typedef int(*send_notify_func)(struct _subscription_data_t *s);
  15. typedef int(*terminate_func)(struct _subscription_data_t *s);
  16. typedef authorization_result_t (*subscription_authorize_func)(struct _subscription_data_t *s);
  17. typedef enum {
  18. subscription_uninitialized,
  19. subscription_active,
  20. subscription_pending,
  21. subscription_terminated,
  22. subscription_terminated_to, /* terminated timeout */
  23. subscription_terminated_pending, /* terminated pending subscription */
  24. subscription_terminated_pending_to /* terminated pending subscription (timeout) */
  25. } subscription_status_t;
  26. typedef struct _subscription_data_t {
  27. /** data for timer events */
  28. time_event_data_t expiration;
  29. /** SIP dialog structure */
  30. dlg_t *dialog;
  31. /** whatever user data */
  32. void *usr_data;
  33. /** the status of this subscription */
  34. subscription_status_t status;
  35. /** linking element */
  36. struct _subscription_data_t *next;
  37. /** linking element */
  38. struct _subscription_data_t *prev;
  39. /** contact for re-subscribe and responses */
  40. str_t contact;
  41. /** subscription destination identifier */
  42. str_t record_id;
  43. /** event package */
  44. str_t package;
  45. /** subscriber's uri (due to authorization) */
  46. str_t subscriber;
  47. } subscription_data_t;
  48. typedef struct {
  49. subscription_data_t *first;
  50. subscription_data_t *last;
  51. /** callback function for notify message sending */
  52. send_notify_func notify;
  53. /** callback function for subscription terminating (timeout) */
  54. terminate_func terminate;
  55. /** callback function for authorization */
  56. subscription_authorize_func authorize;
  57. /** mutex given from caller (common for timer and subscription structures) */
  58. gen_lock_t *mutex;
  59. /** its own time event manager */
  60. time_event_manager_t timer;
  61. int default_expiration;
  62. int min_expiration;
  63. int max_expiration;
  64. } subscription_manager_t;
  65. /** initialization for all subscription managers - MUST be called */
  66. int subscription_management_init(void);
  67. /** create a new subscription manager */
  68. subscription_manager_t *sm_create(send_notify_func notify,
  69. terminate_func terminate,
  70. subscription_authorize_func authorize,
  71. gen_lock_t *mutex,
  72. int min_exp,
  73. int max_exp,
  74. int default_exp,
  75. int expiration_timer_period);
  76. /** initialize a new subscription manager */
  77. int sm_init(subscription_manager_t *sm,
  78. send_notify_func notify,
  79. terminate_func terminate,
  80. subscription_authorize_func authorize,
  81. gen_lock_t *mutex,
  82. int min_exp,
  83. int max_exp,
  84. int default_exp,
  85. int expiration_timer_period);
  86. /** initializes internal data members SIP dialog and status
  87. * and intializes expiration timer */
  88. int sm_init_subscription_nolock(subscription_manager_t *mng,
  89. subscription_data_t *dst,
  90. struct sip_msg *m);
  91. /** refreshes expiration timer and SIP dialog for given subscription
  92. * from given message */
  93. int sm_refresh_subscription_nolock(subscription_manager_t *mng,
  94. subscription_data_t *s,
  95. struct sip_msg *m);
  96. /** releases timer and removes subscription from subscription
  97. * manager, but it doesn't free the occupied memory !*/
  98. void sm_release_subscription_nolock(subscription_manager_t *mng,
  99. subscription_data_t *dst);
  100. /** adds some response lumps into message */
  101. int sm_prepare_subscription_response(subscription_manager_t *mng,
  102. subscription_data_t *s,
  103. struct sip_msg *m);
  104. /** finds subscription according to dialog id */
  105. int sm_find_subscription(subscription_manager_t *mng,
  106. str_t *from_tag, str_t *to_tag, str_t *call_id,
  107. subscription_data_t **dst);
  108. /** returns 0 if the subscriptions is in one of terminated states */
  109. int sm_subscription_terminated(subscription_data_t *s);
  110. /** returns 0 if the subscriptions is in one of pending states */
  111. int sm_subscription_pending(subscription_data_t *s);
  112. /** returns the count of seconds remaining to subscription expiration */
  113. int sm_subscription_expires_in(subscription_manager_t *mng,
  114. subscription_data_t *s);
  115. int sm_init_subscription_nolock_ex(subscription_manager_t *mng,
  116. subscription_data_t *dst,
  117. dlg_t *dialog,
  118. subscription_status_t status,
  119. const str_t *contact,
  120. const str_t *record_id,
  121. const str_t *package,
  122. const str_t *subscriber,
  123. int expires_after,
  124. void *subscription_data);
  125. #endif