diff options
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsip-simple/evsub.c | 34 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_dialog.c | 21 |
2 files changed, 42 insertions, 13 deletions
diff --git a/pjsip/src/pjsip-simple/evsub.c b/pjsip/src/pjsip-simple/evsub.c index 7acd0bad..c52b0b5f 100644 --- a/pjsip/src/pjsip-simple/evsub.c +++ b/pjsip/src/pjsip-simple/evsub.c @@ -735,25 +735,33 @@ static pj_status_t evsub_create( pjsip_dialog *dlg, pj_strdup(sub->pool, &sub->event->event_type, event); - /* Create subcription list: */ - - dlgsub_head = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); - dlgsub = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); - dlgsub->sub = sub; + /* Check if another subscription has been registered to the dialog. In + * that case, just add ourselves to the subscription list, otherwise + * create and register a new subscription list. + */ + if (pjsip_dlg_has_usage(dlg, &mod_evsub.mod)) { + dlgsub_head = (struct dlgsub*) dlg->mod_data[mod_evsub.mod.id]; + dlgsub = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); + dlgsub->sub = sub; + pj_list_push_back(dlgsub_head, dlgsub); + } else { + dlgsub_head = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); + dlgsub = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); + dlgsub->sub = sub; - pj_list_init(dlgsub_head); - pj_list_push_back(dlgsub_head, dlgsub); + pj_list_init(dlgsub_head); + pj_list_push_back(dlgsub_head, dlgsub); - /* Register as dialog usage: */ + /* Register as dialog usage: */ - status = pjsip_dlg_add_usage(dlg, &mod_evsub.mod, dlgsub_head); - if (status != PJ_SUCCESS) { - pjsip_dlg_dec_lock(dlg); - return status; + status = pjsip_dlg_add_usage(dlg, &mod_evsub.mod, dlgsub_head); + if (status != PJ_SUCCESS) { + pjsip_dlg_dec_lock(dlg); + return status; + } } - PJ_LOG(5,(sub->obj_name, "%s subscription created, using dialog %s", (role==PJSIP_ROLE_UAC ? "UAC" : "UAS"), dlg->obj_name)); diff --git a/pjsip/src/pjsip/sip_dialog.c b/pjsip/src/pjsip/sip_dialog.c index f7afde96..2cfeca0d 100644 --- a/pjsip/src/pjsip/sip_dialog.c +++ b/pjsip/src/pjsip/sip_dialog.c @@ -894,6 +894,27 @@ PJ_DEF(pj_status_t) pjsip_dlg_dec_session( pjsip_dialog *dlg, } /* + * Check if the module is registered as a usage + */ +PJ_DEF(pj_bool_t) pjsip_dlg_has_usage( pjsip_dialog *dlg, + pjsip_module *mod) +{ + unsigned index; + pj_bool_t found = PJ_FALSE; + + pjsip_dlg_inc_lock(dlg); + for (index=0; index<dlg->usage_cnt; ++index) { + if (dlg->usage[index] == mod) { + found = PJ_TRUE; + break; + } + } + pjsip_dlg_dec_lock(dlg); + + return found; +} + +/* * Add usage. */ PJ_DEF(pj_status_t) pjsip_dlg_add_usage( pjsip_dialog *dlg, |