Ignore:
Timestamp:
Jul 17, 2008 1:53:41 PM (13 years ago)
Author:
bennylp
Message:

Ticket #574: Add new API to know why the outgoing subscription request is terminated and added support for delaying subscription acceptance

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-simple/evsub.c

    r2147 r2149  
    222222    pjsip_evsub_state     dst_state;    /**< Pending state to be set.       */ 
    223223    pj_str_t              dst_state_str;/**< Pending state to be set.       */ 
     224    pj_str_t              term_reason;  /**< Termination reason.            */ 
    224225    pjsip_method          method;       /**< Method that established subscr.*/ 
    225226    pjsip_event_hdr      *event;        /**< Event description.             */ 
     
    551552 */ 
    552553static void set_state( pjsip_evsub *sub, pjsip_evsub_state state, 
    553                        const pj_str_t *state_str, pjsip_event *event) 
     554                       const pj_str_t *state_str, pjsip_event *event, 
     555                       const pj_str_t *reason) 
    554556{ 
    555557    pjsip_evsub_state prev_state = sub->state; 
     
    562564    else 
    563565        sub->state_str = evsub_state_names[state]; 
     566 
     567    if (reason && sub->term_reason.slen==0) 
     568        pj_strdup(sub->pool, &sub->term_reason, reason); 
    564569 
    565570    PJ_LOG(4,(sub->obj_name,  
     
    639644    case TIMER_TYPE_UAC_TERMINATE: 
    640645        { 
     646            pj_str_t timeout = {"timeout", 7}; 
     647 
    641648            PJ_LOG(5,(sub->obj_name, "Timeout waiting for final NOTIFY. " 
    642649                                     "Terminating..")); 
    643             set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL); 
     650            set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL,  
     651                      &timeout); 
    644652        } 
    645653        break; 
     
    913921 
    914922    sub->call_cb = notify; 
    915     set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL); 
     923    set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL, NULL); 
    916924 
    917925    pjsip_dlg_dec_lock(sub->dlg); 
     
    935943} 
    936944 
     945/* 
     946 * Get termination reason. 
     947 */ 
     948PJ_DEF(const pj_str_t*) pjsip_evsub_get_termination_reason(pjsip_evsub *sub) 
     949{ 
     950    return &sub->term_reason; 
     951} 
    937952 
    938953/* 
     
    10861101    case PJSIP_EVSUB_STATE_NULL: 
    10871102    case PJSIP_EVSUB_STATE_SENT: 
    1088     case PJSIP_EVSUB_STATE_ACCEPTED: 
    10891103        pj_assert(!"Invalid state!"); 
    10901104        /* Treat as pending */ 
    10911105 
     1106    case PJSIP_EVSUB_STATE_ACCEPTED: 
    10921107    case PJSIP_EVSUB_STATE_PENDING: 
    10931108        sub_state->sub_state = STR_PENDING; 
     
    11561171    pjsip_auth_clt_init_req( &sub->dlg->auth_sess, tdata ); 
    11571172 
    1158      
     1173    /* Update reason */ 
     1174    if (reason) 
     1175        pj_strdup(sub->dlg->pool, &sub->term_reason, reason); 
    11591176 
    11601177    /* Save destination state. */ 
     
    12191236        set_state(sub, sub->dst_state,  
    12201237                  (sub->dst_state_str.slen ? &sub->dst_state_str : NULL),  
    1221                   NULL); 
     1238                  NULL, NULL); 
    12221239 
    12231240        sub->dst_state = PJSIP_EVSUB_STATE_NULL; 
     
    15471564            tsx->state == PJSIP_TSX_STATE_CALLING) 
    15481565        { 
    1549             set_state(sub, PJSIP_EVSUB_STATE_SENT, NULL, event); 
     1566            set_state(sub, PJSIP_EVSUB_STATE_SENT, NULL, event, NULL); 
    15501567            return; 
    15511568        } 
     
    15881605                /* Authentication failed! */ 
    15891606                set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, 
    1590                                NULL, 
    1591                                event); 
     1607                          NULL, event, &tsx->status_text); 
    15921608                return; 
    15931609            } 
     
    16471663            pj_assert(sub->state != PJSIP_EVSUB_STATE_NULL); 
    16481664            if (sub->state == PJSIP_EVSUB_STATE_SENT) { 
    1649                 set_state(sub, PJSIP_EVSUB_STATE_ACCEPTED, NULL, event); 
     1665                set_state(sub, PJSIP_EVSUB_STATE_ACCEPTED, NULL, event, NULL); 
    16501666            } 
    16511667 
     
    16861702            /* Set state to TERMINATED */ 
    16871703            set_state(sub, PJSIP_EVSUB_STATE_TERMINATED,  
    1688                       NULL, event); 
     1704                      NULL, event, &tsx->status_text); 
    16891705 
    16901706        } 
     
    17721788                set_timer(sub, TIMER_TYPE_UAC_WAIT_NOTIFY, timeout); 
    17731789            } else { 
    1774                 set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL); 
     1790                char errmsg[PJ_ERR_MSG_SIZE]; 
     1791                pj_str_t reason; 
     1792 
     1793                reason = pj_strerror(status, errmsg, sizeof(errmsg)); 
     1794                set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL,  
     1795                          &reason); 
    17751796            } 
    17761797 
     
    18161837        /* Set the state */ 
    18171838        if (status == PJ_SUCCESS) { 
    1818             set_state(sub, new_state, new_state_str, event); 
     1839            set_state(sub, new_state, new_state_str, event,  
     1840                      &sub_state->reason_param); 
    18191841        } else { 
    1820             set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, event); 
     1842            char errmsg[PJ_ERR_MSG_SIZE]; 
     1843            pj_str_t reason; 
     1844 
     1845            reason = pj_strerror(status, errmsg, sizeof(errmsg)); 
     1846            set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, event,  
     1847                      &reason); 
    18211848        } 
    18221849 
     
    18591886        pjsip_evsub_state old_state; 
    18601887        pj_str_t old_state_str; 
     1888        pj_str_t reason = { NULL, 0 }; 
    18611889        pj_status_t status; 
    18621890 
     
    19451973             
    19461974            if (sub->expires->ivalue == 0) { 
    1947                 set_state(sub, sub->state, NULL, event); 
     1975                set_state(sub, sub->state, NULL, event, &reason); 
    19481976            } else  if (sub->state == PJSIP_EVSUB_STATE_NULL) { 
    1949                 set_state(sub, sub->state, NULL, event); 
     1977                set_state(sub, sub->state, NULL, event, &reason); 
    19501978            } 
    19511979 
     
    19812009            if (status != PJ_SUCCESS) { 
    19822010                /* Can't authenticate. Terminate session (?) */ 
    1983                 set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL); 
     2011                set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, NULL,  
     2012                          &tsx->status_text); 
    19842013                return; 
    19852014            } 
     
    19942023             tsx->status_code/100 == 7)) 
    19952024        { 
    1996             set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, event); 
     2025            set_state(sub, PJSIP_EVSUB_STATE_TERMINATED, NULL, event, 
     2026                      &tsx->status_text); 
    19972027            return; 
    19982028        } 
Note: See TracChangeset for help on using the changeset viewer.