Index: gw/msg-decl.h
===================================================================
RCS file: /home/cvs/gateway/gw/msg-decl.h,v
retrieving revision 1.7
diff -u -r1.7 msg-decl.h
--- gw/msg-decl.h	2001/02/27 11:06:30	1.7
+++ gw/msg-decl.h	2001/05/16 16:30:16
@@ -32,6 +32,7 @@
 		OCTSTR(smsc_id);
 		INTEGER(id);
 		INTEGER(sms_type);
+		OCTSTR(dcsdata);
 	})
 
 MSG(ack,
Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.132
diff -u -r1.132 smsbox.c
--- gw/smsbox.c	2001/05/14 09:42:21	1.132
+++ gw/smsbox.c	2001/05/16 16:30:16
@@ -343,6 +343,7 @@
     receiver->msg->sms.flag_8bit = 0;
     receiver->msg->sms.flag_udh = 0;
     receiver->msg->sms.udhdata = NULL;
+    receiver->msg->sms.dcsdata = NULL;
     receiver->msg->sms.msgdata = NULL;
     receiver->msg->sms.time = (time_t) -1;
     receiver->msg->sms.smsc_id = octstr_duplicate(msg->sms.smsc_id);
@@ -416,7 +417,7 @@
 static void get_x_kannel_from_headers(List *headers, Octstr **from,
 				      Octstr **to, Octstr **udh,
 				      Octstr **user, Octstr **pass,
-				      Octstr **smsc)
+				      Octstr **smsc, Octstr **dcs)
 {
     Octstr *name, *val;
     long l;
@@ -458,6 +459,14 @@
 		*udh = NULL;
 	    }
 	}
+	else if (octstr_case_compare(name, octstr_imm("X-Kannel-DCS")) == 0) {
+	    *dcs = octstr_duplicate(val);
+	    octstr_strip_blanks(*dcs);
+	    if (octstr_hex_to_binary(*dcs) == -1) {
+		octstr_destroy(*dcs);
+		*dcs = NULL;
+	    }
+	}
 	octstr_destroy(name);
 	octstr_destroy(val);
     }
@@ -465,7 +474,7 @@
 
 static void fill_message(Msg *msg, URLTranslation *trans,
 			 Octstr *replytext, int octet_stream,
-			 Octstr *from, Octstr *to, Octstr *udh)
+			 Octstr *from, Octstr *to, Octstr *udh, Octstr *dcs)
 {    
     msg->sms.msgdata = replytext;
     if (octet_stream && urltrans_assume_plain_text(trans)==0)
@@ -502,6 +511,14 @@
 	    octstr_destroy(udh);
 	}
     }
+    if (dcs != NULL) {
+	if (urltrans_accept_x_kannel_headers(trans)) {
+	    msg->sms.dcsdata = dcs;
+	} else {
+	    warning(0, "Tried to set DCS field, denied.");
+	    octstr_destroy(dcs);
+	}
+    }
 }
 
 
@@ -519,7 +536,8 @@
     Octstr *octet_stream;
     Octstr *udh, *from, *to;
     int octets;
-    
+    Octstr *dcs;
+
     text_html = octstr_imm("text/html");
     text_wml = octstr_imm("text/vnd.wap.wml");
     text_plain = octstr_imm("text/plain");
@@ -533,7 +551,7 @@
     	
     	get_receiver(id, &msg, &trans);
 
-    	from = to = udh = NULL;
+    	from = to = udh = dcs = NULL;
 	octets = 0;
 	
     	if (status == HTTP_OK) {
@@ -546,19 +564,19 @@
 		replytext = html_to_sms(reply_body);
 		octstr_strip_blanks(replytext);
     	    	get_x_kannel_from_headers(reply_headers, &from, &to, &udh,
-					  NULL, NULL, NULL);
+					  NULL, NULL, NULL,&dcs);
 	    } else if (octstr_compare(type, text_plain) == 0) {
 		replytext = reply_body;
 		reply_body = NULL;
 		octstr_strip_blanks(replytext);
     	    	get_x_kannel_from_headers(reply_headers, &from, &to, &udh,
-					  NULL, NULL, NULL);
+					  NULL, NULL, NULL,&dcs);
 	    } else if (octstr_compare(type, octet_stream) == 0) {
 		replytext = reply_body;
 		octets = 1;
 		reply_body = NULL;
     	    	get_x_kannel_from_headers(reply_headers, &from, &to, &udh,
-					  NULL, NULL, NULL);
+					  NULL, NULL, NULL,&dcs);
 	    } else {
 		replytext = octstr_create("Result could not be represented "
 					  "as an SMS message.");
@@ -568,7 +586,7 @@
 	} else
 	    replytext = octstr_create("Could not fetch content, sorry.");
 
-	fill_message(msg, trans, replytext, octets, from, to, udh);
+	fill_message(msg, trans, replytext, octets, from, to, udh, dcs);
 	
     	if (final_url == NULL)
 	    final_url = octstr_imm("");
@@ -680,6 +698,15 @@
 			    octstr_get_cstr(os));
 	    octstr_destroy(os);
 	}
+	if(octstr_len(msg->sms.dcsdata) > 0) {
+	    Octstr *os;
+	    os = octstr_duplicate(msg->sms.dcsdata);
+	    octstr_binary_to_hex(os, 1);
+	    http_header_add(request_headers, "X-Kannel-DCS",
+			    octstr_get_cstr(os));
+	    octstr_destroy(os);
+	}
+
 	http_start_request(caller, pattern, request_headers, 
  			   msg->sms.msgdata, 1, id, NULL);
 	octstr_destroy(pattern);
@@ -938,7 +965,7 @@
 
 static Octstr *smsbox_req_handle(URLTranslation *t, Octstr *client_ip,
 				 Octstr *from, Octstr *to, Octstr *text,
-				 int binary, Octstr *udh, Octstr *smsc,
+				 int binary, Octstr *udh, Octstr *smsc, Octstr *dcs,
 				 int *status)
 {				     
     Msg *msg = NULL;
@@ -990,6 +1017,7 @@
     msg->sms.sender = octstr_duplicate(newfrom);
     msg->sms.msgdata = text ? octstr_duplicate(text) : octstr_create("");
     msg->sms.udhdata = udh ? octstr_duplicate(udh) : octstr_create("");
+    msg->sms.dcsdata = dcs ? octstr_duplicate(dcs) : octstr_create("");
     
     /* new smsc-id argument - we should check this one, if able,
        but that's advanced logics -- Kalle */
@@ -1124,7 +1152,8 @@
     Octstr *from, *to;
     Octstr *text, *udh, *smsc;
     int binary;
-    
+    Octstr *dcs;
+   
     /* check the username and password */
     t = authorise_user(args, client_ip);
     if (t == NULL) {
@@ -1137,7 +1166,8 @@
     smsc = http_cgi_variable(args, "smsc");
     from = http_cgi_variable(args, "from");
     to = http_cgi_variable(args, "to");
-    
+    dcs = http_cgi_variable(args, "dcs");
+
     
     if (to == NULL || (text == NULL && udh == NULL)) {
 	error(0, "/sendsms got wrong args");
@@ -1157,7 +1187,7 @@
      */
 
     return smsbox_req_handle(t, client_ip, from, to, text, binary,
-			     udh, smsc, status);
+			     udh, smsc, dcs, status);
     
 }
 
@@ -1174,11 +1204,12 @@
     Octstr *ret;
     Octstr *type, *charset;
     int binary = 0;
-    
+    Octstr *dcs;
+   
     from = to = user = pass = udh = smsc = NULL;
 
     get_x_kannel_from_headers(headers, &from, &to, &udh,
-			      &user, &pass, &smsc);
+			      &user, &pass, &smsc,&dcs);
     
     ret = NULL;
     
@@ -1211,7 +1242,7 @@
 	}
 	if (ret == NULL)
 	    ret = smsbox_req_handle(t, client_ip, from, to, body,
-				    binary, udh, smsc, status);
+				    binary, udh, smsc, dcs, status);
 
 	octstr_destroy(type);
 	octstr_destroy(charset);
@@ -1222,6 +1253,7 @@
     octstr_destroy(pass);
     octstr_destroy(udh);
     octstr_destroy(smsc);
+    octstr_destroy(dcs);
     return ret;
 }
 
Index: gw/smsc_emi2.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc_emi2.c,v
retrieving revision 1.8
diff -u -r1.8 smsc_emi2.c
--- gw/smsc_emi2.c	2001/05/09 20:35:44	1.8
+++ gw/smsc_emi2.c	2001/05/16 16:30:17
@@ -259,15 +259,27 @@
 
     emimsg->fields[E50_ADC] = octstr_duplicate(msg->sms.receiver);
 
+	emimsg->fields[E50_XSER] = octstr_create("");
+    /* XSer1: UDH */
     if (msg->sms.flag_udh) {
-	str = octstr_create("");
+    str = octstr_create("");
 	octstr_append_char(str, 1);
 	octstr_append_char(str, octstr_len(msg->sms.udhdata));
 	octstr_append(str, msg->sms.udhdata);
 	octstr_binary_to_hex(str, 1);
-	emimsg->fields[E50_XSER] = str;
-    }
-
+	octstr_append(emimsg->fields[E50_XSER],str);
+    octstr_destroy(str);
+	}
+	/* XSer2: DCS */
+	if(octstr_len(msg->sms.dcsdata) > 0) {
+    str = octstr_create("");
+	octstr_append_char(str, 2);
+	octstr_append_char(str, octstr_len(msg->sms.dcsdata));
+	octstr_append(str, msg->sms.dcsdata);
+	octstr_binary_to_hex(str, 1);
+	octstr_append(emimsg->fields[E50_XSER],str);
+	}
+	
     if (msg->sms.flag_8bit) {
 	emimsg->fields[E50_MT] = octstr_create("4");
 	emimsg->fields[E50_MCLS] = octstr_create("1");
Index: gw/smsc_http.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc_http.c,v
retrieving revision 1.9
diff -u -r1.9 smsc_http.c
--- gw/smsc_http.c	2001/05/08 07:27:46	1.9
+++ gw/smsc_http.c	2001/05/16 16:30:17
@@ -225,7 +225,9 @@
 
     if (sms->sms.flag_udh && sms->sms.udhdata)
 	octstr_format_append(url, "&udh=%E", sms->sms.udhdata);
-    
+    if (sms->sms.dcsdata)
+	octstr_format_append(url, "&dcs=%E", sms->sms.dcsdata);
+  
     headers = list_create();
     debug("smsc.http.kannel", 0, "start request");
     http_start_request(conndata->http_ref, url, headers, NULL, 0, sms, NULL);
@@ -248,7 +250,7 @@
 			       List *headers, Octstr *body, List *cgivars)
 {
     ConnData *conndata = conn->data;
-    Octstr *user, *pass, *from, *to, *text, *udh;
+    Octstr *user, *pass, *from, *to, *text, *udh, *dcs;
     Octstr *retmsg;
     List *reply_headers;
     int ret;
@@ -259,6 +261,7 @@
     to = http_cgi_variable(cgivars, "to");
     text = http_cgi_variable(cgivars, "text");
     udh = http_cgi_variable(cgivars, "udh");
+    dcs = http_cgi_variable(cgivars, "dcs");
 
     debug("smsc.http.kannel", 0, "Received an HTTP request");
     
@@ -283,6 +286,7 @@
 	msg->sms.sender = octstr_duplicate(from);
 	msg->sms.receiver = octstr_duplicate(to);
 	msg->sms.msgdata = octstr_duplicate(text);
+	msg->sms.dcsdata = octstr_duplicate(dcs);
 	msg->sms.udhdata = octstr_duplicate(udh);
 	if (udh)
 	    msg->sms.flag_8bit = msg->sms.flag_udh = 1;
