diff -c -r sip-server/items.c sip-server.patched/items.c
*** sip-server/items.c	2006-02-15 22:12:45.000000000 +0200
--- sip-server.patched/items.c	2006-02-16 07:32:53.343514896 +0200
***************
*** 47,52 ****
--- 47,54 ----
  #include "parser/parse_hname2.h"
  #include "parser/parse_content.h"
  #include "parser/parse_refer_to.h"
+ #include "parser/parse_rpid.h"
+ #include "parser/parse_diversion.h"
  #include "parser/digest/digest.h"
  
  #include "items.h"
***************
*** 840,845 ****
--- 842,892 ----
  	return 0;
  }
  
+ static int xl_get_diversion(struct sip_msg *msg, xl_value_t *res, xl_param_t *param,
+ 		int flags)
+ {
+ 	if(msg==NULL || res==NULL)
+ 		return -1;
+ 
+ 	if(parse_diversion_header(msg)==-1)
+ 	{
+ 		LOG(L_ERR,
+ 			"xl_get_diversion: ERROR cannot parse Diversion header\n");
+ 		return xl_get_null(msg, res, param, flags);
+ 	}
+ 	
+ 	if(msg->diversion==NULL || get_diversion(msg)==NULL)
+ 		return xl_get_null(msg, res, param, flags);
+ 
+ 	res->rs.s = get_diversion(msg)->uri.s;
+ 	res->rs.len = get_diversion(msg)->uri.len; 
+ 	
+ 	res->flags = XL_VAL_STR;
+ 	return 0;
+ }
+ 
+ static int xl_get_rpid(struct sip_msg *msg, xl_value_t *res, xl_param_t *param,
+ 		int flags)
+ {
+ 	if(msg==NULL || res==NULL)
+ 		return -1;
+ 
+ 	if(parse_rpid_header(msg)==-1)
+ 	{
+ 		LOG(L_ERR,
+ 			"xl_get_rpid: ERROR cannot parse RPID header\n");
+ 		return xl_get_null(msg, res, param, flags);
+ 	}
+ 	
+ 	if(msg->rpid==NULL || get_rpid(msg)==NULL)
+ 		return xl_get_null(msg, res, param, flags);
+ 
+ 	res->rs.s = get_rpid(msg)->uri.s;
+ 	res->rs.len = get_rpid(msg)->uri.len; 
+ 	
+ 	res->flags = XL_VAL_STR;
+ 	return 0;
+ }
  
  static int xl_get_dset(struct sip_msg *msg, xl_value_t *res, xl_param_t *param,
  		int flags)
***************
*** 1985,1990 ****
--- 2032,2041 ----
  					e->p.val.len = 1;
  					e->type = XL_DSTURI_DOMAIN;
  				break;
+ 				case 'i':
+ 					e->itf = xl_get_diversion;
+ 					e->type = XL_DIVERSION;
+ 				break;
  				case 'p':
  					e->itf = xl_get_dsturi_attr;
  					e->p.val.len = 2;
***************
*** 2148,2153 ****
--- 2199,2208 ----
  					e->p.val.len = 2;
  					e->type = XL_RURI_DOMAIN;
  				break;
+ 				case 'e':
+ 					e->itf = xl_get_rpid;
+ 					e->type = XL_RPID;
+ 				break;
  				case 'm':
  					e->itf = xl_get_method;
  					e->type = XL_METHOD;
diff -c -r sip-server/items.h sip-server.patched/items.h
*** sip-server/items.h	2006-02-15 22:12:45.000000000 +0200
--- sip-server.patched/items.h	2006-02-16 07:32:57.536877408 +0200
***************
*** 75,81 ****
  	XL_DSTURI_PORT,      XL_DSTURI_PROTOCOL,   XL_FROM_DISPLAYNAME,
  	XL_TO_DISPLAYNAME,   XL_OURI,              XL_OURI_USERNAME,
  	XL_OURI_DOMAIN,      XL_OURI_PORT,         XL_OURI_PROTOCOL,
! 	XL_FORCE_SOCK
  };
  typedef enum _xl_type xl_type_t;
  
--- 75,81 ----
  	XL_DSTURI_PORT,      XL_DSTURI_PROTOCOL,   XL_FROM_DISPLAYNAME,
  	XL_TO_DISPLAYNAME,   XL_OURI,              XL_OURI_USERNAME,
  	XL_OURI_DOMAIN,      XL_OURI_PORT,         XL_OURI_PROTOCOL,
! 	XL_FORCE_SOCK,       XL_RPID,              XL_DIVERSION
  };
  typedef enum _xl_type xl_type_t;
  
