Hi Slavoj, Thanks for the patch and thanks to Alex for improvements. I hope they commit it.
+1 ------------------------------ Date: Wed, 27 Oct 2010 16:52:15 +0200 From: "XEN-Housing s.r.o." <[email protected]> To: Alexander Malysh <[email protected]> Cc: [email protected] Subject: Re: [patch] opensmppbox validiti periode passtrought fix Message-ID: <[email protected]> Content-Type: text/plain; charset="utf-8"; Format="flowed" 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>
