summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2010-01-21 10:04:26 +0000
committerBenny Prijono <bennylp@teluu.com>2010-01-21 10:04:26 +0000
commit0535be243fddf29f4ab4164cbe1b67d59d59b250 (patch)
tree90c897205aab455ed7d405bd47e9ae82cbd9a3b3 /pjsip
parent29f2c32efa33d5126e53ee1afba31f967517cf1e (diff)
Ticket #1029: Fix support for multiple (event) subscriptions in a single dialog (thanks Wang Eric for the report)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3068 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/include/pjsip/sip_dialog.h12
-rw-r--r--pjsip/src/pjsip-simple/evsub.c34
-rw-r--r--pjsip/src/pjsip/sip_dialog.c21
3 files changed, 54 insertions, 13 deletions
diff --git a/pjsip/include/pjsip/sip_dialog.h b/pjsip/include/pjsip/sip_dialog.h
index 6b748b3a..6ac44c30 100644
--- a/pjsip/include/pjsip/sip_dialog.h
+++ b/pjsip/include/pjsip/sip_dialog.h
@@ -372,6 +372,18 @@ PJ_DECL(pj_status_t) pjsip_dlg_add_usage( pjsip_dialog *dlg,
void *mod_data );
/**
+ * Check if the specified module has been registered as usage to the dialog.
+ *
+ * @param dlg The dialog.
+ * @param module The module.
+ *
+ * @return PJ_TRUE if the specified module is currently
+ * registered as a usage to the dialog.
+ */
+PJ_DECL(pj_bool_t) pjsip_dlg_has_usage(pjsip_dialog *dlg,
+ pjsip_module *module);
+
+/**
* Attach module specific data to the dialog. Application can also set
* the value directly by accessing dlg->mod_data[module_id].
*
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,