Browse Source

Contact header field parser extended to parse "received" parameter.

Jan Janak 21 years ago
parent
commit
3294f90429
4 changed files with 23 additions and 8 deletions
  1. 7 5
      parser/contact/contact.c
  2. 1 0
      parser/contact/contact.h
  3. 10 0
      parser/parse_param.c
  4. 5 3
      parser/parse_param.h

+ 7 - 5
parser/contact/contact.c

@@ -245,6 +245,7 @@ int parse_contacts(str* _s, contact_t** _c)
 
 			c->q = hooks.contact.q;
 			c->expires = hooks.contact.expires;
+			c->received = hooks.contact.received;
 			c->method = hooks.contact.method;
 
 			if (_s->len == 0) goto ok;
@@ -306,11 +307,12 @@ void print_contacts(FILE* _o, contact_t* _c)
 
 	while(ptr) {
 		fprintf(_o, "---Contact---\n");
-		fprintf(_o, "name   : '%.*s'\n", ptr->name.len, ptr->name.s);
-		fprintf(_o, "URI    : '%.*s'\n", ptr->uri.len, ptr->uri.s);
-		fprintf(_o, "q      : %p\n", ptr->q);
-		fprintf(_o, "expires: %p\n", ptr->expires);
-		fprintf(_o, "method : %p\n", ptr->method);
+		fprintf(_o, "name    : '%.*s'\n", ptr->name.len, ptr->name.s);
+		fprintf(_o, "URI     : '%.*s'\n", ptr->uri.len, ptr->uri.s);
+		fprintf(_o, "q       : %p\n", ptr->q);
+		fprintf(_o, "expires : %p\n", ptr->expires);
+		fprintf(_o, "received: %p\n", ptr->received);
+		fprintf(_o, "method  : %p\n", ptr->method);
 		if (ptr->params) {
 			print_params(_o, ptr->params);
 		}

+ 1 - 0
parser/contact/contact.h

@@ -49,6 +49,7 @@ typedef struct contact {
 	param_t* q;             /* q parameter hook */
 	param_t* expires;       /* expires parameter hook */
 	param_t* method;        /* method parameter hook */
+	param_t* received;      /* received parameter hook */
 	param_t* params;        /* List of all parameters */
         struct contact* next; /* Next contact in the list */
 } contact_t;

+ 10 - 0
parser/parse_param.c

@@ -80,6 +80,15 @@ static inline void parse_contact_class(param_hooks_t* _h, param_t* _p)
 			_h->contact.method = _p;
 		}
 		break;
+		
+	case 'r':
+	case 'R':
+		if ((_p->name.len == 8) &&
+		    (!strncasecmp(_p->name.s + 1, "eceived", 7))) {
+			_p->type = P_RECEIVED;
+			_h->contact.method = _p;
+		}
+		break;
 	}
 }
 
@@ -465,6 +474,7 @@ static inline void print_param(FILE* _o, param_t* _p)
 	case P_R2:        type = "P_R2";        break;
 	case P_MADDR:     type = "P_MADDR";     break;
 	case P_TTL:       type = "P_TTL";       break;
+	case P_RECEIVED:  type = "P_RECEIVED";  break;
 	default:          type = "UNKNOWN";     break;
 	}
 	

+ 5 - 3
parser/parse_param.h

@@ -47,6 +47,7 @@ typedef enum ptype {
 	P_Q,         /* Contact: q parameter */
 	P_EXPIRES,   /* Contact: expires parameter */
 	P_METHOD,    /* Contact: method parameter */
+	P_RECEIVED,  /* Contact: received parameter */
 	P_TRANSPORT, /* URI: transport parameter */
 	P_LR,        /* URI: lr parameter */
 	P_R2,        /* URI: r2 parameter (ser specific) */
@@ -81,9 +82,10 @@ typedef struct param {
  * Hooks to well known parameters for contact class of parameters
  */
 struct contact_hooks {
-	struct param* expires; /* expires parameter */
-	struct param* q;       /* q parameter */
-	struct param* method;  /* method parameter */
+	struct param* expires;  /* expires parameter */
+	struct param* q;        /* q parameter */
+	struct param* method;   /* method parameter */
+	struct param* received; /* received parameter */
 };