Ignore:
Timestamp:
Jan 28, 2020 1:47:56 AM (4 years ago)
Author:
riza
Message:

Close #2262: Notify when IP change handling is completed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r6035 r6137  
    693693    acc->via_tp = NULL; 
    694694    acc->next_rtp_port = 0; 
    695     acc->ip_change_op = PJSUA_IP_CHANGE_OP_NULL;     
     695    acc->ip_change_op = PJSUA_IP_CHANGE_OP_NULL; 
    696696 
    697697    /* Remove from array */ 
     
    24232423 
    24242424            pj_bzero(&ip_chg_info, sizeof(ip_chg_info)); 
    2425             pjsip_regc_get_info(param->regc, &rinfo);        
     2425            pjsip_regc_get_info(param->regc, &rinfo); 
    24262426            ip_chg_info.acc_update_contact.acc_id = acc->index; 
    24272427            ip_chg_info.acc_update_contact.code = param->code; 
    24282428            ip_chg_info.acc_update_contact.is_register = !param->is_unreg; 
    2429             (*pjsua_var.ua_cfg.cb.on_ip_change_progress)(acc->ip_change_op,  
    2430                                                          param->status,  
     2429            (*pjsua_var.ua_cfg.cb.on_ip_change_progress)(acc->ip_change_op, 
     2430                                                         param->status, 
    24312431                                                         &ip_chg_info); 
    24322432        } 
     
    24412441 
    24422442                status = pjsua_acc_set_registration(acc->index, PJ_TRUE); 
    2443                 if ((status != PJ_SUCCESS) &&  
    2444                     pjsua_var.ua_cfg.cb.on_ip_change_progress)  
     2443                if ((status != PJ_SUCCESS) && 
     2444                    pjsua_var.ua_cfg.cb.on_ip_change_progress) 
    24452445                { 
    24462446                    pjsua_ip_change_op_info ip_chg_info; 
     
    24502450                    ip_chg_info.acc_update_contact.is_register = PJ_TRUE; 
    24512451                    (*pjsua_var.ua_cfg.cb.on_ip_change_progress)( 
    2452                                                             acc->ip_change_op,  
    2453                                                             status,  
     2452                                                            acc->ip_change_op, 
     2453                                                            status, 
    24542454                                                            &ip_chg_info); 
     2455 
     2456                    pjsua_acc_end_ip_change(acc); 
    24552457                } 
    24562458            } else { 
    24572459                /* Avoid deadlock issue when sending BYE or Re-INVITE.  */ 
    2458                 pjsua_schedule_timer2(&handle_call_on_ip_change_cb,  
     2460                pjsua_schedule_timer2(&handle_call_on_ip_change_cb, 
    24592461                                      (void*)acc, 0); 
    24602462            } 
    2461         }  
    2462     } 
    2463      
     2463        } else { 
     2464            pjsua_acc_end_ip_change(acc); 
     2465        } 
     2466    } 
     2467 
    24642468    PJSUA_UNLOCK(); 
    24652469    pj_log_pop_indent(); 
     
    39033907            pjsip_regc_release_transport(pjsua_var.acc[i].regc); 
    39043908 
    3905             if (pjsua_var.acc[i].ip_change_op ==  
     3909            if (pjsua_var.acc[i].ip_change_op == 
    39063910                                            PJSUA_IP_CHANGE_OP_ACC_SHUTDOWN_TP) 
    39073911            { 
     3912                /* Before progressing to next step, report here. */ 
     3913                if (pjsua_var.ua_cfg.cb.on_ip_change_progress) { 
     3914                    pjsua_ip_change_op_info ch_info; 
     3915 
     3916                    pj_bzero(&ch_info, sizeof(ch_info)); 
     3917                    ch_info.acc_shutdown_tp.acc_id = acc->index; 
     3918 
     3919                    pjsua_var.ua_cfg.cb.on_ip_change_progress( 
     3920                                                         acc->ip_change_op, 
     3921                                                         PJ_SUCCESS, 
     3922                                                         &ch_info); 
     3923                } 
     3924 
    39083925                if (acc->cfg.allow_contact_rewrite) { 
    39093926                    pjsua_acc_update_contact_on_ip_change(acc); 
     
    39403957    status = pjsua_acc_set_registration(acc->index, !need_unreg); 
    39413958 
    3942     if ((status != PJ_SUCCESS) && (pjsua_var.ua_cfg.cb.on_ip_change_progress))  
     3959    if ((status != PJ_SUCCESS) && (pjsua_var.ua_cfg.cb.on_ip_change_progress) 
     3960        && (acc->ip_change_op == PJSUA_IP_CHANGE_OP_ACC_UPDATE_CONTACT)) 
    39433961    { 
     3962        /* If update contact fails, notification might already been triggered 
     3963         * from registration callback. 
     3964         */ 
    39443965        pjsua_ip_change_op_info info; 
    3945          
     3966 
    39463967        pj_bzero(&info, sizeof(info)); 
    39473968        info.acc_update_contact.acc_id = acc->index; 
    3948         info.acc_update_contact.is_register = !need_unreg;       
     3969        info.acc_update_contact.is_register = !need_unreg; 
    39493970 
    39503971        pjsua_var.ua_cfg.cb.on_ip_change_progress(acc->ip_change_op, 
    39513972                                                  status, 
    39523973                                                  &info); 
     3974 
     3975        pjsua_acc_end_ip_change(acc); 
    39533976    } 
    39543977    return status; 
     
    39653988 
    39663989    PJSUA_LOCK(); 
    3967     if (acc->cfg.ip_change_cfg.hangup_calls ||  
     3990    if (acc->cfg.ip_change_cfg.hangup_calls || 
    39683991        acc->cfg.ip_change_cfg.reinvite_flags) 
    39693992    { 
     
    39774000            } 
    39784001 
    3979             if (acc->cfg.ip_change_cfg.hangup_calls) { 
     4002            if ((acc->cfg.ip_change_cfg.hangup_calls) && 
     4003                (call_info.state >= PJSIP_INV_STATE_EARLY)) 
     4004            { 
    39804005                acc->ip_change_op = PJSUA_IP_CHANGE_OP_ACC_HANGUP_CALLS; 
    39814006                PJ_LOG(3, (THIS_FILE, "call to %.*s: hangup " 
     
    40324057            } 
    40334058        } 
    4034     }     
    4035     acc->ip_change_op = PJSUA_IP_CHANGE_OP_NULL; 
     4059    } 
     4060    pjsua_acc_end_ip_change(acc); 
    40364061    PJSUA_UNLOCK(); 
    40374062    return status; 
    40384063} 
     4064 
     4065void pjsua_acc_end_ip_change(pjsua_acc *acc) 
     4066{ 
     4067    int i = 0; 
     4068    pj_bool_t all_done = PJ_TRUE; 
     4069 
     4070    PJSUA_LOCK(); 
     4071    if (acc && acc->ip_change_op < PJSUA_IP_CHANGE_OP_COMPLETED) { 
     4072        PJ_LOG(3, (THIS_FILE, "IP address change handling for acc %d " 
     4073                   "completed", acc->index)); 
     4074        acc->ip_change_op = PJSUA_IP_CHANGE_OP_COMPLETED; 
     4075        if (pjsua_var.acc_cnt) { 
     4076            for (; i < (int)PJ_ARRAY_SIZE(pjsua_var.acc); ++i) { 
     4077                if (pjsua_var.acc[i].valid && 
     4078                    pjsua_var.acc[i].ip_change_op != 
     4079                                                  PJSUA_IP_CHANGE_OP_COMPLETED) 
     4080                { 
     4081                    all_done = PJ_FALSE; 
     4082                    break; 
     4083                } 
     4084            } 
     4085        } 
     4086    } 
     4087    if (all_done && pjsua_var.ua_cfg.cb.on_ip_change_progress) { 
     4088        PJ_LOG(3, (THIS_FILE, "IP address change handling completed")); 
     4089        pjsua_var.ua_cfg.cb.on_ip_change_progress( 
     4090                                            PJSUA_IP_CHANGE_OP_COMPLETED, 
     4091                                            PJ_SUCCESS, 
     4092                                            NULL); 
     4093    } 
     4094    PJSUA_UNLOCK(); 
     4095} 
Note: See TracChangeset for help on using the changeset viewer.