Hey,

On Sat, 2005-08-27 at 04:12 -0600, Alejandro Ramirez wrote:
> I really need to set up a broadcast, but telco is asking me to send
> the messages with ESM CLASS of DATAGRAM MODE. I've read in the mailing
> list and I've changed the line 638 of the code of smsc_smpp.c to the
> corresponding type.
> 
> How ever when I try to send a SMS it STILL goes out with the ESM CLASS
> of STORE & Forward???
> 
> Do i need to change the code somewhere else??

Apply the attached patch against CVS HEAD.

It implements the submission_mode sendsms CGI variable so you can set
the esm_class field of SMPP to one of:

        #define ESM_CLASS_SUBMIT_DEFAULT_SMSC_MODE        0x00000000
        #define ESM_CLASS_SUBMIT_DATAGRAM_MODE            0x00000001
        #define ESM_CLASS_SUBMIT_FORWARD_MODE             0x00000002
        #define ESM_CLASS_SUBMIT_STORE_AND_FORWARD_MODE   0x00000003

via the sendsms CGI interface. Something like this to use datagram mode
should work:

        
http://localhost:10001/cgi-bin/sendsms?user=test&password=test&from=1234&to=1234&text=testing&submission_mode=1

-HTH
-- 
.O.
..O   Enver ALTIN                   |   http://skyblue.gen.tr/
OOO   Software developer @ Parkyeri | http://www.parkyeri.com/
Index: doc/userguide/userguide.xml
===================================================================
RCS file: /home/cvs/gateway/doc/userguide/userguide.xml,v
retrieving revision 1.302
diff -u -p -d -r1.302 userguide.xml
--- doc/userguide/userguide.xml	26 Jul 2005 12:47:17 -0000	1.302
+++ doc/userguide/userguide.xml	27 Aug 2005 12:14:09 -0000
@@ -3419,6 +3419,14 @@ smsc-password = foo
 		priority)
      </entry></row>
 
+	<row><entry><literal>submission_mode</literal><entry>
+	  <entry><literal>number</literal></entry>
+	  <entry valign="bottom">
+	  Optional, sets the esm_class field of SMPP submit_sm request.
+	  Possible values are: 0 = Default SMSC mode, 1 = Datagram Mode,
+	  2 = Forward Mode, 3 = Store and Forward mode (Default).
+	 </entry></row>
+
    </tbody></tgroup></informaltable>
 </sect2>
 
Index: gw/msg-decl.h
===================================================================
RCS file: /home/cvs/gateway/gw/msg-decl.h,v
retrieving revision 1.30
diff -u -p -d -r1.30 msg-decl.h
--- gw/msg-decl.h	11 Feb 2005 15:35:48 -0000	1.30
+++ gw/msg-decl.h	27 Aug 2005 12:14:09 -0000
@@ -106,6 +106,7 @@ MSG(sms,
 		INTEGER(msg_left);
 		VOID(split_parts);
 		INTEGER(priority);
+		INTEGER(submission_mode);
 	})
 
 MSG(ack,
Index: gw/smsbox.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsbox.c,v
retrieving revision 1.258
diff -u -p -d -r1.258 smsbox.c
--- gw/smsbox.c	14 Apr 2005 11:58:57 -0000	1.258
+++ gw/smsbox.c	27 Aug 2005 12:14:09 -0000
@@ -502,7 +502,8 @@ static void get_x_kannel_from_headers(Li
 				      int *validity, int *deferred,
 				      int *dlr_mask, Octstr **dlr_url, 
 				      Octstr **account, int *pid, int *alt_dcs, 
-				      int *rpi, Octstr **binfo, int *priority)
+				      int *rpi, Octstr **binfo, int *priority,
+					  int *submission_mode)
 {
     Octstr *name, *val;
     long l;
@@ -592,6 +593,9 @@ static void get_x_kannel_from_headers(Li
 	else if (octstr_case_compare(name, octstr_imm("X-Kannel-Priority")) == 0) {
     	    sscanf(octstr_get_cstr(val),"%d", priority);
 	}
+	else if (octstr_case_compare(name, octstr_imm("X-Kannel-Submission-Mode")) == 0) {
+	    sscanf(octstr_get_cstr(val),"%d", submission_mode);
+	}
 	octstr_destroy(name);
 	octstr_destroy(val);
     }
@@ -648,7 +652,7 @@ static void get_x_kannel_from_xml(int re
                                   int *dlr_mask, Octstr **dlr_url,
                                   Octstr **account, int *pid, int *alt_dcs,
                                   int *rpi, List **tolist, Octstr **charset,
-                                  Octstr **binfo, int *priority)
+                                  Octstr **binfo, int *priority, int *submission_mode)
 {                                    
 
     Octstr *text, *tmp, *tmp2;
@@ -822,6 +826,13 @@ static void get_x_kannel_from_xml(int re
 	    *priority = tmplong;
 	O_DESTROY(tmp);
     }
+
+    get_tag(*body, octstr_imm("submission_mode"), &tmp, 0, 0);
+    if(tmp) {
+	if(octstr_parse_long(&tmplong, tmp, 0, 10) != -1)
+	    *submission_mode = tmplong;
+	O_DESTROY(tmp);
+    }
     
     /* charset from <?xml...encoding=?> */
     tmp = find_charset_encoding(*body);
@@ -862,7 +873,8 @@ static void fill_message(Msg *msg, URLTr
 			 int validity, int deferred,
 			 Octstr *dlr_url, int dlr_mask, int pid, int alt_dcs,
 			 int rpi, Octstr *smsc, Octstr *account,
-			 Octstr *charset, Octstr *binfo, int priority)
+			 Octstr *charset, Octstr *binfo, int priority,
+			 int submission_mode)
 {
     msg->sms.msgdata = replytext;
     msg->sms.time = time(NULL);
@@ -1020,6 +1032,13 @@ static void fill_message(Msg *msg, URLTr
         else
             warning(0, "Tried to change priority to '%d', denied.", priority);
     }
+
+    if (submission_mode != SMS_PARAM_UNDEFINED) {
+	if (urltrans_accept_x_kannel_headers(trans))
+	    msg->sms.submission_mode = submission_mode;
+	else
+	    warning(0, "Tried to change submission mode to '%d', denied.", submission_mode);
+    }
 }
 
 
@@ -1097,7 +1116,7 @@ static void url_result_thread(void *arg)
     Octstr *reply_body, *charset;
     Octstr *udh, *from, *to, *dlr_url, *account, *smsc, *binfo;
     int dlr_mask, mclass, mwi, coding, compress, pid, alt_dcs, rpi;
-    int validity, deferred, priority;
+    int validity, deferred, priority, submission_mode;
 
     text_html = octstr_imm("text/html");
     text_wml = octstr_imm("text/vnd.wap.wml");
@@ -1115,7 +1134,7 @@ static void url_result_thread(void *arg)
 	octets = 0;
         from = to = udh = smsc = dlr_url = account = binfo = charset = NULL;
         mclass = mwi = coding = compress = pid = alt_dcs = rpi = dlr_mask 
-            = validity = deferred = priority = SMS_PARAM_UNDEFINED;
+            = validity = deferred = priority = submission_mode = SMS_PARAM_UNDEFINED;
 
         get_receiver(id, &msg, &trans, &method, &req_url, &req_headers, &req_body, &retries);
 
@@ -1133,7 +1152,7 @@ static void url_result_thread(void *arg)
 					  &coding, &compress, &validity,
 					  &deferred, &dlr_mask, &dlr_url,
 					  &account, &pid, &alt_dcs, &rpi,
-					  &binfo, &priority);
+					  &binfo, &priority, &submission_mode);
             } else if (octstr_case_compare(type, text_plain) == 0) {
                 replytext = octstr_duplicate(reply_body);
                 octstr_destroy(reply_body);
@@ -1143,7 +1162,7 @@ static void url_result_thread(void *arg)
 					  &coding, &compress, &validity,
 					  &deferred, &dlr_mask, &dlr_url,
 					  &account, &pid, &alt_dcs, &rpi,
-					  &binfo, &priority);
+					  &binfo, &priority, &submission_mode);
             } else if (octstr_case_compare(type, text_xml) == 0) {
                 replytext = octstr_duplicate(reply_body);
                 octstr_destroy(reply_body);
@@ -1152,7 +1171,7 @@ static void url_result_thread(void *arg)
                         &from, &to, &udh, NULL, NULL, &smsc, &mclass, &mwi,
                         &coding, &compress, &validity, &deferred, &dlr_mask,
                         &dlr_url, &account, &pid, &alt_dcs, &rpi, NULL, &charset,
-                        &binfo, &priority);
+                        &binfo, &priority, &submission_mode);
             } else if (octstr_case_compare(type, octet_stream) == 0) {
                 replytext = octstr_duplicate(reply_body);
                 octstr_destroy(reply_body);
@@ -1163,7 +1182,7 @@ static void url_result_thread(void *arg)
 					  &coding, &compress, &validity,
 					  &deferred, &dlr_mask, &dlr_url,
 					  &account, &pid, &alt_dcs, &rpi,
-					  &binfo, &priority);
+					  &binfo, &priority, &submission_mode);
             } else {
                 replytext = octstr_duplicate(reply_couldnotrepresent);
             }
@@ -1183,7 +1202,7 @@ static void url_result_thread(void *arg)
         fill_message(msg, trans, replytext, octets, from, to, udh, mclass,
             mwi, coding, compress, validity, deferred, dlr_url,
             dlr_mask, pid, alt_dcs, rpi, smsc, account, charset,
-            binfo, priority);
+            binfo, priority, submission_mode);
 
         if (final_url == NULL)
             final_url = octstr_imm("");
@@ -1965,7 +1984,8 @@ static Octstr *smsbox_req_handle(URLTran
 				 int validity, int deferred,
 				 int *status, int dlr_mask, Octstr *dlr_url, 
 				 Octstr *account, int pid, int alt_dcs, int rpi,
-				 List *receiver, Octstr *binfo, int priority)
+				 List *receiver, Octstr *binfo, int priority,
+				 int submission_mode)
 {				     
     Msg *msg = NULL;
     Octstr *newfrom, *returnerror, *receiv;
@@ -2260,6 +2280,11 @@ static Octstr *smsbox_req_handle(URLTran
     }
     msg->sms.priority = priority;
 
+    if (submission_mode != SMS_PARAM_UNDEFINED && (submission_mode < 0 || submission_mode > 3)) {
+	returnerror = octstr_create("Submission mode field misformed, rejected");
+	goto fielderror;
+    }
+    msg->sms.submission_mode = submission_mode;
 
     /* new smsc-id argument - we should check this one, if able,
        but that's advanced logics -- Kalle */
@@ -2477,11 +2502,11 @@ static Octstr *smsbox_req_sendsms(List *
     Octstr *from, *to, *charset, *text, *udh, *smsc, *dlr_url, *account;
     Octstr *binfo;
     int	dlr_mask, mclass, mwi, coding, compress, validity, deferred, pid;
-    int alt_dcs, rpi, priority;
+    int alt_dcs, rpi, priority, submission_mode;
 
     from = to = udh = text = smsc = account = dlr_url = charset = binfo = NULL;
     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
-        pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
+        pid = alt_dcs = rpi = priority = submission_mode = SMS_PARAM_UNDEFINED;
  
     /* check the username and password */
     t = authorise_user(args, client_ip);
@@ -2552,6 +2577,10 @@ static Octstr *smsbox_req_sendsms(List *
     tmp_string = http_cgi_variable(args, "priority");
     if(tmp_string != NULL)
         sscanf(octstr_get_cstr(tmp_string),"%d", &priority);
+
+    tmp_string = http_cgi_variable(args, "submission_mode");
+    if(tmp_string != NULL)
+	sscanf(octstr_get_cstr(tmp_string),"%d", &submission_mode);
     
     /*
      * we required "to" to be defined
@@ -2571,7 +2600,7 @@ static Octstr *smsbox_req_sendsms(List *
     return smsbox_req_handle(t, client_ip, stored_uuid, 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);
+			     pid, alt_dcs, rpi, NULL, binfo, priority, submission_mode);
     
 }
 
@@ -2591,7 +2620,7 @@ static Octstr *smsbox_sendsms_post(List 
     Octstr *text;
     Octstr *from, *to, *udh, *smsc, *charset, *dlr_url, *account, *binfo;
     int dlr_mask, mclass, mwi, coding, compress, validity, deferred;
-    int pid, alt_dcs, rpi, priority;
+    int pid, alt_dcs, rpi, priority, submission_mode;
  
     text_html = octstr_imm("text/html");
     text_wml = octstr_imm("text/vnd.wap.wml");
@@ -2603,7 +2632,7 @@ static Octstr *smsbox_sendsms_post(List 
     tolist = NULL;
     from = to = udh = smsc = account = dlr_url = charset = binfo = NULL;
     mclass = mwi = coding = compress = validity = deferred = dlr_mask = 
-        pid = alt_dcs = rpi = priority = SMS_PARAM_UNDEFINED;
+        pid = alt_dcs = rpi = priority = submission_mode = SMS_PARAM_UNDEFINED;
  
     http_header_get_content_type(headers, &type, &charset);
     if (octstr_case_compare(type, text_html) == 0 ||
@@ -2617,7 +2646,7 @@ static Octstr *smsbox_sendsms_post(List 
 				  &coding, &compress, &validity, 
 				  &deferred, &dlr_mask, &dlr_url, 
 				  &account, &pid, &alt_dcs, &rpi,
-				  &binfo, &priority);
+				  &binfo, &priority, &submission_mode);
     } else if (octstr_case_compare(type, text_plain) == 0 ||
                octstr_case_compare(type, octet_stream) == 0) {
 	get_x_kannel_from_headers(headers, &from, &to, &udh,
@@ -2625,13 +2654,14 @@ static Octstr *smsbox_sendsms_post(List 
 				  &coding, &compress, &validity, 
 				  &deferred, &dlr_mask, &dlr_url, 
 				  &account, &pid, &alt_dcs, &rpi,
-				  &binfo, &priority);
+				  &binfo, &priority, &submission_mode);
     } 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,
-			      &rpi, &tolist, &charset, &binfo, &priority);
+			      &rpi, &tolist, &charset, &binfo, &priority,
+			      &submission_mode);
     } else {
 	*status = HTTP_BAD_REQUEST;
 	ret = octstr_create("Invalid content-type");
@@ -2682,7 +2712,7 @@ static Octstr *smsbox_sendsms_post(List 
 				    udh, smsc, mclass, mwi, coding, compress, 
 				    validity, deferred, status, dlr_mask, 
 				    dlr_url, account, pid, alt_dcs, rpi, tolist,
-				    binfo, priority);
+				    binfo, priority, submission_mode);
 
     }
 error2:
Index: gw/smsc/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc/smsc_smpp.c,v
retrieving revision 1.82
diff -u -p -d -r1.82 smsc_smpp.c
--- gw/smsc/smsc_smpp.c	12 Aug 2005 16:12:58 -0000	1.82
+++ gw/smsc/smsc_smpp.c	27 Aug 2005 12:14:09 -0000
@@ -667,7 +667,10 @@ static SMPP_PDU *msg_to_pdu(SMPP *smpp, 
      * set the esm_class field
      * default is store and forward, plus udh and rpi if requested
      */
-    pdu->u.submit_sm.esm_class = ESM_CLASS_SUBMIT_STORE_AND_FORWARD_MODE;
+    if (msg->sms.submission_mode != SMS_PARAM_UNDEFINED)
+	pdu->u.submit_sm.esm_class = msg->sms.submission_mode;
+    else
+	pdu->u.submit_sm.esm_class = ESM_CLASS_SUBMIT_STORE_AND_FORWARD_MODE;
     if (octstr_len(msg->sms.udhdata))
         pdu->u.submit_sm.esm_class = pdu->u.submit_sm.esm_class |
             ESM_CLASS_SUBMIT_UDH_INDICATOR;

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to