subscription_manager.h

00001 #ifndef __SUBSCRIPTION_MANAGER_H
00002 #define __SUBSCRIPTION_MANAGER_H
00003 
00004 #include <cds/sstr.h>
00005 #include "time_event_manager.h"
00006 #include "../../modules/tm/dlg.h"
00007 #include "trace.h"
00008 
00009 struct _subscription_data_t;
00010 
00011 typedef enum {
00012         auth_rejected,
00013         auth_polite_block,
00014         auth_unresolved,
00015         auth_granted
00016 } authorization_result_t;
00017 
00018 typedef int(*send_notify_func)(struct _subscription_data_t *s);
00019 typedef int(*terminate_func)(struct _subscription_data_t *s);
00020 typedef authorization_result_t (*subscription_authorize_func)(struct _subscription_data_t *s);
00021 
00022 typedef enum {
00023         subscription_uninitialized,
00024         subscription_active,
00025         subscription_pending,
00026         subscription_terminated,
00027         subscription_terminated_to,     /* terminated timeout */
00028         subscription_terminated_pending,        /* terminated pending subscription */
00029         subscription_terminated_pending_to      /* terminated pending subscription (timeout) */
00030 } subscription_status_t;
00031 
00032 typedef struct _subscription_data_t {
00034         time_event_data_t expiration;
00036         dlg_t *dialog;
00038         void *usr_data;
00040         subscription_status_t status;
00042         struct _subscription_data_t *next;
00044         struct _subscription_data_t *prev;
00046         str_t contact;
00048         str_t record_id;
00050         str_t package;
00052         str_t subscriber;       
00053 
00054 } subscription_data_t;
00055 
00056 typedef struct {
00057         subscription_data_t *first;
00058         subscription_data_t *last;
00059 
00061         send_notify_func notify;
00063         terminate_func terminate;
00065         subscription_authorize_func authorize;
00066 
00068         gen_lock_t *mutex;
00069         
00071         time_event_manager_t timer;
00072 
00073         int default_expiration;
00074         int min_expiration;
00075         int max_expiration;
00076         
00077 } subscription_manager_t;
00078 
00080 int subscription_management_init(void);
00081         
00083 subscription_manager_t *sm_create(send_notify_func notify, 
00084                 terminate_func terminate, 
00085                 subscription_authorize_func authorize,
00086                 gen_lock_t *mutex,
00087                 int min_exp, 
00088                 int max_exp, 
00089                 int default_exp,
00090                 int expiration_timer_period);
00091 
00093 int sm_init(subscription_manager_t *sm,
00094                 send_notify_func notify, 
00095                 terminate_func terminate, 
00096                 subscription_authorize_func authorize,
00097                 gen_lock_t *mutex,
00098                 int min_exp, 
00099                 int max_exp, 
00100                 int default_exp,
00101                 int expiration_timer_period);
00102 
00105 int sm_init_subscription_nolock(subscription_manager_t *mng,
00106                 subscription_data_t *dst, 
00107                 struct sip_msg *m);
00108 
00111 int sm_refresh_subscription_nolock(subscription_manager_t *mng,
00112                 subscription_data_t *s, 
00113                 struct sip_msg *m);
00114                 
00117 void sm_release_subscription_nolock(subscription_manager_t *mng,
00118                 subscription_data_t *dst);
00119 
00121 int sm_prepare_subscription_response(subscription_manager_t *mng,
00122                 subscription_data_t *s, 
00123                 struct sip_msg *m);
00124 
00126 int sm_find_subscription(subscription_manager_t *mng,
00127                 str_t *from_tag, str_t *to_tag, str_t *call_id, 
00128                 subscription_data_t **dst);
00129 
00131 int sm_subscription_terminated(subscription_data_t *s);
00132 
00134 int sm_subscription_pending(subscription_data_t *s);
00135 
00137 int sm_subscription_expires_in(subscription_manager_t *mng,
00138                 subscription_data_t *s);
00139 
00140 int sm_init_subscription_nolock_ex(subscription_manager_t *mng,
00141                 subscription_data_t *dst, 
00142                 dlg_t *dialog,
00143                 subscription_status_t status,
00144                 const str_t *contact,
00145                 const str_t *record_id,
00146                 const str_t *package,
00147                 const str_t *subscriber,
00148                 int expires_after,
00149                 void *subscription_data);
00150 
00151 #endif