本文整理汇总了C++中pj_assert函数的典型用法代码示例。如果您正苦于以下问题:C++ pj_assert函数的具体用法?C++ pj_assert怎么用?C++ pj_assert使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pj_assert函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: tsx_callback
static void tsx_callback(void *token, pjsip_event *event)
{
pj_status_t status;
pjsip_publishc *pubc = (pjsip_publishc*) token;
pjsip_transaction *tsx = event->body.tsx_state.tsx;
/* Decrement pending transaction counter. */
pj_assert(pubc->pending_tsx > 0);
--pubc->pending_tsx;
/* Mark that we're in callback to prevent deletion (#1164) */
++pubc->in_callback;
/* If publication data has been deleted by user then remove publication
* data from transaction's callback, and don't call callback.
*/
if (pubc->_delete_flag) {
/* Nothing to do */
;
} else if (tsx->status_code == PJSIP_SC_PROXY_AUTHENTICATION_REQUIRED ||
tsx->status_code == PJSIP_SC_UNAUTHORIZED)
{
pjsip_rx_data *rdata = event->body.tsx_state.src.rdata;
pjsip_tx_data *tdata;
status = pjsip_auth_clt_reinit_req( &pubc->auth_sess,
rdata,
tsx->last_tx,
&tdata);
if (status != PJ_SUCCESS) {
call_callback(pubc, status, tsx->status_code,
&rdata->msg_info.msg->line.status.reason,
rdata, -1);
} else {
status = pjsip_publishc_send(pubc, tdata);
}
} else {
pjsip_rx_data *rdata;
pj_int32_t expiration = 0xFFFF;
if (tsx->status_code/100 == 2) {
pjsip_msg *msg;
pjsip_expires_hdr *expires;
pjsip_generic_string_hdr *etag_hdr;
const pj_str_t STR_ETAG = { "SIP-ETag", 8 };
rdata = event->body.tsx_state.src.rdata;
msg = rdata->msg_info.msg;
/* Save ETag value */
etag_hdr = (pjsip_generic_string_hdr*)
pjsip_msg_find_hdr_by_name(msg, &STR_ETAG, NULL);
if (etag_hdr) {
pj_strdup(pubc->pool, &pubc->etag, &etag_hdr->hvalue);
} else {
pubc->etag.slen = 0;
}
/* Update expires value */
expires = (pjsip_expires_hdr*)
pjsip_msg_find_hdr(msg, PJSIP_H_EXPIRES, NULL);
if (pubc->auto_refresh && expires)
expiration = expires->ivalue;
if (pubc->auto_refresh && expiration!=0 && expiration!=0xFFFF) {
pj_time_val delay = { 0, 0};
/* Cancel existing timer, if any */
if (pubc->timer.id != 0) {
pjsip_endpt_cancel_timer(pubc->endpt, &pubc->timer);
pubc->timer.id = 0;
}
delay.sec = expiration - DELAY_BEFORE_REFRESH;
if (pubc->expires != PJSIP_PUBC_EXPIRATION_NOT_SPECIFIED &&
delay.sec > (pj_int32_t)pubc->expires)
{
delay.sec = pubc->expires;
}
if (delay.sec < DELAY_BEFORE_REFRESH)
delay.sec = DELAY_BEFORE_REFRESH;
pubc->timer.cb = &pubc_refresh_timer_cb;
pubc->timer.id = REFRESH_TIMER;
pubc->timer.user_data = pubc;
pjsip_endpt_schedule_timer( pubc->endpt, &pubc->timer, &delay);
pj_gettimeofday(&pubc->last_refresh);
pubc->next_refresh = pubc->last_refresh;
pubc->next_refresh.sec += delay.sec;
}
} else {
rdata = (event->body.tsx_state.type==PJSIP_EVENT_RX_MSG) ?
event->body.tsx_state.src.rdata : NULL;
}
//.........这里部分代码省略.........
开发者ID:0x0B501E7E,项目名称:pjproject,代码行数:101,代码来源:publishc.c
示例2: PJ_DEF
/*
* Perform echo cancellation.
*/
PJ_DEF(pj_status_t) echo_supp_cancel_echo( void *state,
pj_int16_t *rec_frm,
const pj_int16_t *play_frm,
unsigned options,
void *reserved )
{
unsigned i, N;
echo_supp *ec = (echo_supp*) state;
PJ_UNUSED_ARG(options);
PJ_UNUSED_ARG(reserved);
/* Calculate number of segments. This should be okay even if
* samples_per_frame is not a multiply of samples_per_segment, since
* we only calculate level.
*/
N = ec->samples_per_frame / ec->samples_per_segment;
pj_assert(N>0);
for (i=0; i<N; ++i) {
unsigned pos = i * ec->samples_per_segment;
echo_supp_update(ec, rec_frm+pos, play_frm+pos);
}
if (ec->tail_index < 0) {
/* Not ready */
} else {
unsigned lookup_cnt, rec_level=0, play_level=0;
unsigned tail_cnt;
float factor;
/* How many previous segments to lookup */
lookup_cnt = SIGNAL_LOOKUP_MSEC / SEGMENT_PTIME;
if (lookup_cnt > ec->templ_cnt)
lookup_cnt = ec->templ_cnt;
/* Lookup in recording history to get maximum mic level, to see
* if local user is currently talking
*/
for (i=ec->templ_cnt - lookup_cnt; i < ec->templ_cnt; ++i) {
if (ec->rec_hist[i] > rec_level)
rec_level = ec->rec_hist[i];
}
rec_level = pjmedia_linear2ulaw(rec_level) ^ 0xFF;
/* Calculate the detected tail length, in # of segments */
tail_cnt = (ec->tail_cnt - ec->tail_index);
/* Lookup in playback history to get max speaker level, to see
* if remote user is currently talking
*/
for (i=ec->play_hist_cnt -lookup_cnt -tail_cnt;
i<ec->play_hist_cnt-tail_cnt; ++i)
{
if (ec->play_hist[i] > play_level)
play_level = ec->play_hist[i];
}
play_level = pjmedia_linear2ulaw(play_level) ^ 0xFF;
if (rec_level >= MIN_SIGNAL_ULAW) {
if (play_level < MIN_SIGNAL_ULAW) {
/* Mic is talking, speaker is idle. Let mic signal pass as is.
*/
factor = 1.0;
echo_supp_set_state(ec, ST_LOCAL_TALK, rec_level);
} else if (rec_level > play_level) {
/* Seems that both are talking. Scale the mic signal
* down a little bit to reduce echo, while allowing both
* parties to talk at the same time.
*/
factor = (float)(ec->avg_factor[ec->tail_index] * 2);
echo_supp_set_state(ec, ST_DOUBLETALK, rec_level);
} else {
/* Speaker is active, but we've picked up large signal in
* the microphone. Assume that this is an echo, so bring
* the level down to minimum too.
*/
factor = ec->min_factor[ec->tail_index] / 2;
echo_supp_set_state(ec, ST_REM_TALK, play_level);
}
} else {
if (play_level < MIN_SIGNAL_ULAW) {
/* Both mic and speaker seems to be idle. Also scale the
* mic signal down with average factor to reduce low power
* echo.
*/
factor = ec->avg_factor[ec->tail_index] * 3 / 2;
echo_supp_set_state(ec, ST_REM_SILENT, rec_level);
} else {
/* Mic is idle, but there's something playing in speaker.
* Scale the mic down to minimum
*/
factor = ec->min_factor[ec->tail_index] / 2;
echo_supp_set_state(ec, ST_REM_TALK, play_level);
}
}
/* Smoothen the transition */
//.........这里部分代码省略.........
开发者ID:conght,项目名称:BLM-Lib,代码行数:101,代码来源:echo_suppress.c
示例3: PJ_DEF
PJ_DEF(const pj_str_t*) pjpidf_tuple_get_id(const pjpidf_tuple *t)
{
const pj_xml_attr *attr = pj_xml_find_attr((pj_xml_node*)t, &ID, NULL);
pj_assert(attr);
return &attr->value;
}
开发者ID:LuLei2013,项目名称:pjproject,代码行数:6,代码来源:pidf.c
示例4: PJ_DEF
/*
* pj_ioqueue_register_sock()
*
* Register a socket to ioqueue.
*/
PJ_DEF(pj_status_t) pj_ioqueue_register_sock2(pj_pool_t *pool,
pj_ioqueue_t *ioqueue,
pj_sock_t sock,
pj_grp_lock_t *grp_lock,
void *user_data,
const pj_ioqueue_callback *cb,
pj_ioqueue_key_t **p_key)
{
pj_ioqueue_key_t *key = NULL;
pj_uint32_t value;
struct epoll_event ev;
int status;
pj_status_t rc = PJ_SUCCESS;
PJ_ASSERT_RETURN(pool && ioqueue && sock != PJ_INVALID_SOCKET &&
cb && p_key, PJ_EINVAL);
pj_lock_acquire(ioqueue->lock);
if (ioqueue->count >= ioqueue->max) {
rc = PJ_ETOOMANY;
TRACE_((THIS_FILE, "pj_ioqueue_register_sock error: too many files"));
goto on_return;
}
/* Set socket to nonblocking. */
value = 1;
if ((rc=os_ioctl(sock, FIONBIO, (ioctl_val_type)&value))) {
TRACE_((THIS_FILE, "pj_ioqueue_register_sock error: ioctl rc=%d",
rc));
rc = pj_get_netos_error();
goto on_return;
}
/* If safe unregistration (PJ_IOQUEUE_HAS_SAFE_UNREG) is used, get
* the key from the free list. Otherwise allocate a new one.
*/
#if PJ_IOQUEUE_HAS_SAFE_UNREG
/* Scan closing_keys first to let them come back to free_list */
scan_closing_keys(ioqueue);
pj_assert(!pj_list_empty(&ioqueue->free_list));
if (pj_list_empty(&ioqueue->free_list)) {
rc = PJ_ETOOMANY;
goto on_return;
}
key = ioqueue->free_list.next;
pj_list_erase(key);
#else
/* Create key. */
key = (pj_ioqueue_key_t*)pj_pool_zalloc(pool, sizeof(pj_ioqueue_key_t));
#endif
rc = ioqueue_init_key(pool, ioqueue, key, sock, grp_lock, user_data, cb);
if (rc != PJ_SUCCESS) {
key = NULL;
goto on_return;
}
/* Create key's mutex */
/* rc = pj_mutex_create_recursive(pool, NULL, &key->mutex);
if (rc != PJ_SUCCESS) {
key = NULL;
goto on_return;
}
*/
/* os_epoll_ctl. */
ev.events = EPOLLIN | EPOLLERR;
ev.epoll_data = (epoll_data_type)key;
status = os_epoll_ctl(ioqueue->epfd, EPOLL_CTL_ADD, sock, &ev);
if (status < 0) {
rc = pj_get_os_error();
pj_lock_destroy(key->lock);
key = NULL;
TRACE_((THIS_FILE,
"pj_ioqueue_register_sock error: os_epoll_ctl rc=%d",
status));
goto on_return;
}
/* Register */
pj_list_insert_before(&ioqueue->active_list, key);
++ioqueue->count;
//TRACE_((THIS_FILE, "socket registered, count=%d", ioqueue->count));
on_return:
if (rc != PJ_SUCCESS) {
if (key && key->grp_lock)
pj_grp_lock_dec_ref_dbg(key->grp_lock, "ioqueue", 0);
}
*p_key = key;
pj_lock_release(ioqueue->lock);
//.........这里部分代码省略.........
开发者ID:0x0B501E7E,项目名称:pjproject,代码行数:101,代码来源:ioqueue_epoll.c
示例5: transport_rtp_cb
/* This is our RTP callback, that is called by the slave transport when it
* receives RTP packet.
*/
static void transport_rtp_cb(void *user_data, void *pkt, pj_ssize_t size)
{
struct tp_zrtp *zrtp = (struct tp_zrtp*)user_data;
pj_uint8_t* buffer = (pj_uint8_t*)pkt;
int32_t newLen = 0;
pj_status_t rc = PJ_SUCCESS;
pj_assert(zrtp && zrtp->stream_rtcp_cb && pkt);
// check if this could be a real RTP/SRTP packet.
if ((*buffer & 0xf0) != 0x10)
{
// Could be real RTP, check if we are in secure mode
if (zrtp->srtpReceive == NULL || size < 0)
{
zrtp->stream_rtp_cb(zrtp->stream_user_data, pkt, size);
}
else
{
rc = zsrtp_unprotect(zrtp->srtpReceive, pkt, size, &newLen);
if (rc == 1)
{
zrtp->unprotect++;
zrtp->stream_rtp_cb(zrtp->stream_user_data, pkt,
newLen);
zrtp->unprotect_err = 0;
}
else
{
if (rc == -1) {
zrtp->userCallback->zrtp_showMessage(zrtp->userCallback->userData,
zrtp_Warning,
zrtp_WarningSRTPauthError);
}
else {
zrtp->userCallback->zrtp_showMessage(zrtp->userCallback->userData,
zrtp_Warning,
zrtp_WarningSRTPreplayError);
}
zrtp->unprotect_err = rc;
}
}
if (!zrtp->started && zrtp->enableZrtp)
pjmedia_transport_zrtp_startZrtp((pjmedia_transport *)zrtp);
return;
}
// We assume all other packets are ZRTP packets here. Process
// if ZRTP processing is enabled. Because valid RTP packets are
// already handled we delete any packets here after processing.
if (zrtp->enableZrtp && zrtp->zrtpCtx != NULL)
{
// Get CRC value into crc (see above how to compute the offset)
pj_uint16_t temp = size - CRC_SIZE;
pj_uint32_t crc = *(uint32_t*)(buffer + temp);
crc = pj_ntohl(crc);
if (!zrtp_CheckCksum(buffer, temp, crc))
{
if (zrtp->userCallback != NULL)
zrtp->userCallback->zrtp_showMessage(zrtp->userCallback->userData, zrtp_Warning, zrtp_WarningCRCmismatch);
return;
}
pj_uint32_t magic = *(pj_uint32_t*)(buffer + 4);
magic = pj_ntohl(magic);
// Check if it is really a ZRTP packet, return, no further processing
if (magic != ZRTP_MAGIC || zrtp->zrtpCtx == NULL)
{
return;
}
// cover the case if the other party sends _only_ ZRTP packets at the
// beginning of a session. Start ZRTP in this case as well.
if (!zrtp->started)
{
pjmedia_transport_zrtp_startZrtp((pjmedia_transport *)zrtp);
}
// this now points beyond the undefined and length field.
// We need them, thus adjust
unsigned char* zrtpMsg = (buffer + 12);
// store peer's SSRC in host order, used when creating the CryptoContext
zrtp->peerSSRC = *(pj_uint32_t*)(buffer + 8);
zrtp->peerSSRC = pj_ntohl(zrtp->peerSSRC);
zrtp_processZrtpMessage(zrtp->zrtpCtx, zrtpMsg, zrtp->peerSSRC, size);
}
}
开发者ID:saghul,项目名称:ZRTP4PJ,代码行数:93,代码来源:transport_zrtp.c
示例6: transport_encode_sdp
static pj_status_t transport_encode_sdp(pjmedia_transport *tp,
pj_pool_t *sdp_pool,
pjmedia_sdp_session *sdp_local,
const pjmedia_sdp_session *sdp_remote,
unsigned media_index)
{
struct transport_srtp *srtp = (struct transport_srtp*) tp;
pjmedia_sdp_media *m_rem, *m_loc;
enum { MAXLEN = 512 };
char buffer[MAXLEN];
int buffer_len;
pj_status_t status;
pjmedia_sdp_attr *attr;
pj_str_t attr_value;
unsigned i, j;
PJ_ASSERT_RETURN(tp && sdp_pool && sdp_local, PJ_EINVAL);
pj_bzero(&srtp->rx_policy_neg, sizeof(srtp->rx_policy_neg));
pj_bzero(&srtp->tx_policy_neg, sizeof(srtp->tx_policy_neg));
srtp->offerer_side = sdp_remote == NULL;
m_rem = sdp_remote ? sdp_remote->media[media_index] : NULL;
m_loc = sdp_local->media[media_index];
/* Bypass if media transport is not RTP/AVP or RTP/SAVP */
if (pj_stricmp(&m_loc->desc.transport, &ID_RTP_AVP) != 0 &&
pj_stricmp(&m_loc->desc.transport, &ID_RTP_SAVP) != 0)
goto BYPASS_SRTP;
/* If the media is inactive, do nothing. */
/* No, we still need to process SRTP offer/answer even if the media is
* marked as inactive, because the transport is still alive in this
* case (e.g. for keep-alive). See:
* http://trac.pjsip.org/repos/ticket/1079
*/
/*
if (pjmedia_sdp_media_find_attr(m_loc, &ID_INACTIVE, NULL) ||
(m_rem && pjmedia_sdp_media_find_attr(m_rem, &ID_INACTIVE, NULL)))
goto BYPASS_SRTP;
*/
/* Check remote media transport & set local media transport
* based on SRTP usage option.
*/
if (srtp->offerer_side) {
/* Generate transport */
switch (srtp->setting.use) {
case PJMEDIA_SRTP_DISABLED:
goto BYPASS_SRTP;
case PJMEDIA_SRTP_OPTIONAL:
m_loc->desc.transport =
(srtp->peer_use == PJMEDIA_SRTP_MANDATORY)?
ID_RTP_SAVP : ID_RTP_AVP;
break;
case PJMEDIA_SRTP_MANDATORY:
m_loc->desc.transport = ID_RTP_SAVP;
break;
}
/* Generate crypto attribute if not yet */
if (pjmedia_sdp_media_find_attr(m_loc, &ID_CRYPTO, NULL) == NULL) {
for (i=0; i<srtp->setting.crypto_count; ++i) {
/* Offer crypto-suites based on setting. */
buffer_len = MAXLEN;
status = generate_crypto_attr_value(srtp->pool, buffer, &buffer_len,
&srtp->setting.crypto[i],
i+1);
if (status != PJ_SUCCESS)
return status;
/* If buffer_len==0, just skip the crypto attribute. */
if (buffer_len) {
pj_strset(&attr_value, buffer, buffer_len);
attr = pjmedia_sdp_attr_create(srtp->pool, ID_CRYPTO.ptr,
&attr_value);
m_loc->attr[m_loc->attr_count++] = attr;
}
}
}
} else {
/* Answerer side */
pj_assert(sdp_remote && m_rem);
/* Generate transport */
switch (srtp->setting.use) {
case PJMEDIA_SRTP_DISABLED:
if (pj_stricmp(&m_rem->desc.transport, &ID_RTP_SAVP) == 0)
return PJMEDIA_SRTP_ESDPINTRANSPORT;
goto BYPASS_SRTP;
case PJMEDIA_SRTP_OPTIONAL:
m_loc->desc.transport = m_rem->desc.transport;
break;
case PJMEDIA_SRTP_MANDATORY:
if (pj_stricmp(&m_rem->desc.transport, &ID_RTP_SAVP) != 0)
return PJMEDIA_SRTP_ESDPINTRANSPORT;
//.........这里部分代码省略.........
开发者ID:svn2github,项目名称:pjproject,代码行数:101,代码来源:transport_srtp.c
示例7: PJ_DEF
/*
* Convert IPv4/IPv6 address to text.
*/
PJ_DEF(pj_status_t) pj_inet_ntop(int af, const void *src,
char *dst, int size)
{
PJ_ASSERT_RETURN(src && dst && size, PJ_EINVAL);
*dst = '\0';
PJ_ASSERT_RETURN(af==PJ_AF_INET || af==PJ_AF_INET6, PJ_EAFNOTSUP);
#if defined(PJ_SOCK_HAS_INET_NTOP) && PJ_SOCK_HAS_INET_NTOP != 0
/*
* Implementation using inet_ntop()
*/
if (inet_ntop(af, src, dst, size) == NULL) {
pj_status_t status = pj_get_netos_error();
if (status == PJ_SUCCESS)
status = PJ_EUNKNOWN;
return status;
}
return PJ_SUCCESS;
#elif defined(PJ_WIN32) || defined(PJ_WIN64) || defined(PJ_WIN32_WINCE)
/*
* Implementation on Windows, using WSAAddressToString().
* Should also work on Unicode systems.
*/
{
PJ_DECL_UNICODE_TEMP_BUF(wtempaddr,PJ_INET6_ADDRSTRLEN)
pj_sockaddr sock_addr;
DWORD addr_len, addr_str_len;
int rc;
pj_bzero(&sock_addr, sizeof(sock_addr));
sock_addr.addr.sa_family = (pj_uint16_t)af;
if (af == PJ_AF_INET) {
if (size < PJ_INET_ADDRSTRLEN)
return PJ_ETOOSMALL;
pj_memcpy(&sock_addr.ipv4.sin_addr, src, 4);
addr_len = sizeof(pj_sockaddr_in);
addr_str_len = PJ_INET_ADDRSTRLEN;
} else if (af == PJ_AF_INET6) {
if (size < PJ_INET6_ADDRSTRLEN)
return PJ_ETOOSMALL;
pj_memcpy(&sock_addr.ipv6.sin6_addr, src, 16);
addr_len = sizeof(pj_sockaddr_in6);
addr_str_len = PJ_INET6_ADDRSTRLEN;
} else {
pj_assert(!"Unsupported address family");
return PJ_EAFNOTSUP;
}
#if PJ_NATIVE_STRING_IS_UNICODE
rc = WSAAddressToString((LPSOCKADDR)&sock_addr, addr_len,
NULL, wtempaddr, &addr_str_len);
if (rc == 0) {
pj_unicode_to_ansi(wtempaddr, wcslen(wtempaddr), dst, size);
}
#else
rc = WSAAddressToString((LPSOCKADDR)&sock_addr, addr_len,
NULL, dst, &addr_str_len);
#endif
if (rc != 0) {
pj_status_t status = pj_get_netos_error();
if (status == PJ_SUCCESS)
status = PJ_EUNKNOWN;
return status;
}
return PJ_SUCCESS;
}
#elif !defined(PJ_HAS_IPV6) || PJ_HAS_IPV6==0
/* IPv6 support is disabled, just return error without raising assertion */
return PJ_EIPV6NOTSUP;
#else
pj_assert(!"Not supported");
return PJ_EIPV6NOTSUP;
#endif
}
开发者ID:AGProjects,项目名称:python-sipsimple,代码行数:87,代码来源:sock_bsd.c
示例8: pjsip_url_print
static pj_ssize_t pjsip_url_print( pjsip_uri_context_e context,
const pjsip_sip_uri *url,
char *buf, pj_size_t size)
{
int printed;
char *startbuf = buf;
char *endbuf = buf+size;
const pj_str_t *scheme;
*buf = '\0';
/* Print scheme ("sip:" or "sips:") */
scheme = pjsip_uri_get_scheme(url);
copy_advance_check(buf, *scheme);
*buf++ = ':';
/* Print "user:[email protected]", if any. */
if (url->user.slen) {
copy_advance_escape(buf, url->user, pjsip_USER_SPEC);
if (url->passwd.slen) {
*buf++ = ':';
copy_advance_escape(buf, url->passwd, pjsip_PASSWD_SPEC);
}
*buf++ = '@';
}
/* Print host. */
pj_assert(url->host.slen != 0);
copy_advance_check(buf, url->host);
/* Only print port if it is explicitly specified.
* Port is not allowed in To and From header.
*/
/* Unfortunately some UA requires us to send back the port
* number exactly as it was sent. We don't remember whether an
* UA has sent us port, so we'll just send the port indiscrimately
*/
//PJ_TODO(SHOULD_DISALLOW_URI_PORT_IN_FROM_TO_HEADER)
if (url->port && context != PJSIP_URI_IN_FROMTO_HDR) {
if (endbuf - buf < 10)
return -1;
*buf++ = ':';
printed = pj_utoa(url->port, buf);
buf += printed;
}
/* User param is allowed in all contexes */
copy_advance_pair_check(buf, ";user=", 6, url->user_param);
/* Method param is only allowed in external/other context. */
if (context == PJSIP_URI_IN_OTHER) {
copy_advance_pair_escape(buf, ";method=", 8, url->method_param,
pjsip_PARAM_CHAR_SPEC);
}
/* Transport is not allowed in From/To header. */
if (context != PJSIP_URI_IN_FROMTO_HDR) {
copy_advance_pair_escape(buf, ";transport=", 11, url->transport_param,
pjsip_PARAM_CHAR_SPEC);
}
/* TTL param is not allowed in From, To, Route, and Record-Route header. */
if (url->ttl_param >= 0 && context != PJSIP_URI_IN_FROMTO_HDR &&
context != PJSIP_URI_IN_ROUTING_HDR)
{
if (endbuf - buf < 15)
return -1;
pj_memcpy(buf, ";ttl=", 5);
printed = pj_utoa(url->ttl_param, buf+5);
buf += printed + 5;
}
/* maddr param is not allowed in From and To header. */
if (context != PJSIP_URI_IN_FROMTO_HDR) {
copy_advance_pair_escape(buf, ";maddr=", 7, url->maddr_param,
pjsip_PARAM_CHAR_SPEC);
}
/* lr param is not allowed in From, To, and Contact header. */
if (url->lr_param && context != PJSIP_URI_IN_FROMTO_HDR &&
context != PJSIP_URI_IN_CONTACT_HDR)
{
pj_str_t lr = { ";lr", 3 };
if (endbuf - buf < 3)
return -1;
copy_advance_check(buf, lr);
}
/* Other param. */
printed = pjsip_param_print_on(&url->other_param, buf, endbuf-buf,
&pjsip_PARAM_CHAR_SPEC,
&pjsip_PARAM_CHAR_SPEC, ';');
if (printed < 0)
return -1;
buf += printed;
/* Header param.
* Header param is only allowed in these contexts:
//.........这里部分代码省略.........
开发者ID:tibastral,项目名称:symphonie,代码行数:101,代码来源:sip_uri.c
示例9: PJ_DEF
/*
* Release write lock.
*
*/
PJ_DEF(pj_status_t) pj_rwmutex_unlock_write(pj_rwmutex_t *mutex)
{
PJ_ASSERT_RETURN(mutex, PJ_EINVAL);
pj_assert(mutex->reader_count <= 1);
return pj_sem_post(mutex->write_lock);
}
开发者ID:max3903,项目名称:SFLphone,代码行数:10,代码来源:os_rwmutex.c
示例10: purity_test
static int purity_test(void)
{
PJ_LOG(3,("test", "...purity_test()"));
#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
/* Check on "sin_len" member of sockaddr */
{
const pj_str_t str_ip = {"1.1.1.1", 7};
pj_sockaddr addr[16];
pj_addrinfo ai[16];
unsigned cnt;
pj_status_t rc;
/* pj_enum_ip_interface() */
cnt = PJ_ARRAY_SIZE(addr);
rc = pj_enum_ip_interface(pj_AF_UNSPEC(), &cnt, addr);
if (rc == PJ_SUCCESS) {
while (cnt--)
CHECK_SA_ZERO_LEN(&addr[cnt], -10);
}
/* pj_gethostip() on IPv4 */
rc = pj_gethostip(pj_AF_INET(), &addr[0]);
if (rc == PJ_SUCCESS)
CHECK_SA_ZERO_LEN(&addr[0], -20);
/* pj_gethostip() on IPv6 */
rc = pj_gethostip(pj_AF_INET6(), &addr[0]);
if (rc == PJ_SUCCESS)
CHECK_SA_ZERO_LEN(&addr[0], -30);
/* pj_getdefaultipinterface() on IPv4 */
rc = pj_getdefaultipinterface(pj_AF_INET(), &addr[0]);
if (rc == PJ_SUCCESS)
CHECK_SA_ZERO_LEN(&addr[0], -40);
/* pj_getdefaultipinterface() on IPv6 */
rc = pj_getdefaultipinterface(pj_AF_INET6(), &addr[0]);
if (rc == PJ_SUCCESS)
CHECK_SA_ZERO_LEN(&addr[0], -50);
/* pj_getaddrinfo() on a host name */
cnt = PJ_ARRAY_SIZE(ai);
rc = pj_getaddrinfo(pj_AF_UNSPEC(), pj_gethostname(), &cnt, ai);
if (rc == PJ_SUCCESS) {
while (cnt--)
CHECK_SA_ZERO_LEN(&ai[cnt].ai_addr, -60);
}
/* pj_getaddrinfo() on an IP address */
cnt = PJ_ARRAY_SIZE(ai);
rc = pj_getaddrinfo(pj_AF_UNSPEC(), &str_ip, &cnt, ai);
if (rc == PJ_SUCCESS) {
pj_assert(cnt == 1);
CHECK_SA_ZERO_LEN(&ai[0].ai_addr, -70);
}
}
#endif
return 0;
}
开发者ID:AbhaySingh,项目名称:pjproject,代码行数:61,代码来源:sock.c
示例11: parse_test
static int parse_test(void)
{
#define IPv4 1
#define IPv6 2
struct test_t {
const char *input;
int result_af;
const char *result_ip;
pj_uint16_t result_port;
};
struct test_t valid_tests[] =
{
/* IPv4 */
{ "10.0.0.1:80", IPv4, "10.0.0.1", 80},
{ "10.0.0.1", IPv4, "10.0.0.1", 0},
{ "10.0.0.1:", IPv4, "10.0.0.1", 0},
{ "10.0.0.1:0", IPv4, "10.0.0.1", 0},
{ ":80", IPv4, "0.0.0.0", 80},
{ ":", IPv4, "0.0.0.0", 0},
#if !PJ_SYMBIAN
{ "localhost", IPv4, "127.0.0.1", 0},
{ "localhost:", IPv4, "127.0.0.1", 0},
{ "localhost:80", IPv4, "127.0.0.1", 80},
#endif
#if defined(PJ_HAS_IPV6) && PJ_HAS_IPV6
{ "fe::01:80", IPv6, "fe::01:80", 0},
{ "[fe::01]:80", IPv6, "fe::01", 80},
{ "fe::01", IPv6, "fe::01", 0},
{ "[fe::01]", IPv6, "fe::01", 0},
{ "fe::01:", IPv6, "fe::01", 0},
{ "[fe::01]:", IPv6, "fe::01", 0},
{ "::", IPv6, "::0", 0},
{ "[::]", IPv6, "::", 0},
{ ":::", IPv6, "::", 0},
{ "[::]:", IPv6, "::", 0},
{ ":::80", IPv6, "::", 80},
{ "[::]:80", IPv6, "::", 80},
#endif
};
struct test_t invalid_tests[] =
{
/* IPv4 */
{ "10.0.0.1:abcd", IPv4}, /* port not numeric */
{ "10.0.0.1:-1", IPv4}, /* port contains illegal character */
{ "10.0.0.1:123456", IPv4}, /* port too big */
{ "1.2.3.4.5:80", IPv4}, /* invalid IP */
{ "10:0:80", IPv4}, /* hostname has colon */
#if defined(PJ_HAS_IPV6) && PJ_HAS_IPV6
{ "[fe::01]:abcd", IPv6}, /* port not numeric */
{ "[fe::01]:-1", IPv6}, /* port contains illegal character */
{ "[fe::01]:123456", IPv6}, /* port too big */
{ "fe::01:02::03:04:80", IPv6}, /* invalid IP */
{ "[fe::01:02::03:04]:80", IPv6}, /* invalid IP */
{ "[fe:01", IPv6}, /* Unterminated bracket */
#endif
};
unsigned i;
PJ_LOG(3,("test", "...IP address parsing"));
for (i=0; i<PJ_ARRAY_SIZE(valid_tests); ++i) {
pj_status_t status;
pj_str_t input;
pj_sockaddr addr, result;
switch (valid_tests[i].result_af) {
case IPv4:
valid_tests[i].result_af = PJ_AF_INET;
break;
case IPv6:
valid_tests[i].result_af = PJ_AF_INET6;
break;
default:
pj_assert(!"Invalid AF!");
continue;
}
/* Try parsing with PJ_AF_UNSPEC */
status = pj_sockaddr_parse(PJ_AF_UNSPEC, 0,
pj_cstr(&input, valid_tests[i].input),
&addr);
if (status != PJ_SUCCESS) {
PJ_LOG(1,("test", ".... failed when parsing %s (i=%d)",
valid_tests[i].input, i));
return -10;
}
/* Check "sin_len" member of parse result */
CHECK_SA_ZERO_LEN(&addr, -20);
/* Build the correct result */
status = pj_sockaddr_init(valid_tests[i].result_af,
&result,
pj_cstr(&input, valid_tests[i].result_ip),
valid_tests[i].result_port);
if (status != PJ_SUCCESS) {
//.........这里部分代码省略.........
开发者ID:AbhaySingh,项目名称:pjproject,代码行数:101,代码来源:sock.c
示例12: PJ_DEF
/*
* pj_init(void).
* Init PJLIB!
*/
PJ_DEF(pj_status_t) pj_init(void)
{
char dummy_guid[PJ_GUID_MAX_LENGTH];
pj_str_t guid;
pj_status_t rc;
/* Check if PJLIB have been initialized */
if (initialized) {
++initialized;
return PJ_SUCCESS;
}
#if PJ_HAS_THREADS
/* Init this thread's TLS. */
if ((rc=pj_thread_init()) != 0) {
return rc;
}
/* Critical section. */
if ((rc=init_mutex(&critical_section, "critsec", PJ_MUTEX_RECURSE)) != 0)
return rc;
#endif
/* Init logging */
pj_log_init();
/* Initialize exception ID for the pool.
* Must do so after critical section is configured.
*/
rc = pj_exception_id_alloc("PJLIB/No memory", &PJ_NO_MEMORY_EXCEPTION);
if (rc != PJ_SUCCESS)
return rc;
/* Init random seed. */
/* Or probably not. Let application in charge of this */
/* pj_srand( clock() ); */
/* Startup GUID. */
guid.ptr = dummy_guid;
pj_generate_unique_string( &guid );
/* Startup timestamp */
#if defined(PJ_HAS_HIGH_RES_TIMER) && PJ_HAS_HIGH_RES_TIMER != 0
{
pj_timestamp dummy_ts;
if ((rc=pj_get_timestamp(&dummy_ts)) != 0) {
return rc;
}
}
#endif
/* Flag PJLIB as initialized */
++initialized;
pj_assert(initialized == 1);
PJ_LOG(4,(THIS_FILE, "pjlib %s for POSIX initialized",
PJ_VERSION));
return PJ_SUCCESS;
}
开发者ID:CloudStyleStudio,项目名称:csip,代码行数:65,代码来源:os_core_unix.c
示例13: PJ_DEF
/*
* pj_thread_create(...)
*/
PJ_DEF(pj_status_t) pj_thread_create( pj_pool_t *pool,
const char *thread_name,
pj_thread_proc *proc,
void *arg,
pj_size_t stack_size,
unsigned flags,
pj_thread_t **ptr_thread)
{
#if PJ_HAS_THREADS
pj_thread_t *rec;
pthread_attr_t thread_attr;
void *stack_addr;
int rc;
PJ_UNUSED_ARG(stack_addr);
PJ_CHECK_STACK();
PJ_ASSERT_RETURN(pool && proc && ptr_thread, PJ_EINVAL);
/* Create thread record and assign name for the thread */
rec = (struct pj_thread_t*) pj_pool_zalloc(pool, sizeof(pj_thread_t));
PJ_ASSERT_RETURN(rec, PJ_ENOMEM);
/* Set name. */
if (!thread_name)
thread_name = "thr%p";
if (strchr(thread_name, '%')) {
pj_ansi_snprintf(rec->obj_name, PJ_MAX_OBJ_NAME, thread_name, rec);
} else {
strncpy(rec->obj_name, thread_name, PJ_MAX_OBJ_NAME);
rec->obj_name[PJ_MAX_OBJ_NAME-1] = '\0';
}
/* Set default stack size */
if (stack_size == 0)
stack_size = PJ_THREAD_DEFAULT_STACK_SIZE;
#if defined(PJ_OS_HAS_CHECK_STACK) && PJ_OS_HAS_CHECK_STACK!=0
rec->stk_size = stack_size;
rec->stk_max_usage = 0;
#endif
/* Emulate suspended thread with mutex. */
if (flags & PJ_THREAD_SUSPENDED) {
rc = pj_mutex_create_simple(pool, NULL, &rec->suspended_mutex);
if (rc != PJ_SUCCESS) {
return rc;
}
pj_mutex_lock(rec->suspended_mutex);
} else {
pj_assert(rec->suspended_mutex == NULL);
}
/* Init thread attributes */
pthread_attr_init(&thread_attr);
#if defined(PJ_THREAD_SET_STACK_SIZE) && PJ_THREAD_SET_STACK_SIZE!=0
/* Set thread's stack size */
rc = pthread_attr_setstacksize(&thread_attr, stack_size);
if (rc != 0)
return PJ_RETURN_OS_ERROR(rc);
#endif /* PJ_THREAD_SET_STACK_SIZE */
#if defined(PJ_THREAD_ALLOCATE_STACK) && PJ_THREAD_ALLOCATE_STACK!=0
/* Allocate memory for the stack */
stack_addr = pj_pool_alloc(pool, stack_size);
PJ_ASSERT_RETURN(stack_addr, PJ_ENOMEM);
rc = pthread_attr_setstackaddr(&thread_attr, stack_addr);
if (rc != 0)
return PJ_RETURN_OS_ERROR(rc);
#endif /* PJ_THREAD_ALLOCATE_STACK */
/* Create the thread. */
rec->proc = proc;
rec->arg = arg;
rc = pthread_create( &rec->thread, &thread_attr, &thread_main, rec);
if (rc != 0) {
return PJ_RETURN_OS_ERROR(rc);
}
*ptr_thread = rec;
PJ_LOG(6, (rec->obj_name, "Thread created"));
return PJ_SUCCESS;
#else
pj_assert(!"Threading is disabled!");
return PJ_EINVALIDOP;
#endif
}
开发者ID:max3903,项目名称:SFLphone,代码行数:98,代码来源:os_core_unix.c
示例14: pj_assert
static const pj_str_t *pjsip_name_addr_get_scheme(const pjsip_name_addr *name)
{
pj_assert(name->uri != NULL);
return pjsip_uri_get_scheme(name->uri);
}
开发者ID:tibastral,项目名称:symphonie,代码行数:5,代码来源:sip_uri.c
示例15: PJ_DEF
PJ_DEF(void* )pjmedia_transport_zrtp_getUserData(pjmedia_transport *tp){
struct tp_zrtp *zrtp = (struct tp_zrtp*)tp;
pj_assert(tp);
return zrtp->userCallback->userData;
}
开发者ID:saghul,项目名称:ZRTP4PJ,代码行数:6,代码来源:transport_zrtp.c
示例16: fake_udp_on_read_complete
/*
* fake_udp_on_read_complete()
*
* This is callback notification from ioqueue that a pending recvfrom()
* operation has completed.
*/
static void fake_udp_on_read_complete( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
pj_ssize_t bytes_read)
{
/* See https://trac.pjsip.org/repos/ticket/1197 */
enum { MAX_IMMEDIATE_PACKET = 50 };
pjsip_rx_data_op_key *rdata_op_key = (pjsip_rx_data_op_key*) op_key;
pjsip_rx_data *rdata = rdata_op_key->rdata;
struct fake_udp_transport *tp = (struct fake_udp_transport*)rdata->tp_info.transport;
int i;
pj_status_t status;
/* Don't do anything if transport is closing. */
if (tp->is_closing) {
tp->is_closing++;
return;
}
/* Don't do anything if transport is being paused. */
if (tp->is_paused)
return;
/*
* The idea of the loop is to process immediate data received by
* pj_ioqueue_recvfrom(), as long as i < MAX_IMMEDIATE_PACKET. When
* i is >= MAX_IMMEDIATE_PACKET, we force the recvfrom() operation to
* complete asynchronously, to allow other sockets to get their data.
*/
for (i=0;; ++i) {
enum { MIN_SIZE = 32 };
pj_uint32_t flags;
/* Report the packet to transport manager. Only do so if packet size
* is relatively big enough for a SIP packet.
*/
if (bytes_read > MIN_SIZE) {
pj_size_t size_eaten;
const pj_sockaddr *src_addr = &rdata->pkt_info.src_addr;
/* Init pkt_info part. */
rdata->pkt_info.len = bytes_read;
rdata->pkt_info.zero = 0;
pj_gettimeofday(&rdata->pkt_info.timestamp);
pj_ansi_strcpy(rdata->pkt_info.src_name,
pj_inet_ntoa(src_addr->ipv4.sin_addr));
rdata->pkt_info.src_port = pj_ntohs(src_addr->ipv4.sin_port);
size_eaten =
pjsip_tpmgr_receive_packet(rdata->tp_info.transport->tpmgr,
rdata);
if (size_eaten < 0) {
pj_assert(!"It shouldn't happen!");
size_eaten = rdata->pkt_info.len;
}
/* Since this is FAKE_UDP, the whole buffer is the message. */
rdata->pkt_info.len = 0;
} else if (bytes_read <= MIN_SIZE) {
/* TODO: */
} else if (-bytes_read != PJ_STATUS_FROM_OS(OSERR_EWOULDBLOCK) &&
-bytes_read != PJ_STATUS_FROM_OS(OSERR_EINPROGRESS) &&
-bytes_read != PJ_STATUS_FROM_OS(OSERR_ECONNRESET))
{
/* Report error to endpoint. */
PJSIP_ENDPT_LOG_ERROR((rdata->tp_info.transport->endpt,
rdata->tp_info.transport->obj_name,
-bytes_read,
"Warning: pj_ioqueue_recvfrom()"
" callback error"));
}
if (i >= MAX_IMMEDIATE_PACKET) {
/* Force ioqueue_recvfrom() to return PJ_EPENDING */
flags = PJ_IOQUEUE_ALWAYS_ASYNC;
} else {
flags = 0;
}
/* Reset pool.
* Need to copy rdata fields to temp variable because they will
* be invalid after pj_pool_reset().
*/
{
pj_pool_t *rdata_pool = rdata->tp_info.pool;
struct fake_udp_transport *rdata_tp ;
unsigned rdata_index;
rdata_tp = (struct fake_udp_transport*)rdata->tp_info.transport;
rdata_index = (unsigned)(unsigned long)rdata->tp_info.tp_data;
//.........这里部分代码省略.........
开发者ID:oldurecu,项目名称:sprout,代码行数:101,代码来源:faketransport_udp.cpp
示例17: PJ_DEF
//.........这里部分代码省略.........
pj_lock_acquire(ioqueue->lock);
for (processed=0, i=0; i<count; ++i) {
pj_ioqueue_key_t *h = (pj_ioqueue_key_t*)(epoll_data_type)
events[i].epoll_data;
TRACE_((THIS_FILE, "event %d: events=%d", i, events[i].events));
/*
* Check readability.
*/
if ((events[i].events & EPOLLIN) &&
(key_has_pending_read(h) || key_has_pending_accept(h)) && !IS_CLOSING(h) ) {
#if PJ_IOQUEUE_HAS_SAFE_UNREG
increment_counter(h);
#endif
queue[processed].key = h;
queue[processed].event_type = READABLE_EVENT;
++processed;
}
/*
* Check for writeability.
*/
if ((events[i].events & EPOLLOUT) && key_has_pending_write(h) && !IS_CLOSING(h)) {
#if PJ_IOQUEUE_HAS_SAFE_UNREG
increment_counter(h);
#endif
queue[processed].key = h;
queue[processed].event_type = WRITEABLE_EVENT;
++processed;
}
#if PJ_HAS_TCP
/*
* Check for completion of connect() operation.
*/
if ((events[i].events & EPOLLOUT) && (h->connecting) && !IS_CLOSING(h)) {
#if PJ_IOQUEUE_HAS_SAFE_UNREG
increment_counter(h);
#endif
queue[processed].key = h;
queue[processed].event_type = WRITEABLE_EVENT;
++processed;
}
#endif /* PJ_HAS_TCP */
/*
* Check for error condition.
*/
if (events[i].events & EPOLLERR && (h->connecting) && !IS_CLOSING(h)) {
#if PJ_IOQUEUE_HAS_SAFE_UNREG
increment_counter(h);
#endif
queue[processed].key = h;
queue[processed].event_type = EXCEPTION_EVENT;
++processed;
}
}
pj_lock_release(ioqueue->lock);
/* Now process the events. */
for (i=0; i<processed; ++i) {
switch (queue[i].event_type) {
case READABLE_EVENT:
ioqueue_dispatch_read_event(ioqueue, queue[i].key);
break;
case WRITEABLE_EVENT:
ioqueue_dispatch_write_event(ioqueue, queue[i].key);
break;
case EXCEPTION_EVENT:
ioqueue_dispatch_exception_event(ioqueue, queue[i].key);
break;
case NO_EVENT:
pj_assert(!"Invalid event!");
break;
}
#if PJ_IOQUEUE_HAS_SAFE_UNREG
decrement_counter(queue[i].key);
#endif
}
/* Special case:
* When epoll returns > 0 but no descriptors are actually set!
*/
if (count > 0 && !processed && msec > 0) {
pj_thread_sleep(msec);
}
pj_get_timestamp(&t1);
TRACE_((THIS_FILE, "ioqueue_poll() returns %d, time=%d usec",
processed, pj_elapsed_usec(&t2, &t1)));
return processed;
}
开发者ID:carlosdelfino,项目名称:WorkshopTelefoniaAutomacao,代码行数:101,代码来源:ioqueue_epoll.c
示例18: ioqueue_dispatch_write_event
//.........这里部分代码省略.........
/* Can't do this. We only clear "op" after we're finished sending
* the whole buffer.
*/
//write_op->op = 0;
} else if (write_op->op == PJ_IOQUEUE_OP_SEND_TO) {
int retry = 2;
while (--retry >= 0) {
send_rc = pj_sock_sendto(h->fd,
write_op->buf+write_op->written,
&sent, write_op->flags,
&write_op->rmt_addr,
write_op->rmt_addrlen);
#if defined(PJ_IPHONE_OS_HAS_MULTITASKING_SUPPORT) && \
PJ_IPHONE_OS_HAS_MULTITASKING_SUPPORT!=0
/* Special treatment for dead UDP sockets here, see ticket #1107 */
if (send_rc==PJ_STATUS_FROM_OS(EPIPE) && !IS_CLOSING(h) &&
h->fd_type==pj_SOCK_DGRAM())
{
PJ_PERROR(4,(THIS_FILE, send_rc,
"Send error for socket %d, retrying",
h->fd));
replace_udp_sock(h);
continue;
}
#endif
break;
}
/* Can't do this. We only clear "op" after we're finished sending
* the whole buffer.
*/
//write_op->op = 0;
} else {
pj_assert(!"Invalid o
|
请发表评论