summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-10-07 08:41:55 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-10-07 08:41:55 +0000
commited1e39fc77252282e4c7e4140bb40fe20c9469a6 (patch)
treefe9ff75bc2b872c79775227843a9ef8fe1564a65
parente9389f9490b5a50b35c85756d89a3a9c59fa01eb (diff)
Fixed #1967: Add function pjsip_tdata_get_dlg
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5456 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/include/pjsip/sip_dialog.h10
-rw-r--r--pjsip/src/pjsip/sip_dialog.c9
-rw-r--r--pjsip/src/pjsip/sip_ua_layer.c5
3 files changed, 24 insertions, 0 deletions
diff --git a/pjsip/include/pjsip/sip_dialog.h b/pjsip/include/pjsip/sip_dialog.h
index 7f68476c..f56a60e1 100644
--- a/pjsip/include/pjsip/sip_dialog.h
+++ b/pjsip/include/pjsip/sip_dialog.h
@@ -557,6 +557,16 @@ PJ_DECL(void) pjsip_dlg_dec_lock( pjsip_dialog *dlg );
PJ_DECL(pjsip_dialog*) pjsip_rdata_get_dlg( pjsip_rx_data *rdata );
/**
+ * Get the dialog instance for the outgoing tdata. Returns NULL if the message
+ * wasn't sent from a dialog.
+ *
+ * @param tdata Outgoing message buffer.
+ *
+ * @return The dialog instance that "owns" the message.
+ */
+PJ_DECL(pjsip_dialog*) pjsip_tdata_get_dlg( pjsip_tx_data *tdata );
+
+/**
* Get the associated dialog for the specified transaction, if any.
*
* @param tsx The transaction.
diff --git a/pjsip/src/pjsip/sip_dialog.c b/pjsip/src/pjsip/sip_dialog.c
index 421ddc41..c83f2e92 100644
--- a/pjsip/src/pjsip/sip_dialog.c
+++ b/pjsip/src/pjsip/sip_dialog.c
@@ -1124,6 +1124,9 @@ static pj_status_t dlg_create_request_throw( pjsip_dialog *dlg,
if (status != PJ_SUCCESS)
return status;
+ /* Put this dialog in tdata's mod_data */
+ tdata->mod_data[dlg->ua->id] = dlg;
+
/* Just copy dialog route-set to Route header.
* The transaction will do the processing as specified in Section 12.2.1
* of RFC 3261 in function tsx_process_route() in sip_transaction.c.
@@ -1224,6 +1227,9 @@ PJ_DEF(pj_status_t) pjsip_dlg_send_request( pjsip_dialog *dlg,
/* Lock and increment session */
pjsip_dlg_inc_lock(dlg);
+ /* Put this dialog in tdata's mod_data */
+ tdata->mod_data[dlg->ua->id] = dlg;
+
/* If via_addr is set, use this address for the Via header. */
if (dlg->via_addr.host.slen > 0) {
tdata->via_addr = dlg->via_addr;
@@ -1406,6 +1412,9 @@ PJ_DEF(pj_status_t) pjsip_dlg_create_response( pjsip_dialog *dlg,
/* Lock the dialog. */
pjsip_dlg_inc_lock(dlg);
+ /* Put this dialog in tdata's mod_data */
+ tdata->mod_data[dlg->ua->id] = dlg;
+
dlg_beautify_response(dlg, PJ_FALSE, st_code, tdata);
/* Unlock the dialog. */
diff --git a/pjsip/src/pjsip/sip_ua_layer.c b/pjsip/src/pjsip/sip_ua_layer.c
index 7b6c11b5..2cc55343 100644
--- a/pjsip/src/pjsip/sip_ua_layer.c
+++ b/pjsip/src/pjsip/sip_ua_layer.c
@@ -412,6 +412,11 @@ PJ_DEF(pjsip_dialog*) pjsip_rdata_get_dlg( pjsip_rx_data *rdata )
return (pjsip_dialog*) rdata->endpt_info.mod_data[mod_ua.mod.id];
}
+PJ_DEF(pjsip_dialog*) pjsip_tdata_get_dlg( pjsip_tx_data *tdata )
+{
+ return (pjsip_dialog*) tdata->mod_data[mod_ua.mod.id];
+}
+
PJ_DEF(pjsip_dialog*) pjsip_tsx_get_dlg( pjsip_transaction *tsx )
{
return (pjsip_dialog*) tsx->mod_data[mod_ua.mod.id];