rl_subscription.h

00001 #ifndef __RL_SUBSCRIPTION_H
00002 #define __RL_SUBSCRIPTION_H
00003 
00004 #include "../../modules/tm/dlg.h"
00005 #include "../../lock_ops.h"
00006 #include "subscription_manager.h"
00007 #include <xcap/resource_lists_parser.h>
00008 #include <cds/vector.h>
00009 #include <cds/ptr_vector.h>
00010 #include <cds/sstr.h>
00011 
00012 #include <presence/subscriber.h>
00013 #include <presence/notifier.h>
00014 #include <xcap/resource_list.h>
00015 
00016 #include "trace.h"
00017 
00018 /* type for generated database ID */
00019 typedef char db_id_t[48];
00020 
00021 typedef enum {
00022         rls_auth_none, 
00023         rls_auth_implicit,
00024         rls_auth_xcap
00025 } rls_authorization_type_t;
00026 
00027 typedef struct {
00028         rls_authorization_type_t type;
00029 } rls_auth_params_t;
00030 
00031 struct _virtual_subscription_t;
00032 struct _rl_subscription_t;
00033 typedef struct _rl_subscription_t rl_subscription_t;
00034 
00035 typedef struct {
00036         str name;
00037         str lang;
00038 } vs_display_name_t;
00039 
00040 typedef struct _virtual_subscription_t {
00041         /* helper to reduce memory allocations */
00042         qsa_subscription_data_t local_subscription_pres_data;
00043         
00044         /* local subscription data */
00045         qsa_subscription_t *local_subscription_pres;
00046         rl_subscription_t *local_subscription_list;
00047         
00048         vector_t display_names;
00049 
00050         rl_subscription_t *subscription;
00051 
00052         int changed;
00053         
00055         str state_document;
00057         str content_type;
00059         subscription_status_t status;
00060         
00061         /* VS identifier */
00062         str uri;
00063         
00064         struct _virtual_subscription_t *next;
00065         struct _virtual_subscription_t *prev;
00066 
00067         /* generated id for database */
00068         db_id_t dbid;
00069 
00070         char uri_str[1];
00071 } virtual_subscription_t;
00072 
00073 typedef enum { 
00074         rls_internal_subscription, 
00075         rls_external_subscription 
00076 } rls_subscription_type_t;
00077 
00078 typedef struct {
00079         str *package; /* points to "parent" subscription */
00080         str *record_id; /* NEVER free this - it points into VS data */
00081         str *subscriber_id; /* NEVER free this - it points into "parent" subscription */
00082         
00083         /* created from this virtual subscription */
00084         virtual_subscription_t *vs;
00085 
00086 } internal_subscription_data_t;
00087 
00089 struct _rl_subscription_t {
00090         rls_subscription_type_t type;
00091 
00092         /* XCAP server settings (needed for reloading internal subscriptions
00093          * from DB, XCAP notifications, ...) */
00094         xcap_query_params_t xcap_params;
00095         
00096         union {
00097                 /* data of external subscription */
00098                 subscription_data_t external;
00099 
00100                 /* data of internal subscription (pointer to "parent" 
00101                  * virtual subscription) */
00102                 internal_subscription_data_t internal;
00103         } u;
00104         
00106         int doc_version;
00107 
00110         int changed;
00111         
00112         /* virtual subscriptions for this rls */
00113         ptr_vector_t vs;
00114 
00115         /* uid of the watcher */
00116         str from_uid;
00117 
00118         /* generated id for database */
00119         db_id_t dbid;
00120 };
00121 
00122 str_t * rls_get_package(rl_subscription_t *s);
00123 str_t * rls_get_uri(rl_subscription_t *s);
00124 str_t * rls_get_subscriber(rl_subscription_t *subscription);
00125 
00126 /********* resource list subscription functions ********/
00127 
00128 int rls_create_subscription(struct sip_msg *m, 
00129                 rl_subscription_t **dst, 
00130                 flat_list_t *flat, 
00131                 xcap_query_params_t *params);
00132 int rls_create_internal_subscription(virtual_subscription_t *vs, 
00133                 rl_subscription_t **dst, 
00134                 flat_list_t *flat,
00135                 int nesting_level);
00136 int rls_refresh_subscription(struct sip_msg *m, rl_subscription_t *s);
00137 int rls_find_subscription(str *from_tag, str *to_tag, str *call_id, rl_subscription_t **dst);
00138 void rls_free(rl_subscription_t *s); /* removes from memory only */
00139 void rls_remove(rl_subscription_t *s); /* finishes subscription - removes from DB, mem, ... */
00140 int rls_generate_notify(rl_subscription_t *s, int full_info);
00141 int rls_prepare_subscription_response(rl_subscription_t *s, struct sip_msg *m);
00142 
00143 /* void rls_notify_all_modified(); */
00144 
00145 /********* virtual subscription functions ********/
00146 
00147 int vs_init();
00148 int vs_destroy();
00149 
00150 int vs_create(str *uri, 
00151                 virtual_subscription_t **dst, 
00152                 display_name_t *dnames, 
00153                 rl_subscription_t *subscription,
00154                 int nesting_level);
00155 int vs_add_display_name(virtual_subscription_t *vs, const char *name, const char *lang);
00156 void vs_free(virtual_subscription_t *vs);
00157 int create_virtual_subscriptions(rl_subscription_t *ss,
00158                 int nesting_level);
00159 int add_virtual_subscriptions(rl_subscription_t *ss, 
00160                 flat_list_t *flat,
00161                 int nesting_level);
00162 
00163 /* database operations */
00164 int rls_db_add(rl_subscription_t *s);
00165 int rls_db_remove(rl_subscription_t *s);
00166 int rls_db_update(rl_subscription_t *s);
00167 int db_load_rls(); /* load stored subscriptions on startup */
00168 
00169 /* helper functions */
00170 void generate_db_id(db_id_t *id, void *data);
00171 
00173 int rls_subscription_expires_in(rl_subscription_t *s);
00174 
00175 /* allocates and initializes structure */
00176 rl_subscription_t *rls_alloc_subscription(rls_subscription_type_t type);
00177 
00178 /* XCAP queries */
00179 int xcap_query_rls_services(xcap_query_params_t *xcap_params,
00180                 const str *uri, const str *package, 
00181                 flat_list_t **dst);
00182 
00183 /* internal notification */
00184 void process_internal_notify(virtual_subscription_t *vs, 
00185                 str_t *new_state_document,
00186                 str_t *new_content_type);
00187 
00188 void process_rls_notification(virtual_subscription_t *vs, client_notify_info_t *info);
00189  
00190 #endif