[PATCH] smsc default-sender & forced-sender

"Angel Fradejas" <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <[email protected]>
Hi list,

Find attached my patch (version 2) to add support for default-sender and
forced-sender smsc config directives. I will explain some points:

1) smsbox: precedence of faked_sender, global_sender, from
------------------------------------------------------------
I have normalized the way these directives are applied. As I posted
previously [ with very little feedback I have to say :-( ], MT-replies, and
MT's were treated in different ways.

I dapply 1) faked_sender then 2) global then 3) from

obey_request_thread, smsbox_req_handle, smsbox_req_sendota were the
functions responsible for this. I changed smsbox_req_handle,
smsbox_req_sendota to work the same as obey_request_thread.


2) struct Msg* : applied_defaults
------------------------------------------------------------
Now smsbox and bearerbox records in the Msg* structure the defaults it
applies. This is coded in applied_defaults member. Each default is
represented by one bit, and are available for the rest of modules to check
with dlf_xxxx constants. For example, you could check inside a smsc driver
if global-sender was applied with something like this

     if (msg->sms.applied_defaults & dfl_global_sender) { /* global-sender
was applied */.... }


3) config directives default-sender and forced-sender
------------------------------------------------------------
This directives can be established for each smsc. Both are optional.

default-sender :   it overrides faked-sender and global-sender, but NOT
&from=
forced-sender  :   as it name implies, it overrides anything. Every message
routed to this smsc will have this sender.


I'd greatly appreciate your feedback, bug reporting, flames, anything.

Any chance for commiting to cvs?

Have fun.

Angel Fradejas.
patch_default_sender_2.diff (application/octet-stream, 6.9 KB)
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.
  */
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.