* $Id$

#ifndef msg_parser_h
#define msg_parser_h

#include "data_lump.h"

#define SIP_REQUEST 1
#define SIP_REPLY   2
#define SIP_INVALID 0

#define HDR_ERROR 0
/* end of header */
#define HDR_EOH   -1
#define HDR_OTHER 1
#define HDR_VIA   2
#define HDR_TO    3

#define VIA_PARSE_OK	1
#define VIA_PARSE_ERROR -1

#define SIP_VERSION	"SIP/2.0"

struct msg_start{
	int type;
	union {
		struct {
			char* method;
			char* uri;
			char* version;
		struct {
			char* version;
			char* status;
			char* reason;

struct hdr_field{   /* format: name':' body */
	int type;
	char* name;
	char* body;

struct via_body{  /* format: name/version/transport host:port;params comment */
	int error;
	char *hdr;   /* contains "Via" or "v" */
	char* name;
	char* version;
	char* transport;
	char* host;
	int port;
	char* params;
	char* comment;
	int size;    /* full size, including hdr */
	char* next; /* pointer to next via body string if compact via or null */

struct sip_msg{
	struct msg_start first_line;
	struct via_body via1;
	struct via_body via2;

	unsigned int src_ip;
	unsigned int dst_ip;
	char* orig; /* original message copy */
	char* buf;  /* scratch pad, holds a modfied message,
				   via, etc. point into it */
	unsigned int len; /* message len (orig) */

	/* modifications */
	char* new_uri; /* changed first line uri*/

	struct lump* add_rm;      /* used for all the forwarded messages */
	struct lump* repl_add_rm; /* only for localy generated replies !!!*/

struct sip_uri{
	char* user;
	char* passwd;
	char* host;
	char* port;
	char* params;
	char* headers;

char* parse_first_line(char* buffer, unsigned int len, struct msg_start * fl);
char* get_hdr_field(char *buffer, unsigned int len, struct hdr_field*  hdr_f);
int field_name(char *s);
char* parse_hostport(char* buf, char** host, short int* port);
char* parse_via_body(char* buffer,unsigned int len, struct via_body * vb);
int parse_msg(char* buf, unsigned int len, struct sip_msg* msg);
int parse_uri(char *buf, int len, struct sip_uri* uri);
void free_uri(struct sip_uri* u);