rl_subscription.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #ifndef __RL_SUBSCRIPTION_H
  2. #define __RL_SUBSCRIPTION_H
  3. #include "../../modules/tm/dlg.h"
  4. #include "../../lock_ops.h"
  5. #include "subscription_manager.h"
  6. #include <xcap/resource_lists_parser.h>
  7. #include <cds/vector.h>
  8. #include <cds/ptr_vector.h>
  9. #include <cds/sstr.h>
  10. #include <presence/subscriber.h>
  11. #include <presence/notifier.h>
  12. #include <xcap/resource_list.h>
  13. #include "trace.h"
  14. /* type for generated database ID */
  15. typedef char db_id_t[48];
  16. typedef enum {
  17. rls_auth_none,
  18. rls_auth_implicit,
  19. rls_auth_xcap
  20. } rls_authorization_type_t;
  21. typedef struct {
  22. rls_authorization_type_t type;
  23. } rls_auth_params_t;
  24. struct _virtual_subscription_t;
  25. struct _rl_subscription_t;
  26. typedef struct _rl_subscription_t rl_subscription_t;
  27. typedef struct {
  28. str name;
  29. str lang;
  30. } vs_display_name_t;
  31. typedef struct _virtual_subscription_t {
  32. /* helper to reduce memory allocations */
  33. qsa_subscription_data_t local_subscription_pres_data;
  34. /* local subscription data */
  35. qsa_subscription_t *local_subscription_pres;
  36. rl_subscription_t *local_subscription_list;
  37. vector_t display_names;
  38. rl_subscription_t *subscription;
  39. int changed;
  40. /** whole document describing the state of this resource */
  41. str state_document;
  42. /** type of this state_document */
  43. str content_type;
  44. /** status of this subscription */
  45. subscription_status_t status;
  46. /* VS identifier */
  47. str uri;
  48. struct _virtual_subscription_t *next;
  49. struct _virtual_subscription_t *prev;
  50. /* generated id for database */
  51. db_id_t dbid;
  52. char uri_str[1];
  53. } virtual_subscription_t;
  54. typedef enum {
  55. rls_internal_subscription,
  56. rls_external_subscription
  57. } rls_subscription_type_t;
  58. typedef struct {
  59. str *package; /* points to "parent" subscription */
  60. str *record_id; /* NEVER free this - it points into VS data */
  61. str *subscriber_id; /* NEVER free this - it points into "parent" subscription */
  62. /* created from this virtual subscription */
  63. virtual_subscription_t *vs;
  64. } internal_subscription_data_t;
  65. /** subscription to the list of resources */
  66. struct _rl_subscription_t {
  67. rls_subscription_type_t type;
  68. /* XCAP server settings (needed for reloading internal subscriptions
  69. * from DB, XCAP notifications, ...) */
  70. xcap_query_params_t xcap_params;
  71. union {
  72. /* data of external subscription */
  73. subscription_data_t external;
  74. /* data of internal subscription (pointer to "parent"
  75. * virtual subscription) */
  76. internal_subscription_data_t internal;
  77. } u;
  78. /** sequence number of NOTIFY */
  79. int doc_version;
  80. /** the count of changed virtual subscriptions
  81. * (enough changes ?= send notify) */
  82. int changed;
  83. /* virtual subscriptions for this rls */
  84. ptr_vector_t vs;
  85. /* uid of the watcher */
  86. str from_uid;
  87. /* generated id for database */
  88. db_id_t dbid;
  89. };
  90. str_t * rls_get_package(rl_subscription_t *s);
  91. str_t * rls_get_uri(rl_subscription_t *s);
  92. str_t * rls_get_subscriber(rl_subscription_t *subscription);
  93. /********* resource list subscription functions ********/
  94. int rls_create_subscription(struct sip_msg *m,
  95. rl_subscription_t **dst,
  96. flat_list_t *flat,
  97. xcap_query_params_t *params);
  98. int rls_create_internal_subscription(virtual_subscription_t *vs,
  99. rl_subscription_t **dst,
  100. flat_list_t *flat,
  101. int nesting_level);
  102. int rls_refresh_subscription(struct sip_msg *m, rl_subscription_t *s);
  103. int rls_find_subscription(str *from_tag, str *to_tag, str *call_id, rl_subscription_t **dst);
  104. void rls_free(rl_subscription_t *s); /* removes from memory only */
  105. void rls_remove(rl_subscription_t *s); /* finishes subscription - removes from DB, mem, ... */
  106. int rls_generate_notify(rl_subscription_t *s, int full_info);
  107. int rls_prepare_subscription_response(rl_subscription_t *s, struct sip_msg *m);
  108. /* void rls_notify_all_modified(); */
  109. /********* virtual subscription functions ********/
  110. int vs_init();
  111. int vs_destroy();
  112. int vs_create(str *uri,
  113. virtual_subscription_t **dst,
  114. display_name_t *dnames,
  115. rl_subscription_t *subscription,
  116. int nesting_level);
  117. int vs_add_display_name(virtual_subscription_t *vs, const char *name, const char *lang);
  118. void vs_free(virtual_subscription_t *vs);
  119. int create_virtual_subscriptions(rl_subscription_t *ss,
  120. int nesting_level);
  121. int add_virtual_subscriptions(rl_subscription_t *ss,
  122. flat_list_t *flat,
  123. int nesting_level);
  124. /* database operations */
  125. int rls_db_add(rl_subscription_t *s);
  126. int rls_db_remove(rl_subscription_t *s);
  127. int rls_db_update(rl_subscription_t *s);
  128. int db_load_rls(); /* load stored subscriptions on startup */
  129. /* helper functions */
  130. void generate_db_id(db_id_t *id, void *data);
  131. /** returns the count of seconds remaining to subscription expiration */
  132. int rls_subscription_expires_in(rl_subscription_t *s);
  133. /* allocates and initializes structure */
  134. rl_subscription_t *rls_alloc_subscription(rls_subscription_type_t type);
  135. /* XCAP queries */
  136. int xcap_query_rls_services(xcap_query_params_t *xcap_params,
  137. const str *uri, const str *package,
  138. flat_list_t **dst);
  139. /* internal notification */
  140. void process_internal_notify(virtual_subscription_t *vs,
  141. str_t *new_state_document,
  142. str_t *new_content_type);
  143. void process_rls_notification(virtual_subscription_t *vs, client_notify_info_t *info);
  144. #endif