[Devel] textops and pseudo-variables

Boris Bliznioukov blib at dsi.ru
Wed Nov 23 11:17:00 CET 2005


Hello,

I was using textops module and had discovered  that pudo-variables  
are not extended in textops module. So constriction like this is not  
working

append_hf("Remote-Party-ID: <sip:$avp(s:xxx)@ 
$fd>;party=calling;screen=yes;privacy=off\r\n");

I thought it would be good if textops would extend pseudo-variables.
And here is a small patch for that.
Right now it is only changes append_hf, if there is an interest I can  
add pseudo-variables support for the rest of the functions in textops  
module.

Boris./

*** textops.c.orig      Tue Nov 22 20:09:35 2005
--- textops.c   Wed Nov 23 18:03:38 2005
***************
*** 94,104 ****
   static int replace_all_f(struct sip_msg* msg, char* key, char* str);
   static int search_append_f(struct sip_msg*, char*, char*);
   static int append_to_reply_f(struct sip_msg* msg, char* key, char*  
str);
! static int append_hf(struct sip_msg* msg, char* str1, char* str2);
   static int append_urihf(struct sip_msg* msg, char* str1, char* str2);
   static int append_time_f(struct sip_msg* msg, char* , char *);
   static int is_method_f(struct sip_msg* msg, char* , char *);

   static int fixup_regex(void**, int);
   static int fixup_substre(void**, int);
   static int str_fixup(void** param, int param_no);
--- 94,105 ----
   static int replace_all_f(struct sip_msg* msg, char* key, char* str);
   static int search_append_f(struct sip_msg*, char*, char*);
   static int append_to_reply_f(struct sip_msg* msg, char* key, char*  
str);
! static int append_hf(struct sip_msg *msg, xl_elem_t *format );
   static int append_urihf(struct sip_msg* msg, char* str1, char* str2);
   static int append_time_f(struct sip_msg* msg, char* , char *);
   static int is_method_f(struct sip_msg* msg, char* , char *);

+ static int avp_fixup(void**, int);
   static int fixup_regex(void**, int);
   static int fixup_substre(void**, int);
   static int str_fixup(void** param, int param_no);
***************
*** 119,125 ****
                         REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE| 
BRANCH_ROUTE},
         {"append_to_reply",  append_to_reply_f, 1, 0,
                         REQUEST_ROUTE|BRANCH_ROUTE},
!       {"append_hf",        append_hf,         1, str_fixup,
                         REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE| 
BRANCH_ROUTE},
         {"append_urihf",     append_urihf,      2, str_fixup,
                         REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
--- 120,126 ----
                         REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE| 
BRANCH_ROUTE},
         {"append_to_reply",  append_to_reply_f, 1, 0,
                         REQUEST_ROUTE|BRANCH_ROUTE},
!       {"append_hf",        append_hf,         1, avp_fixup,
                         REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE| 
BRANCH_ROUTE},
         {"append_urihf",     append_urihf,      2, str_fixup,
                         REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
***************
*** 623,631 ****
         return 1;
   }

! static int append_hf(struct sip_msg *msg, char *str1, char *str2 )
   {
!       return append_hf_helper(msg, (str *) str1, (str *) 0);
   }

   static int append_urihf(struct sip_msg *msg, char *str1, char *str2 )
--- 624,654 ----
         return 1;
   }

! static int append_hf(struct sip_msg *msg, xl_elem_t *format )
   {
!
!       #define PRINTBUF_SIZE   1024
!       char printbuf[PRINTBUF_SIZE];
!       int printbuf_len;
!       str* s;
!
!       s = (str*)pkg_malloc(sizeof(str));
!       if (!s) {
!               LOG(L_ERR, "str_fixup(): No memory left\n");
!               return E_UNSPEC;
!       }
!
!       printbuf_len = PRINTBUF_SIZE-1;
!       if(xl_printf(msg, format, printbuf, &printbuf_len)<0)
!       {
!               LOG(L_ERR, "textops:append_hf: error - cannot print  
the format\n");
!               return -1;
!       }
!
!       s->s = printbuf;
!       s->len = strlen(s->s);
!
!       return append_hf_helper(msg, (str *) s, (str *) 0);
   }

   static int append_urihf(struct sip_msg *msg, char *str1, char *str2 )
***************
*** 679,684 ****
--- 702,727 ----
         s->len = strlen(s->s);
         *param = (void*)s;

+       return 0;
+ }
+
+ /*
+  * Convert char* parameter to xl_elem parameter
+  */
+ static int avp_fixup(void** param, int param_no)
+ {
+       xl_elem_t *model;
+
+       if(*param)
+       {
+               if(xl_parse_format((char*)(*param), &model,  
XL_DISABLE_COLORS)<0)
+               {
+                       LOG(L_ERR, "ERROR:textops:avp_fixup: wrong  
format[%s]\n",
+                               (char*)(*param));
+                       return E_UNSPEC;
+               }
+               *param = (void*)model;
+       }
         return 0;
   }
  
  




More information about the Devel mailing list