Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.171
diff -u -r1.171 smsbox.c
--- gw/smsbox.c	2002/02/18 11:47:53	1.171
+++ gw/smsbox.c	2002/02/19 16:55:31
@@ -852,9 +852,11 @@
 	    if (p != NULL) {
 		octstr_destroy(msg->sms.sender);
 		msg->sms.sender = octstr_duplicate(p);
+		msg->sms.applied_defaults |= dfl_faked_sender;
 	    } else if (global_sender != NULL) {
 		octstr_destroy(msg->sms.sender);
 		msg->sms.sender = octstr_duplicate(global_sender);
+		msg->sms.applied_defaults |= dfl_global_sender;
 	    } else {
 		octstr_destroy(msg->sms.sender);
 		msg->sms.sender = octstr_duplicate(msg->sms.receiver);
@@ -1029,6 +1031,9 @@
     List *receiver, *failed_id, *allowed, *denied;
     int no_recv, ret, i;
     long del;
+    int applied_defaults;
+    
+    applied_defaults = 0;
 
     /*
      * Multi-cast messages with several receivers in 'to' are handled
@@ -1122,10 +1127,12 @@
     if (urltrans_faked_sender(t) != NULL) {
 	/* discard previous from */
 	newfrom = octstr_duplicate(urltrans_faked_sender(t));
-    } else if (octstr_len(from) > 0) {
-	newfrom = octstr_duplicate(from);
+	applied_defaults |= dfl_faked_sender;
     } else if (global_sender != NULL) {
 	newfrom = octstr_duplicate(global_sender);
+	applied_defaults |= dfl_global_sender;
+    } else if (octstr_len(from) > 0) {
+	newfrom = octstr_duplicate(from);
     } else {
 	returnerror = octstr_create("Sender missing and no global set, rejected");
 	goto fielderror2;
@@ -1148,6 +1155,7 @@
     msg->sms.service = octstr_duplicate(urltrans_name(t));
     msg->sms.sms_type = mt_push;
     msg->sms.sender = octstr_duplicate(newfrom);
+    msg->sms.applied_defaults = applied_defaults;
     msg->sms.account = account ? octstr_duplicate(account) : NULL;
     msg->sms.msgdata = text ? octstr_duplicate(text) : octstr_create("");
     msg->sms.udhdata = udh ? octstr_duplicate(udh) : octstr_create("");
@@ -1579,7 +1587,9 @@
     URLTranslation *t;
     Msg *msg;
     int ret, ota_type;
+    int applied_defaults;
     
+    applied_defaults = 0;
     id = phonenumber = smsc = NULL;
 
     /* check the username and password */
@@ -1598,11 +1608,13 @@
 
     if (urltrans_faked_sender(t) != NULL) {
 	from = octstr_duplicate(urltrans_faked_sender(t));
+	applied_defaults |= dfl_faked_sender;
+    } else if (global_sender != NULL) {
+	from = octstr_duplicate(global_sender);
+	applied_defaults |= dfl_global_sender;
     } else if ((from = http_cgi_variable(list, "from")) != NULL &&
 	       octstr_len(from) > 0) {
 	from = octstr_duplicate(from);
-    } else if (global_sender != NULL) {
-	from = octstr_duplicate(global_sender);
     } else {
 	*status = HTTP_BAD_REQUEST;
 	return octstr_create("Sender missing and no global set, rejected");
@@ -1691,6 +1703,7 @@
     octstr_dump(msg->sms.msgdata, 0);
 
 send: 
+    msg->sms.applied_defaults = applied_defaults;
     /* we still need to check if smsc is forced for this */
     smsc = http_cgi_variable(list, "smsc");
     if (urltrans_forced_smsc(t)) {
Index: gw/smscconn.c
===================================================================
RCS file: /home/cvs/gateway/gw/smscconn.c,v
retrieving revision 1.27
diff -u -r1.27 smscconn.c
--- gw/smscconn.c	2002/01/15 10:17:01	1.27
+++ gw/smscconn.c	2002/02/19 16:55:32
@@ -54,6 +54,8 @@
     GET_OPTIONAL_VAL(conn->allowed_prefix, "allowed-prefix");
     GET_OPTIONAL_VAL(conn->denied_prefix, "denied-prefix");
     GET_OPTIONAL_VAL(conn->preferred_prefix, "preferred-prefix");
+    GET_OPTIONAL_VAL(conn->default_sender, "default-sender");
+    GET_OPTIONAL_VAL(conn->forced_sender, "forced-sender");
 
     if (conn->allowed_smsc_id && conn->denied_smsc_id)
 	warning(0, "Both 'allowed-smsc-id' and 'denied-smsc-id' set, deny-list "
@@ -292,17 +294,36 @@
     int ret;
     
     gw_assert(conn != NULL);
+    gw_assert(msg != NULL);
     mutex_lock(conn->flow_mutex);
     if (conn->status == SMSCCONN_DEAD || conn->why_killed != SMSCCONN_ALIVE) {
 	mutex_unlock(conn->flow_mutex);
 	return -1;
     }
+    /* if forced-sender is set, override sender */
+    if (octstr_len(conn->forced_sender)) {
+        octstr_destroy(msg->sms.sender);
+        msg->sms.sender = octstr_duplicate(conn->forced_sender);
+        msg->sms.applied_defaults &= ~(dfl_faked_sender);
+        msg->sms.applied_defaults &= ~(dfl_global_sender);
+        msg->sms.applied_defaults |= dfl_forced_sender;
+    }
+    /* if default-sender is set, override sender */
+    /* only if faked-sender or global-sender was applied previously */
+    else if (octstr_len(conn->default_sender) && 
+             (msg->sms.applied_defaults & 
+             (dfl_faked_sender | dfl_global_sender))) {
+        msg->sms.sender = octstr_duplicate(conn->default_sender);
+        msg->sms.applied_defaults &= ~(dfl_faked_sender);
+        msg->sms.applied_defaults &= ~(dfl_global_sender);
+        msg->sms.applied_defaults |= dfl_default_sender;
+    }                                                                
     ret = conn->send_msg(conn, msg);
 	mutex_unlock(conn->flow_mutex);
     return ret;
-}
-
-
+}   
+    
+    
 int smscconn_status(SMSCConn *conn)
 {
     gw_assert(conn != NULL);
Index: gw/msg-decl.h
===================================================================
RCS file: /home/cvs/gateway/gw/msg-decl.h,v
retrieving revision 1.16
diff -u -r1.16 msg-decl.h
--- gw/msg-decl.h	2001/12/20 12:43:35	1.16
+++ gw/msg-decl.h	2002/02/19 16:55:32
@@ -40,6 +40,7 @@
 		INTEGER(deferred);
 		INTEGER(dlr_mask);
 		OCTSTR(dlr_url);
+		INTEGER(applied_defaults);
 	})
 
 MSG(ack,
Index: gw/smscconn_p.h
===================================================================
RCS file: /home/cvs/gateway/gw/smscconn_p.h,v
retrieving revision 1.27
diff -u -r1.27 smscconn_p.h
--- gw/smscconn_p.h	2002/01/17 07:52:39	1.27
+++ gw/smscconn_p.h	2002/02/19 16:55:33
@@ -118,6 +118,9 @@
     Octstr *allowed_prefix;
     Octstr *denied_prefix;
     Octstr *preferred_prefix;
+    
+    Octstr *default_sender;
+    Octstr *forced_sender;
 
 
     /* XXX: move rest global data from Smsc here
Index: gwlib/cfg.def
===================================================================
RCS file: /home/cvs/gateway/gwlib/cfg.def,v
retrieving revision 1.38
diff -u -r1.38 cfg.def
--- gwlib/cfg.def	2002/02/07 22:16:04	1.38
+++ gwlib/cfg.def	2002/02/19 16:55:34
@@ -183,6 +183,8 @@
     OCTSTR(idle-timeout)
     OCTSTR(no-sep)
     OCTSTR(appname)
+    OCTSTR(default-sender)  
+    OCTSTR(forced-sender)  
 )
 
 
Index: gw/msg.h
===================================================================
RCS file: /home/cvs/gateway/gw/msg.h,v
retrieving revision 1.12
diff -u -r1.12 msg.h
--- gw/msg.h	2001/10/11 17:18:33	1.12
+++ gw/msg.h	2002/02/19 16:55:34
@@ -46,6 +46,14 @@
     cmd_resume = 2
 };
 
+/* applied defaults */
+enum {
+    dfl_faked_sender   = 0x00000001,
+    dfl_global_sender  = 0x00000002,
+    dfl_default_sender = 0x00000004,
+    dfl_forced_sender  = 0x00000008
+};
+
 /*
  * Create a new, empty Msg object. Panics if fails.
  */
