/*
 * tst  
 */

#include <stdio.h>
#include <string.h>

#include "msg_parser.h"
#include "dprint.h"

#define BSIZE 1024
char buf[BSIZE+1];

void main()
{
	char* rest;
	char* tmp;
	char* first_via;
	char* second_via;
	struct msg_start fl;
	struct hdr_field hf;
	struct via_body vb1, vb2;

	int len;
	int offset;
	int r;

	while(!feof(stdin)){
		len=fread(buf,1,BSIZE,stdin);
		buf[len+1]=0;
		printf("read <%s>(%d)\n",buf,strlen(buf));
		fflush(stdin);
	
		/* eat crlf from the beginning */
		for (tmp=buf; (*tmp=='\n' || *tmp=='\r')&&
				tmp-buf < len ; tmp++);
		offset=tmp-buf;
		rest=parse_first_line(tmp, len-offset, &fl);
		offset+=rest-tmp;
		tmp=rest;
		switch(fl.type){
			case SIP_INVALID:
				printf("invalid message\n");
				break;
			case SIP_REQUEST:
				printf("SIP Request:\n");
				printf(" method:  <%s>\n",fl.u.request.method);
				printf(" uri:     <%s>\n",fl.u.request.uri);
				printf(" version: <%s>\n",fl.u.request.version);
				break;
			case SIP_REPLY:
				printf("SIP Reply  (status):\n");
				printf(" version: <%s>\n",fl.u.reply.version);
				printf(" status:  <%s>\n",fl.u.reply.status);
				printf(" reason:  <%s>\n",fl.u.reply.reason);
				break;
			default:
				printf("unknown type %d\n",fl.type);
		}
		
		/*find first Via: */
		hf.type=HDR_ERROR;
		first_via=0;
		second_via=0;
		do{
			rest=get_hdr_field(tmp, len-offset, &hf);
			offset+=rest-tmp;
			tmp=rest;
			switch (hf.type){
				case HDR_ERROR:
					DPrint("ERROR: bad header  field\n");
					goto  error;
				case HDR_EOH: 
					goto eoh;
				case HDR_VIA:
					if (first_via==0) first_via=hf.body;
					else if (second_via==0) second_via=hf.body;
					break;
			}
			printf("header field type %d, name=<%s>, body=<%s>\n",
				hf.type, hf.name, hf.body);

		
		}while(hf.type!=HDR_EOH && rest-buf < len);

	eoh:
		/* replace cr/lf with space in first via */
		for (tmp=first_via;(first_via) && (*tmp);tmp++)
			if ((*tmp=='\r')||(*tmp=='\n'))	*tmp=' ';

		printf("first via: <%s>\n", first_via);
		tmp=parse_via_body(first_via, strlen(first_via), &vb1);
		if (vb1.error!=VIA_PARSE_OK){
			DPrint("ERROR: parsing via body: %s\n", first_via);
			goto error;
		}
		/* compact via */
		if (vb1.next) second_via=vb1.next;
		if (second_via) {
			tmp=parse_via_body(second_via, strlen(second_via), &vb2);
			if (vb2.error!=VIA_PARSE_OK){
				DPrint("ERROR: parsing via body: %s\n", second_via);
				goto error;
			}
		}
		
		/* dump parsed data */
		printf(" first  via: <%s/%s/%s> <%s:%d>",
				vb1.name, vb1.version, vb1.transport, vb1.host, vb1.port);
		if (vb1.params) printf(";<%s>", vb1.params);
		if (vb1.comment) printf(" <%s>", vb1.comment);
		printf ("\n");
		if (second_via){
			printf(" second via: <%s/%s/%s> <%s:%d>",
					vb2.name, vb2.version, vb2.transport, vb2.host, vb2.port);
			if (vb2.params) printf(";<%s>", vb2.params);
			if (vb2.comment) printf(" <%s>", vb2.comment);
			printf ("\n");
		}

		

	error:
		/* find endof msg */
		printf("rest:(buffer=%x, rest=%x)\n%s\n.\n",buf,rest,rest);

		for (r=0; r<len+1;r++)
			printf("%02x ", buf[r]);
		printf("\n*rest=%02x\n",*rest);
		
	}
}