int print_encoded_route(FILE *fd,char *hdr,int hdrlen,unsigned char* payload,int paylen,char *prefix) { int i=2;/* flags + urilength */ unsigned char flags=0; flags=payload[0]; fprintf(fd,"%s",prefix); for(i=0;i<paylen;i++) fprintf(fd,"%s%d%s",i==0?"ENCODED ROUTE=[":":",payload[i],i==paylen-1?"]\n":""); i=2; if(flags & HAS_NAME_F){ fprintf(fd,"%sNAME=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(print_encoded_uri(fd,&payload[i],payload[1],hdr,hdrlen,strcat(prefix," "))<0){ prefix[strlen(prefix)-2]=0; fprintf(fd,"Error parsing URI\n"); return -1; } prefix[strlen(prefix)-2]=0; print_encoded_parameters(fd,&payload[i+payload[1]],hdr,paylen-i-payload[1],prefix); /* for(i+=payload[1];i<paylen-1;i+=2){ fprintf(fd,"%s[PARAMETER[%.*s]",prefix,payload[i+1]-payload[i]-1,&hdr[payload[i]]); fprintf(fd,"VALUE[%.*s]]\n",(payload[i+2]-payload[i+1])==0?0:(payload[i+2]-payload[i+1]-1),&hdr[payload[i+1]]); }*/ return 0; }
int print_encoded_to_body(FILE *fp,char *hdr,int hdrlen,unsigned char* payload,int paylen,char *prefix) { int i=2;/* flags + urilength */ unsigned char flags=0; flags=payload[0]; fprintf(fp,"%s",prefix); for(i=0;i<paylen;i++) fprintf(fp,"%s%d%s",i==0?"BODY CODE=[":":",payload[i],i==paylen-1?"]\n":""); i=2; if(flags & HAS_DISPLAY_F){ fprintf(fp,"%sDISPLAY NAME=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(flags & HAS_TAG_F){ fprintf(fp,"%sTAG=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(print_encoded_uri(fp,&payload[i],payload[1],hdr,hdrlen,strcat(prefix," "))<0){ fprintf(fp,"Error parsing URI\n"); prefix[strlen(prefix)-2]=0; return -1; } prefix[strlen(prefix)-2]=0; print_encoded_parameters(fp,&payload[i+payload[1]],hdr,paylen-i-payload[1],prefix); return 0; }
int print_encoded_content_disposition(FILE* fd,char *hdr,int hdrlen,unsigned char* payload,int paylen,char *prefix) { int i=3;/* flags + urilength */ fprintf(fd,"%s",prefix); for(i=0;i<paylen;i++) fprintf(fd,"%s%d%s",i==0?"ENCODED CONTENT-DISPOSITION=[":":",payload[i],i==paylen-1?"]\n":""); fprintf(fd,"%sCONTENT DISPOSITION:[%.*s]\n",prefix,payload[2],&hdr[payload[1]]); print_encoded_parameters(fd,&payload[3],hdr,paylen-3,prefix); return 0; }
int print_encoded_contact(FILE *fp,char *hdr,int hdrlen,unsigned char* payload,int paylen,char *prefix) { int i=2;/* flags + urilength */ unsigned char flags=0; flags=payload[0]; fprintf(fp,"%s",prefix); for(i=0;i<paylen;i++) fprintf(fp,"%s%d%s",i==0?"ENCODED CONTACT=[":":",payload[i],i==paylen-1?"]\n":""); i=2; if(flags & HAS_NAME_F){ fprintf(fp,"%sCONTACT NAME=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(flags & HAS_Q_F){ fprintf(fp,"%sCONTACT Q=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(flags & HAS_EXPIRES_F){ fprintf(fp,"%sCONTACT EXPIRES=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(flags & HAS_RECEIVED_F){ fprintf(fp,"%sCONTACT RECEIVED=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(flags & HAS_METHOD_F){ fprintf(fp,"%sCONTACT METHOD=[%.*s]\n",prefix,payload[i+1],&hdr[payload[i]]); i+=2; } if(print_encoded_uri(fp,&payload[i],payload[1],hdr,hdrlen,strcat(prefix," "))<0){ prefix[strlen(prefix)-2]=0; fprintf(fp,"Error parsing URI\n"); return -1; } prefix[strlen(prefix)-2]=0; print_encoded_parameters(fp,(unsigned char*)&payload[i+payload[1]],hdr,paylen-i-payload[1],prefix); return 0; }
int print_encoded_uri(FILE *fd,unsigned char *payload,int paylen,char *hdrstart,int hdrlen,char *prefix) { int i=4,j=0;/*1*pointer+1*len+2*flags*/ unsigned char uriidx=0,flags1=0,flags2=0,urilen; char *ch_uriptr,*uritype=NULL,*secure=NULL; uriidx=payload[0]; fprintf(fd,"%s",prefix); for(j=0;j<paylen;j++) fprintf(fd,"%s%d%s",j==0?"ENCODED-URI:[":":",payload[j],j==paylen-1?"]\n":""); if(uriidx>hdrlen){ fprintf(fd,"bad index for start of uri: hdrlen=%d uri_index=%d\n",hdrlen,uriidx); return -1; } ch_uriptr = hdrstart+uriidx; urilen=payload[1]; flags1=payload[2]; flags2=payload[3]; fprintf(fd,"%sURI:[%.*s]\n",prefix,urilen,ch_uriptr); uritype=flags1&SIP_OR_TEL_F?"SIP":"TEL"; secure=flags1&SECURE_F?"S":""; fprintf(fd,"%s TYPE:[%s%s]\n",prefix,uritype,secure); if(flags1 & USER_F){ fprintf(fd,"%s USER:[%.*s]\n",prefix,(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; } if(flags1 & PASSWORD_F){ fprintf(fd,"%s PASSWORD=[%.*s]\n",prefix,(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; } if(flags1 & HOST_F){ fprintf(fd,"%s HOST=[%.*s]\n",prefix,(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; } if(flags1 & PORT_F){ fprintf(fd,"%s PORT=[%.*s]\n",prefix,(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; } if(flags1 & PARAMETERS_F){ fprintf(fd,"%s PARAMETERS=[%.*s]\n",prefix,(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; } if(flags1 & HEADERS_F){ fprintf(fd,"%s HEADERS=[%.*s]\n",prefix,(payload[i+1]-1)-payload[i],&ch_uriptr[payload[i]]); ++i; } ++i; if(flags2 & TRANSPORT_F){ fprintf(fd,"%s TRANSPORT=[%.*s]\n",prefix,payload[i+1],&ch_uriptr[payload[i]]); i+=2; } if(flags2 & TTL_F){ fprintf(fd,"%s TTL_F=[%.*s]\n",prefix,payload[i+1],&ch_uriptr[payload[i]]); i+=2; } if(flags2 & USER_F){ fprintf(fd,"%s USER_F=[%.*s]\n",prefix,payload[i+1],&ch_uriptr[payload[i]]); i+=2; } if(flags2 & METHOD_F){ fprintf(fd,"%s METHOD_F=[%.*s]\n",prefix,payload[i+1],&ch_uriptr[payload[i]]); i+=2; } if(flags2 & MADDR_F){ fprintf(fd,"%s MADDR_F=[%.*s]\n",prefix,payload[i+1],&ch_uriptr[payload[i]]); i+=2; } if(flags2 & LR_F){ fprintf(fd,"%s LR_F=[%.*s]\n",prefix,payload[i+1],&ch_uriptr[payload[i]]); i+=2; } print_encoded_parameters(fd,&payload[i],ch_uriptr,paylen-i,prefix); return 0; }