Changeset 3444


Ignore:
Timestamp:
Mar 15, 2011 10:49:59 AM (10 years ago)
Author:
ming
Message:

Re #1205: If refresh timer is already running, it will be cancelled and rescheduled with the new delay. This can be useful if app wants to correct the delay after it checks the timeout in the callback.

Location:
pjproject/trunk/pjsip/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_reg.c

    r3441 r3444  
    392392} 
    393393 
    394 PJ_DEF(pj_status_t) 
    395 pjsip_regc_set_delay_before_refresh( pjsip_regc *regc, 
    396                                      pj_uint32_t delay ) 
    397 { 
    398     PJ_ASSERT_RETURN(regc, PJ_EINVAL); 
    399     regc->delay_before_refresh = delay; 
    400     return PJ_SUCCESS; 
    401 } 
    402  
    403394PJ_DEF(pj_status_t) pjsip_regc_set_credentials( pjsip_regc *regc, 
    404395                                                int count, 
     
    783774    } 
    784775} 
     776 
     777static void schedule_registration ( pjsip_regc *regc, pj_int32_t expiration ) 
     778{ 
     779    if (regc->auto_reg && expiration > 0) { 
     780        pj_time_val delay = { 0, 0}; 
     781 
     782        delay.sec = expiration - regc->delay_before_refresh; 
     783        if (regc->expires != PJSIP_REGC_EXPIRATION_NOT_SPECIFIED &&  
     784            delay.sec > (pj_int32_t)regc->expires)  
     785        { 
     786            delay.sec = regc->expires; 
     787        } 
     788        if (delay.sec < DELAY_BEFORE_REFRESH)  
     789            delay.sec = DELAY_BEFORE_REFRESH; 
     790        regc->timer.cb = &regc_refresh_timer_cb; 
     791        regc->timer.id = REFRESH_TIMER; 
     792        regc->timer.user_data = regc; 
     793        pjsip_endpt_schedule_timer( regc->endpt, &regc->timer, &delay); 
     794        pj_gettimeofday(&regc->last_reg); 
     795        regc->next_reg = regc->last_reg; 
     796        regc->next_reg.sec += delay.sec; 
     797    } 
     798} 
     799 
     800PJ_DEF(pj_status_t) 
     801pjsip_regc_set_delay_before_refresh( pjsip_regc *regc, 
     802                                     pj_uint32_t delay ) 
     803{ 
     804    PJ_ASSERT_RETURN(regc, PJ_EINVAL); 
     805 
     806    if (delay > regc->expires) 
     807        return PJ_ETOOBIG; 
     808 
     809    if (regc->delay_before_refresh != delay) 
     810    { 
     811        regc->delay_before_refresh = delay; 
     812 
     813        if (regc->timer.id != 0) { 
     814            /* Cancel registration timer */ 
     815            pjsip_endpt_cancel_timer(regc->endpt, &regc->timer); 
     816            regc->timer.id = 0; 
     817 
     818            /* Schedule next registration */ 
     819            schedule_registration(regc, regc->expires); 
     820        } 
     821    } 
     822 
     823    return PJ_SUCCESS; 
     824} 
     825 
    785826 
    786827static pj_int32_t calculate_response_expiration(const pjsip_regc *regc, 
     
    11281169 
    11291170            /* Schedule next registration */ 
    1130             if (regc->auto_reg && expiration > 0) { 
    1131                 pj_time_val delay = { 0, 0}; 
    1132  
    1133                 delay.sec = expiration - regc->delay_before_refresh; 
    1134                 if (regc->expires != PJSIP_REGC_EXPIRATION_NOT_SPECIFIED &&  
    1135                     delay.sec > (pj_int32_t)regc->expires)  
    1136                 { 
    1137                     delay.sec = regc->expires; 
    1138                 } 
    1139                 if (delay.sec < DELAY_BEFORE_REFRESH)  
    1140                     delay.sec = DELAY_BEFORE_REFRESH; 
    1141                 regc->timer.cb = &regc_refresh_timer_cb; 
    1142                 regc->timer.id = REFRESH_TIMER; 
    1143                 regc->timer.user_data = regc; 
    1144                 pjsip_endpt_schedule_timer( regc->endpt, &regc->timer, &delay); 
    1145                 pj_gettimeofday(&regc->last_reg); 
    1146                 regc->next_reg = regc->last_reg; 
    1147                 regc->next_reg.sec += delay.sec; 
    1148             } 
     1171            schedule_registration(regc, expiration); 
    11491172 
    11501173        } else { 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r3441 r3444  
    946946    /* Registration */ 
    947947    acc->cfg.reg_timeout = cfg->reg_timeout; 
    948     acc->cfg.reg_delay_before_refresh = cfg->reg_delay_before_refresh; 
    949948    acc->cfg.unreg_timeout = cfg->unreg_timeout; 
    950949    acc->cfg.allow_contact_rewrite = cfg->allow_contact_rewrite; 
    951950    acc->cfg.reg_retry_interval = cfg->reg_retry_interval; 
    952951    acc->cfg.drop_calls_on_reg_fail = cfg->drop_calls_on_reg_fail; 
     952    if (acc->cfg.reg_delay_before_refresh != cfg->reg_delay_before_refresh) { 
     953        acc->cfg.reg_delay_before_refresh = cfg->reg_delay_before_refresh; 
     954        pjsip_regc_set_delay_before_refresh(acc->regc, 
     955                                            cfg->reg_delay_before_refresh); 
     956    } 
    953957 
    954958    /* Normalize registration timeout and refresh delay */ 
Note: See TracChangeset for help on using the changeset viewer.