Browse Source

*** empty log message ***

Jan Janak 23 years ago
parent
commit
a054d7d50d

+ 1 - 1
parser/case_allo.h

@@ -18,4 +18,4 @@
     goto other;
 
 
-#endif
+#endif /* CASE_ALLO_H */

+ 1 - 1
parser/case_auth.h

@@ -47,4 +47,4 @@
      goto other;
 
 
-#endif
+#endif /* CASE_AUTH_H */

+ 1 - 1
parser/case_call.h

@@ -34,4 +34,4 @@
      goto other;
 
 
-#endif
+#endif /* CASE_CALL_H */

+ 1 - 1
parser/case_cont.h

@@ -76,4 +76,4 @@
      goto other;
 
 
-#endif
+#endif /* CASE_CONT_H */

+ 1 - 1
parser/case_cseq.h

@@ -14,4 +14,4 @@
      goto dc_end
 
 
-#endif
+#endif /* CASE_CSEQ_H */

+ 21 - 0
parser/case_even.h

@@ -0,0 +1,21 @@
+/*
+ * $Id$
+ *
+ * Event header field parser macros
+ */
+
+#ifndef CASE_EVEN_H
+#define CASE_EVEN_H
+
+
+#define Even_CASE                     \
+    p += 4;                           \
+    if ((*p == 't') || (*p == 'T')) { \
+            hdr->type = HDR_EVENT;    \
+            p++;                      \
+	    goto dc_end;              \
+    }                                 \
+    goto other;
+
+
+#endif /* CASE_EVEN_H */

+ 1 - 1
parser/case_expi.h

@@ -33,4 +33,4 @@
         goto other;
 
 
-#endif
+#endif /* CASE_EXPI_H */

+ 1 - 1
parser/case_from.h

@@ -14,4 +14,4 @@
         goto dc_end
 
 
-#endif
+#endif /* CASE_FROM_H */

+ 1 - 1
parser/case_max.h

@@ -39,4 +39,4 @@
      goto other;       \
 
 
-#endif
+#endif /* CASE_MAX_H */

+ 1 - 1
parser/case_prox.h

@@ -96,4 +96,4 @@
         goto other;
 
 
-#endif
+#endif /* CASE_PROX_H */

+ 3 - 3
parser/case_reco.h

@@ -4,8 +4,8 @@
  * Record-Route header field parser macros
  */
 
-#ifndef RECO_CASE_H
-#define RECO_CASE_H
+#ifndef CASE_RECO_H
+#define CASE_RECO_H
 
 
 #define OUTE_CASE                            \
@@ -39,5 +39,5 @@
         goto other;
 
 
-#endif
+#endif /* CASE_RECO_H */
 

+ 1 - 1
parser/case_requ.h

@@ -33,4 +33,4 @@
         goto other;
 
 
-#endif
+#endif /* CASE_REQU_H */

+ 1 - 2
parser/case_rout.h

@@ -22,5 +22,4 @@
      }
 
 
-#endif
-
+#endif /* CASE_ROUT_H */

+ 1 - 1
parser/case_supp.h

@@ -31,4 +31,4 @@
         goto other;
 
 
-#endif
+#endif /* CASE_SUPP_H */

+ 1 - 1
parser/case_to.h

@@ -15,4 +15,4 @@
         return (p + 4);
 
 
-#endif
+#endif /* CASE_TO_H */

+ 1 - 1
parser/case_unsu.h

@@ -46,4 +46,4 @@
         goto other;       \
 
 
-#endif
+#endif /* CASE_UNSU_H */

+ 1 - 1
parser/case_via.h

@@ -21,4 +21,4 @@
         goto dc_end
 
 
-#endif
+#endif /* CASE_VIA_H */

+ 1 - 1
parser/case_www.h

@@ -54,4 +54,4 @@
         goto other;
 
 
-#endif
+#endif /* CASE_WWW_H */

+ 19 - 1
parser/keys.h

@@ -650,5 +650,23 @@
 #define _CATe_ 0x65544143   /* "CATe" */
 #define _CATE_ 0x45544143   /* "CATE" */
 
-#endif
+#define _even_ 0x6e657665   /* "even" */
+#define _eveN_ 0x4e657665   /* "eveN" */
+#define _evEn_ 0x6e457665   /* "evEn" */
+#define _evEN_ 0x4e457665   /* "evEN" */
+#define _eVen_ 0x6e655665   /* "eVen" */
+#define _eVeN_ 0x4e655665   /* "eVeN" */
+#define _eVEn_ 0x6e455665   /* "eVEn" */
+#define _eVEN_ 0x4e455665   /* "eVEN" */
+#define _Even_ 0x6e657645   /* "Even" */
+#define _EveN_ 0x4e657645   /* "EveN" */
+#define _EvEn_ 0x6e457645   /* "EvEn" */
+#define _EvEN_ 0x4e457645   /* "EvEN" */
+#define _EVen_ 0x6e655645   /* "EVen" */
+#define _EVeN_ 0x4e655645   /* "EVeN" */
+#define _EVEn_ 0x6e455645   /* "EVEn" */
+#define _EVEN_ 0x4e455645   /* "EVEN" */
+
+
+#endif /* KEYS_H */
 

+ 3 - 3
parser/parse_def.h

@@ -2,10 +2,10 @@
  * $Id$
  */
 
-#ifndef PARSE_DEF
-#define PARSE_DEF
+#ifndef PARSE_DEF_H
+#define PARSE_DEF_H
 
 #define PARSE_ERROR -1
 #define PARSE_OK 1
 
-#endif
+#endif /* PARSE_DEF_H */

+ 125 - 0
parser/parse_event.c

@@ -0,0 +1,125 @@
+/*
+ * $Id$
+ *
+ * Event header field body parser.
+ * The parser was written for Presence Agent module only.
+ * it recognize presence package only, no subpackages, no parameters
+ * It should be replaced by a more generic parser if subpackages or
+ * parameters should be parsed too.
+ */
+
+#include "parse_event.h"
+#include "../mem/mem.h"    /* pkg_malloc, pkg_free */
+#include "../dprint.h"
+#include <string.h>        /* memset */
+#include "../trim.h"       /* trim_leading */
+#include <stdio.h>         /* printf */
+
+
+#define PRES_STR "presence"
+#define PRES_STR_LEN 8
+
+
+static inline char* skip_token_nodot(char* _b, int _l)
+{
+	int i = 0;
+
+	for(i = 0; i < _l; i++) {
+		switch(_b[i]) {
+		case ' ':
+		case '\r':
+		case '\n':
+		case '\t':
+		case ';':
+		case '.':
+			return _b + i;
+		}
+	}
+
+	return _b + _l;
+}
+
+
+static inline int event_parser(char* _s, int _l, event_t* _e)
+{
+	str tmp;
+	char* end;
+
+	tmp.s = _s;
+	tmp.len = _l;
+
+	trim_leading(&tmp);
+
+	if (tmp.len == 0) {
+		LOG(L_ERR, "event_parser(): Empty body\n");
+		return -1;
+	}
+
+	_e->text.s = tmp.s;
+
+	end = skip_token_nodot(tmp.s, tmp.len);
+
+	tmp.len = end - tmp.s;
+
+	if ((tmp.len == PRES_STR_LEN) && 
+	    !strncasecmp(PRES_STR, tmp.s, tmp.len)) {
+		_e->parsed = EVENT_PRESENCE;
+	} else {
+		_e->parsed = EVENT_OTHER;
+	}
+
+	return 0;
+}
+
+
+/*
+ * Parse Event header field body
+ */
+int parse_event(struct hdr_field* _h)
+{
+	event_t* e;
+
+	if (_h->parsed != 0) {
+		return 0;
+	}
+
+	e = (event_t*)pkg_malloc(sizeof(event_t));
+	if (e == 0) {
+		LOG(L_ERR, "parse_event(): No memory left\n");
+		return -1;
+	}
+
+	memset(e, 0, sizeof(event_t));
+
+	if (event_parser(_h->body.s, _h->body.len, e) < 0) {
+		LOG(L_ERR, "parse_event(): Error in event_parser\n");
+		pkg_free(e);
+		return -2;
+	}
+
+	_h->parsed = (void*)e;
+	return 0;
+}
+
+
+/*
+ * Free all memory
+ */
+void free_event(event_t** _e)
+{
+	if (*_e) pkg_free(*_e);
+	*_e = 0;
+}
+
+
+/*
+ * Print structure, for debugging only
+ */
+void print_event(event_t* _e)
+{
+	printf("===Event===\n");
+	printf("text  : %.*s\n", _e->text.len, _e->text.s);
+	printf("parsed: %s\n", 
+	       (_e->parsed == EVENT_PRESENCE) ? ("EVENT_PRESENCE") : ("EVENT_OTHER"));
+	printf("===/Event===\n");
+}

+ 45 - 0
parser/parse_event.h

@@ -0,0 +1,45 @@
+/*
+ * $Id$
+ *
+ * Event header field body parser
+ * This parser was written for Presence Agent module only.
+ * it recognize presence package only, no subpackages, no parameters
+ * It should be replaced by a more generic parser if subpackages or
+ * parameters should be parsed too.
+ */
+
+#ifndef PARSE_EVENT_H
+#define PARSE_EVENT_H
+
+#include "../str.h"
+#include "hf.h"
+
+#define EVENT_OTHER    0
+#define EVENT_PRESENCE 1
+
+
+typedef struct event {
+	str text;       /* Original string representation */
+	int parsed;     /* Parsed variant */
+} event_t;
+
+
+/*
+ * Parse Event HF body
+ */
+int parse_event(struct hdr_field* _h);
+
+
+/*
+ * Release memory
+ */
+void free_event(event_t** _e);
+
+
+/*
+ * Print structure, for debugging only
+ */
+void print_event(event_t* _e);
+
+
+#endif /* PARSE_EVENT_H */

+ 106 - 0
parser/parse_expires.c

@@ -0,0 +1,106 @@
+/*
+ * $Id$
+ *
+ * Expires header field body parser
+ */
+
+#include "parse_expires.h"
+#include <stdio.h>          /* printf */
+#include "../mem/mem.h"     /* pkg_malloc, pkg_free */
+#include "../dprint.h"
+#include "../trim.h"        /* trim_leading */
+#include <string.h>         /* memset */
+
+
+static inline int expires_parser(char* _s, int _l, exp_body_t* _e)
+{
+	int i;
+	str tmp;
+	
+	tmp.s = _s;
+	tmp.len = _l;
+
+	trim_leading(&tmp);
+
+	if (tmp.len == 0) {
+		LOG(L_ERR, "expires_parser(): Empty body\n");
+		return -1;
+	}
+
+	_e->text.s = tmp.s;
+
+	for(i = 0; i < tmp.len; i++) {
+		if ((tmp.s[i] >= '0') && (tmp.s[i] <= '9')) {
+			_e->val *= 10;
+			_e->val += tmp.s[i] - '0';
+		} else {
+			switch(tmp.s[i]) {
+			case ' ':
+			case '\t':
+			case '\r':
+			case '\n':
+				_e->text.len = i;
+				return 0;
+
+			default:
+				LOG(L_ERR, "expires_parser(): Invalid character\n");
+				return -2;
+			}
+		}
+	}
+
+	_e->text.len = _l;
+	return 0;
+}
+
+
+/*
+ * Parse expires header field body
+ */
+int parse_expires(struct hdr_field* _h)
+{
+	exp_body_t* e;
+
+	if (_h->parsed) {
+		return 0;  /* Already parsed */
+	}
+
+	e = (exp_body_t*)pkg_malloc(sizeof(exp_body_t));
+	if (e == 0) {
+		LOG(L_ERR, "parse_expires(): No memory left\n");
+		return -1;
+	}
+	
+	memset(e, 0, sizeof(exp_body_t));
+
+	if (expires_parser(_h->body.s, _h->body.len, e) < 0) {
+		LOG(L_ERR, "parse_expires(): Error while parsing\n");
+		pkg_free(e);
+		return -2;
+	}
+	
+	_h->parsed = (void*)e;
+	return 0;
+}
+
+
+/*
+ * Free all memory associated with exp_body_t
+ */
+void free_expires(exp_body_t** _e)
+{
+	pkg_free(*_e);
+	*_e = 0;
+}
+
+
+/*
+ * Print exp_body_t content, for debugging only
+ */
+void print_expires(exp_body_t* _e)
+{
+	printf("===Expires===\n");
+	printf("text: %.*s\n", _e->text.len, _e->text.s);
+	printf("val : %d\n", _e->val);
+	printf("===/Expires===\n");
+}

+ 38 - 0
parser/parse_expires.h

@@ -0,0 +1,38 @@
+/*
+ * $Id$
+ *
+ * Expires header field body parser
+ */
+
+#ifndef PARSE_EXPIRES_H
+#define PARSE_EXPIRES_H
+
+#include "../str.h"
+#include "hf.h"
+
+
+typedef struct exp_body {
+	str text;          /* Original text representation */
+	int val;           /* Parsed value */
+} exp_body_t;
+
+
+/*
+ * Parse expires header field body
+ */
+int parse_expires(struct hdr_field* _h);
+
+
+/*
+ * Free all memory associated with exp_body_t
+ */
+void free_expires(exp_body_t** _e);
+
+
+/*
+ * Print exp_body_t content, for debugging only
+ */
+void print_expires(exp_body_t* _e);
+
+
+#endif /* PARSE_EXPIRES_H */

+ 15 - 6
parser/parse_hname2.c

@@ -121,6 +121,7 @@ static inline int unify(int key)
 #include "case_requ.h"     /* Require */
 #include "case_supp.h"     /* Supported */
 #include "case_www.h"      /* WWW-Authenticate */
+#include "case_even.h"     /* Event */
 
 
 #define READ(val) \
@@ -145,7 +146,8 @@ static inline int unify(int key)
 	case _Unsu_: Unsu_CASE; \
 	case _Requ_: Requ_CASE; \
 	case _Supp_: Supp_CASE; \
-        case _WWW__: WWW_CASE;
+        case _WWW__: WWW_CASE;  \
+        case _Even_: Even_CASE;
 
 
 #define PARSE_COMPACT(id)          \
@@ -234,6 +236,11 @@ char* parse_hname2(char* begin, char* end, struct hdr_field* hdr)
 		case 'k':
 			PARSE_COMPACT(HDR_SUPPORTED);
                         break;
+
+		case 'O':
+		case 'o':
+			PARSE_COMPACT(HDR_EVENT);
+			break;
 		}
 		
 		val = unify(val);
@@ -272,10 +279,10 @@ char* parse_hname2(char* begin, char* end, struct hdr_field* hdr)
 
 
 /* Number of distinct keys */
-#define NUM_KEYS  592
+#define NUM_KEYS  608
 
 /* Number of distinct values */
-#define NUM_VALS 49
+#define NUM_VALS 50
 
 
 /*
@@ -293,7 +300,7 @@ void init_hfname_parser(void)
 		_thor_, _izat_, _ion2_, _ion1_, _y_Re_, _quir_, _Reco_, _rd_R_,
 		_oute_, _Requ_, _ire2_, _ire1_, _Rout_, _Supp_, _orte_, _To12_,
 		_Unsu_, _ppor_, _ted2_, _ted1_, _Via2_, _Via1_, _WWW__, _enti_,
-		_cate_
+		_cate_, _Even_
 	};
 
 	     /* Number of keys associated to each value */
@@ -304,7 +311,7 @@ void init_hfname_parser(void)
 		16, 16,  8,  8,  8, 16, 16,  8, 
 		16, 16,  8,  8, 16, 16, 16,  4, 
 		16, 16,  8,  8,  8,  8,  8, 16,
-                16
+                16, 16
 	};
 
 	     /* Hash table keys */
@@ -382,7 +389,9 @@ void init_hfname_parser(void)
 		_enti_, _entI_, _enTi_, _enTI_, _eNti_, _eNtI_, _eNTi_, _eNTI_, 
 		_Enti_, _EntI_, _EnTi_, _EnTI_, _ENti_, _ENtI_, _ENTi_, _ENTI_, 
 		_cate_, _catE_, _caTe_, _caTE_, _cAte_, _cAtE_, _cATe_, _cATE_, 
-		_Cate_, _CatE_, _CaTe_, _CaTE_, _CAte_, _CAtE_, _CATe_, _CATE_
+		_Cate_, _CatE_, _CaTe_, _CaTE_, _CAte_, _CAtE_, _CATe_, _CATE_,
+		_even_, _eveN_, _evEn_, _evEN_, _eVen_, _eVeN_, _eVEn_, _eVEN_, 
+		_Even_, _EveN_, _EvEn_, _EvEN_, _EVen_, _EVeN_, _EVEn_, _EVEN_, 
 	}; 
 
 	     /* Mark all elements as empty */