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>


Reply via email to