[PATCH] WSP Encoding-Version support

Stipe Tolj <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Organization Wapme Systems AG
Message-ID <[email protected]>
Hi list,

attached patch adds the WSP Encoding-Version handling properly?! to
the WSP session state machine et all.

Please review. This patch is against cvs-20030625, so beware if you
try to apply to current cvs head tree.

Here is a summary:

  * wap/wsp.h: added WSP_1_x enumeration values to identify which WSP
Encoding-Version is used within a session.
  * wap/wsp_headers.h: re-declare wsp_headers_pack() function to add
required WSP version.
  * wap/wsp_server_session_machine.def: added
INTEGER(encoding_version) to hold the version within the WSPMachine.
  * wap/wsp_server_session_states.def: populates the aboe
sm->encoding_version with the appropriate version parsed our of the
request WSP headers.
  * wap/wsp_session.c: added WSP encoding-version mapping functions
wsp_encoding_string_to_version(Octstr *enc) and
wsp_encoding_version_to_string(int version)
  * wap/wsp_strings.c: added VSTRING() define for "versioned STRING"
and VASSIGN() for "versioned ASSIGN" of the .def values.
  * wap/wsp_strings.def: added WSP enumeration values to the
definition tables
  * <all other files>: addopted calling to wsp_headers_pack() with the
version.

Please review and vote for commit. This has been tested on our MMSC
WAP GW and it works as expected.

Stipe

[email protected]
-------------------------------------------------------------------
Wapme Systems AG

Vogelsanger Weg 80
40470 Düsseldorf

Tel: +49-211-74845-0
Fax: +49-211-74845-299

E-Mail: [email protected]
Internet: http://www.wapme-systems.de
-------------------------------------------------------------------
wapme.net - wherever you are
gateway-20020808-wsp-encoding.patch (text/plain, 36.4 KB)
diff -ur --exclude=CVS* old/gateway/test/test_headers.c gateway/test/test_headers.c
--- old/gateway/test/test_headers.c	Fri Apr  4 13:51:04 2003
+++ gateway/test/test_headers.c	Thu Aug  7 16:59:52 2003
@@ -119,7 +119,7 @@
     filename = octstr_create(argv[1]);
     headers = octstr_read_file(octstr_get_cstr(filename));
     split_headers(headers, &split, &expected);
-    packed = wsp_headers_pack(split, 0);
+    packed = wsp_headers_pack(split, 0, WSP_1_2);
     unpacked = wsp_headers_unpack(packed, 0);
 
     if (list_len(unpacked) != list_len(expected)) {
diff -ur --exclude=CVS* old/gateway/wap/wsp.h gateway/wap/wsp.h
--- old/gateway/wap/wsp.h	Mon Apr 22 17:24:14 2002
+++ gateway/wap/wsp.h	Thu Aug  7 15:33:22 2003
@@ -10,6 +10,14 @@
  * int WSP_accepted_header_code_pages[] = { -1 };
  */
 
+typedef enum {
+	WSP_1_1 = 1, 
+    WSP_1_2 = 2, 
+    WSP_1_3 = 3, 
+    WSP_1_4 = 4,
+    WSP_1_5 = 5,
+} wsp_encoding;
+
 /* See Table 35 of the WSP standard */
 enum wsp_abort_values {
 	WSP_ABORT_PROTOERR = 0xe0,
diff -ur --exclude=CVS* old/gateway/wap/wsp_headers.c gateway/wap/wsp_headers.c
--- old/gateway/wap/wsp_headers.c	Thu Jun 19 13:49:12 2003
+++ gateway/wap/wsp_headers.c	Thu Aug  7 17:00:51 2003
@@ -1808,7 +1757,10 @@
     start = octstr_len(packed);
 
     /* Parameter = Typed-parameter | Untyped-parameter */
-    keytoken = wsp_string_to_parameter(parm->key);
+    /* keytoken = wsp_string_to_parameter(parm->key); */
+    /* XXX this should obey what kind of WSP Encoding-Version the client is using */
+    keytoken = wsp_string_to_versioned_parameter(parm->key, WSP_1_2);
+   
     if (keytoken >= 0) {
         /* Typed-parameter = Well-known-parameter-token Typed-value */
         /* Well-known-parameter-token = Integer-value */
@@ -2123,8 +2075,11 @@
 
 static int pack_field_name(Octstr *packed, Octstr *value)
 {
+    /* XXX we need to obey which WSP encoding-version to use */
+    /* return pack_constrained_value(packed, value,
+                                  wsp_string_to_header(value)); */
     return pack_constrained_value(packed, value,
-                                  wsp_string_to_header(value));
+                                  wsp_string_to_versioned_header(value, WSP_1_2));
 }
 
 static int pack_language(Octstr *packed, Octstr *value)
@@ -2232,7 +2187,9 @@
     long media;
 
     parms = strip_parameters(value);
-    media = wsp_string_to_content_type(value);
+    /* XXX we need to obey which WSP encoding-version to use */
+    /* media = wsp_string_to_content_type(value); */
+    media = wsp_string_to_versioned_content_type(value, WSP_1_2);
 
     /* See if we can fit this in a Constrained-media encoding */
     if (parms == NULL && media <= MAX_SHORT_INTEGER) {
@@ -2877,7 +2835,9 @@
         long fieldnum;
 
         http_header_get(headers, i, &fieldname, &value);
-        fieldnum = wsp_string_to_header(fieldname);
+        /* XXX we need to obey which WSP encoding-version to use */
+        /* fieldnum = wsp_string_to_header(fieldname); */
+        fieldnum = wsp_string_to_versioned_header(fieldname, wsp_version);
 
         errors = 0;
 
diff -ur --exclude=CVS* old/gateway/wap/wsp_headers.h gateway/wap/wsp_headers.h
--- old/gateway/wap/wsp_headers.h	Mon Nov 20 20:55:54 2000
+++ gateway/wap/wsp_headers.h	Thu Aug  7 17:05:41 2003
@@ -21,6 +76,6 @@
  * and return the encoded headers as an Octstr. 
  * The second argument is true if the encoded headers should have
  * a leading content-type field.  See the note for wsp_headers_unpack. */
-Octstr *wsp_headers_pack(List *headers, int separate_content_type);
+Octstr *wsp_headers_pack(List *headers, int separate_content_type, int wsp_version);
 
 #endif
diff -ur --exclude=CVS* old/gateway/wap/wsp_server_method_states.def gateway/wap/wsp_server_method_states.def
--- old/gateway/wap/wsp_server_method_states.def	Tue Nov 28 22:15:33 2000
+++ gateway/wap/wsp_server_method_states.def	Thu Aug  7 17:06:25 2003
@@ -260,7 +260,7 @@
 		new_pdu->u.Reply.status = 
 			wsp_convert_http_status_to_wsp_status(e->status);
 		new_pdu->u.Reply.headers = 
-			wsp_headers_pack(e->response_headers, 1);
+			wsp_headers_pack(e->response_headers, 1, WSP_1_2);
 		new_pdu->u.Reply.data = octstr_duplicate(e->response_body);
 
 		/* Send TR-Result.req to WTP */
diff -ur --exclude=CVS* old/gateway/wap/wsp_server_session_machine.def gateway/wap/wsp_server_session_machine.def
--- old/gateway/wap/wsp_server_session_machine.def	Tue Apr 30 11:07:03 2002
+++ gateway/wap/wsp_server_session_machine.def	Thu Aug  7 14:28:13 2003
@@ -19,23 +19,24 @@
 
 
 MACHINE(
-	INTEGER(state)
-	INTEGER(connect_handle)
-	INTEGER(resume_handle)
-	INTEGER(session_id)
-	ADDRTUPLE(addr_tuple)
+    INTEGER(state)
+    INTEGER(connect_handle)
+    INTEGER(resume_handle)
+    INTEGER(session_id)
+    ADDRTUPLE(addr_tuple)
 
-	CAPABILITIES(request_caps)
-	CAPABILITIES(reply_caps)
+    CAPABILITIES(request_caps)
+    CAPABILITIES(reply_caps)
 
-	INTEGER(MOR_push)
-	INTEGER(client_SDU_size)
+    INTEGER(MOR_push)
+    INTEGER(client_SDU_size)
+    INTEGER(encoding_version)
 	
-	HTTPHEADERS(http_headers)
-	COOKIES(cookies)
-        REFERER(referer_url)
-	MACHINESLIST(methodmachines)
-        MACHINESLIST(pushmachines)
+    HTTPHEADERS(http_headers)
+    COOKIES(cookies)
+    REFERER(referer_url)
+    MACHINESLIST(methodmachines)
+    MACHINESLIST(pushmachines)
 )
 
 #undef INTEGER
diff -ur --exclude=CVS* old/gateway/wap/wsp_server_session_states.def gateway/wap/wsp_server_session_states.def
--- old/gateway/wap/wsp_server_session_states.def	Tue Dec  3 13:33:10 2002
+++ gateway/wap/wsp_server_session_states.def	Thu Aug  7 16:42:22 2003
@@ -49,12 +49,31 @@
 		}
 
 		if (pdu->u.Connect.headers_len > 0) {
-			List *hdrs;
+            List *hdrs;
+            Octstr *encoding;
 			
-			hdrs = wsp_headers_unpack(pdu->u.Connect.headers, 0);
-			http_header_pack(hdrs);
-			gw_assert(sm->http_headers == NULL);
-			sm->http_headers = hdrs;
+            hdrs = wsp_headers_unpack(pdu->u.Connect.headers, 0);
+            http_header_pack(hdrs);
+            gw_assert(sm->http_headers == NULL);
+            sm->http_headers = hdrs;
+
+            /*
+             * Get WSP encoding version if provided by device and remember in
+             * session machine for later use in encoding tokenized values.
+             */
+            encoding = http_header_value(sm->http_headers, octstr_imm("Encoding-Version"));
+            if (encoding != NULL) {
+                debug("wsp",0,"WSP: Session machine: Encoding-Version: %s", 
+                      octstr_get_cstr(encoding));
+                sm->encoding_version = wsp_encoding_string_to_version(encoding);
+            } else {
+                /* WAP-230-WSP-20010705-a, section 8.4.2.70, page 97 defines
+                 * by a MUST argument that a non-present Encoding-Version header 
+                 * should be interpreted as WSP 1.2 compliant.
+                 */
+                sm->encoding_version = WSP_1_2; 
+            }
+            octstr_destroy(encoding);
 		}
 
 		/* Send S-Connect.ind to application layer */
diff -ur --exclude=CVS* old/gateway/wap/wsp_session.c gateway/wap/wsp_session.c
--- old/gateway/wap/wsp_session.c	Thu Jun 19 13:49:12 2003
+++ gateway/wap/wsp_session.c	Thu Aug  7 17:03:57 2003
@@ -2,6 +2,7 @@
  * wsp_session.c - Implement WSP session oriented service
  *
  * Lars Wirzenius
+ * Stipe Tolj
  */
 
 
@@ -127,7 +128,8 @@
 
 static void main_thread(void *);
 static int id_belongs_to_session (void *, void *);
-
+static int wsp_encoding_string_to_version(Octstr *enc);
+static Octstr *wsp_encoding_version_to_string(int version);
 
 
 /***********************************************************************
@@ -1011,6 +1013,8 @@
     /* First the case that we have no Encoding-Version header at all. 
      * This case we must assume that the client supports version 1.2
      * or lower. */
+
+    /*
     if (is_default_version(m)) {
         encoding_version = octstr_create("1.2");
     } else if (is_higher_version(m)) {
@@ -1022,60 +1026,65 @@
     }  else {   
         encoding_version = octstr_create("1.3");
     }
+    */
 
     headers = http_create_empty_headers();
+    encoding_version = wsp_encoding_version_to_string(m->encoding_version);
     http_header_add(headers, "Encoding-Version", octstr_get_cstr(encoding_version));
     octstr_destroy(encoding_version);
 
     return headers;
 }
 
-static Octstr *make_connectreply_pdu(WSPMachine *m) {
-	WSP_PDU *pdu;
-	Octstr *os;
-	List *caps;
-        List *reply_headers;
+static Octstr *make_connectreply_pdu(WSPMachine *m) 
+{
+    WSP_PDU *pdu;
+    Octstr *os;
+    List *caps;
+    List *reply_headers;
 	
-	pdu = wsp_pdu_create(ConnectReply);
+    pdu = wsp_pdu_create(ConnectReply);
 
-	pdu->u.ConnectReply.sessionid = m->session_id;
+    pdu->u.ConnectReply.sessionid = m->session_id;
 
-	caps = make_capabilities_reply(m);
-	pdu->u.ConnectReply.capabilities = wsp_cap_pack_list(caps);
-	wsp_cap_destroy_list(caps);
+    caps = make_capabilities_reply(m);
+    pdu->u.ConnectReply.capabilities = wsp_cap_pack_list(caps);
+    wsp_cap_destroy_list(caps);
 
-        reply_headers = make_reply_headers(m);
-	pdu->u.ConnectReply.headers = wsp_headers_pack(reply_headers, 0);
-        http_destroy_headers(reply_headers);
+    reply_headers = make_reply_headers(m);
+    pdu->u.ConnectReply.headers = 
+        wsp_headers_pack(reply_headers, 0, m->encoding_version);
+    http_destroy_headers(reply_headers);
 	
-	os = wsp_pdu_pack(pdu);
-	wsp_pdu_destroy(pdu);
+    os = wsp_pdu_pack(pdu);
+    wsp_pdu_destroy(pdu);
 
-	return os;
+    return os;
 }
 
 
-static Octstr *make_resume_reply_pdu(WSPMachine *m, List *headers) {
-	WSP_PDU *pdu;
-	Octstr *os;
+static Octstr *make_resume_reply_pdu(WSPMachine *m, List *headers) 
+{
+    WSP_PDU *pdu;
+    Octstr *os;
 
-	pdu = wsp_pdu_create(Reply);
+    pdu = wsp_pdu_create(Reply);
 
-	/* Not specified for Resume replies */
-	pdu->u.Reply.status = wsp_convert_http_status_to_wsp_status(HTTP_OK);
-	if (headers == NULL) {
-		headers = http_create_empty_headers();
-		pdu->u.Reply.headers = wsp_headers_pack(headers, 1);
-		http_destroy_headers(headers);
-	} else {
-		pdu->u.Reply.headers = wsp_headers_pack(headers, 1);
-	}
-	pdu->u.Reply.data = octstr_create("");
+    /* Not specified for Resume replies */
+    pdu->u.Reply.status = wsp_convert_http_status_to_wsp_status(HTTP_OK);
+    if (headers == NULL) {
+        headers = http_create_empty_headers();
+        pdu->u.Reply.headers = wsp_headers_pack(headers, 1, m->encoding_version);
+        http_destroy_headers(headers);
+    } else {
+        pdu->u.Reply.headers = wsp_headers_pack(headers, 1, m->encoding_version);
+    }
+    pdu->u.Reply.data = octstr_create("");
 
-	os = wsp_pdu_pack(pdu);
-	wsp_pdu_destroy(pdu);
+    os = wsp_pdu_pack(pdu);
+    wsp_pdu_destroy(pdu);
 
-	return os;
+    return os;
 }
 
 static WSP_PDU *make_confirmedpush_pdu(WAPEvent *e)
@@ -1089,11 +1098,11 @@
  */
         if (e->u.S_ConfirmedPush_Req.push_headers == NULL) {
 	    headers = http_create_empty_headers();
-            pdu->u.ConfirmedPush.headers = wsp_headers_pack(headers, 1);
+            pdu->u.ConfirmedPush.headers = wsp_headers_pack(headers, 1, WSP_1_2);
             http_destroy_headers(headers);
         } else
             pdu->u.ConfirmedPush.headers = 
-                wsp_headers_pack(e->u.S_ConfirmedPush_Req.push_headers, 1);
+                wsp_headers_pack(e->u.S_ConfirmedPush_Req.push_headers, 1, WSP_1_2);
    
         if (e->u.S_ConfirmedPush_Req.push_body == NULL)
 	    pdu->u.ConfirmedPush.data = octstr_create("");
@@ -1115,11 +1124,11 @@
  */
         if (e->u.S_Push_Req.push_headers == NULL) {
 	    headers = http_create_empty_headers();
-            pdu->u.Push.headers = wsp_headers_pack(headers, 1);
+            pdu->u.Push.headers = wsp_headers_pack(headers, 1, WSP_1_2);
             http_destroy_headers(headers);
         } else
             pdu->u.Push.headers = 
-                wsp_headers_pack(e->u.S_Push_Req.push_headers, 1);
+                wsp_headers_pack(e->u.S_Push_Req.push_headers, 1, WSP_1_2);
    
         if (e->u.S_Push_Req.push_body == NULL)
 	    pdu->u.Push.data = octstr_create("");
@@ -1407,6 +1416,7 @@
 	wap_event_destroy(ab);
 }
 
+
 static void abort_pushes(WSPMachine *sm, long reason)
 {
         WAPEvent *ab;
@@ -1431,6 +1441,7 @@
 	return list_search(session_machines, &id, id_belongs_to_session);
 }
 
+
 static int id_belongs_to_session (void *wsp_ptr, void *pid) {
 	WSPMachine *wsp;
 	int *id;
@@ -1443,10 +1454,57 @@
 }
 
 
+static int wsp_encoding_string_to_version(Octstr *enc) 
+{
+    int v;
+    
+    /* default will be WSP 1.2, as defined by WAPWSP */
+    v = WSP_1_2;    
 
+    if (octstr_compare(enc, octstr_imm("1.1")) == 0) {
+        v = WSP_1_1;
+    }
+    else if (octstr_compare(enc, octstr_imm("1.2")) == 0) {
+        v = WSP_1_2;
+    }
+    else if (octstr_compare(enc, octstr_imm("1.3")) == 0) {
+        v = WSP_1_3;
+    }
+    else if (octstr_compare(enc, octstr_imm("1.4")) == 0) {
+        v = WSP_1_4;
+    }
+    else if (octstr_compare(enc, octstr_imm("1.5")) == 0) {
+        v = WSP_1_5;
+    }
 
+    return v;
+}
 
-
-
-
+static Octstr *wsp_encoding_version_to_string(int version) 
+{
+    Octstr *os;
+    
+    switch (version) {
+        case WSP_1_1:
+            os = octstr_create("1.1");
+            break;
+        case WSP_1_2:
+            os = octstr_create("1.2");
+            break;
+        case WSP_1_3:
+            os = octstr_create("1.3");
+            break;
+        case WSP_1_4:
+            os = octstr_create("1.4");
+            break;
+        case WSP_1_5:
+            os = octstr_create("1.5");
+            break;
+        default:
+            os = octstr_create("1.2");
+            break;
+    }
+    
+    return os;
+}
 
diff -ur --exclude=CVS* old/gateway/wap/wsp_strings.c gateway/wap/wsp_strings.c
--- old/gateway/wap/wsp_strings.c	Thu Jan 18 16:25:06 2001
+++ gateway/wap/wsp_strings.c	Thu Aug  7 17:28:42 2003
@@ -27,31 +27,42 @@
     long size;          /* Nr of entries in each of the tables below */
     Octstr **strings;   /* Immutable octstrs */
     long *numbers;      /* Assigned numbers, or NULL for linear tables */
-    int linear;	    /* True for tables defined as LINEAR */
+    int *versions;      /* WSP Encoding-versions, or NULL if non-versioned */
+    int linear;	        /* True for tables defined as LINEAR */
 };
 
-struct element
+struct numbered_element
 {
     unsigned char *str;
     long number;
+    int version;    
+};
+
+struct linear_element
+{
+    unsigned char *str;
+    int version;    
 };
 
 /* Local functions */
 static Octstr *number_to_string(long number, struct table *table);
 static unsigned char *number_to_cstr(long number, struct table *table);
 static long string_to_number(Octstr *ostr, struct table *table);
+static long string_to_versioned_number(Octstr *ostr, struct table *table, int version);
 
 
 /* Declare the data.  For each table "foo", create a foo_strings array
  * to hold the data, and a (still empty) foo_table structure. */
 #define LINEAR(name, strings) \
-    static const unsigned char *name##_strings[] = { strings }; \
+    static const struct linear_element name##_strings[] = { strings }; \
     static struct table name##_table;
-#define STRING(string) string,
+#define STRING(string) { string, 0 },
+#define VSTRING(version, string) { string, version }, 
 #define NUMBERED(name, strings) \
-    static const struct element name##_strings[] = { strings }; \
+    static const struct numbered_element name##_strings[] = { strings }; \
     static struct table name##_table;
-#define ASSIGN(string, number) { string, number },
+#define ASSIGN(string, number) { string, number, 0 },
+#define VASSIGN(version, string, number) { string, number, version },
 #include "wsp_strings.def"
 
 /* Define the functions for translating number to Octstr */
@@ -74,6 +85,12 @@
 }
 #include "wsp_strings.def"
 
+#define LINEAR(name, strings) \
+long wsp_string_to_versioned_##name(Octstr *ostr, int version) { \
+     return string_to_versioned_number(ostr, &name##_table, version); \
+}
+#include "wsp_strings.def"
+
 static Octstr *number_to_string(long number, struct table *table)
 {
     long i;
@@ -81,13 +98,13 @@
     gw_assert(initialized);
 
     if (table->linear) {
-	if (number >= 0 && number < table->size)
-	    return octstr_duplicate(table->strings[number]);
+        if (number >= 0 && number < table->size)
+            return octstr_duplicate(table->strings[number]);
     } else {
-	for (i = 0; i < table->size; i++) {
-   	     if (table->numbers[i] == number)
-		return octstr_duplicate(table->strings[i]);
-	}
+        for (i = 0; i < table->size; i++) {
+            if (table->numbers[i] == number)
+                return octstr_duplicate(table->strings[i]);
+        }
     }
     return NULL;
 }
@@ -126,34 +143,61 @@
     return -1;
 }
 
-static void construct_linear_table(struct table *table,
-const unsigned char **strings, long size)
+/* Case-insensitive string lookup according to passed WSP encoding version */
+static long string_to_versioned_number(Octstr *ostr, struct table *table, 
+                                       int version)
+{
+    long i, ret;
+
+    gw_assert(initialized);
+
+    /* walk the whole table and pick the highest versioned token */
+    ret = -1;
+    for (i = 0; i < table->size; i++) {
+        if (octstr_case_compare(ostr, table->strings[i]) == 0 &&
+            table->versions[i] <= version) {
+                ret = table->linear ? i : table->numbers[i];
+        }
+    }
+
+    debug("wsp.strings",0,"WSP: Mapping string `%s', WSP version 1.%d to binary " 
+          "representation `0x%04x'.", octstr_get_cstr(ostr), version, ret);
+
+    return ret;
+}
+
+static void construct_linear_table(struct table *table, const struct linear_element *strings, 
+                                   long size)
 {
     long i;
 
     table->size = size;
     table->strings = gw_malloc(size * (sizeof table->strings[0]));
     table->numbers = NULL;
+    table->versions = gw_malloc(size * (sizeof table->versions[0]));
     table->linear = 1;
 
     for (i = 0; i < size; i++) {
-	table->strings[i] = octstr_imm(strings[i]);
+        table->strings[i] = octstr_imm(strings[i].str);
+        table->versions[i] = strings[i].version;
     }
 }
 
-static void construct_numbered_table(struct table *table,
-const struct element *strings, long size)
+static void construct_numbered_table(struct table *table, const struct numbered_element *strings, 
+                                     long size)
 {
     long i;
 
     table->size = size;
     table->strings = gw_malloc(size * (sizeof table->strings[0]));
     table->numbers = gw_malloc(size * (sizeof table->numbers[0]));
+    table->versions = gw_malloc(size * (sizeof table->versions[0]));
     table->linear = 0;
 
     for (i = 0; i < size; i++) {
-	table->strings[i] = octstr_imm(strings[i].str);
-	table->numbers[i] = strings[i].number;
+        table->strings[i] = octstr_imm(strings[i].str);
+        table->numbers[i] = strings[i].number;
+        table->versions[i] = strings[i].version;
     }
 }
 
@@ -163,6 +207,7 @@
 
     gw_free(table->strings);
     gw_free(table->numbers);
+    gw_free(table->versions);
 }
 
 void wsp_strings_init(void)
diff -ur --exclude=CVS* old/gateway/wap/wsp_strings.def gateway/wap/wsp_strings.def
--- old/gateway/wap/wsp_strings.def	Tue Jun 24 16:32:13 2003
+++ gateway/wap/wsp_strings.def	Thu Aug  7 16:30:32 2003
@@ -22,6 +22,11 @@
 #define ASSIGN(string, number) STRING(string)
 #endif
 
+/* Entry in a versioned NUMBERED table */
+#if !defined(VASSIGN)
+#define VASSIGN(version, string, number) VSTRING(version, string)
+#endif
+
 /* Just like LINEAR, but an enumerated type name##_enum is defined for
  * the entries. */
 #if !defined(NAMED)
@@ -33,149 +38,172 @@
 #define NSTRING(string, name) STRING(string)
 #endif
 
+/* Entry in a versioned NAMED table */
+#if !defined(VNSTRING)
+#define VNSTRING(version, string, name) VSTRING(version, string)
+#endif
+
+
 /**** End of preprocessor magic.  Tables start here. ****/
 
 /* Table 39. Header Field Name Assignments. Note that headers Accept-Charset, Accept-Encoding,
  * Cache-Control and Content-Range are defined twice. First ones should be used only for com-
  * pability reasons. */
 NAMED(header,
-NSTRING("Accept", WSP_HEADER_ACCEPT)
-NSTRING("Accept-Charset", WSP_HEADER_ACCEPT_CHARSET)
-NSTRING("Accept-Encoding", WSP_HEADER_ACCEPT_ENCODING)
-NSTRING("Accept-Language", WSP_HEADER_ACCEPT_LANGUAGE)
-NSTRING("Accept-Ranges", WSP_HEADER_ACCEPT_RANGES)
-NSTRING("Age", WSP_HEADER_AGE)
-NSTRING("Allow", WSP_HEADER_ALLOW)
-NSTRING("Authorization", WSP_HEADER_AUTHORIZATION)
-NSTRING("Cache-Control", WSP_HEADER_CACHE_CONTROL)
-NSTRING("Connection", WSP_HEADER_CONNECTION)
-NSTRING("Content-Base", WSP_HEADER_CONTENT_BASE)
-NSTRING("Content-Encoding", WSP_HEADER_CONTENT_ENCODING)
-NSTRING("Content-Language", WSP_HEADER_CONTENT_LANGUAGE)
-NSTRING("Content-Length", WSP_HEADER_CONTENT_LENGTH)
-NSTRING("Content-Location", WSP_HEADER_CONTENT_LOCATION)
-NSTRING("Content-MD5", WSP_HEADER_CONTENT_MD5)
-NSTRING("Content-Range", WSP_HEADER_CONTENT_RANGE)
-NSTRING("Content-Type", WSP_HEADER_CONTENT_TYPE)
-NSTRING("Date", WSP_HEADER_DATE)
-NSTRING("Etag", WSP_HEADER_ETAG)
-NSTRING("Expires", WSP_HEADER_EXPIRES)
-NSTRING("From", WSP_HEADER_FROM)
-NSTRING("Host", WSP_HEADER_HOST)
-NSTRING("If-Modified-Since", WSP_HEADER_IF_MODIFIED_SINCE)
-NSTRING("If-Match", WSP_HEADER_IF_MATCH)
-NSTRING("If-None-Match", WSP_HEADER_IF_NONE_MATCH)
-NSTRING("If-Range", WSP_HEADER_IF_RANGE)
-NSTRING("If-Unmodified-Since", WSP_HEADER_IF_UNMODIFIED_SINCE)
-NSTRING("Location", WSP_HEADER_LOCATION)
-NSTRING("Last-Modified", WSP_HEADER_LAST_MODIFIED)
-NSTRING("Max-Forwards", WSP_HEADER_MAX_FORWARDS)
-NSTRING("Pragma", WSP_HEADER_PRAGMA)
-NSTRING("Proxy-Authenticate", WSP_HEADER_PROXY_AUTHENTICATE)
-NSTRING("Proxy-Authorization", WSP_HEADER_PROXY_AUTHORIZATION)
-NSTRING("Public", WSP_HEADER_PUBLIC)
-NSTRING("Range", WSP_HEADER_RANGE)
-NSTRING("Referer", WSP_HEADER_REFERER)
-NSTRING("Retry-After", WSP_HEADER_RETRY_AFTER)
-NSTRING("Server", WSP_HEADER_SERVER)
-NSTRING("Transfer-Encoding", WSP_HEADER_TRANSFER_ENCODING)
-NSTRING("Upgrade", WSP_HEADER_UPGRADE)
-NSTRING("User-Agent", WSP_HEADER_USER_AGENT)
-NSTRING("Vary", WSP_HEADER_VARY)
-NSTRING("Via", WSP_HEADER_VIA)
-NSTRING("Warning", WSP_HEADER_WARNING)
-NSTRING("WWW-Authenticate", WSP_HEADER_WWW_AUTHENTICATE)
-NSTRING("Content-Disposition", WSP_HEADER_CONTENT_DISPOSITION)
-NSTRING("X-Wap-Application-Id", WSP_HEADER_X_WAP_APPLICATION_ID)
-NSTRING("X-Wap-Content-URI", WSP_HEADER_X_WAP_CONTENT_URI)
-NSTRING("X-Wap-Initiator-URI", WSP_HEADER_X_WAP_INITIATOR_URI)
-NSTRING("Accept-Application", WSP_HEADER_ACCEPT_APPLICATION)
-NSTRING("Bearer-Indication", WSP_HEADER_BEARER_INDICATION)
-NSTRING("Push-Flag", WSP_HEADER_PUSH_FLAG)
-NSTRING("Profile", WSP_HEADER_PROFILE)
-NSTRING("Profile-Diff", WSP_HEADER_PROFILE_DIFF)
-NSTRING("Profile-Warning", WSP_HEADER_PROFILE_WARNING)
-NSTRING("Expect", WSP_HEADER_EXPECT)
-NSTRING("TE", WSP_HEADER_TE)
-NSTRING("Trailer", WSP_HEADER_TRAILER)
-NSTRING("Accept-Charset", WSP_HEADER_ACCEPT_CHARSET_V13)
-NSTRING("Accept-Encoding", WSP_HEADER_ACCEPT_ENCODING_V13)
-NSTRING("Cache-Control", WSP_HEADER_CACHE_CONTROL_V13)
-NSTRING("Content-Range", WSP_HEADER_CONTENT_RANGE_V13)
-NSTRING("X-WAP-Tod", WSP_HEADER_X_WAP_TOD)
-NSTRING("Content-ID", WSP_HEADER_CONTENT_ID)
-NSTRING("Set-Cookie", WSP_HEADER_SET_COOKIE)
-NSTRING("Cookie", WSP_HEADER_COOKIE)
-NSTRING("Encoding-Version", WSP_HEADER_ENCODING_VERSION)
+VNSTRING(WSP_1_1, "Accept", WSP_HEADER_ACCEPT)
+VNSTRING(WSP_1_1, "Accept-Charset", WSP_HEADER_ACCEPT_CHARSET)
+VNSTRING(WSP_1_1, "Accept-Encoding", WSP_HEADER_ACCEPT_ENCODING)
+VNSTRING(WSP_1_1, "Accept-Language", WSP_HEADER_ACCEPT_LANGUAGE)
+VNSTRING(WSP_1_1, "Accept-Ranges", WSP_HEADER_ACCEPT_RANGES)
+VNSTRING(WSP_1_1, "Age", WSP_HEADER_AGE)
+VNSTRING(WSP_1_1, "Allow", WSP_HEADER_ALLOW)
+VNSTRING(WSP_1_1, "Authorization", WSP_HEADER_AUTHORIZATION)
+VNSTRING(WSP_1_1, "Cache-Control", WSP_HEADER_CACHE_CONTROL)
+VNSTRING(WSP_1_1, "Connection", WSP_HEADER_CONNECTION)
+VNSTRING(WSP_1_1, "Content-Base", WSP_HEADER_CONTENT_BASE)
+VNSTRING(WSP_1_1, "Content-Encoding", WSP_HEADER_CONTENT_ENCODING)
+VNSTRING(WSP_1_1, "Content-Language", WSP_HEADER_CONTENT_LANGUAGE)
+VNSTRING(WSP_1_1, "Content-Length", WSP_HEADER_CONTENT_LENGTH)
+VNSTRING(WSP_1_1, "Content-Location", WSP_HEADER_CONTENT_LOCATION)
+VNSTRING(WSP_1_1, "Content-MD5", WSP_HEADER_CONTENT_MD5)
+VNSTRING(WSP_1_1, "Content-Range", WSP_HEADER_CONTENT_RANGE)
+VNSTRING(WSP_1_1, "Content-Type", WSP_HEADER_CONTENT_TYPE)
+VNSTRING(WSP_1_1, "Date", WSP_HEADER_DATE)
+VNSTRING(WSP_1_1, "Etag", WSP_HEADER_ETAG)
+VNSTRING(WSP_1_1, "Expires", WSP_HEADER_EXPIRES)
+VNSTRING(WSP_1_1, "From", WSP_HEADER_FROM)
+VNSTRING(WSP_1_1, "Host", WSP_HEADER_HOST)
+VNSTRING(WSP_1_1, "If-Modified-Since", WSP_HEADER_IF_MODIFIED_SINCE)
+VNSTRING(WSP_1_1, "If-Match", WSP_HEADER_IF_MATCH)
+VNSTRING(WSP_1_1, "If-None-Match", WSP_HEADER_IF_NONE_MATCH)
+VNSTRING(WSP_1_1, "If-Range", WSP_HEADER_IF_RANGE)
+VNSTRING(WSP_1_1, "If-Unmodified-Since", WSP_HEADER_IF_UNMODIFIED_SINCE)
+VNSTRING(WSP_1_1, "Location", WSP_HEADER_LOCATION)
+VNSTRING(WSP_1_1, "Last-Modified", WSP_HEADER_LAST_MODIFIED)
+VNSTRING(WSP_1_1, "Max-Forwards", WSP_HEADER_MAX_FORWARDS)
+VNSTRING(WSP_1_1, "Pragma", WSP_HEADER_PRAGMA)
+VNSTRING(WSP_1_1, "Proxy-Authenticate", WSP_HEADER_PROXY_AUTHENTICATE)
+VNSTRING(WSP_1_1, "Proxy-Authorization", WSP_HEADER_PROXY_AUTHORIZATION)
+VNSTRING(WSP_1_1, "Public", WSP_HEADER_PUBLIC)
+VNSTRING(WSP_1_1, "Range", WSP_HEADER_RANGE)
+VNSTRING(WSP_1_1, "Referer", WSP_HEADER_REFERER)
+VNSTRING(WSP_1_1, "Retry-After", WSP_HEADER_RETRY_AFTER)
+VNSTRING(WSP_1_1, "Server", WSP_HEADER_SERVER)
+VNSTRING(WSP_1_1, "Transfer-Encoding", WSP_HEADER_TRANSFER_ENCODING)
+VNSTRING(WSP_1_1, "Upgrade", WSP_HEADER_UPGRADE)
+VNSTRING(WSP_1_1, "User-Agent", WSP_HEADER_USER_AGENT)
+VNSTRING(WSP_1_1, "Vary", WSP_HEADER_VARY)
+VNSTRING(WSP_1_1, "Via", WSP_HEADER_VIA)
+VNSTRING(WSP_1_1, "Warning", WSP_HEADER_WARNING)
+VNSTRING(WSP_1_1, "WWW-Authenticate", WSP_HEADER_WWW_AUTHENTICATE)
+VNSTRING(WSP_1_1, "Content-Disposition", WSP_HEADER_CONTENT_DISPOSITION)
+VNSTRING(WSP_1_2, "X-Wap-Application-Id", WSP_HEADER_X_WAP_APPLICATION_ID)
+VNSTRING(WSP_1_2, "X-Wap-Content-URI", WSP_HEADER_X_WAP_CONTENT_URI)
+VNSTRING(WSP_1_2, "X-Wap-Initiator-URI", WSP_HEADER_X_WAP_INITIATOR_URI)
+VNSTRING(WSP_1_2, "Accept-Application", WSP_HEADER_ACCEPT_APPLICATION)
+VNSTRING(WSP_1_2, "Bearer-Indication", WSP_HEADER_BEARER_INDICATION)
+VNSTRING(WSP_1_2, "Push-Flag", WSP_HEADER_PUSH_FLAG)
+VNSTRING(WSP_1_2, "Profile", WSP_HEADER_PROFILE)
+VNSTRING(WSP_1_2, "Profile-Diff", WSP_HEADER_PROFILE_DIFF)
+VNSTRING(WSP_1_2, "Profile-Warning", WSP_HEADER_PROFILE_WARNING)
+VNSTRING(WSP_1_3, "Expect", WSP_HEADER_EXPECT)
+VNSTRING(WSP_1_3, "TE", WSP_HEADER_TE)
+VNSTRING(WSP_1_3, "Trailer", WSP_HEADER_TRAILER)
+VNSTRING(WSP_1_3, "Accept-Charset", WSP_HEADER_ACCEPT_CHARSET_V13)
+VNSTRING(WSP_1_3, "Accept-Encoding", WSP_HEADER_ACCEPT_ENCODING_V13)
+VNSTRING(WSP_1_3, "Cache-Control", WSP_HEADER_CACHE_CONTROL_V13)
+VNSTRING(WSP_1_3, "Content-Range", WSP_HEADER_CONTENT_RANGE_V13)
+VNSTRING(WSP_1_3, "X-WAP-Tod", WSP_HEADER_X_WAP_TOD)
+VNSTRING(WSP_1_3, "Content-ID", WSP_HEADER_CONTENT_ID)
+VNSTRING(WSP_1_3, "Set-Cookie", WSP_HEADER_SET_COOKIE)
+VNSTRING(WSP_1_3, "Cookie", WSP_HEADER_COOKIE)
+VNSTRING(WSP_1_3, "Encoding-Version", WSP_HEADER_ENCODING_VERSION)
+VNSTRING(WSP_1_4, "Profile-Warning", WSP_HEADER_PROFILE_WARNING_V14)
+VNSTRING(WSP_1_4, "Content-Disposition", WSP_HEADER_CONTENT_DISPOSITION_V14)
+VNSTRING(WSP_1_4, "X-WAP-Security", WSP_HEADER_X_WAP_SECURITY)
+VNSTRING(WSP_1_4, "Cache-Control", WSP_HEADER_CACHE_CONTROL_V14)
 )
 
-/* Table 40. Content Type Assignments. Only to wsp version 1.3. */
+/* Table 40. Content Type Assignments. These are defined by WINA, 
+ * see http://www.wapforum.org/wina/wsp-content-type.htm 
+ */
 LINEAR(content_type,
-STRING("*/*")
-STRING("text/*")
-STRING("text/html")
-STRING("text/plain")
-STRING("text/x-hdml")
-STRING("text/x-ttml")
-STRING("text/x-vCalendar")
-STRING("text/x-vCard")
-STRING("text/vnd.wap.wml")
-STRING("text/vnd.wap.wmlscript")
-STRING("application/vnd.wap.catc")
-STRING("multipart/*")
-STRING("multipart/mixed")
-STRING("multipart/form-data")
-STRING("multipart/byteranges")
-STRING("multipart/alternative")
-STRING("application/*")
-STRING("application/java-vm")
-STRING("application/x-www-form-urlencoded")
-STRING("application/x-hdmlc")
-STRING("application/vnd.wap.wmlc")
-STRING("application/vnd.wap.wmlscriptc")
-STRING("application/vnd.wap.wsic")
-STRING("application/vnd.wap.uaprof")
-STRING("application/vnd.wap.wtls-ca-certificate")
-STRING("application/vnd.wap.wtls-user-certificate")
-STRING("application/x-x509-ca-cert")
-STRING("application/x-x509-user-cert")
-STRING("image/*")
-STRING("image/gif")
-STRING("image/jpeg")
-STRING("image/tiff")
-STRING("image/png")
-STRING("image/vnd.wap.wbmp")
-STRING("application/vnd.wap.multipart.*")
-STRING("application/vnd.wap.multipart.mixed")
-STRING("application/vnd.wap.multipart.form-data")
-STRING("application/vnd.wap.multipart.byteranges")
-STRING("application/vnd.wap.multipart.alternative")
-STRING("application/xml")
-STRING("text/xml")
-STRING("application/vnd.wap.wbxml")
-STRING("application/x-x968-cross-cert")
-STRING("application/x-x968-ca-cert")
-STRING("application/x-x968-user-cert")
-STRING("text/vnd.wap.si")
-STRING("application/vnd.wap.sic")
-STRING("text/vnd.wap.sl")
-STRING("application/vnd.wap.slc")
-STRING("text/vnd.wap.co")
-STRING("application/vnd.wap.coc")
-STRING("application/vnd.wap.multipart.related")
-STRING("application/vnd.wap.sia")
-STRING("text/vnd.wap.connectivity-xml")
-STRING("application/vnd.wap.connectivity-wbxml")
-/*
-STRING("application/pkcs7-mime")
-STRING("application/vnd.wap.hashed-certificate")
-STRING("application/vnd.wap.signed-certificate")
-STRING("application/vnd.wap.cert-response")
-STRING("application/xhtml+xml")
-STRING("application/wml+xml")
-STRING("text/css")
-STRING("application/vnd.wap.mms-message")
-*/ 
+VSTRING(WSP_1_1, "*/*")
+VSTRING(WSP_1_1, "text/*")
+VSTRING(WSP_1_1, "text/html")
+VSTRING(WSP_1_1, "text/plain")
+VSTRING(WSP_1_1, "text/x-hdml")
+VSTRING(WSP_1_1, "text/x-ttml")
+VSTRING(WSP_1_1, "text/x-vCalendar")
+VSTRING(WSP_1_1, "text/x-vCard")
+VSTRING(WSP_1_1, "text/vnd.wap.wml")
+VSTRING(WSP_1_1, "text/vnd.wap.wmlscript")
+VSTRING(WSP_1_1, "application/vnd.wap.catc")
+VSTRING(WSP_1_1, "multipart/*")
+VSTRING(WSP_1_1, "multipart/mixed")
+VSTRING(WSP_1_1, "multipart/form-data")
+VSTRING(WSP_1_1, "multipart/byteranges")
+VSTRING(WSP_1_1, "multipart/alternative")
+VSTRING(WSP_1_1, "application/*")
+VSTRING(WSP_1_1, "application/java-vm")
+VSTRING(WSP_1_1, "application/x-www-form-urlencoded")
+VSTRING(WSP_1_1, "application/x-hdmlc")
+VSTRING(WSP_1_1, "application/vnd.wap.wmlc")
+VSTRING(WSP_1_1, "application/vnd.wap.wmlscriptc")
+VSTRING(WSP_1_1, "application/vnd.wap.wsic")
+VSTRING(WSP_1_1, "application/vnd.wap.uaprof")
+VSTRING(WSP_1_1, "application/vnd.wap.wtls-ca-certificate")
+VSTRING(WSP_1_1, "application/vnd.wap.wtls-user-certificate")
+VSTRING(WSP_1_1, "application/x-x509-ca-cert")
+VSTRING(WSP_1_1, "application/x-x509-user-cert")
+VSTRING(WSP_1_1, "image/*")
+VSTRING(WSP_1_1, "image/gif")
+VSTRING(WSP_1_1, "image/jpeg")
+VSTRING(WSP_1_1, "image/tiff")
+VSTRING(WSP_1_1, "image/png")
+VSTRING(WSP_1_1, "image/vnd.wap.wbmp")
+VSTRING(WSP_1_1, "application/vnd.wap.multipart.*")
+VSTRING(WSP_1_1, "application/vnd.wap.multipart.mixed")
+VSTRING(WSP_1_1, "application/vnd.wap.multipart.form-data")
+VSTRING(WSP_1_1, "application/vnd.wap.multipart.byteranges")
+VSTRING(WSP_1_1, "application/vnd.wap.multipart.alternative")
+VSTRING(WSP_1_1, "application/xml")
+VSTRING(WSP_1_1, "text/xml")
+VSTRING(WSP_1_1, "application/vnd.wap.wbxml")
+VSTRING(WSP_1_1, "application/x-x968-cross-cert")
+VSTRING(WSP_1_1, "application/x-x968-ca-cert")
+VSTRING(WSP_1_1, "application/x-x968-user-cert")
+VSTRING(WSP_1_1, "text/vnd.wap.si")
+VSTRING(WSP_1_2, "application/vnd.wap.sic")
+VSTRING(WSP_1_2, "text/vnd.wap.sl")
+VSTRING(WSP_1_2, "application/vnd.wap.slc")
+VSTRING(WSP_1_2, "text/vnd.wap.co")
+VSTRING(WSP_1_2, "application/vnd.wap.coc")
+VSTRING(WSP_1_2, "application/vnd.wap.multipart.related")
+VSTRING(WSP_1_2, "application/vnd.wap.sia")
+VSTRING(WSP_1_3, "text/vnd.wap.connectivity-xml")
+VSTRING(WSP_1_3, "application/vnd.wap.connectivity-wbxml")
+VSTRING(WSP_1_4, "application/pkcs7-mime")
+VSTRING(WSP_1_4, "application/vnd.wap.hashed-certificate")
+VSTRING(WSP_1_4, "application/vnd.wap.signed-certificate")
+VSTRING(WSP_1_4, "application/vnd.wap.cert-response")
+VSTRING(WSP_1_4, "application/xhtml+xml")
+VSTRING(WSP_1_4, "application/wml+xml")
+VSTRING(WSP_1_4, "text/css")
+VSTRING(WSP_1_4, "application/vnd.wap.mms-message")
+VSTRING(WSP_1_4, "application/vnd.wap.rollover-certificate")
+VSTRING(WSP_1_5, "application/vnd.wap.locc+wbxml") 
+VSTRING(WSP_1_5, "application/vnd.wap.loc+xml")
+VSTRING(WSP_1_5, "application/vnd.syncml.dm+wbxml") 
+VSTRING(WSP_1_5, "application/vnd.syncml.dm+xml") 
+VSTRING(WSP_1_5, "application/vnd.syncml.notification") 
+VSTRING(WSP_1_5, "application/vnd.wap.xhtml+xml") 
+VSTRING(WSP_1_5, "application/vnd.wv.csp.cir") 
+VSTRING(WSP_1_5, "application/vnd.oma.dd+xml") 
+VSTRING(WSP_1_5, "application/vnd.oma.drm.message") 
+VSTRING(WSP_1_5, "application/vnd.oma.drm.content")
+VSTRING(WSP_1_5, "application/vnd.oma.drm.rights+xml") 
+VSTRING(WSP_1_5, "application/vnd.oma.drm.rights+wbxml") 
 )
 
 /* Table 42, Character Set Assignment (partial) */
@@ -202,22 +230,35 @@
 
 /* Table 38, Well-Known Parameter Assignments */
 NUMBERED(parameter,
-ASSIGN("q", 0)
-ASSIGN("charset", 1)
-ASSIGN("level", 2)
-ASSIGN("type", 3)
-ASSIGN("name", 5)
-ASSIGN("filename", 6)
-ASSIGN("differences", 7)
-ASSIGN("padding", 8)
-ASSIGN("type", 9)
-ASSIGN("start", 10)
-ASSIGN("start-info", 11)
-ASSIGN("comment", 12)
-ASSIGN("domain", 13)
-ASSIGN("max-age", 14)
-ASSIGN("path", 15)
-ASSIGN("secure", 16)
+VASSIGN(WSP_1_1, "q", 0)
+VASSIGN(WSP_1_1, "charset", 1)
+VASSIGN(WSP_1_1, "level", 2)
+VASSIGN(WSP_1_1, "type", 3)
+VASSIGN(WSP_1_1, "name", 5)
+VASSIGN(WSP_1_1, "filename", 6)
+VASSIGN(WSP_1_1, "differences", 7)
+VASSIGN(WSP_1_1, "padding", 8)
+VASSIGN(WSP_1_2, "type", 9)
+VASSIGN(WSP_1_2, "start", 10)
+VASSIGN(WSP_1_2, "start-info", 11)
+VASSIGN(WSP_1_3, "comment", 12)
+VASSIGN(WSP_1_3, "domain", 13)
+VASSIGN(WSP_1_3, "max-age", 14)
+VASSIGN(WSP_1_3, "path", 15)
+VASSIGN(WSP_1_3, "secure", 16)
+VASSIGN(WSP_1_4, "sec", 17)
+VASSIGN(WSP_1_4, "mac", 18)
+VASSIGN(WSP_1_4, "creation-date", 19)
+VASSIGN(WSP_1_4, "modification-date", 20)
+VASSIGN(WSP_1_4, "read-date", 21)
+VASSIGN(WSP_1_4, "size", 22)
+VASSIGN(WSP_1_4, "name", 23)
+VASSIGN(WSP_1_4, "filename", 24)
+VASSIGN(WSP_1_4, "start", 25)
+VASSIGN(WSP_1_4, "start-info", 26)
+VASSIGN(WSP_1_4, "comment", 27)
+VASSIGN(WSP_1_4, "domain", 28)
+VASSIGN(WSP_1_4, "path", 29)
 )
 
 /* 8.4.2.18, Content encoding field */
@@ -489,7 +530,11 @@
 
 #undef LINEAR
 #undef STRING
+#undef VSTRING
 #undef NUMBERED
 #undef ASSIGN
+#undef VASSIGN
 #undef NAMED
 #undef NSTRING
+#undef VNSTRING
+
diff -ur --exclude=CVS* old/gateway/wap/wsp_strings.h gateway/wap/wsp_strings.h
--- old/gateway/wap/wsp_strings.h	Mon Nov 20 20:55:54 2000
+++ gateway/wap/wsp_strings.h	Thu Aug  7 16:10:30 2003
@@ -28,6 +28,7 @@
 #define WSP_STRINGS_H
 
 #include "gwlib/gwlib.h"
+#include "wap/wsp.h"
 
 /* Must be called before any of the other functions in this file.
  * Can be called more than once, in which case multiple shutdowns
@@ -50,6 +51,7 @@
 #define STRING(string)
 #define NAMED(name, strings) enum name##_enum { strings name##_dummy };
 #define NSTRING(string, name) name,
+#define VNSTRING(version, string, name) name,
 #include "wsp_strings.def"
 
 #endif
diff -ur --exclude=CVS* old/gateway/wap/wsp_unit.c gateway/wap/wsp_unit.c
--- old/gateway/wap/wsp_unit.c	Thu Jun 19 14:30:54 2003
+++ gateway/wap/wsp_unit.c	Thu Aug  7 17:05:06 2003
@@ -209,11 +209,11 @@
 	gw_assert(event->type == S_Unit_MethodResult_Req);
 	p = &event->u.S_Unit_MethodResult_Req;
 
-        http_header_add(p->response_headers, "Encoding-Version", "1.3");
+    http_header_add(p->response_headers, "Encoding-Version", "1.3");
 
 	pdu = wsp_pdu_create(Reply);
 	pdu->u.Reply.status = wsp_convert_http_status_to_wsp_status(p->status);
-	pdu->u.Reply.headers = wsp_headers_pack(p->response_headers, 1);
+	pdu->u.Reply.headers = wsp_headers_pack(p->response_headers, 1, WSP_1_3);
 	pdu->u.Reply.data = octstr_duplicate(p->response_body);
 	ospdu = wsp_pdu_pack(pdu);
 	wsp_pdu_destroy(pdu);
@@ -249,7 +249,7 @@
 
         pdu = wsp_pdu_create(Push);
 	pdu->u.Push.headers = wsp_headers_pack(
-            event->u.S_Unit_Push_Req.push_headers, 1);
+            event->u.S_Unit_Push_Req.push_headers, 1, WSP_1_3);
 	pdu->u.Push.data = octstr_duplicate(
             event->u.S_Unit_Push_Req.push_body);
         ospdu = wsp_pdu_pack(pdu);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.