[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