Re: [patch] opensmppbox validiti periode passtrought fix
"XEN-Housing s.r.o." <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Thank you Alex.
implemented and new patch with validity_periode and
schedule_delivery_time attached.
Slavoj.
Dňa 27. 10. 2010 15:04, Alexander Malysh wrote / napísal(a):
> Hi,
>
> your code doesn't handle relation and relative in the timestamp. Below is function that I use for this, then just write:
>
> if (pdu->u.submit_sm.validity_period)
> msg->sms.validity = timestamp_to_minutes(pdu->u.submit_sm.validity_period);
>
> ditto fo deferred...
>
> Alex
>
>
> /*
> * Converting SMPP timestamp to minutes relative
> * to our localtime.
> * Return -1 if error detected
> */
> static int timestamp_to_minutes(Octstr *timestamp)
> {
> struct tm tm, local;
> time_t valutc, utc;
> int rc, diff, dummy, localdiff;
> char relation;
>
> if (octstr_len(timestamp) == 0)
> return 0;
>
> if (octstr_len(timestamp) != 16)
> return -1;
>
> /*
> * Timestamp format:
> * YYMMDDhhmmsstnn[+-R]
> * t - tenths of second (not used by us)
> * nn - Time difference in quarter hours between local and UTC time
> */
> rc = sscanf(octstr_get_cstr(timestamp),
> "%02d%02d%02d%02d%02d%02d%1d%02d%1c",
> &tm.tm_year,&tm.tm_mon,&tm.tm_mday,
> &tm.tm_hour,&tm.tm_min,&tm.tm_sec,
> &dummy,&diff,&relation);
> if (rc != 9)
> return -1;
>
> utc = time(NULL);
> if (utc == ((time_t)-1))
> return 0;
>
> if (relation == '+' || relation == '-') {
> tm.tm_year += 100; /* number of years since 1900 */
> tm.tm_mon--; /* month 0-11 */
> tm.tm_isdst = -1;
> /* convert to sec. since 1970 */
> valutc = gw_mktime(&tm);
> if (valutc == ((time_t)-1))
> return -1;
>
> /* work out local time, because gw_mktime assume local time */
> local = gw_localtime(utc);
> tm = gw_gmtime(utc);
> local.tm_isdst = tm.tm_isdst = -1;
> localdiff = difftime(gw_mktime(&local), gw_mktime(&tm));
> valutc += localdiff;
>
> debug("sms.smpp",0, "diff between utc and localtime (%d)", localdiff);
> diff = diff*15*60;
> switch(relation) {
> case '+':
> valutc -= diff;
> break;
> case '-':
> valutc += diff;
> break;
> }
> } else if (relation == 'R') { /* relative to SMSC localtime */
> local = gw_localtime(utc);
> local.tm_year += tm.tm_year;
> local.tm_mon += tm.tm_mon;
> local.tm_mday += tm.tm_mday;
> local.tm_hour += tm.tm_hour;
> local.tm_min += tm.tm_min;
> local.tm_sec += tm.tm_sec;
> valutc = gw_mktime(&local);
> if (valutc == ((time_t)-1))
> return -1;
> } else {
> return -1;
> }
> tm = gw_gmtime(valutc);
> debug("sms.smpp",0,"Requested UTC timestamp: %02d-%02d-%02d %02d:%02d:%02d",
> tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
>
> debug("sms.smpp", 0, "requested timestamp in min. (%ld)", (valutc - utc)/60);
>
> return ceil(difftime(valutc, utc) / 60);
> }
>
>
> Am 27.10.2010 um 14:04 schrieb XEN-Housing s.r.o.:
>
>> Hello folks,
>>
>> at opensmppbox i found that it not support validity periode handling when from pdu makes msg for bb.
>>
>> attached patch solve that. i am not well C++ coder, so please make an review, if there are no left some memory leaks. or may be there is an nicer way to make it.
>>
>> But it's tested and working ;)
>>
>> PS: acording this, deffered parameter have same problem, is not passing trought. and handling of DLR need some improvement too, coz from smsc i will get EXPIRED msg, but opensmpp client is sending UNDELIV with err:000. I will try to prepare next patches to handle it, but if someone is working on it, it would be twice made ;)
>>
>> Slavoj.
>>
>> <validity_period.diff>
validity_period2.diff
(text/plain, 3.3 KB)
--- opensmppbox.c.old 2010-10-06 19:05:13.000000000 +0200
+++ opensmppbox.c 2010-10-27 16:49:32.000000000 +0200
@@ -341,6 +341,95 @@
} while(0)
#endif
+
+/*
+ * Converting SMPP timestamp to minutes relative
+ * to our localtime.
+ * Return -1 if error detected
+ * Author: [email protected]
+*/
+static int timestamp_to_minutes(Octstr *timestamp)
+{
+ struct tm tm, local;
+ time_t valutc, utc;
+ int rc, diff, dummy, localdiff;
+ char relation;
+
+ if (octstr_len(timestamp) == 0)
+ return 0;
+
+ if (octstr_len(timestamp) != 16)
+ return -1;
+
+ /*
+ * Timestamp format:
+ * YYMMDDhhmmsstnn[+-R]
+ * t - tenths of second (not used by us)
+ * nn - Time difference in quarter hours between local and UTC time
+ */
+ rc = sscanf(octstr_get_cstr(timestamp),
+ "%02d%02d%02d%02d%02d%02d%1d%02d%1c",
+ &tm.tm_year, &tm.tm_mon, &tm.tm_mday,
+ &tm.tm_hour, &tm.tm_min, &tm.tm_sec,
+ &dummy, &diff, &relation);
+ if (rc != 9)
+ return -1;
+
+ utc = time(NULL);
+ if (utc == ((time_t)-1))
+ return 0;
+
+ if (relation == '+' || relation == '-') {
+ tm.tm_year += 100; /* number of years since 1900 */
+ tm.tm_mon--; /* month 0-11 */
+ tm.tm_isdst = -1;
+ /* convert to sec. since 1970 */
+ valutc = gw_mktime(&tm);
+ if (valutc == ((time_t)-1))
+ return -1;
+
+ /* work out local time, because gw_mktime assume local time */
+ local = gw_localtime(utc);
+ tm = gw_gmtime(utc);
+ local.tm_isdst = tm.tm_isdst = -1;
+ localdiff = difftime(gw_mktime(&local), gw_mktime(&tm));
+ valutc += localdiff;
+
+ debug("sms.smpp",0, "diff between utc and localtime (%d)", localdiff);
+ diff = diff*15*60;
+ switch(relation) {
+ case '+':
+ valutc -= diff;
+ break;
+ case '-':
+ valutc += diff;
+ break;
+ }
+ } else if (relation == 'R') { /* relative to SMSC localtime */
+ local = gw_localtime(utc);
+ local.tm_year += tm.tm_year;
+ local.tm_mon += tm.tm_mon;
+ local.tm_mday += tm.tm_mday;
+ local.tm_hour += tm.tm_hour;
+ local.tm_min += tm.tm_min;
+ local.tm_sec += tm.tm_sec;
+ valutc = gw_mktime(&local);
+ if (valutc == ((time_t)-1))
+ return -1;
+ } else {
+ return -1;
+ }
+ tm = gw_gmtime(valutc);
+ debug("sms.smpp",0,"Requested UTC timestamp: %02d-%02d-%02d %02d:%02d:%02d",
+ tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+
+ debug("sms.smpp", 0, "requested timestamp in min. (%ld)", (valutc - utc)/60);
+
+ return ceil ( difftime (valutc, utc) / 60 );
+}
+
+
+
/*
*-------------------------------------------------
* receiver thingies
@@ -1165,6 +1254,17 @@
}
msg->sms.time = time(NULL);
+
+ /* set validity period if needed */
+ if (pdu->u.submit_sm.validity_period) {
+ msg->sms.validity = timestamp_to_minutes(pdu->u.submit_sm.validity_period);
+ }
+
+
+ /* set schedule delivery time if needed */
+ if (pdu->u.submit_sm.schedule_delivery_time) {
+ msg->sms.deferred = timestamp_to_minutes(pdu->u.submit_sm.schedule_delivery_time);
+ }
return msg;