diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-06-23 04:22:51 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-06-23 04:22:51 +0000 |
commit | de1e9a2df94e4a20bbf41f5edd241bfbdacd9b7f (patch) | |
tree | bc0319e1a935397bdd03f83d991f24a71faa6911 /pjsip/src/pjsip/sip_transport.c | |
parent | b6171c4a923a593539f6d5e424332bb9e03556cc (diff) |
Ticket #341: implemented pjsip_send_raw_data() function to send raw data to a destination
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1387 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src/pjsip/sip_transport.c')
-rw-r--r-- | pjsip/src/pjsip/sip_transport.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c index 7dcfb711..331bc5f7 100644 --- a/pjsip/src/pjsip/sip_transport.c +++ b/pjsip/src/pjsip/sip_transport.c @@ -602,6 +602,54 @@ PJ_DEF(pj_status_t) pjsip_transport_send( pjsip_transport *tr, return status; } + +/* Send raw data */ +PJ_DEF(pj_status_t) pjsip_transport_send_raw(pjsip_transport *tr, + const void *raw_data, + pj_size_t data_len, + const pj_sockaddr_t *addr, + int addr_len, + void *token, + pjsip_tp_send_callback cb) +{ + pjsip_tx_data *tdata; + pj_status_t status; + + status = pjsip_endpt_create_tdata(tr->endpt, &tdata); + if (status != PJ_SUCCESS) + return status; + + /* Add reference counter. */ + pjsip_tx_data_add_ref(tdata); + + /* Allocate buffer */ + tdata->buf.start = (char*) pj_pool_alloc(tdata->pool, data_len); + tdata->buf.end = tdata->buf.start + data_len; + + /* Copy data */ + pj_memcpy(tdata->buf.start, raw_data, data_len); + tdata->buf.cur = tdata->buf.start + data_len; + + /* Save callback data. */ + tdata->token = token; + tdata->cb = cb; + + /* Mark as pending. */ + tdata->is_pending = 1; + + /* Send to transoprt */ + status = tr->send_msg(tr, tdata, addr, addr_len, + tdata, &transport_send_callback); + + if (status != PJ_EPENDING) { + /* callback will not be called, so destroy tdata now. */ + pjsip_tx_data_dec_ref(tdata); + } + + return status; +} + + static void transport_idle_callback(pj_timer_heap_t *timer_heap, struct pj_timer_entry *entry) { |