summaryrefslogtreecommitdiff
path: root/pjsip/src/pjsip/sip_transport.c
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-06-23 04:22:51 +0000
committerBenny Prijono <bennylp@teluu.com>2007-06-23 04:22:51 +0000
commitde1e9a2df94e4a20bbf41f5edd241bfbdacd9b7f (patch)
treebc0319e1a935397bdd03f83d991f24a71faa6911 /pjsip/src/pjsip/sip_transport.c
parentb6171c4a923a593539f6d5e424332bb9e03556cc (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.c48
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)
{