00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #define _GNU_SOURCE
00040 #include <stdio.h>
00041 #include <string.h>
00042 #include <netinet/in.h>
00043 #include "../../mem/mem.h"
00044 #include "../../parser/msg_parser.h"
00045 #include "../../parser/parse_uri.h"
00046 #include "../../dprint.h"
00047 #include "encode_to_body.h"
00048 #include "encode_uri.h"
00049 #include "encode_header.h"
00050 #include "encode_parameters.h"
00051 #include "xaddress.h"
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 int encode_to_body(char *hdrstart,int hdrlen,struct to_body *body,unsigned char *where)
00069 {
00070 int i=2,j=0;
00071 unsigned char flags=0;
00072 struct sip_uri puri;
00073
00074 if(body->display.s && body->display.len){
00075 flags|=HAS_DISPLAY_F;
00076 if(body->display.s[0]=='\"'){
00077 body->display.s++;
00078 body->display.len-=2;
00079 }
00080 where[i++]=(unsigned char)(body->display.s-hdrstart);
00081 where[i++]=(unsigned char)(body->display.len);
00082 }
00083 if(body->tag_value.s && body->tag_value.len){
00084 flags|=HAS_TAG_F;
00085 where[i++]=(unsigned char)(body->tag_value.s-hdrstart);
00086 where[i++]=(unsigned char)body->tag_value.len;
00087 }
00088 if (parse_uri(body->uri.s, body->uri.len,&puri) < 0 ) {
00089 LM_ERR("Bad URI in address\n");
00090 return -1;
00091 }else{
00092 if((j=encode_uri2(hdrstart,hdrlen,body->uri,&puri,&where[i]))<0){
00093 LM_ERR("failed to codify the URI\n");
00094 return -1;
00095 }else{
00096 i+=j;
00097 }
00098 }
00099 where[0]=flags;
00100 where[1]=(unsigned char)j;
00101 i+=encode_parameters(&where[i],(void *)body->param_lst,hdrstart,body,'t');
00102
00103 return i;
00104 }
00105
00106 int print_encoded_to_body(FILE *fd,char *hdr,int hdrlen,unsigned char* payload,int paylen,char *prefix)
00107 {
00108 int i=2;
00109 unsigned char flags=0;
00110
00111 flags=payload[0];
00112 fprintf(fd,"%s",prefix);
00113 for(i=0;i<paylen;i++)
00114 fprintf(fd,"%s%d%s",i==0?"BODY CODE=[":":",payload[i],i==paylen-1?"]\n":"");
00115 i=2;
00116 if(flags & HAS_DISPLAY_F){
00117 fprintf(fd,"%sDISPLAY NAME=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]);
00118 i+=2;
00119 }
00120 if(flags & HAS_TAG_F){
00121 fprintf(fd,"%sTAG=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]);
00122 i+=2;
00123 }
00124 if(print_encoded_uri(fd,&payload[i],payload[1],hdr,hdrlen,strcat(prefix," "))<0){
00125 fprintf(fd,"Error parsing URI\n");
00126 prefix[strlen(prefix)-2]=0;
00127 return -1;
00128 }
00129 prefix[strlen(prefix)-2]=0;
00130 print_encoded_parameters(fd,&payload[i+payload[1]],hdr,paylen-i-payload[1],prefix);
00131 return 0;
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147 int dump_to_body_test(char *hdr,int hdrlen,unsigned char* payload,int paylen,FILE* fd,char segregationLevel)
00148 {
00149 int i=2;
00150 unsigned char flags=0;
00151
00152 flags=payload[0];
00153 if(!segregationLevel){
00154 return dump_standard_hdr_test(hdr,hdrlen,payload,paylen,fd);
00155 }
00156 i=2;
00157 if(flags & HAS_DISPLAY_F){
00158 i+=2;
00159 }
00160 if(flags & HAS_TAG_F){
00161 i+=2;
00162 }
00163 if(!(segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)){
00164 return dump_standard_hdr_test(hdr,hdrlen,&payload[i],payload[1],fd);
00165 }
00166 if((segregationLevel & JUNIT) && (segregationLevel & ONLY_URIS)){
00167 return print_uri_junit_tests(hdr,hdrlen,&payload[i],payload[1],fd,1,"");
00168 }
00169 return 0;
00170 }