[sr-dev] git:kamailio_3.0: pua_dialoginfo: use contact addresses in document
Daniel-Constantin Mierla
miconda at gmail.com
Sat Dec 19 23:28:19 CET 2009
Module: sip-router
Branch: kamailio_3.0
Commit: d35df0cdab10aa83b3ceedde3a8cde8baeabfc79
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d35df0cdab10aa83b3ceedde3a8cde8baeabfc79
Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date: Sat Dec 19 23:26:01 2009 +0100
pua_dialoginfo: use contact addresses in document
- for local and remote targets
- patch by Santiago Gimeno, FS#20
---
modules_k/pua_dialoginfo/dialog_publish.c | 16 ++++++++--
modules_k/pua_dialoginfo/pua_dialoginfo.c | 47 ++++++++++++++++++++--------
modules_k/pua_dialoginfo/pua_dialoginfo.h | 4 ++-
3 files changed, 49 insertions(+), 18 deletions(-)
diff --git a/modules_k/pua_dialoginfo/dialog_publish.c b/modules_k/pua_dialoginfo/dialog_publish.c
index 59c5bc6..8b15c77 100644
--- a/modules_k/pua_dialoginfo/dialog_publish.c
+++ b/modules_k/pua_dialoginfo/dialog_publish.c
@@ -55,7 +55,8 @@ void print_publ(publ_info_t* p)
}
str* build_dialoginfo(char *state, str *entity, str *peer, str *callid,
- unsigned int initiator, str *localtag, str *remotetag)
+ unsigned int initiator, str *localtag, str *remotetag,
+ str *localtarget, str *remotetarget)
{
xmlDocPtr doc = NULL;
xmlNodePtr root_node = NULL;
@@ -187,6 +188,10 @@ str* build_dialoginfo(char *state, str *entity, str *peer, str *callid,
LM_ERR("while adding child\n");
goto error;
}
+ if (remotetarget && remotetarget->s) {
+ memcpy(buf, remotetarget->s, remotetarget->len);
+ buf[remotetarget->len]= '\0';
+ }
xmlNewProp(tag_node, BAD_CAST "uri", BAD_CAST buf);
/* local tag*/
@@ -216,6 +221,10 @@ str* build_dialoginfo(char *state, str *entity, str *peer, str *callid,
LM_ERR("while adding child\n");
goto error;
}
+ if (localtarget && localtarget->s) {
+ memcpy(buf, localtarget->s, localtarget->len);
+ buf[localtarget->len]= '\0';
+ }
xmlNewProp(tag_node, BAD_CAST "uri", BAD_CAST buf);
}
@@ -251,7 +260,8 @@ error:
}
void dialog_publish(char *state, str *entity, str *peer, str *callid,
- unsigned int initiator, unsigned int lifetime, str *localtag, str *remotetag)
+ unsigned int initiator, unsigned int lifetime, str *localtag, str *remotetag,
+ str *localtarget, str *remotetarget)
{
str* body= NULL;
str uri= {NULL, 0};
@@ -273,7 +283,7 @@ void dialog_publish(char *state, str *entity, str *peer, str *callid,
content_type.s= "application/dialog-info+xml";
content_type.len= 27;
- body= build_dialoginfo(state, entity, peer, callid, initiator, localtag, remotetag);
+ body= build_dialoginfo(state, entity, peer, callid, initiator, localtag, remotetag, localtarget, remotetarget);
if(body == NULL || body->s == NULL)
goto error;
diff --git a/modules_k/pua_dialoginfo/pua_dialoginfo.c b/modules_k/pua_dialoginfo/pua_dialoginfo.c
index f95e0c6..f2731c0 100644
--- a/modules_k/pua_dialoginfo/pua_dialoginfo.c
+++ b/modules_k/pua_dialoginfo/pua_dialoginfo.c
@@ -41,6 +41,7 @@
#include "../../mem/shm_mem.h"
#include "../../parser/msg_parser.h"
#include "../../parser/parse_to.h"
+#include "../../parser/contact/parse_contact.h"
#include "../../str.h"
#include "../../mem/mem.h"
#include "../../pt.h"
@@ -199,6 +200,8 @@ __dialog_sendpublish(struct dlg_cell *dlg, int type, struct dlg_cb_params *_para
{
str tag = {0,0};
str uri = {0,0};
+ str target = {0,0};
+
struct dlginfo_cell *dlginfo = (struct dlginfo_cell*)*_params->param;
if (include_req_uri) {
@@ -212,18 +215,30 @@ __dialog_sendpublish(struct dlg_cell *dlg, int type, struct dlg_cb_params *_para
case DLGCB_TERMINATED:
case DLGCB_EXPIRED:
LM_DBG("dialog over, from=%.*s\n", dlginfo->from_uri.len, dlginfo->from_uri.s);
- dialog_publish("terminated", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0);
- dialog_publish("terminated", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0);
+ dialog_publish("terminated", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0, &(dlginfo->from_contact), &target);
+ dialog_publish("terminated", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0, &target, &(dlginfo->from_contact));
break;
case DLGCB_CONFIRMED:
case DLGCB_REQ_WITHIN:
LM_DBG("dialog confirmed, from=%.*s\n", dlginfo->from_uri.len, dlginfo->from_uri.s);
- dialog_publish("confirmed", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0);
- dialog_publish("confirmed", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0);
+ dialog_publish("confirmed", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0, &(dlginfo->from_contact), &target);
+ dialog_publish("confirmed", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0, &target, &(dlginfo->from_contact));
break;
case DLGCB_EARLY:
LM_DBG("dialog is early, from=%.*s\n", dlginfo->from_uri.len, dlginfo->from_uri.s);
if (include_tags) {
+ /* get remotetarget */
+ if ( !_params->msg->contact && ((parse_headers(_params->msg, HDR_CONTACT_F,0)<0) || !_params->msg->contact) ) {
+ LM_ERR("bad reply or missing CONTACT hdr\n");
+ } else {
+ if ( parse_contact(_params->msg->contact)<0 ||
+ ((contact_body_t *)_params->msg->contact->parsed)->contacts==NULL ||
+ ((contact_body_t *)_params->msg->contact->parsed)->contacts->next!=NULL ) {
+ LM_ERR("Malformed CONTACT hdr\n");
+ } else {
+ target = ((contact_body_t *)_params->msg->contact->parsed)->contacts->uri;
+ }
+ }
/* get to tag*/
if ( !_params->msg->to && ((parse_headers(_params->msg, HDR_TO_F,0)<0) || !_params->msg->to) ) {
LM_ERR("bad reply or missing TO hdr :-/\n");
@@ -238,27 +253,27 @@ __dialog_sendpublish(struct dlg_cell *dlg, int type, struct dlg_cb_params *_para
}
}
if (caller_confirmed) {
- dialog_publish("confirmed", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, &(dlginfo->from_tag), &tag);
+ dialog_publish("confirmed", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, &(dlginfo->from_tag), &tag, &(dlginfo->from_contact), &target);
} else {
- dialog_publish("early", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, &(dlginfo->from_tag), &tag);
+ dialog_publish("early", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, &(dlginfo->from_tag), &tag, &(dlginfo->from_contact), &target);
}
- dialog_publish("early", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, &tag, &(dlginfo->from_tag));
+ dialog_publish("early", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, &tag, &(dlginfo->from_tag), &target, &(dlginfo->from_contact));
} else {
if (caller_confirmed) {
- dialog_publish("confirmed", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0);
+ dialog_publish("confirmed", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0, &(dlginfo->from_contact), &target);
} else {
- dialog_publish("early", &(dlginfo->from_uri), &(dlginfo->to_uri), &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0);
+ dialog_publish("early", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0, &(dlginfo->from_contact), &target);
}
- dialog_publish("early", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0);
+ dialog_publish("early", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0, &target, &(dlginfo->from_contact));
}
break;
default:
LM_ERR("unhandled dialog callback type %d received, from=%.*s\n", type, dlginfo->from_uri.len, dlginfo->from_uri.s);
- dialog_publish("terminated", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0);
- dialog_publish("terminated", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0);
+ dialog_publish("terminated", &(dlginfo->from_uri), &uri, &(dlginfo->callid), 1, dlginfo->lifetime, 0, 0, &(dlginfo->from_contact), &target);
+ dialog_publish("terminated", &uri, &(dlginfo->from_uri), &(dlginfo->callid), 0, dlginfo->lifetime, 0, 0, &target, &(dlginfo->from_contact));
}
}
@@ -281,7 +296,8 @@ __dialog_created(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params)
dlg->to_uri.len +
dlg->callid.len +
dlg->tag[0].len +
- dlg->req_uri.len;
+ dlg->req_uri.len +
+ dlg->contact[0].len;
dlginfo = (struct dlginfo_cell*)shm_malloc( len );
if (dlginfo==0) {
@@ -302,11 +318,14 @@ __dialog_created(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params)
dlginfo->from_tag.len = dlg->tag[0].len;
dlginfo->req_uri.s = dlginfo->from_tag.s + dlginfo->from_tag.len;
dlginfo->req_uri.len = dlg->req_uri.len;
+ dlginfo->from_contact.s = dlginfo->req_uri.s + dlginfo->req_uri.len;
+ dlginfo->from_contact.len = dlg->contact[0].len;
memcpy(dlginfo->from_uri.s, dlg->from_uri.s, dlg->from_uri.len);
memcpy(dlginfo->to_uri.s, dlg->to_uri.s, dlg->to_uri.len);
memcpy(dlginfo->callid.s, dlg->callid.s, dlg->callid.len);
memcpy(dlginfo->from_tag.s, dlg->tag[0].s, dlg->tag[0].len);
memcpy(dlginfo->req_uri.s, dlg->req_uri.s, dlg->req_uri.len);
+ memcpy(dlginfo->from_contact.s, dlg->contact[0].s, dlg->contact[0].len);
/* register dialog callbacks which triggers sending PUBLISH */
if (dlg_api.register_dlgcb(dlg,
@@ -329,7 +348,7 @@ __dialog_created(struct dlg_cell *dlg, int type, struct dlg_cb_params *_params)
}
#endif
- dialog_publish("Trying", &(dlg->from_uri), &(dlg->to_uri), &(dlg->callid), 1, dlginfo->lifetime, 0, 0);
+ dialog_publish("Trying", &(dlg->from_uri), (include_req_uri)?&(dlg->req_uri):&(dlg->to_uri), &(dlg->callid), 1, dlginfo->lifetime, 0, 0, 0, 0);
}
diff --git a/modules_k/pua_dialoginfo/pua_dialoginfo.h b/modules_k/pua_dialoginfo/pua_dialoginfo.h
index 74cc6e0..7ff71b7 100644
--- a/modules_k/pua_dialoginfo/pua_dialoginfo.h
+++ b/modules_k/pua_dialoginfo/pua_dialoginfo.h
@@ -30,7 +30,8 @@
extern send_publish_t pua_send_publish;
void dialog_publish(char *state, str *entity, str *peer, str *callid,
- unsigned int initiator, unsigned int lifetime, str *localtag, str *remotetag);
+ unsigned int initiator, unsigned int lifetime, str *localtag, str *remotetag,
+ str *localtarget, str *remotetarget);
/* store the important data locally to avoid reading the data from the
dlg_cell during the callback (as this could create a race condition
@@ -42,6 +43,7 @@ struct dlginfo_cell {
str from_tag;
/* str *to_tag; */
str req_uri;
+ str from_contact;
unsigned int lifetime;
};
More information about the sr-dev
mailing list