diff options
Diffstat (limited to 'res/res_pjsip_mwi.c')
-rw-r--r-- | res/res_pjsip_mwi.c | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/res/res_pjsip_mwi.c b/res/res_pjsip_mwi.c index 55ef300e8..37e1da0bb 100644 --- a/res/res_pjsip_mwi.c +++ b/res/res_pjsip_mwi.c @@ -48,17 +48,20 @@ AO2_GLOBAL_OBJ_STATIC(unsolicited_mwi); #define MWI_TYPE "application" #define MWI_SUBTYPE "simple-message-summary" +#define MWI_DATASTORE "MWI datastore" + static void mwi_subscription_shutdown(struct ast_sip_subscription *sub); static void mwi_to_ami(struct ast_sip_subscription *sub, struct ast_str **buf); static int mwi_new_subscribe(struct ast_sip_endpoint *endpoint, const char *resource); -static int mwi_notify_required(struct ast_sip_subscription *sip_sub, - enum ast_sip_subscription_notify_reason reason); +static int mwi_subscription_established(struct ast_sip_subscription *sub); +static void *mwi_get_notify_data(struct ast_sip_subscription *sub); static struct ast_sip_notifier mwi_notifier = { .default_accept = MWI_TYPE"/"MWI_SUBTYPE, .new_subscribe = mwi_new_subscribe, - .notify_required = mwi_notify_required, + .subscription_established = mwi_subscription_established, + .get_notify_data = mwi_get_notify_data, }; static struct ast_sip_subscription_handler mwi_handler = { @@ -457,7 +460,7 @@ static void mwi_subscription_shutdown(struct ast_sip_subscription *sub) { struct mwi_subscription *mwi_sub; RAII_VAR(struct ast_datastore *, mwi_datastore, - ast_sip_subscription_get_datastore(sub, "MWI datastore"), ao2_cleanup); + ast_sip_subscription_get_datastore(sub, MWI_DATASTORE), ao2_cleanup); if (!mwi_datastore) { return; @@ -473,7 +476,7 @@ static int add_mwi_datastore(struct mwi_subscription *sub) { RAII_VAR(struct ast_datastore *, mwi_datastore, NULL, ao2_cleanup); - mwi_datastore = ast_sip_subscription_alloc_datastore(&mwi_ds_info, "MWI datastore"); + mwi_datastore = ast_sip_subscription_alloc_datastore(&mwi_ds_info, MWI_DATASTORE); if (!mwi_datastore) { return -1; } @@ -676,7 +679,7 @@ static int mwi_new_subscribe(struct ast_sip_endpoint *endpoint, return 200; } -static int mwi_initial_subscription(struct ast_sip_subscription *sip_sub) +static int mwi_subscription_established(struct ast_sip_subscription *sip_sub) { const char *resource = ast_sip_subscription_get_resource_name(sip_sub); struct mwi_subscription *sub; @@ -694,39 +697,32 @@ static int mwi_initial_subscription(struct ast_sip_subscription *sip_sub) return -1; } - send_mwi_notify(sub); - ao2_cleanup(sub); ao2_cleanup(endpoint); return 0; } -static int mwi_notify_required(struct ast_sip_subscription *sip_sub, - enum ast_sip_subscription_notify_reason reason) +static void *mwi_get_notify_data(struct ast_sip_subscription *sub) { + struct ast_sip_message_accumulator *counter; struct mwi_subscription *mwi_sub; struct ast_datastore *mwi_datastore; - switch (reason) { - case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_STARTED: - return mwi_initial_subscription(sip_sub); - case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_RENEWED: - case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_TERMINATED: - case AST_SIP_SUBSCRIPTION_NOTIFY_REASON_OTHER: - mwi_datastore = ast_sip_subscription_get_datastore(sip_sub, "MWI datastore"); - - if (!mwi_datastore) { - return -1; - } - - mwi_sub = mwi_datastore->data; + mwi_datastore = ast_sip_subscription_get_datastore(sub, MWI_DATASTORE); + if (!mwi_datastore) { + return NULL; + } + mwi_sub = mwi_datastore->data; - send_mwi_notify(mwi_sub); + counter = ao2_alloc(sizeof(*counter), NULL); + if (!counter) { ao2_cleanup(mwi_datastore); - break; + return NULL; } - return 0; + ao2_callback(mwi_sub->stasis_subs, OBJ_NODATA, get_message_count, counter); + ao2_cleanup(mwi_datastore); + return counter; } static void mwi_subscription_mailboxes_str(struct ao2_container *stasis_subs, @@ -753,7 +749,7 @@ static void mwi_to_ami(struct ast_sip_subscription *sub, { struct mwi_subscription *mwi_sub; RAII_VAR(struct ast_datastore *, mwi_datastore, - ast_sip_subscription_get_datastore(sub, "MWI datastore"), ao2_cleanup); + ast_sip_subscription_get_datastore(sub, MWI_DATASTORE), ao2_cleanup); if (!mwi_datastore) { return; |