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,
00028 subscription_terminated_pending,
00029 subscription_terminated_pending_to
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