Ignore:
Timestamp:
Jun 23, 2007 7:26:54 AM (12 years ago)
Author:
bennylp
Message:

More ticket #341: renamed pjsip_transport_send_raw() to pjsip_tpmgr_send_raw(), and added pjsip_endpt_send_raw() and pjsip_endpt_send_raw_to_uri()

File:
1 edited

Legend:

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

    r1387 r1388  
    604604 
    605605 
     606/* send_raw() callback */ 
     607static void send_raw_callback(pjsip_transport *transport, 
     608                              void *token, 
     609                              pj_ssize_t size) 
     610{ 
     611    pjsip_tx_data *tdata = (pjsip_tx_data*) token; 
     612 
     613    /* Mark pending off so that app can resend/reuse txdata from inside 
     614     * the callback. 
     615     */ 
     616    tdata->is_pending = 0; 
     617 
     618    /* Call callback, if any. */ 
     619    if (tdata->cb) { 
     620        (*tdata->cb)(tdata->token, tdata, size); 
     621    } 
     622 
     623    /* Decrement tdata reference count. */ 
     624    pjsip_tx_data_dec_ref(tdata); 
     625 
     626    /* Decrement transport reference count */ 
     627    pjsip_transport_dec_ref(transport); 
     628} 
     629 
     630 
    606631/* Send raw data */ 
    607 PJ_DEF(pj_status_t) pjsip_transport_send_raw(pjsip_transport *tr, 
    608                                              const void *raw_data, 
    609                                              pj_size_t data_len, 
    610                                              const pj_sockaddr_t *addr, 
    611                                              int addr_len, 
    612                                              void *token, 
    613                                              pjsip_tp_send_callback cb) 
    614 { 
    615     pjsip_tx_data *tdata; 
     632PJ_DEF(pj_status_t) pjsip_tpmgr_send_raw(pjsip_tpmgr *mgr, 
     633                                         pjsip_transport_type_e tp_type, 
     634                                         const pjsip_tpselector *sel, 
     635                                         pjsip_tx_data *tdata, 
     636                                         const void *raw_data, 
     637                                         pj_size_t data_len, 
     638                                         const pj_sockaddr_t *addr, 
     639                                         int addr_len, 
     640                                         void *token, 
     641                                         pjsip_tp_send_callback cb) 
     642{ 
     643    pjsip_transport *tr; 
    616644    pj_status_t status; 
    617645  
    618     status = pjsip_endpt_create_tdata(tr->endpt, &tdata); 
     646    /* Acquire the transport */ 
     647    status = pjsip_tpmgr_acquire_transport(mgr, tp_type, addr, addr_len, 
     648                                           sel, &tr); 
    619649    if (status != PJ_SUCCESS) 
    620650        return status; 
    621651 
    622     /* Add reference counter. */ 
    623     pjsip_tx_data_add_ref(tdata); 
     652    /* Create transmit data buffer if one is not specified */ 
     653    if (tdata == NULL) { 
     654        status = pjsip_endpt_create_tdata(tr->endpt, &tdata); 
     655        if (status != PJ_SUCCESS) { 
     656            pjsip_transport_dec_ref(tr); 
     657            return status; 
     658        } 
     659 
     660        /* Add reference counter. */ 
     661        pjsip_tx_data_add_ref(tdata); 
     662    } 
     663 
     664    /* Allocate buffer */ 
     665    if (tdata->buf.start == NULL || 
     666        (tdata->buf.end - tdata->buf.start) < (int)data_len) 
     667    { 
     668        /* Note: data_len may be zero, so allocate +1 */ 
     669        tdata->buf.start = (char*) pj_pool_alloc(tdata->pool, data_len+1); 
     670        tdata->buf.end = tdata->buf.start + data_len + 1; 
     671    } 
    624672  
    625     /* Allocate buffer */ 
    626     tdata->buf.start = (char*) pj_pool_alloc(tdata->pool, data_len); 
    627     tdata->buf.end = tdata->buf.start + data_len; 
    628   
    629     /* Copy data */ 
    630     pj_memcpy(tdata->buf.start, raw_data, data_len); 
     673    /* Copy data, if any! (application may send zero len packet) */ 
     674    if (data_len) { 
     675        pj_memcpy(tdata->buf.start, raw_data, data_len); 
     676    } 
    631677    tdata->buf.cur = tdata->buf.start + data_len; 
    632678  
     
    638684    tdata->is_pending = 1; 
    639685 
    640     /* Send to transoprt */ 
     686    /* Send to transport */ 
    641687    status = tr->send_msg(tr, tdata, addr, addr_len, 
    642                           tdata, &transport_send_callback); 
     688                          tdata, &send_raw_callback); 
    643689  
    644690    if (status != PJ_EPENDING) { 
    645691        /* callback will not be called, so destroy tdata now. */ 
    646692        pjsip_tx_data_dec_ref(tdata); 
     693        pjsip_transport_dec_ref(tr); 
    647694    } 
    648695 
Note: See TracChangeset for help on using the changeset viewer.