Changeset 500 for pjproject/trunk


Ignore:
Timestamp:
Jun 13, 2006 10:21:23 PM (18 years ago)
Author:
bennylp
Message:

Added status_text and cause_text in dialog and transaction to capture the real status text in the final response (instead of just the code)

Location:
pjproject/trunk/pjsip
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/include/pjsip-ua/sip_inv.h

    r324 r500  
    167167struct pjsip_inv_session 
    168168{ 
    169     char                 obj_name[PJ_MAX_OBJ_NAME]; /**< Log identification. */ 
     169    char                 obj_name[PJ_MAX_OBJ_NAME]; /**< Log identification */ 
    170170    pj_pool_t           *pool;                      /**< Dialog's pool.     */ 
    171171    pjsip_inv_state      state;                     /**< Invite sess state. */ 
    172172    pjsip_status_code    cause;                     /**< Disconnect cause.  */ 
     173    pj_str_t             cause_text;                /**< Cause text.        */ 
    173174    pj_bool_t            notify;                    /**< Internal.          */ 
    174175    pjsip_dialog        *dlg;                       /**< Underlying dialog. */ 
  • pjproject/trunk/pjsip/include/pjsip/sip_transaction.h

    r253 r500  
    8383     */ 
    8484    int                         status_code;    /**< Last status code seen. */ 
     85    pj_str_t                    status_text;    /**< Last reason phrase.    */ 
    8586    pjsip_tsx_state_e           state;          /**< State.                 */ 
    8687    int                         handle_200resp; /**< UAS 200/INVITE  retrsm.*/ 
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r376 r500  
    159159 
    160160/* 
     161 * Set cause code. 
     162 */ 
     163void inv_set_cause(pjsip_inv_session *inv, int cause_code, 
     164                   const pj_str_t *cause_text) 
     165{ 
     166    if (cause_code > inv->cause) { 
     167        inv->cause = cause_code; 
     168        if (cause_text) 
     169            pj_strdup(inv->pool, &inv->cause_text, cause_text); 
     170        else if (cause_code/100 == 2) 
     171            inv->cause_text = pj_str("Normal call clearing"); 
     172        else 
     173            inv->cause_text = *pjsip_get_status_text(cause_code); 
     174    } 
     175} 
     176 
     177 
     178 
     179/* 
    161180 * Send ACK for 2xx response. 
    162181 */ 
     
    899918 
    900919    /* Set cause. */ 
    901     inv->cause = st_code; 
     920    inv_set_cause(inv, st_code, NULL); 
    902921 
    903922    /* Forcefully terminate the session if state is not DISCONNECTED */ 
     
    13881407 
    13891408    /* Set cause code. */ 
    1390     if (inv->cause==0) inv->cause = st_code; 
     1409    inv_set_cause(inv, st_code, st_text); 
    13911410 
    13921411    /* Create appropriate message. */ 
     
    16981717 
    16991718    if (inv->state != PJSIP_INV_STATE_DISCONNECTED) { 
    1700         if (inv->cause==0) inv->cause=PJSIP_SC_OK; 
     1719        inv_set_cause(inv, PJSIP_SC_OK, NULL); 
    17011720        inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    17021721    } 
     
    17141733     
    17151734    if (e->body.tsx_state.type != PJSIP_EVENT_RX_MSG) { 
    1716         if (inv->cause==0) inv->cause=PJSIP_SC_OK; 
     1735        inv_set_cause(inv, PJSIP_SC_OK, NULL); 
    17171736        inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    17181737        return; 
     
    17341753             * End the session anyway. 
    17351754             */ 
    1736             if (inv->cause==0) inv->cause=PJSIP_SC_OK; 
     1755            inv_set_cause(inv, PJSIP_SC_OK, NULL); 
    17371756            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    17381757             
     
    17451764 
    17461765        /* End the session. */ 
    1747         if (inv->cause==0) inv->cause=PJSIP_SC_OK; 
     1766        inv_set_cause(inv, PJSIP_SC_OK, NULL); 
    17481767        inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    17491768    } 
     
    18631882                     * End the session. 
    18641883                     */ 
    1865                     if (inv->cause==0) inv->cause = tsx->status_code; 
     1884                    inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    18661885                    inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    18671886 
     
    18781897            } else { 
    18791898 
    1880                 if (inv->cause==0) inv->cause = tsx->status_code; 
     1899                inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    18811900                inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    18821901 
     
    19061925 
    19071926            } else  { 
    1908                 if (inv->cause==0) inv->cause = tsx->status_code; 
     1927                inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    19091928                inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    19101929            } 
     
    19271946            tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT || 
    19281947            tsx->status_code == PJSIP_SC_TSX_TIMEOUT || 
    1929             PJSIP_SC_TSX_TRANSPORT_ERROR) 
     1948            tsx->status_code == PJSIP_SC_TSX_TRANSPORT_ERROR) 
    19301949        { 
    1931             if (inv->cause==0) inv->cause = tsx->status_code; 
     1950            inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    19321951            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    19331952        } 
     
    19731992                inv_set_state(inv, PJSIP_INV_STATE_CONNECTING, e); 
    19741993            } else { 
    1975                 if (inv->cause==0) inv->cause = tsx->status_code; 
     1994                inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    19761995                inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    19771996            } 
     
    19832002             * response) 
    19842003             */ 
    1985             if (inv->cause==0) inv->cause = tsx->status_code; 
     2004            inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    19862005            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    19872006            break; 
     
    20452064 
    20462065            } else { 
    2047                 if (inv->cause==0) inv->cause = tsx->status_code; 
     2066                inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    20482067                inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    20492068            } 
     
    20792098 
    20802099            } else  { 
    2081                 if (inv->cause==0) inv->cause = tsx->status_code; 
     2100                inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    20822101                inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    20832102            } 
     
    21132132            tsx->status_code == PJSIP_SC_REQUEST_TIMEOUT || 
    21142133            tsx->status_code == PJSIP_SC_TSX_TIMEOUT || 
    2115             PJSIP_SC_TSX_TRANSPORT_ERROR) 
     2134            tsx->status_code == PJSIP_SC_TSX_TRANSPORT_ERROR) 
    21162135        { 
    2117             if (inv->cause==0) inv->cause = tsx->status_code; 
     2136            inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    21182137            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    21192138        } 
     
    21492168             */ 
    21502169            if (tsx->status_code/100 != 2) { 
    2151                 if (inv->cause==0) inv->cause = tsx->status_code; 
     2170                inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    21522171                inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    21532172            } 
     
    23412360             * Handle responses that terminates dialog. 
    23422361             */ 
    2343             if (inv->cause==0) inv->cause = tsx->status_code; 
     2362            inv_set_cause(inv, tsx->status_code, &tsx->status_text); 
    23442363            inv_set_state(inv, PJSIP_INV_STATE_DISCONNECTED, e); 
    23452364        } 
  • pjproject/trunk/pjsip/src/pjsip/sip_transaction.c

    r491 r500  
    13271327 
    13281328/* 
     1329 * Set transaction status code and reason. 
     1330 */ 
     1331static tsx_set_status_code(pjsip_transaction *tsx, 
     1332                           int code, const pj_str_t *reason) 
     1333{ 
     1334    tsx->status_code = code; 
     1335    if (reason) 
     1336        pj_strdup(tsx->pool, &tsx->status_text, reason); 
     1337    else 
     1338        tsx->status_text = *pjsip_get_status_text(code); 
     1339} 
     1340 
     1341 
     1342/* 
    13291343 * Forcely terminate transaction. 
    13301344 */ 
     
    13421356 
    13431357    lock_tsx(tsx, &lck); 
    1344     tsx->status_code = code; 
     1358    tsx_set_status_code(tsx, code, NULL); 
    13451359    tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED, PJSIP_EVENT_USER, NULL); 
    13461360    unlock_tsx(tsx, &lck); 
     
    14921506        if (!*cont) { 
    14931507            char errmsg[PJ_ERR_MSG_SIZE]; 
     1508            pj_str_t err; 
    14941509 
    14951510            tsx->transport_err = -sent; 
     1511 
     1512            err =pj_strerror(-sent, errmsg, sizeof(errmsg)); 
    14961513 
    14971514            PJ_LOG(4,(tsx->obj_name,  
    14981515                      "Failed to send %s! err=%d (%s)", 
    14991516                      pjsip_tx_data_get_info(send_state->tdata), -sent, 
    1500                       pj_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
     1517                      errmsg)); 
    15011518 
    15021519            /* Clear pending transport flag. */ 
     
    15071524 
    15081525            /* Terminate transaction, if it's not already terminated. */ 
    1509             tsx->status_code = PJSIP_SC_TSX_TRANSPORT_ERROR; 
     1526            tsx_set_status_code(tsx, PJSIP_SC_TSX_TRANSPORT_ERROR, &err); 
    15101527            if (tsx->state != PJSIP_TSX_STATE_TERMINATED && 
    15111528                tsx->state != PJSIP_TSX_STATE_DESTROYED) 
     
    15381555        struct tsx_lock_data lck; 
    15391556        char errmsg[PJ_ERR_MSG_SIZE]; 
     1557        pj_str_t err; 
    15401558 
    15411559        tsx->transport_err = -sent; 
    15421560 
     1561        err = pj_strerror(-sent, errmsg, sizeof(errmsg)); 
     1562 
    15431563        PJ_LOG(4,(tsx->obj_name, "Transport failed to send %s! Err=%d (%s)", 
    1544                   pjsip_tx_data_get_info(tdata), -sent, 
    1545                   pj_strerror(-sent, errmsg, sizeof(errmsg)).ptr)); 
     1564                  pjsip_tx_data_get_info(tdata), -sent, errmsg)); 
    15461565 
    15471566        lock_tsx(tsx, &lck); 
     
    15521571 
    15531572        /* Terminate transaction. */ 
    1554         tsx->status_code = PJSIP_SC_TSX_TRANSPORT_ERROR; 
     1573        tsx_set_status_code(tsx, PJSIP_SC_TSX_TRANSPORT_ERROR, &err); 
    15551574        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
    15561575                       PJSIP_EVENT_TRANSPORT_ERROR, tdata ); 
     
    16221641         
    16231642        char errmsg[PJ_ERR_MSG_SIZE]; 
     1643        pj_str_t err; 
    16241644 
    16251645        if (status == PJ_SUCCESS) { 
     
    16311651         * Treat this as permanent transport error. 
    16321652         */ 
     1653        err = pj_strerror(status, errmsg, sizeof(errmsg)); 
     1654 
    16331655        PJ_LOG(4,(tsx->obj_name,  
    16341656                  "Transport error, terminating transaction. " 
    16351657                  "Err=%d (%s)", 
    1636                   status,  
    1637                   pj_strerror(status, errmsg, sizeof(errmsg)).ptr)); 
    1638  
    1639         tsx->status_code = PJSIP_SC_TSX_TRANSPORT_ERROR; 
     1658                  status, errmsg)); 
     1659 
     1660        tsx_set_status_code(tsx, PJSIP_SC_TSX_TRANSPORT_ERROR, &err); 
    16401661        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
    16411662                       PJSIP_EVENT_TRANSPORT_ERROR, NULL ); 
     
    18601881 
    18611882        /* Set status code */ 
    1862         tsx->status_code = PJSIP_SC_TSX_TIMEOUT; 
     1883        tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL); 
    18631884 
    18641885        /* Inform TU. */ 
     
    20022023 
    20032024        /* Update last status */ 
    2004         tsx->status_code = msg->line.status.code; 
     2025        tsx_set_status_code(tsx, msg->line.status.code,  
     2026                            &msg->line.status.reason); 
    20052027 
    20062028        /* Discard the saved last response (it will be updated later as 
     
    21642186        pj_assert(!"Should not happen(?)"); 
    21652187 
    2166         tsx->status_code = PJSIP_SC_TSX_TIMEOUT; 
     2188        tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL); 
    21672189 
    21682190        tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
     
    22112233        } 
    22122234 
    2213         tsx->status_code = msg->line.status.code; 
     2235        tsx_set_status_code(tsx, msg->line.status.code,  
     2236                            &msg->line.status.reason); 
     2237 
    22142238    } else { 
    2215         tsx->status_code = PJSIP_SC_TSX_TIMEOUT; 
     2239        tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL); 
    22162240    } 
    22172241 
     
    24412465                 */ 
    24422466 
    2443                 tsx->status_code = PJSIP_SC_TSX_TIMEOUT; 
     2467                tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL); 
    24442468 
    24452469                tsx_set_state( tsx, PJSIP_TSX_STATE_TERMINATED,  
Note: See TracChangeset for help on using the changeset viewer.