[PATCH] [GATEWAY] Expose replace-if-present flag

Germán Bobr <[email protected]> Fri, 18 Sep 2015 13:00:33 -0300
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <CAGNSKr77Rv-pwWktCib2+O9yi0Uohhev+yYpdv6feAEExT7kxA@mail.gmail.com>
Hi

I needed to use the replace-if-present smpp flag in my submits, and found
out that the PDU definition in gw/smsc/smpp_pdu.def had the flag in its
definition but there was no code to expose said flag.

I have changed gw/smsbox.c, gw/msg-decl.h and gw/smsc/smsc_smpp.c to expose
that flag in cgi, and X-Kannel-Headers

The new cgi variable is called "rip" and the header is "X-Kannel-RIP"

Please, feel free to apply this patch for the next kannel version.

Regards,

-- 


*Germán Bobr *[email protected]
[image: Description: redmond]
image001.png (image/png, 10.2 KB) - not displayed
replace-if-present.diff (text/plain, 12.4 KB)
Index: gw/msg-decl.h
===================================================================
--- gw/msg-decl.h	(revisión: 5149)
+++ gw/msg-decl.h	(copia de trabajo)
@@ -99,6 +99,7 @@
         INTEGER(deferred)
         INTEGER(dlr_mask)
         OCTSTR(dlr_url)
+        INTEGER(rip)
         INTEGER(pid)
         INTEGER(alt_dcs)
         INTEGER(rpi)
Index: gw/smsbox.c
===================================================================
--- gw/smsbox.c	(revisión: 5149)
+++ gw/smsbox.c	(copia de trabajo)
@@ -538,7 +538,7 @@
 				      int *coding, int *compress, 
 				      int *validity, int *deferred,
 				      int *dlr_mask, Octstr **dlr_url, 
-				      Octstr **account, int *pid, int *alt_dcs, 
+				      Octstr **account, int *rip, int *pid, int *alt_dcs, 
 				      int *rpi, Octstr **binfo, int *priority, Octstr **meta_data)
 {
     Octstr *name, *val;
@@ -599,6 +599,9 @@
 	else if (octstr_case_compare(name, octstr_imm("X-Kannel-Coding")) == 0) {
     	    sscanf(octstr_get_cstr(val),"%d", coding);
 	}
+	else if (octstr_case_compare(name, octstr_imm("X-Kannel-RIP")) == 0) {
+    	    sscanf(octstr_get_cstr(val),"%d", rip);
+	}
 	else if (octstr_case_compare(name, octstr_imm("X-Kannel-PID")) == 0) {
     	    sscanf(octstr_get_cstr(val),"%d", pid);
 	}
@@ -649,7 +652,7 @@
                                   int *coding, int *compress,
                                   int *validity, int *deferred,
                                   int *dlr_mask, Octstr **dlr_url,
-                                  Octstr **account, int *pid, int *alt_dcs,
+                                  Octstr **account, int *rip, int *pid, int *alt_dcs,
                                   int *rpi, List **tolist, Octstr **charset,
                                   Octstr **binfo, int *priority, Octstr **meta_data)
 {                                    
@@ -752,6 +755,9 @@
     if (*smsc == NULL)
         XPATH_SEARCH_OCTSTR("/message/submit/to", *smsc, 0);
 
+    /* rip */
+    XPATH_SEARCH_NUMBER("/message/submit/rip", *rip);
+
     /* pid */
     XPATH_SEARCH_NUMBER("/message/submit/pid", *pid);
 
@@ -821,7 +827,7 @@
 			 Octstr *replytext, Octstr *from, Octstr *to, Octstr *udh,
 			 int mclass, int mwi, int coding, int compress,
 			 int validity, int deferred,
-			 Octstr *dlr_url, int dlr_mask, int pid, int alt_dcs,
+			 Octstr *dlr_url, int dlr_mask, int rip, int pid, int alt_dcs,
 			 int rpi, Octstr *smsc, Octstr *account,
 			 Octstr *charset, Octstr *binfo, int priority, Octstr *meta_data)
 {
@@ -888,6 +894,12 @@
         else
         	warning(0, "Tried to set MClass field, denied.");
     }
+    if (rip != SMS_PARAM_UNDEFINED) {
+        if (urltrans_accept_x_kannel_headers(trans))
+                msg->sms.rip = rip;
+        else
+                warning(0, "Tried to set rip field, denied.");
+    }
     if (pid != SMS_PARAM_UNDEFINED) {
         if (urltrans_accept_x_kannel_headers(trans))
         	msg->sms.pid = pid;
@@ -1059,7 +1071,7 @@
 
     Octstr *reply_body, *charset, *alt_charset;
     Octstr *udh, *from, *to, *dlr_url, *account, *smsc, *binfo, *meta_data;
-    int dlr_mask, mclass, mwi, coding, compress, pid, alt_dcs, rpi;
+    int dlr_mask, mclass, mwi, coding, compress, rip, pid, alt_dcs, rpi;
     int validity, deferred, priority;
 
     text_html = octstr_imm("text/html");
@@ -1077,7 +1089,7 @@
 
         from = to = udh = smsc = dlr_url = account = binfo = charset
         		= alt_charset = meta_data = NULL;
-        mclass = mwi = compress = pid = alt_dcs = rpi = dlr_mask =
+        mclass = mwi = compress = rip = pid = alt_dcs = rpi = dlr_mask =
         		validity = deferred = priority = SMS_PARAM_UNDEFINED;
         coding = DC_7BIT;
 
@@ -1102,7 +1114,7 @@
                 						  NULL, NULL, &smsc, &mclass, &mwi,
                 						  &coding, &compress, &validity,
                 						  &deferred, &dlr_mask, &dlr_url,
-                						  &account, &pid, &alt_dcs, &rpi,
+                						  &account, &rip, &pid, &alt_dcs, &rpi,
                 						  &binfo, &priority, &meta_data);
             } else if (octstr_case_compare(type, text_plain) == 0) {
                 replytext = octstr_duplicate(reply_body);
@@ -1112,7 +1124,7 @@
                 		                  NULL, NULL, &smsc, &mclass, &mwi,
                 		                  &coding, &compress, &validity,
                 						  &deferred, &dlr_mask, &dlr_url,
-                						  &account, &pid, &alt_dcs, &rpi,
+                						  &account, &rip, &pid, &alt_dcs, &rpi,
                 						  &binfo, &priority, &meta_data);
             } else if (octstr_case_compare(type, text_xml) == 0) {
                 replytext = octstr_duplicate(reply_body);
@@ -1121,7 +1133,7 @@
                 get_x_kannel_from_xml(mt_reply, &type, &replytext, reply_headers,
                 					  &from, &to, &udh, NULL, NULL, &smsc, &mclass, &mwi,
                                       &coding, &compress, &validity, &deferred, &dlr_mask,
-                                      &dlr_url, &account, &pid, &alt_dcs, &rpi, NULL, &charset,
+                                      &dlr_url, &account, &rip, &pid, &alt_dcs, &rpi, NULL, &charset,
                                       &binfo, &priority, &meta_data);
             } else if (octstr_case_compare(type, octet_stream) == 0) {
                 replytext = octstr_duplicate(reply_body);
@@ -1132,7 +1144,7 @@
                 		                  NULL, NULL, &smsc, &mclass, &mwi,
                 						  &coding, &compress, &validity,
                 						  &deferred, &dlr_mask, &dlr_url,
-                						  &account, &pid, &alt_dcs, &rpi,
+                						  &account, &rip, &pid, &alt_dcs, &rpi,
                 						  &binfo, &priority, &meta_data);
             } else {
                 replytext = octstr_duplicate(reply_couldnotrepresent);
@@ -1175,7 +1187,7 @@
         if (msg->sms.sms_type != report_mo) {
             fill_message(msg, trans, replytext, from, to, udh, mclass,
                          mwi, coding, compress, validity, deferred, dlr_url,
-                         dlr_mask, pid, alt_dcs, rpi, smsc, account, charset,
+                         dlr_mask, rip, pid, alt_dcs, rpi, smsc, account, charset,
                          binfo, priority, meta_data);
 
             alog("SMS HTTP-request sender:%s request: '%s' url: '%s' reply: %d '%s'",
@@ -1362,6 +1374,12 @@
     	    http_header_add(request_headers, "X-Kannel-MClass", octstr_get_cstr(os));
     	    octstr_destroy(os);
     	}
+        if (msg->sms.rip != SMS_PARAM_UNDEFINED) {
+            Octstr *os;
+            os = octstr_format("%d",msg->sms.rip);
+            http_header_add(request_headers, "X-Kannel-RIP", octstr_get_cstr(os));
+            octstr_destroy(os);
+        }
     	if (msg->sms.pid != SMS_PARAM_UNDEFINED) {
     	    Octstr *os;
     	    os = octstr_format("%d",msg->sms.pid);
@@ -1519,6 +1537,10 @@
             OCTSTR_APPEND_XML_OCTSTR(xml, "ud", msg->sms.msgdata);
         }
 
+        /* rip */
+        if (msg->sms.rip != SMS_PARAM_UNDEFINED)
+            OCTSTR_APPEND_XML_NUMBER(xml, "rip", msg->sms.rip);
+
     	/* pid */
     	if (msg->sms.pid != SMS_PARAM_UNDEFINED)
     	    OCTSTR_APPEND_XML_NUMBER(xml, "pid", msg->sms.pid);
@@ -1949,7 +1971,7 @@
 				 int mclass, int mwi, int coding, int compress, 
 				 int validity, int deferred,
 				 int *status, int dlr_mask, Octstr *dlr_url, 
-				 Octstr *account, int pid, int alt_dcs, int rpi,
+				 Octstr *account, int rip, int pid, int alt_dcs, int rpi,
 				 List *receiver, Octstr *binfo, int priority, Octstr *meta_data)
 {				     
     Msg *msg = NULL;
@@ -2192,6 +2214,12 @@
     }
     msg->sms.mclass = mclass;
     
+    if ( rip < -1 || rip > 7 ) {
+        returnerror = octstr_create("RIP field misformed, rejected");
+        goto field_error;
+    }
+    msg->sms.rip = rip;
+
     if ( pid < -1 || pid > 255 ) {
 	returnerror = octstr_create("PID field misformed, rejected");
 	goto field_error;
@@ -2462,12 +2490,12 @@
     Octstr *tmp_string;
     Octstr *from, *to, *charset, *text, *udh, *smsc, *dlr_url, *account;
     Octstr *binfo, *meta_data;
-    int	dlr_mask, mclass, mwi, coding, compress, validity, deferred, pid;
+    int	dlr_mask, mclass, mwi, coding, compress, validity, deferred, rip, pid;
     int alt_dcs, rpi, priority;
 
     from = to = udh = text = smsc = account = dlr_url = charset = binfo = meta_data = NULL;
     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
-        pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
+        rip = pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
  
     /* check the username and password */
     t = authorise_user(args, client_ip);
@@ -2503,6 +2531,10 @@
     if(tmp_string != NULL)
         sscanf(octstr_get_cstr(tmp_string),"%d", &mclass);
 
+    tmp_string = http_cgi_variable(args, "rip");
+    if(tmp_string != NULL)
+        sscanf(octstr_get_cstr(tmp_string),"%d", &rip);
+
     tmp_string = http_cgi_variable(args, "pid");
     if(tmp_string != NULL)
         sscanf(octstr_get_cstr(tmp_string),"%d", &pid);
@@ -2559,7 +2591,7 @@
     return smsbox_req_handle(t, client_ip, client, from, to, text, charset, udh,
 			     smsc, mclass, mwi, coding, compress, validity, 
 			     deferred, status, dlr_mask, dlr_url, account,
-			     pid, alt_dcs, rpi, NULL, binfo, priority, meta_data);
+			     rip, pid, alt_dcs, rpi, NULL, binfo, priority, meta_data);
     
 }
 
@@ -2579,7 +2611,7 @@
     Octstr *text;
     Octstr *from, *to, *udh, *smsc, *charset, *dlr_url, *account, *binfo, *meta_data;
     int dlr_mask, mclass, mwi, coding, compress, validity, deferred;
-    int pid, alt_dcs, rpi, priority;
+    int rip, pid, alt_dcs, rpi, priority;
  
     text_html = octstr_imm("text/html");
     text_wml = octstr_imm("text/vnd.wap.wml");
@@ -2591,7 +2623,7 @@
     tolist = NULL;
     from = to = udh = smsc = account = dlr_url = charset = binfo = meta_data = NULL;
     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
-        pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
+        rip = pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
  
     http_header_get_content_type(headers, &type, &charset);
     if (octstr_case_compare(type, text_html) == 0 ||
@@ -2603,7 +2635,7 @@
 				  &user, &pass, &smsc, &mclass, &mwi, 
 				  &coding, &compress, &validity, 
 				  &deferred, &dlr_mask, &dlr_url, 
-				  &account, &pid, &alt_dcs, &rpi,
+				  &account, &rip, &pid, &alt_dcs, &rpi,
 				  &binfo, &priority, &meta_data);
     } else if (octstr_case_compare(type, text_plain) == 0 ||
                octstr_case_compare(type, octet_stream) == 0) {
@@ -2611,13 +2643,13 @@
 				  &user, &pass, &smsc, &mclass, &mwi, 
 				  &coding, &compress, &validity, 
 				  &deferred, &dlr_mask, &dlr_url, 
-				  &account, &pid, &alt_dcs, &rpi,
+				  &account, &rip, &pid, &alt_dcs, &rpi,
 				  &binfo, &priority, &meta_data);
     } else if (octstr_case_compare(type, text_xml) == 0) {
 	get_x_kannel_from_xml(mt_push, &type, &body, headers, 
                               &from, &to, &udh, &user, &pass, &smsc, &mclass, 
 			      &mwi, &coding, &compress, &validity, &deferred,
-			      &dlr_mask, &dlr_url, &account, &pid, &alt_dcs,
+			      &dlr_mask, &dlr_url, &account, &rip, &pid, &alt_dcs,
 			      &rpi, &tolist, &charset, &binfo, &priority, &meta_data);
     } else {
 	*status = HTTP_BAD_REQUEST;
@@ -2662,7 +2694,7 @@
 	    ret = smsbox_req_handle(t, client_ip, client, from, to, body, charset,
 				    udh, smsc, mclass, mwi, coding, compress, 
 				    validity, deferred, status, dlr_mask, 
-				    dlr_url, account, pid, alt_dcs, rpi, tolist,
+				    dlr_url, account, rip, pid, alt_dcs, rpi, tolist,
 				    binfo, priority, meta_data);
 
     }
Index: gw/smsc/smsc_smpp.c
===================================================================
--- gw/smsc/smsc_smpp.c	(revisión: 5149)
+++ gw/smsc/smsc_smpp.c	(copia de trabajo)
@@ -701,6 +701,7 @@
     handle_mo_dcs(msg, smpp->alt_charset, pdu->u.deliver_sm.data_coding, pdu->u.deliver_sm.esm_class);
 
     msg->sms.pid = pdu->u.deliver_sm.protocol_id;
+    msg->sms.rip = pdu->u.deliver_sm.replace_if_present_flag;
 
     /* set priority flag */
     msg->sms.priority = pdu->u.deliver_sm.priority_flag;
@@ -1021,6 +1022,10 @@
     if (msg->sms.pid != SMS_PARAM_UNDEFINED)
         pdu->u.submit_sm.protocol_id = msg->sms.pid;
 
+    /* set rip */
+    if (msg->sms.rip != SMS_PARAM_UNDEFINED)
+        pdu->u.submit_sm.replace_if_present_flag = msg->sms.rip;
+
     /*
      * set the esm_class field
      * default is store and forward, plus udh and rpi if requested