Browse Source

- support for uri attributes

Jan Janak 19 years ago
parent
commit
51b8201f88
4 changed files with 30 additions and 2 deletions
  1. 8 0
      modules/tm/h_table.c
  2. 2 0
      modules/tm/h_table.h
  3. 10 2
      modules/tm/t_hooks.c
  4. 10 0
      modules/tm/t_reply.c

+ 8 - 0
modules/tm/h_table.c

@@ -242,6 +242,14 @@ struct cell*  build_cell( struct sip_msg* p_msg )
 	/* timers */
 	init_cell_timers(new_cell);
 
+	old = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI,  &new_cell->uri_avps_from );
+	new_cell->uri_avps_from = *old;
+	*old = 0;
+
+	old = set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI,  &new_cell->uri_avps_to );
+	new_cell->uri_avps_to = *old;
+	*old = 0;
+
 	old = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER,  &new_cell->user_avps_from );
 	new_cell->user_avps_from = *old;
 	*old = 0;

+ 2 - 0
modules/tm/h_table.h

@@ -241,6 +241,8 @@ typedef struct cell
 	struct totag_elem *fwded_totags;
 
 	     /* list with avp */
+	struct usr_avp *uri_avps_from;
+	struct usr_avp *uri_avps_to;
 	struct usr_avp *user_avps_from;
 	struct usr_avp *user_avps_to;
 	struct usr_avp *domain_avps_from;

+ 10 - 2
modules/tm/t_hooks.c

@@ -172,7 +172,7 @@ void run_trans_callbacks( int type , struct cell *trans,
 {
 	static struct tmcb_params params = {0,0,0,0};
 	struct tm_callback    *cbp;
-	avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to;
+	avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to, *backup_uri_from, *backup_uri_to;
 
 	params.req = req;
 	params.rpl = rpl;
@@ -181,6 +181,8 @@ void run_trans_callbacks( int type , struct cell *trans,
 	if (trans->tmcb_hl.first==0 || ((trans->tmcb_hl.reg_types)&type)==0 )
 		return;
 
+	backup_uri_from = set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, &trans->uri_avps_from );
+	backup_uri_to = set_avp_list(AVP_CLASS_URI | AVP_TRACK_TO, &trans->uri_avps_to );
 	backup_from = set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, &trans->user_avps_from );
 	backup_to = set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, &trans->user_avps_to );
 	backup_dom_from = set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, &trans->domain_avps_from);
@@ -197,6 +199,8 @@ void run_trans_callbacks( int type , struct cell *trans,
 	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, backup_dom_from );
 	set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, backup_to );
 	set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, backup_from );
+	set_avp_list(AVP_CLASS_URI | AVP_TRACK_TO, backup_uri_to );
+	set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, backup_uri_from );
 }
 
 
@@ -205,7 +209,7 @@ void run_reqin_callbacks( struct cell *trans, struct sip_msg *req, int code )
 {
 	static struct tmcb_params params = {0,0,0,0};
 	struct tm_callback    *cbp;
-	avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to;
+	avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to, *backup_uri_from, *backup_uri_to;
 
 	params.req = req;
 	params.code = code;
@@ -213,6 +217,8 @@ void run_reqin_callbacks( struct cell *trans, struct sip_msg *req, int code )
 	if (req_in_tmcb_hl->first==0)
 		return;
 
+	backup_uri_from = set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, &trans->uri_avps_from );
+	backup_uri_to = set_avp_list(AVP_CLASS_URI | AVP_TRACK_TO, &trans->uri_avps_to );
 	backup_from = set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, &trans->user_avps_from );
 	backup_to = set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, &trans->user_avps_to );
 	backup_dom_from = set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, &trans->domain_avps_from);
@@ -223,6 +229,8 @@ void run_reqin_callbacks( struct cell *trans, struct sip_msg *req, int code )
 		params.param = &(cbp->param);
 		cbp->callback( trans, cbp->types, &params );
 	}
+	set_avp_list(AVP_CLASS_URI | AVP_TRACK_TO, backup_uri_to );
+	set_avp_list(AVP_CLASS_URI | AVP_TRACK_FROM, backup_uri_from );
 	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_TO, backup_dom_to );
 	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, backup_dom_from );
 	set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, backup_to );

+ 10 - 0
modules/tm/t_reply.c

@@ -489,6 +489,7 @@ static inline void faked_env( struct cell *t,struct sip_msg *msg)
 	static unsigned int backup_msgid;
 	static avp_list_t* backup_user_from, *backup_user_to;
 	static avp_list_t* backup_domain_from, *backup_domain_to;
+	static avp_list_t* backup_uri_from, *backup_uri_to;
 	static struct socket_info* backup_si;
 
 	if (msg) {
@@ -512,6 +513,8 @@ static inline void faked_env( struct cell *t,struct sip_msg *msg)
 		set_t(t);
 		/* make available the avp list from transaction */
 
+		backup_uri_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, &t->uri_avps_from );
+		backup_uri_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, &t->uri_avps_to );
 		backup_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps_from );
 		backup_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &t->user_avps_to );
 		backup_domain_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &t->domain_avps_from );
@@ -529,6 +532,8 @@ static inline void faked_env( struct cell *t,struct sip_msg *msg)
 		set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, backup_user_to );
 		set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, backup_domain_from );
 		set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, backup_domain_to );
+		set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, backup_uri_from );
+		set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, backup_uri_to );
 		bind_address=backup_si;
 	}
 }
@@ -1276,6 +1281,7 @@ int reply_received( struct sip_msg  *p_msg )
 	str next_hop;
 	avp_list_t* backup_user_from, *backup_user_to;
 	avp_list_t* backup_domain_from, *backup_domain_to;
+	avp_list_t* backup_uri_from, *backup_uri_to;
 
 	/* make sure we know the associated transaction ... */
 	if (t_check( p_msg  , &branch )==-1)
@@ -1348,6 +1354,8 @@ int reply_received( struct sip_msg  *p_msg )
 		if (t->uas.request) p_msg->flags=t->uas.request->flags;
 		/* set the as avp_list the one from transaction */
 
+		backup_uri_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_URI, &t->uri_avps_from );
+		backup_uri_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI, &t->uri_avps_to );
 		backup_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps_from );
 		backup_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &t->user_avps_to );
 		backup_domain_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &t->domain_avps_from );
@@ -1357,6 +1365,8 @@ int reply_received( struct sip_msg  *p_msg )
 		/* transfer current message context back to t */
 		if (t->uas.request) t->uas.request->flags=p_msg->flags;
 		/* restore original avp list */
+		set_avp_list( AVP_TRACK_FROM | AVP_CLASS_URI, backup_uri_from );
+		set_avp_list( AVP_TRACK_TO | AVP_CLASS_URI, backup_uri_to );
 		set_avp_list( AVP_TRACK_FROM | AVP_CLASS_USER, backup_user_from );
 		set_avp_list( AVP_TRACK_TO | AVP_CLASS_USER, backup_user_to );
 		set_avp_list( AVP_TRACK_FROM | AVP_CLASS_DOMAIN, backup_domain_from );