Ignore:
Timestamp:
May 18, 2015 4:42:42 AM (6 years ago)
Author:
ming
Message:

Fixed #1853: Add callback for dropped data in SIP transport

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transport.c

    r4988 r5097  
    100100    pj_status_t    (*on_tx_msg)(pjsip_endpoint*, pjsip_tx_data*); 
    101101    pjsip_tp_state_callback tp_state_cb; 
     102    pjsip_tp_on_rx_dropped_cb tp_drop_data_cb; 
    102103 
    103104    /* Transmit data list, for transmit data cleanup when transport manager 
     
    16941695            remaining_len -= (p - current_pkt); 
    16951696            total_processed += (p - current_pkt); 
     1697 
     1698            /* Notify application about the dropped newlines */ 
     1699            if (mgr->tp_drop_data_cb) { 
     1700                pjsip_tp_dropped_data dd; 
     1701                pj_bzero(&dd, sizeof(dd)); 
     1702                dd.tp = tr; 
     1703                dd.data = current_pkt; 
     1704                dd.len = p - current_pkt; 
     1705                dd.status = PJ_EIGNORED; 
     1706                (*mgr->tp_drop_data_cb)(&dd); 
     1707            } 
     1708 
    16961709            current_pkt = p; 
    16971710            if (remaining_len == 0) { 
     
    17201733                if (remaining_len == PJSIP_MAX_PKT_LEN) { 
    17211734                    mgr->on_rx_msg(mgr->endpt, PJSIP_ERXOVERFLOW, rdata); 
     1735                     
     1736                    /* Notify application about the message overflow */ 
     1737                    if (mgr->tp_drop_data_cb) { 
     1738                        pjsip_tp_dropped_data dd; 
     1739                        pj_bzero(&dd, sizeof(dd)); 
     1740                        dd.tp = tr; 
     1741                        dd.data = current_pkt; 
     1742                        dd.len = msg_fragment_size; 
     1743                        dd.status = PJSIP_ERXOVERFLOW; 
     1744                        (*mgr->tp_drop_data_cb)(&dd); 
     1745                    } 
     1746                     
    17221747                    /* Exhaust all data. */ 
    17231748                    return rdata->pkt_info.len; 
     
    17841809            } 
    17851810 
     1811            /* Notify application about the dropped data (syntax error) */ 
     1812            if (tmp.slen && mgr->tp_drop_data_cb) { 
     1813                pjsip_tp_dropped_data dd; 
     1814                pj_bzero(&dd, sizeof(dd)); 
     1815                dd.tp = tr; 
     1816                dd.data = current_pkt; 
     1817                dd.len = msg_fragment_size; 
     1818                dd.status = PJSIP_EINVALIDMSG; 
     1819                (*mgr->tp_drop_data_cb)(&dd); 
     1820                 
     1821                if (dd.len > 0 && dd.len < msg_fragment_size) 
     1822                    msg_fragment_size = dd.len; 
     1823            } 
     1824 
    17861825            goto finish_process_fragment; 
    17871826        } 
     
    22662305    return PJ_SUCCESS; 
    22672306} 
     2307 
     2308/* 
     2309 * Set callback of data dropping. 
     2310 */ 
     2311PJ_DEF(pj_status_t) pjsip_tpmgr_set_drop_data_cb(pjsip_tpmgr *mgr, 
     2312                                                 pjsip_tp_on_rx_dropped_cb cb) 
     2313{ 
     2314    PJ_ASSERT_RETURN(mgr, PJ_EINVAL); 
     2315 
     2316    mgr->tp_drop_data_cb = cb; 
     2317 
     2318    return PJ_SUCCESS; 
     2319} 
Note: See TracChangeset for help on using the changeset viewer.