本文整理汇总了C++中pjsip_tx_data_dec_ref函数的典型用法代码示例。如果您正苦于以下问题:C++ pjsip_tx_data_dec_ref函数的具体用法?C++ pjsip_tx_data_dec_ref怎么用?C++ pjsip_tx_data_dec_ref使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pjsip_tx_data_dec_ref函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: send_response_timer
/* Timer callback to send response. */
static void send_response_timer( pj_timer_heap_t *timer_heap,
struct pj_timer_entry *entry)
{
pjsip_transaction *tsx;
struct response *r = (struct response*) entry->user_data;
pj_status_t status;
PJ_UNUSED_ARG(timer_heap);
tsx = pjsip_tsx_layer_find_tsx(&r->tsx_key, PJ_TRUE);
if (!tsx) {
PJ_LOG(3,(THIS_FILE," error: timer unable to find transaction"));
pjsip_tx_data_dec_ref(r->tdata);
return;
}
status = pjsip_tsx_send_msg(tsx, r->tdata);
if (status != PJ_SUCCESS) {
// Some tests do expect failure!
//PJ_LOG(3,(THIS_FILE," error: timer unable to send response"));
pj_mutex_unlock(tsx->mutex);
pjsip_tx_data_dec_ref(r->tdata);
return;
}
pj_mutex_unlock(tsx->mutex);
}
开发者ID:CryptoCall,项目名称:pjsip,代码行数:28,代码来源:tsx_uas_test.c
示例2: pjsip_tsx_create_uac
/// This provides function similar to the pjsip_endpt_send_request method
/// but includes setting the SAS trail. It does not support the timeout, token
/// or callback options.
pj_status_t PJUtils::send_request(pjsip_endpoint* endpt,
pjsip_tx_data* tdata)
{
pjsip_transaction* tsx;
pj_status_t status;
status = pjsip_tsx_create_uac(&mod_sprout_util, tdata, &tsx);
if (status != PJ_SUCCESS)
{
pjsip_tx_data_dec_ref(tdata);
return status;
}
pjsip_tsx_set_transport(tsx, &tdata->tp_sel);
// Set the trail ID in the transaction from the message.
set_trail(tsx, get_trail(tdata));
status = pjsip_tsx_send_msg(tsx, NULL);
if (status != PJ_SUCCESS)
{
pjsip_tx_data_dec_ref(tdata);
}
return status;
}
开发者ID:telecore-ivan,项目名称:sprout,代码行数:29,代码来源:pjutils.cpp
示例3: my_on_rx_request
static pj_bool_t my_on_rx_request(pjsip_rx_data *rdata)
{
/* Check that this is our request. */
if (pj_strcmp2(&rdata->msg_info.cid->id, CALL_ID_HDR) == 0) {
/* It is! */
/* Send response. */
pjsip_tx_data *tdata;
pjsip_response_addr res_addr;
pj_status_t status;
status = pjsip_endpt_create_response( endpt, rdata, 200, NULL, &tdata);
if (status != PJ_SUCCESS) {
recv_status = status;
return PJ_TRUE;
}
status = pjsip_get_response_addr( tdata->pool, rdata, &res_addr);
if (status != PJ_SUCCESS) {
recv_status = status;
pjsip_tx_data_dec_ref(tdata);
return PJ_TRUE;
}
status = pjsip_endpt_send_response( endpt, &res_addr, tdata, NULL, NULL);
if (status != PJ_SUCCESS) {
recv_status = status;
pjsip_tx_data_dec_ref(tdata);
return PJ_TRUE;
}
return PJ_TRUE;
}
/* Not ours. */
return PJ_FALSE;
}
开发者ID:Jopie64,项目名称:pjsip,代码行数:33,代码来源:transport_test.c
示例4: rt_on_rx_request
static pj_bool_t rt_on_rx_request(pjsip_rx_data *rdata)
{
if (!pj_strncmp(&rdata->msg_info.cid->id, &rt_call_id, rt_call_id.slen)) {
pjsip_tx_data *tdata;
pjsip_response_addr res_addr;
pj_status_t status;
status = pjsip_endpt_create_response( endpt, rdata, 200, NULL, &tdata);
if (status != PJ_SUCCESS) {
app_perror(" error creating response", status);
return PJ_TRUE;
}
status = pjsip_get_response_addr( tdata->pool, rdata, &res_addr);
if (status != PJ_SUCCESS) {
app_perror(" error in get response address", status);
pjsip_tx_data_dec_ref(tdata);
return PJ_TRUE;
}
status = pjsip_endpt_send_response( endpt, &res_addr, tdata, NULL, NULL);
if (status != PJ_SUCCESS) {
app_perror(" error sending response", status);
pjsip_tx_data_dec_ref(tdata);
return PJ_TRUE;
}
return PJ_TRUE;
}
return PJ_FALSE;
}
开发者ID:Jopie64,项目名称:pjsip,代码行数:29,代码来源:transport_test.c
示例5: create_response
/// This is a clone of the PJSIP pjsip_endpt_respond_stateless function,
/// with the addition of code to reflect the trail on the request on to the
/// response. All sprout application code should use this method instead.
pj_status_t PJUtils::respond_stateless(pjsip_endpoint* endpt,
pjsip_rx_data* rdata,
int st_code,
const pj_str_t* st_text,
const pjsip_hdr* hdr_list,
const pjsip_msg_body* body)
{
pj_status_t status;
pjsip_response_addr res_addr;
pjsip_tx_data* tdata;
// Create response message
status = create_response(endpt, rdata, st_code, st_text, &tdata);
if (status != PJ_SUCCESS)
{
return status;
}
// Add the message headers, if any
if (hdr_list)
{
const pjsip_hdr* hdr = hdr_list->next;
while (hdr != hdr_list)
{
pjsip_msg_add_hdr(tdata->msg,
(pjsip_hdr*) pjsip_hdr_clone(tdata->pool, hdr) );
hdr = hdr->next;
}
}
// Add the message body, if any.
if (body)
{
tdata->msg->body = pjsip_msg_body_clone(tdata->pool, body);
if (tdata->msg->body == NULL)
{
pjsip_tx_data_dec_ref(tdata);
return status;
}
}
// Get where to send request.
status = pjsip_get_response_addr(tdata->pool, rdata, &res_addr);
if (status != PJ_SUCCESS)
{
pjsip_tx_data_dec_ref(tdata);
return status;
}
// Send!
status = pjsip_endpt_send_response(endpt, &res_addr, tdata, NULL, NULL);
if (status != PJ_SUCCESS)
{
pjsip_tx_data_dec_ref(tdata);
return status;
}
return PJ_SUCCESS;
}
开发者ID:telecore-ivan,项目名称:sprout,代码行数:62,代码来源:pjutils.cpp
示例6: authenticate
static pj_bool_t authenticate(pjsip_rx_data *rdata)
{
RAII_VAR(struct ast_sip_endpoint *, endpoint, ast_pjsip_rdata_get_endpoint(rdata), ao2_cleanup);
int is_ack = rdata->msg_info.msg->line.req.method.id == PJSIP_ACK_METHOD;
ast_assert(endpoint != NULL);
if (is_ack) {
return PJ_FALSE;
}
if (ast_sip_requires_authentication(endpoint, rdata)) {
pjsip_tx_data *tdata;
struct unidentified_request *unid;
pjsip_endpt_create_response(ast_sip_get_pjsip_endpoint(), rdata, 401, NULL, &tdata);
switch (ast_sip_check_authentication(endpoint, rdata, tdata)) {
case AST_SIP_AUTHENTICATION_CHALLENGE:
/* Send the 401 we created for them */
ast_sip_report_auth_challenge_sent(endpoint, rdata, tdata);
if (pjsip_endpt_send_response2(ast_sip_get_pjsip_endpoint(), rdata, tdata, NULL, NULL) != PJ_SUCCESS) {
pjsip_tx_data_dec_ref(tdata);
}
return PJ_TRUE;
case AST_SIP_AUTHENTICATION_SUCCESS:
/* See note in endpoint_lookup about not holding an unnecessary write lock */
unid = ao2_find(unidentified_requests, rdata->pkt_info.src_name, OBJ_SEARCH_KEY);
if (unid) {
ao2_unlink(unidentified_requests, unid);
ao2_ref(unid, -1);
}
ast_sip_report_auth_success(endpoint, rdata);
break;
case AST_SIP_AUTHENTICATION_FAILED:
log_failed_request(rdata, "Failed to authenticate", 0, 0);
ast_sip_report_auth_failed_challenge_response(endpoint, rdata);
if (pjsip_endpt_send_response2(ast_sip_get_pjsip_endpoint(), rdata, tdata, NULL, NULL) != PJ_SUCCESS) {
pjsip_tx_data_dec_ref(tdata);
}
return PJ_TRUE;
case AST_SIP_AUTHENTICATION_ERROR:
log_failed_request(rdata, "Error to authenticate", 0, 0);
ast_sip_report_auth_failed_challenge_response(endpoint, rdata);
pjsip_tx_data_dec_ref(tdata);
pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 500, NULL, NULL, NULL);
return PJ_TRUE;
}
pjsip_tx_data_dec_ref(tdata);
} else if (endpoint == artificial_endpoint) {
/* Uh. Oh. The artificial endpoint couldn't challenge so block the request. */
pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, 500, NULL, NULL, NULL);
return PJ_TRUE;
}
return PJ_FALSE;
}
开发者ID:scudella,项目名称:asterisk,代码行数:56,代码来源:pjsip_distributor.c
示例7: create_request_bench
/*
* create request benchmark
*/
static int create_request_bench(pj_timestamp *p_elapsed)
{
enum { COUNT = 100 };
unsigned i, j;
pjsip_tx_data *tdata[COUNT];
pj_timestamp t1, t2, elapsed;
pj_status_t status;
pj_str_t str_target = pj_str("sip:[email protected]");
pj_str_t str_from = pj_str("\"Local User\" <sip:[email protected]>");
pj_str_t str_to = pj_str("\"Remote User\" <sip:[email protected]>");
pj_str_t str_contact = str_from;
elapsed.u64 = 0;
for (i=0; i<LOOP; i+=COUNT) {
pj_bzero(tdata, sizeof(tdata));
pj_get_timestamp(&t1);
for (j=0; j<COUNT; ++j) {
status = pjsip_endpt_create_request(endpt, &pjsip_invite_method,
&str_target, &str_from, &str_to,
&str_contact, NULL, -1, NULL,
&tdata[j]);
if (status != PJ_SUCCESS) {
app_perror(" error: unable to create request", status);
goto on_error;
}
}
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
pj_add_timestamp(&elapsed, &t2);
for (j=0; j<COUNT; ++j)
pjsip_tx_data_dec_ref(tdata[j]);
}
p_elapsed->u64 = elapsed.u64;
return PJ_SUCCESS;
on_error:
for (i=0; i<COUNT; ++i) {
if (tdata[i])
pjsip_tx_data_dec_ref(tdata[i]);
}
return -400;
}
开发者ID:Antares84,项目名称:asuswrt-merlin,代码行数:52,代码来源:txdata_test.c
示例8: VoipLinkException
void
SIPCall::sendSIPInfo(const char *const body, const char *const subtype)
{
if (not inv or not inv->dlg)
throw VoipLinkException("Couldn't get invite dialog");
pj_str_t methodName = CONST_PJ_STR("INFO");
pjsip_method method;
pjsip_method_init_np(&method, &methodName);
/* Create request message. */
pjsip_tx_data *tdata;
if (pjsip_dlg_create_request(inv->dlg, &method, -1, &tdata) != PJ_SUCCESS) {
RING_ERR("[call:%s] Could not create dialog", getCallId().c_str());
return;
}
/* Create "application/<subtype>" message body. */
pj_str_t content;
pj_cstr(&content, body);
const pj_str_t type = CONST_PJ_STR("application");
pj_str_t pj_subtype;
pj_cstr(&pj_subtype, subtype);
tdata->msg->body = pjsip_msg_body_create(tdata->pool, &type, &pj_subtype, &content);
if (tdata->msg->body == NULL)
pjsip_tx_data_dec_ref(tdata);
else
pjsip_dlg_send_request(inv->dlg, tdata, getSIPVoIPLink()->getModId(), NULL);
}
开发者ID:BenjaminLefoul,项目名称:ring-daemon,代码行数:31,代码来源:sipcall.cpp
示例9: LOG_ERROR
/// Rejects a request statelessly.
void ICSCFProxy::reject_request(pjsip_rx_data* rdata, int status_code)
{
pj_status_t status;
ACR* acr = _acr_factory->get_acr(get_trail(rdata), CALLING_PARTY);
acr->rx_request(rdata->msg_info.msg, rdata->pkt_info.timestamp);
if (rdata->msg_info.msg->line.req.method.id != PJSIP_ACK_METHOD)
{
LOG_ERROR("Rejecting %.*s request with %d status code",
rdata->msg_info.msg->line.req.method.name.slen,
rdata->msg_info.msg->line.req.method.name.ptr,
status_code);
pjsip_tx_data* tdata;
status = PJUtils::create_response(stack_data.endpt, rdata, status_code, NULL, &tdata);
if (status == PJ_SUCCESS)
{
// Pass the response to the ACR.
acr->tx_response(tdata->msg);
status = pjsip_endpt_send_response2(stack_data.endpt, rdata, tdata, NULL, NULL);
if (status != PJ_SUCCESS)
{
// LCOV_EXCL_START
pjsip_tx_data_dec_ref(tdata);
// LCOV_EXCL_STOP
}
}
}
// Send the ACR and delete it.
acr->send_message();
delete acr;
}
开发者ID:oldurecu,项目名称:sprout,代码行数:36,代码来源:icscfproxy.cpp
示例10: submit_stateless_job
/* Send one stateless request */
static pj_status_t submit_stateless_job(void)
{
pjsip_tx_data *tdata;
pj_status_t status;
status = pjsip_endpt_create_request(app.sip_endpt, &app.client.method,
&app.client.dst_uri, &app.local_uri,
&app.client.dst_uri, &app.local_contact,
NULL, -1, NULL, &tdata);
if (status != PJ_SUCCESS) {
app_perror(THIS_FILE, "Error creating request", status);
report_completion(701);
return status;
}
status = pjsip_endpt_send_request_stateless(app.sip_endpt, tdata, NULL,
NULL);
if (status != PJ_SUCCESS) {
pjsip_tx_data_dec_ref(tdata);
app_perror(THIS_FILE, "Error sending stateless request", status);
report_completion(701);
return status;
}
return PJ_SUCCESS;
}
开发者ID:ClearwaterCore,项目名称:pjsip-upstream,代码行数:27,代码来源:pjsip-perf.c
示例11: stateless_send_cb
/// Callback used for PJUtils::send_request_stateless
static void stateless_send_cb(pjsip_send_state *st,
pj_ssize_t sent,
pj_bool_t *cont)
{
*cont = PJ_FALSE;
bool retrying = false;
StatelessSendState* sss = (StatelessSendState*)st->token;
if ((sent <= 0) &&
(!sss->servers.empty()))
{
// Request to a resolved server failed. When sending statelessly
// this means we couldn't get a transport, so couldn't connect to the
// selected target, so we always blacklist.
PJUtils::blacklist_server(sss->servers[sss->current_server]);
// Can we do a retry?
pj_status_t status = PJ_ENOTFOUND;
++sss->current_server;
if (sss->current_server < (int)sss->servers.size())
{
pjsip_tx_data* tdata = st->tdata;
// According to RFC3263 we should generate a new branch identifier for
// the message so there is no possibility of it being confused with
// previous attempts. Not clear this is really necessary in this case,
// but just in case ...
PJUtils::generate_new_branch_id(tdata);
// Add a reference to the tdata to stop PJSIP releasing it when we
// return the callback.
pjsip_tx_data_add_ref(tdata);
// Set up destination info for the new server and resend the request.
PJUtils::set_dest_info(tdata, sss->servers[sss->current_server]);
status = pjsip_endpt_send_request_stateless(stack_data.endpt,
tdata,
(void*)sss,
&stateless_send_cb);
if (status == PJ_SUCCESS)
{
retrying = true;
}
else
{
pjsip_tx_data_dec_ref(tdata);
}
}
}
if ((sent > 0) ||
(!retrying))
{
// Either the request was sent successfully, or we couldn't retry.
delete sss;
}
}
开发者ID:oldurecu,项目名称:sprout,代码行数:60,代码来源:pjutils.cpp
示例12: PJ_DEF
PJ_DEF(pj_status_t) pjsip_publishc_send(pjsip_publishc *pubc,
pjsip_tx_data *tdata)
{
pj_status_t status;
pjsip_cseq_hdr *cseq_hdr;
pj_uint32_t cseq;
PJ_ASSERT_RETURN(pubc && tdata, PJ_EINVAL);
/* Make sure we don't have pending transaction. */
pj_mutex_lock(pubc->mutex);
if (pubc->pending_tsx) {
if (pubc->opt.queue_request) {
pj_list_push_back(&pubc->pending_reqs, tdata);
pj_mutex_unlock(pubc->mutex);
PJ_LOG(4,(THIS_FILE, "Request is queued, pubc has another "
"transaction pending"));
return PJ_EPENDING;
} else {
pjsip_tx_data_dec_ref(tdata);
pj_mutex_unlock(pubc->mutex);
PJ_LOG(4,(THIS_FILE, "Unable to send request, pubc has another "
"transaction pending"));
return PJ_EBUSY;
}
}
pj_mutex_unlock(pubc->mutex);
/* If via_addr is set, use this address for the Via header. */
if (pubc->via_addr.host.slen > 0) {
tdata->via_addr = pubc->via_addr;
tdata->via_tp = pubc->via_tp;
}
/* Invalidate message buffer. */
pjsip_tx_data_invalidate_msg(tdata);
/* Increment CSeq */
cseq = ++pubc->cseq_hdr->cseq;
cseq_hdr = (pjsip_cseq_hdr*)
pjsip_msg_find_hdr(tdata->msg, PJSIP_H_CSEQ, NULL);
cseq_hdr->cseq = cseq;
/* Increment pending transaction first, since transaction callback
* may be called even before send_request() returns!
*/
++pubc->pending_tsx;
status = pjsip_endpt_send_request(pubc->endpt, tdata, -1, pubc,
&tsx_callback);
if (status!=PJ_SUCCESS) {
// no need to decrement, callback has been called and it should
// already decremented pending_tsx. Decrementing this here may
// cause accessing freed memory location.
//--pubc->pending_tsx;
PJ_LOG(4,(THIS_FILE, "Error sending request, status=%d", status));
}
return status;
}
开发者ID:CryptoCall,项目名称:pjsip,代码行数:59,代码来源:publishc.c
示例13: PJ_DEF
/*
* Send PRACK request.
*/
PJ_DEF(pj_status_t) pjsip_100rel_send_prack( pjsip_inv_session *inv,
pjsip_tx_data *tdata)
{
dlg_data *dd;
dd = (dlg_data*) inv->dlg->mod_data[mod_100rel.mod.id];
PJ_ASSERT_ON_FAIL(dd != NULL,
{pjsip_tx_data_dec_ref(tdata); return PJSIP_ENOTINITIALIZED; });
开发者ID:iamroger,项目名称:voip,代码行数:11,代码来源:sip_100rel.c
示例14: proxy_on_rx_response
/* Callback to be called to handle incoming response outside
* any transactions. This happens for example when 2xx/OK
* for INVITE is received and transaction will be destroyed
* immediately, so we need to forward the subsequent 2xx/OK
* retransmission statelessly.
*/
static pj_bool_t proxy_on_rx_response( pjsip_rx_data *rdata )
{
pjsip_tx_data *tdata;
pjsip_response_addr res_addr;
pjsip_via_hdr *hvia;
pj_status_t status;
/* Create response to be forwarded upstream (Via will be stripped here) */
status = pjsip_endpt_create_response_fwd(global.endpt, rdata, 0, &tdata);
if (status != PJ_SUCCESS) {
app_perror("Error creating response", status);
return PJ_TRUE;
}
/* Get topmost Via header */
hvia = (pjsip_via_hdr*) pjsip_msg_find_hdr(tdata->msg, PJSIP_H_VIA, NULL);
if (hvia == NULL) {
/* Invalid response! Just drop it */
pjsip_tx_data_dec_ref(tdata);
return PJ_TRUE;
}
/* Calculate the address to forward the response */
pj_bzero(&res_addr, sizeof(res_addr));
res_addr.dst_host.type = PJSIP_TRANSPORT_UDP;
res_addr.dst_host.flag =
pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_UDP);
/* Destination address is Via's received param */
res_addr.dst_host.addr.host = hvia->recvd_param;
if (res_addr.dst_host.addr.host.slen == 0) {
/* Someone has messed up our Via header! */
res_addr.dst_host.addr.host = hvia->sent_by.host;
}
/* Destination port is the rport */
if (hvia->rport_param != 0 && hvia->rport_param != -1)
res_addr.dst_host.addr.port = hvia->rport_param;
if (res_addr.dst_host.addr.port == 0) {
/* Ugh, original sender didn't put rport!
* At best, can only send the response to the port in Via.
*/
res_addr.dst_host.addr.port = hvia->sent_by.port;
}
/* Forward response */
status = pjsip_endpt_send_response(global.endpt, &res_addr, tdata,
NULL, NULL);
if (status != PJ_SUCCESS) {
app_perror("Error forwarding response", status);
return PJ_TRUE;
}
return PJ_TRUE;
}
开发者ID:carlosdelfino,项目名称:WorkshopTelefoniaAutomacao,代码行数:62,代码来源:stateful_proxy.c
示例15: rt_send_request
static pj_status_t rt_send_request(int thread_id)
{
pj_status_t status;
pj_str_t target, from, to, contact, call_id;
pjsip_tx_data *tdata;
pj_time_val timeout_delay;
pj_mutex_lock(rt_test_data[thread_id].mutex);
/* Create a request message. */
target = pj_str(rt_target_uri);
from = pj_str(FROM_HDR);
to = pj_str(rt_target_uri);
contact = pj_str(CONTACT_HDR);
call_id = rt_test_data[thread_id].call_id;
status = pjsip_endpt_create_request( endpt, &pjsip_options_method,
&target, &from, &to,
&contact, &call_id, -1,
NULL, &tdata );
if (status != PJ_SUCCESS) {
app_perror(" error: unable to create request", status);
pj_mutex_unlock(rt_test_data[thread_id].mutex);
return -610;
}
/* Start time. */
pj_get_timestamp(&rt_test_data[thread_id].send_time);
/* Send the message (statelessly). */
status = pjsip_endpt_send_request_stateless( endpt, tdata, NULL, NULL);
if (status != PJ_SUCCESS) {
/* Immediate error! */
app_perror(" error: send request", status);
pjsip_tx_data_dec_ref(tdata);
pj_mutex_unlock(rt_test_data[thread_id].mutex);
return -620;
}
/* Update counter. */
rt_test_data[thread_id].sent_request_count++;
/* Set timeout timer. */
if (rt_test_data[thread_id].timeout_timer.user_data != NULL) {
pjsip_endpt_cancel_timer(endpt, &rt_test_data[thread_id].timeout_timer);
}
timeout_delay.sec = 100; timeout_delay.msec = 0;
rt_test_data[thread_id].timeout_timer.user_data = (void*)1;
pjsip_endpt_schedule_timer(endpt, &rt_test_data[thread_id].timeout_timer,
&timeout_delay);
pj_mutex_unlock(rt_test_data[thread_id].mutex);
return PJ_SUCCESS;
}
开发者ID:Jopie64,项目名称:pjsip,代码行数:54,代码来源:transport_test.c
示例16: PJ_DEF
/*
* For notifier, create NOTIFY request to subscriber, and set the state
* of the subscription.
*/
PJ_DEF(pj_status_t) pjsip_xfer_notify( pjsip_evsub *sub,
pjsip_evsub_state state,
int xfer_st_code,
const pj_str_t *xfer_st_text,
pjsip_tx_data **p_tdata)
{
pjsip_tx_data *tdata;
pjsip_xfer *xfer;
pjsip_param *param;
const pj_str_t reason = { "noresource", 10 };
char *body;
int bodylen;
pjsip_msg_body *msg_body;
pj_status_t status;
/* Check arguments. */
PJ_ASSERT_RETURN(sub, PJ_EINVAL);
/* Get the xfer object. */
xfer = (pjsip_xfer*) pjsip_evsub_get_mod_data(sub, mod_xfer.id);
PJ_ASSERT_RETURN(xfer != NULL, PJSIP_ENOREFERSESSION);
/* Lock object. */
pjsip_dlg_inc_lock(xfer->dlg);
/* Create the NOTIFY request.
* Note that reason is only used when state is TERMINATED, and
* the defined termination reason for REFER is "noresource".
*/
status = pjsip_evsub_notify( sub, state, NULL, &reason, &tdata);
if (status != PJ_SUCCESS)
goto on_return;
/* Check status text */
if (xfer_st_text==NULL || xfer_st_text->slen==0)
xfer_st_text = pjsip_get_status_text(xfer_st_code);
/* Save st_code and st_text, for current_notify() */
xfer->last_st_code = xfer_st_code;
pj_strdup(xfer->dlg->pool, &xfer->last_st_text, xfer_st_text);
/* Create sipfrag content. */
body = (char*) pj_pool_alloc(tdata->pool, 128);
bodylen = pj_ansi_snprintf(body, 128, "SIP/2.0 %u %.*s\r\n",
xfer_st_code,
(int)xfer_st_text->slen,
xfer_st_text->ptr);
PJ_ASSERT_ON_FAIL(bodylen > 0 && bodylen < 128,
{status=PJ_EBUG; pjsip_tx_data_dec_ref(tdata);
goto on_return; });
开发者ID:iamroger,项目名称:voip,代码行数:57,代码来源:sip_xfer.c
示例17: qualify_contact
/*!
* \internal
* \brief Attempt to qualify the contact
*
* \details Sends a SIP OPTIONS request to the given contact in order to make
* sure that contact is available.
*/
static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact)
{
pjsip_tx_data *tdata;
RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup);
if (endpoint) {
endpoint_local = ao2_bump(endpoint);
} else {
if (!ast_strlen_zero(contact->endpoint_name)) {
endpoint_local = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "endpoint", contact->endpoint_name);
}
if (!endpoint_local) {
endpoint_local = find_an_endpoint(contact);
}
if (!endpoint_local) {
ast_log(LOG_WARNING, "Unable to find an endpoint to qualify contact %s. Deleting this contact\n",
contact->uri);
contact_deleted(contact);
return -1;
}
}
if (ast_sip_create_request("OPTIONS", NULL, endpoint_local, NULL, contact, &tdata)) {
ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n",
contact->uri);
return -1;
}
/* If an outbound proxy is specified set it on this request */
if (!ast_strlen_zero(contact->outbound_proxy) &&
ast_sip_set_outbound_proxy(tdata, contact->outbound_proxy)) {
pjsip_tx_data_dec_ref(tdata);
ast_log(LOG_ERROR, "Unable to apply outbound proxy on request to qualify contact %s\n",
contact->uri);
return -1;
}
init_start_time(contact);
ao2_ref(contact, +1);
if (ast_sip_send_out_of_dialog_request(tdata, endpoint_local, (int)(contact->qualify_timeout * 1000), contact, qualify_contact_cb)
!= PJ_SUCCESS) {
ast_log(LOG_ERROR, "Unable to send request to qualify contact %s\n",
contact->uri);
update_contact_status(contact, UNAVAILABLE, 0);
ao2_ref(contact, -1);
return -1;
}
return 0;
}
开发者ID:litnimax,项目名称:asterisk,代码行数:58,代码来源:pjsip_options.c
示例18: pjsip_messaging_send_msg
pjsip_messaging_send_msg( pjsip_endpoint *endpt, pjsip_tx_data *tdata,
void *token, pjsip_messaging_cb cb )
{
pjsip_transaction *tsx;
struct messaging_data *msg_data;
/* Create transaction. */
tsx = pjsip_endpt_create_tsx(endpt);
if (!tsx) {
pjsip_tx_data_dec_ref(tdata);
return -1;
}
/* Save parameters to messaging data and attach to tsx. */
msg_data = pj_pool_calloc(tsx->pool, 1, sizeof(struct messaging_data));
msg_data->cb = cb;
msg_data->token = token;
/* Init transaction. */
tsx->module_data[module_id] = msg_data;
if (pjsip_tsx_init_uac(tsx, tdata) != 0) {
pjsip_tx_data_dec_ref(tdata);
pjsip_endpt_destroy_tsx(endpt, tsx);
return -1;
}
pjsip_endpt_register_tsx(endpt, tsx);
/*
* Instruct transaction to send message.
* Further events will be received via transaction's event.
*/
pjsip_tsx_on_tx_msg(tsx, tdata);
/* Decrement reference counter. */
pjsip_tx_data_dec_ref(tdata);
return 0;
}
开发者ID:svn2github,项目名称:pjproject,代码行数:38,代码来源:messaging.c
示例19: qualify_contact
/*!
* \internal
* \brief Attempt to qualify the contact
*
* \details Sends a SIP OPTIONS request to the given contact in order to make
* sure that contact is available.
*/
static int qualify_contact(struct ast_sip_endpoint *endpoint, struct ast_sip_contact *contact)
{
pjsip_tx_data *tdata;
RAII_VAR(struct ast_sip_endpoint *, endpoint_local, NULL, ao2_cleanup);
if (contact->authenticate_qualify) {
endpoint_local = ao2_bump(endpoint);
if (!endpoint_local) {
/*
* Find the "first" endpoint to completely qualify the contact - any
* endpoint that is associated with the contact should do.
*/
endpoint_local = find_an_endpoint(contact);
if (!endpoint_local) {
ast_log(LOG_ERROR, "Unable to find an endpoint to qualify contact %s\n",
contact->uri);
return -1;
}
}
}
if (ast_sip_create_request("OPTIONS", NULL, NULL, NULL, contact, &tdata)) {
ast_log(LOG_ERROR, "Unable to create request to qualify contact %s\n",
contact->uri);
return -1;
}
/* If an outbound proxy is specified set it on this request */
if (!ast_strlen_zero(contact->outbound_proxy) &&
ast_sip_set_outbound_proxy(tdata, contact->outbound_proxy)) {
pjsip_tx_data_dec_ref(tdata);
ast_log(LOG_ERROR, "Unable to apply outbound proxy on request to qualify contact %s\n",
contact->uri);
return -1;
}
init_start_time(contact);
ao2_ref(contact, +1);
if (ast_sip_send_out_of_dialog_request(tdata, endpoint_local, (int)(contact->qualify_timeout * 1000), contact, qualify_contact_cb)
!= PJ_SUCCESS) {
ast_log(LOG_ERROR, "Unable to send request to qualify contact %s\n",
contact->uri);
update_contact_status(contact, UNAVAILABLE);
ao2_ref(contact, -1);
return -1;
}
return 0;
}
开发者ID:brandonshults01,项目名称:asterisk,代码行数:57,代码来源:pjsip_options.c
示例20: PJ_DEF
PJ_DEF(pj_status_t) pjsip_endpt_send_request( pjsip_endpoint *endpt,
pjsip_tx_data *tdata,
pj_int32_t timeout,
void *token,
pjsip_endpt_send_callback cb)
{
pjsip_transaction *tsx;
struct tsx_data *tsx_data;
pj_status_t status;
PJ_ASSERT_RETURN(endpt && tdata && (timeout==-1 || timeout>0), PJ_EINVAL);
/* Check that transaction layer module is registered to endpoint */
PJ_ASSERT_RETURN(mod_stateful_util.id != -1, PJ_EINVALIDOP);
PJ_UNUSED_ARG(timeout);
status = pjsip_tsx_create_uac(&mod_stateful_util, tdata, &tsx);
if (status != PJ_SUCCESS) {
pjsip_tx_data_dec_ref(tdata);
return status;
}
pjsip_tsx_set_transport(tsx, &tdata->tp_sel);
tsx_data = PJ_POOL_ALLOC_T(tsx->pool, struct tsx_data);
tsx_data->token = token;
tsx_data->cb = cb;
tsx->mod_data[mod_stateful_util.id] = tsx_data;
status = pjsip_tsx_send_msg(tsx, NULL);
if (status != PJ_SUCCESS)
pjsip_tx_data_dec_ref(tdata);
return status;
}
开发者ID:avble,项目名称:natClientEx,代码行数:37,代码来源:sip_util_statefull.c
注:本文中的pjsip_tx_data_dec_ref函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论