While we're there adding quick patches to SMPP here's one to add defered 
and validity support to SMPP. I've done limited testing with it so would 
appreciate any of the other SMPP users giving it a once over.

SMPP v3.4 specifies tenths of second which I just set to 0 as defacto and 
we calculate 1/4 hour time relative to UTC/GMT according to the SMPP Time 
Format documentation (section 7.5)

Alex

-- 
Alex Judd
http://www.skywire.co.uk
Index: gw/smsc_smpp.c
===================================================================
RCS file: /home/cvs/gateway/gw/smsc_smpp.c,v
retrieving revision 1.58
diff -u -r1.58 smsc_smpp.c
--- gw/smsc_smpp.c      20 May 2002 14:14:13 -0000      1.58
+++ gw/smsc_smpp.c      21 May 2002 15:34:35 -0000
@@ -222,6 +222,11 @@
 static SMPP_PDU *msg_to_pdu(SMPP *smpp, Msg *msg) 
 { 
     SMPP_PDU *pdu; 
+    char buffer[16];
+    Octstr *relation_UTC_time;
+    struct tm gmtime, localtime, tm;
+    int gwqdiff;
+
     pdu = smpp_pdu_create(submit_sm,  
                          counter_increase(smpp->message_id_counter)); 
                    
@@ -290,9 +295,41 @@
         if (pdu->u.submit_sm.data_coding == 0 ) /* no reencoding for unicode! */ 
             charset_latin1_to_gsm(pdu->u.submit_sm.short_message);              
     } 
+
+    /* work out 1/4 hour difference between local time and UTC/GMT */
+    gmtime = gw_gmtime(time(NULL));
+    localtime = gw_localtime(time(NULL));
+    if (localtime.tm_hour >= gmtime.tm_hour) {
+        relation_UTC_time = octstr_create("+");
+        gwqdiff = (localtime.tm_hour - gmtime.tm_hour) * 4;
+    } else {
+        relation_UTC_time = octstr_create("-");
+        gwqdiff = (gmtime.tm_hour - localtime.tm_hour) * 4;
+    }
+
+    if (msg->sms.validity) {
+        tm = gw_localtime(time(NULL) + msg->sms.validity * 60);
+        sprintf(buffer, "%02d%02d%02d%02d%02d%02d0%01d%02d%1s",
+           tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday,
+           tm.tm_hour, tm.tm_min, tm.tm_sec,
+           0, gwqdiff, relation_UTC_time );
+        pdu->u.submit_sm.validity_period = octstr_create(buffer);
+    }
+
+    if (msg->sms.deferred) {
+        tm = gw_localtime(time(NULL) + msg->sms.deferred * 60);
+        sprintf(buffer, "%02d%02d%02d%02d%02d%02d0%01d%02d%1s",
+           tm.tm_year % 100, tm.tm_mon + 1, tm.tm_mday,
+           tm.tm_hour, tm.tm_min, tm.tm_sec,
+           0, gwqdiff, relation_UTC_time );
+        pdu->u.submit_sm.schedule_delivery_time = octstr_create(buffer);
+    }
+
     /* ask for the delivery reports if needed */ 
     if (msg->sms.dlr_mask & (DLR_SUCCESS|DLR_FAIL)) 
         pdu->u.submit_sm.registered_delivery = 1;  
+
+    octstr_destroy(relation_UTC_time);
  
     return pdu; 
 } 

Reply via email to