Changeset 4172 for pjproject/trunk


Ignore:
Timestamp:
Jun 19, 2012 2:35:18 PM (12 years ago)
Author:
nanang
Message:

Close #1540:

  • added pjsua_acc_config.mwi_expires, also compile-time macro PJSIP_MWI_DEFAULT_EXPIRES
  • updated pjsua_acc_modify() to update MWI subscription when mwi_expires & mwi_enabled of pjsua_acc_config is modified
Location:
pjproject/trunk/pjsip
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsip/sip_config.h

    r4094 r4172  
    995995 
    996996 
     997/** 
     998 * Specify the default expiration time for Message Waiting Indication 
     999 * (RFC 3842) event subscription, for both client and server subscription. 
     1000 * For client subscription, application can override this by specifying 
     1001 * positive non-zero value in "expires" parameter when calling 
     1002 * #pjsip_mwi_initiate(). For server subscription, we would take the 
     1003 * expiration value from the Expires header sent by client in the SUBSCRIBE 
     1004 * request if the header exists and its value is less than  this setting, 
     1005 * otherwise this setting will be used. 
     1006 * 
     1007 * Default: 3600 seconds 
     1008 */ 
     1009#ifndef PJSIP_MWI_DEFAULT_EXPIRES 
     1010#   define PJSIP_MWI_DEFAULT_EXPIRES            3600 
     1011#endif 
     1012 
     1013 
    9971014PJ_END_DECL 
    9981015 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua.h

    r4164 r4172  
    26162616 
    26172617    /** 
     2618     * Specify the default expiration time for Message Waiting Indication 
     2619     * (RFC 3842) event subscription. This must not be zero. 
     2620     * 
     2621     * Default: PJSIP_MWI_DEFAULT_EXPIRES 
     2622     */ 
     2623    unsigned        mwi_expires; 
     2624 
     2625    /** 
    26182626     * If this flag is set, the presence information of this account will 
    26192627     * be PUBLISH-ed to the server where the account belongs. 
  • pjproject/trunk/pjsip/include/pjsua-lib/pjsua_internal.h

    r4145 r4172  
    671671 * Start MWI subscription 
    672672 */ 
    673 void pjsua_start_mwi(pjsua_acc *acc); 
     673pj_status_t pjsua_start_mwi(pjsua_acc_id acc_id, pj_bool_t force_renew); 
    674674 
    675675/** 
  • pjproject/trunk/pjsip/src/pjsip-simple/mwi.c

    r3553 r4172  
    3333 
    3434#define THIS_FILE                   "mwi.c" 
    35 #define MWI_DEFAULT_EXPIRES         3600 
    3635 
    3736 /* 
     
    139138    /* Register event package to event module. */ 
    140139    status = pjsip_evsub_register_pkg( &mod_mwi, &STR_MWI,  
    141                                        MWI_DEFAULT_EXPIRES,  
     140                                       PJSIP_MWI_DEFAULT_EXPIRES,  
    142141                                       PJ_ARRAY_SIZE(accept), accept); 
    143142    if (status != PJ_SUCCESS) { 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r4155 r4172  
    470470        /* Otherwise subscribe to MWI, if it's enabled */ 
    471471        if (pjsua_var.acc[id].cfg.mwi_enabled) 
    472             pjsua_start_mwi(&pjsua_var.acc[id]); 
     472            pjsua_start_mwi(id, PJ_TRUE); 
    473473    } 
    474474 
     
    680680    pj_bool_t update_reg = PJ_FALSE; 
    681681    pj_bool_t unreg_first = PJ_FALSE; 
     682    pj_bool_t update_mwi = PJ_FALSE; 
    682683    pj_status_t status = PJ_SUCCESS; 
    683684 
     
    839840 
    840841    /* MWI */ 
    841     acc->cfg.mwi_enabled = cfg->mwi_enabled; 
     842    if (acc->cfg.mwi_enabled != cfg->mwi_enabled) { 
     843        acc->cfg.mwi_enabled = cfg->mwi_enabled; 
     844        update_mwi = PJ_TRUE; 
     845    } 
     846    if (acc->cfg.mwi_expires != cfg->mwi_expires && cfg->mwi_expires > 0) { 
     847        acc->cfg.mwi_expires = cfg->mwi_expires; 
     848        update_mwi = PJ_TRUE; 
     849    } 
    842850 
    843851    /* PIDF tuple ID */ 
     
    11331141        if (acc->cfg.reg_uri.slen) 
    11341142            pjsua_acc_set_registration(acc->index, PJ_TRUE); 
    1135         else { 
    1136             /* Otherwise subscribe to MWI, if it's enabled */ 
    1137             if (acc->cfg.mwi_enabled) 
    1138                 pjsua_start_mwi(acc); 
    1139         } 
     1143    } 
     1144 
     1145    /* Update MWI subscription */ 
     1146    if (update_mwi) { 
     1147        pjsua_start_mwi(acc_id, PJ_TRUE); 
    11401148    } 
    11411149 
     
    18761884            /* Subscribe to MWI, if it's enabled */ 
    18771885            if (acc->cfg.mwi_enabled) 
    1878                 pjsua_start_mwi(acc); 
     1886                pjsua_start_mwi(acc->index, PJ_FALSE); 
    18791887        } 
    18801888 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r4154 r4172  
    238238    cfg->call_hold_type = PJSUA_CALL_HOLD_TYPE_DEFAULT; 
    239239    cfg->register_on_acc_add = PJ_TRUE; 
     240    cfg->mwi_expires = PJSIP_MWI_DEFAULT_EXPIRES; 
    240241} 
    241242 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_pres.c

    r3841 r4172  
    20122012}; 
    20132013 
    2014 void pjsua_start_mwi(pjsua_acc *acc) 
    2015 { 
     2014pj_status_t pjsua_start_mwi(pjsua_acc_id acc_id, pj_bool_t force_renew) 
     2015{ 
     2016    pjsua_acc *acc; 
    20162017    pj_pool_t *tmp_pool = NULL; 
    20172018    pj_str_t contact; 
    20182019    pjsip_tx_data *tdata; 
    2019     pj_status_t status; 
     2020    pj_status_t status = PJ_SUCCESS; 
     2021 
     2022    PJ_ASSERT_RETURN(acc_id>=0 && acc_id<(int)PJ_ARRAY_SIZE(pjsua_var.acc) 
     2023                     && pjsua_var.acc[acc_id].valid, PJ_EINVAL); 
     2024 
     2025    acc = &pjsua_var.acc[acc_id]; 
    20202026 
    20212027    if (!acc->cfg.mwi_enabled) { 
    20222028        if (acc->mwi_sub) { 
    20232029            /* Terminate MWI subscription */ 
    2024             pjsip_tx_data *tdata; 
    20252030            pjsip_evsub *sub = acc->mwi_sub; 
    20262031 
     
    20362041            } 
    20372042        } 
    2038         return; 
    2039     } 
    2040  
     2043        return status; 
     2044    } 
     2045 
     2046    /* Subscription is already active */ 
    20412047    if (acc->mwi_sub) { 
    2042         /* Subscription is already active */ 
    2043         return; 
    2044  
     2048        if (!force_renew) 
     2049            return PJ_SUCCESS; 
     2050         
     2051        /* Update MWI subscription */ 
     2052        pj_assert(acc->mwi_dlg); 
     2053        pjsip_dlg_inc_lock(acc->mwi_dlg); 
     2054         
     2055        status = pjsip_mwi_initiate(acc->mwi_sub, acc->cfg.mwi_expires, &tdata); 
     2056        if (status == PJ_SUCCESS) { 
     2057            pjsua_process_msg_data(tdata, NULL); 
     2058            status = pjsip_pres_send_request(acc->mwi_sub, tdata); 
     2059        } 
     2060 
     2061        pjsip_dlg_dec_lock(acc->mwi_dlg); 
     2062        return status; 
    20452063    } 
    20462064 
     
    20602078            pjsua_perror(THIS_FILE, "Unable to generate Contact header",  
    20612079                         status); 
    2062             pj_pool_release(tmp_pool); 
    2063             pj_log_pop_indent(); 
    2064             return; 
     2080            goto on_return; 
    20652081        } 
    20662082    } 
     
    20742090    if (status != PJ_SUCCESS) { 
    20752091        pjsua_perror(THIS_FILE, "Unable to create dialog", status); 
    2076         if (tmp_pool) pj_pool_release(tmp_pool); 
    2077         pj_log_pop_indent(); 
    2078         return; 
     2092        goto on_return; 
    20792093    } 
    20802094 
     
    20892103    if (status != PJ_SUCCESS) { 
    20902104        pjsua_perror(THIS_FILE, "Error creating MWI subscription", status); 
    2091         if (tmp_pool) pj_pool_release(tmp_pool); 
    20922105        if (acc->mwi_dlg) pjsip_dlg_dec_lock(acc->mwi_dlg); 
    2093         pj_log_pop_indent(); 
    2094         return; 
     2106        goto on_return; 
    20952107    } 
    20962108 
     
    21212133    pjsip_evsub_set_mod_data(acc->mwi_sub, pjsua_var.mod.id, acc); 
    21222134 
    2123     status = pjsip_mwi_initiate(acc->mwi_sub, -1, &tdata); 
     2135    status = pjsip_mwi_initiate(acc->mwi_sub, acc->cfg.mwi_expires, &tdata); 
    21242136    if (status != PJ_SUCCESS) { 
    21252137        if (acc->mwi_dlg) pjsip_dlg_dec_lock(acc->mwi_dlg); 
     
    21312143        pjsua_perror(THIS_FILE, "Unable to create initial MWI SUBSCRIBE",  
    21322144                     status); 
    2133         if (tmp_pool) pj_pool_release(tmp_pool); 
    2134         pj_log_pop_indent(); 
    2135         return; 
     2145        goto on_return; 
    21362146    } 
    21372147 
     
    21482158        pjsua_perror(THIS_FILE, "Unable to send initial MWI SUBSCRIBE",  
    21492159                     status); 
    2150         if (tmp_pool) pj_pool_release(tmp_pool); 
    2151         pj_log_pop_indent(); 
    2152         return; 
     2160        goto on_return; 
    21532161    } 
    21542162 
    21552163    pjsip_dlg_dec_lock(acc->mwi_dlg); 
     2164 
     2165on_return: 
    21562166    if (tmp_pool) pj_pool_release(tmp_pool); 
    21572167 
    21582168    pj_log_pop_indent(); 
     2169    return status; 
    21592170} 
    21602171 
     
    22702281        /* Re-subscribe MWI subscription if it's terminated prematurely */ 
    22712282        if (acc->cfg.mwi_enabled && !acc->mwi_sub) 
    2272             pjsua_start_mwi(acc); 
     2283            pjsua_start_mwi(acc->index, PJ_FALSE); 
    22732284    } 
    22742285 
Note: See TracChangeset for help on using the changeset viewer.