Changeset 3068


Ignore:
Timestamp:
01/21/10 04:04:26 (9 years ago)
Author:
bennylp
Message:

Ticket #1029: Fix support for multiple (event) subscriptions in a single dialog (thanks Wang Eric for the report)

Location:
pjproject/trunk/pjsip
Files:
3 edited

Legend:

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

    r2855 r3068  
    373373 
    374374/** 
     375 * Check if the specified module has been registered as usage to the dialog. 
     376 * 
     377 * @param dlg               The dialog. 
     378 * @param module            The module. 
     379 * 
     380 * @return                  PJ_TRUE if the specified module is currently 
     381 *                          registered as a usage to the dialog. 
     382 */ 
     383PJ_DECL(pj_bool_t) pjsip_dlg_has_usage(pjsip_dialog *dlg, 
     384                                          pjsip_module *module); 
     385 
     386/** 
    375387 * Attach module specific data to the dialog. Application can also set  
    376388 * the value directly by accessing dlg->mod_data[module_id]. 
  • pjproject/trunk/pjsip/src/pjsip-simple/evsub.c

    r2822 r3068  
    736736 
    737737 
    738     /* Create subcription list: */ 
    739  
    740     dlgsub_head = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); 
    741     dlgsub = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); 
    742     dlgsub->sub = sub; 
    743  
    744     pj_list_init(dlgsub_head); 
    745     pj_list_push_back(dlgsub_head, dlgsub); 
    746  
    747  
    748     /* Register as dialog usage: */ 
    749  
    750     status = pjsip_dlg_add_usage(dlg, &mod_evsub.mod, dlgsub_head); 
    751     if (status != PJ_SUCCESS) { 
    752         pjsip_dlg_dec_lock(dlg); 
    753         return status; 
    754     } 
    755  
     738    /* Check if another subscription has been registered to the dialog. In 
     739     * that case, just add ourselves to the subscription list, otherwise 
     740     * create and register a new subscription list. 
     741     */ 
     742    if (pjsip_dlg_has_usage(dlg, &mod_evsub.mod)) { 
     743        dlgsub_head = (struct dlgsub*) dlg->mod_data[mod_evsub.mod.id]; 
     744        dlgsub = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); 
     745        dlgsub->sub = sub; 
     746        pj_list_push_back(dlgsub_head, dlgsub); 
     747    } else { 
     748        dlgsub_head = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); 
     749        dlgsub = PJ_POOL_ALLOC_T(sub->pool, struct dlgsub); 
     750        dlgsub->sub = sub; 
     751 
     752        pj_list_init(dlgsub_head); 
     753        pj_list_push_back(dlgsub_head, dlgsub); 
     754 
     755 
     756        /* Register as dialog usage: */ 
     757 
     758        status = pjsip_dlg_add_usage(dlg, &mod_evsub.mod, dlgsub_head); 
     759        if (status != PJ_SUCCESS) { 
     760            pjsip_dlg_dec_lock(dlg); 
     761            return status; 
     762        } 
     763    } 
    756764 
    757765    PJ_LOG(5,(sub->obj_name, "%s subscription created, using dialog %s", 
  • pjproject/trunk/pjsip/src/pjsip/sip_dialog.c

    r3031 r3068  
    892892 
    893893    return PJ_SUCCESS; 
     894} 
     895 
     896/* 
     897 * Check if the module is registered as a usage 
     898 */ 
     899PJ_DEF(pj_bool_t) pjsip_dlg_has_usage( pjsip_dialog *dlg, 
     900                                          pjsip_module *mod) 
     901{ 
     902    unsigned index; 
     903    pj_bool_t found = PJ_FALSE; 
     904 
     905    pjsip_dlg_inc_lock(dlg); 
     906    for (index=0; index<dlg->usage_cnt; ++index) { 
     907        if (dlg->usage[index] == mod) { 
     908            found = PJ_TRUE; 
     909            break; 
     910        } 
     911    } 
     912    pjsip_dlg_dec_lock(dlg); 
     913 
     914    return found; 
    894915} 
    895916 
Note: See TracChangeset for help on using the changeset viewer.