📄 soa.c
字号:
if (rtp_sort < SOA_RTP_SORT_DEFAULT || rtp_sort > SOA_RTP_SORT_REMOTE) rtp_select = ss->ss_rtp_select; rtp_mismatch = rtp_mismatch != 0; srtp_enable = srtp_enable != 0; srtp_confidentiality = srtp_confidentiality != 0; srtp_integrity = srtp_integrity != 0; change_session |= af != ss->ss_af; change_session |= rtp_select != ss->ss_rtp_select; change_session |= rtp_sort != ss->ss_rtp_sort; change_session |= rtp_mismatch != ss->ss_rtp_mismatch; change_session |= srtp_enable != ss->ss_srtp_enable; change_session |= srtp_confidentiality != ss->ss_srtp_confidentiality; change_session |= srtp_integrity != ss->ss_srtp_integrity; ss->ss_af = af; ss->ss_rtp_select = rtp_select; ss->ss_rtp_sort = rtp_sort; ss->ss_rtp_mismatch = rtp_mismatch; ss->ss_srtp_enable = srtp_enable; ss->ss_srtp_confidentiality = srtp_confidentiality; ss->ss_srtp_integrity = srtp_integrity; if (str0casecmp(media_address, ss->ss_address)) { su_free(ss->ss_home, (void *)ss->ss_address); ss->ss_address = su_strdup(ss->ss_home, media_address); change_session = 1; } if (hold == (char const *)1) hold = "*"; if (str0casecmp(hold, ss->ss_hold)) { su_free(ss->ss_home, (void *)ss->ss_hold); ss->ss_hold = su_strdup(ss->ss_home, hold); change_session = 1; } if (change_session) ss->ss_user_version++; return n;}/** Get tagged parameters */int soa_get_params(soa_session_t const *ss, tag_type_t tag, tag_value_t value, ...){ ta_list ta; int n; SU_DEBUG_9(("soa_get_params(%s::%p, ...) called\n", ss ? ss->ss_actions->soa_name : "", ss)); if (ss == NULL) return su_seterrno(EFAULT), -1; ta_start(ta, tag, value); n = ss->ss_actions->soa_get_params(ss, ta_args(ta)); ta_end(ta); return n;}int soa_base_get_params(soa_session_t const *ss, tagi_t *tags){ int n; n = tl_tgets(tags, SOATAG_CAPS_SDP(ss->ss_caps->ssd_sdp), SOATAG_CAPS_SDP_STR(ss->ss_caps->ssd_str), SOATAG_USER_SDP(ss->ss_user->ssd_sdp), SOATAG_USER_SDP_STR(ss->ss_user->ssd_str), SOATAG_LOCAL_SDP(ss->ss_local->ssd_sdp), SOATAG_LOCAL_SDP_STR(ss->ss_local->ssd_str), SOATAG_REMOTE_SDP(ss->ss_remote->ssd_sdp), SOATAG_REMOTE_SDP_STR(ss->ss_remote->ssd_unparsed), SOATAG_AF(ss->ss_af), SOATAG_ADDRESS(ss->ss_address), SOATAG_HOLD(ss->ss_hold), SOATAG_RTP_SELECT(ss->ss_rtp_select), SOATAG_RTP_SORT(ss->ss_rtp_sort), SOATAG_RTP_MISMATCH(ss->ss_rtp_mismatch), SOATAG_SRTP_ENABLE(ss->ss_srtp_enable), SOATAG_SRTP_CONFIDENTIALITY(ss->ss_srtp_confidentiality), SOATAG_SRTP_INTEGRITY(ss->ss_srtp_integrity), TAG_END()); return n;}/** Return a list of parameters */tagi_t *soa_get_paramlist(soa_session_t const *ss, tag_type_t tag, tag_value_t value, ...){ ta_list ta; tagi_t *params = NULL; SU_DEBUG_9(("soa_get_paramlist(%s::%p, ...) called\n", ss ? ss->ss_actions->soa_name : "", ss)); if (ss) { ta_start(ta, tag, value); params = ss->ss_actions->soa_get_paramlist(ss, ta_tags(ta)); ta_end(ta); } return params;}tagi_t *soa_base_get_paramlist(soa_session_t const *ss, tag_type_t tag, tag_value_t value, ...){ ta_list ta; tagi_t *params; if (ss == NULL) return NULL; ta_start(ta, tag, value); params = tl_llist( TAG_IF(ss->ss_caps->ssd_sdp, SOATAG_CAPS_SDP(ss->ss_caps->ssd_sdp)), TAG_IF(ss->ss_caps->ssd_str, SOATAG_CAPS_SDP_STR(ss->ss_caps->ssd_str)), TAG_IF(ss->ss_user->ssd_sdp, SOATAG_USER_SDP(ss->ss_user->ssd_sdp)), TAG_IF(ss->ss_user->ssd_str, SOATAG_USER_SDP_STR(ss->ss_user->ssd_str)), TAG_IF(ss->ss_local->ssd_sdp, SOATAG_LOCAL_SDP(ss->ss_local->ssd_sdp)), TAG_IF(ss->ss_user->ssd_str, SOATAG_LOCAL_SDP_STR(ss->ss_local->ssd_str)), TAG_IF(ss->ss_remote->ssd_sdp, SOATAG_REMOTE_SDP(ss->ss_remote->ssd_sdp)), TAG_IF(ss->ss_remote->ssd_str, SOATAG_REMOTE_SDP_STR(ss->ss_remote->ssd_unparsed)), SOATAG_AF(ss->ss_af), TAG_IF(ss->ss_address, SOATAG_ADDRESS(ss->ss_address)), SOATAG_SRTP_ENABLE(ss->ss_srtp_enable), SOATAG_SRTP_CONFIDENTIALITY(ss->ss_srtp_confidentiality), SOATAG_SRTP_INTEGRITY(ss->ss_srtp_integrity), ta_tags(ta)); ta_end(ta); return params;}#include <sofia-sip/sip_status.h>int soa_error_as_sip_response(soa_session_t *ss, char const **return_phrase){ SU_DEBUG_9(("soa_error_as_sip_response(%s::%p, ...) called\n", ss ? ss->ss_actions->soa_name : "", ss)); if (ss == NULL || ss->ss_status < 400 || ss->ss_status >= 700) { if (return_phrase) *return_phrase = sip_500_Internal_server_error; return 500; } if (return_phrase) *return_phrase = ss->ss_phrase; return ss->ss_status;}char const *soa_error_as_sip_reason(soa_session_t *ss){ char const *phrase; int status; char *reason; SU_DEBUG_9(("soa_error_as_sip_reason(%s::%p) called\n", ss ? ss->ss_actions->soa_name : "", ss)); if (ss == NULL) return "SIP;cause=500;text=\"Internal Server Error\""; status = soa_error_as_sip_response(ss, &phrase); reason = su_sprintf(ss->ss_home, "SIP;cause=%u;text=\"%s\"", status, phrase); if (ss->ss_reason) su_free(ss->ss_home, reason); return ss->ss_reason = reason;}/** Return warning code and text */int soa_get_warning(soa_session_t *ss, char const **return_text){ if (!ss) return 0; if (!ss->ss_wcode) return 0; if (return_text) *return_text = ss->ss_warning; return ss->ss_wcode;}/** Return SDP description of capabilities. * * @retval 0 if there is no description to return * @retval 1 if description is returned * @retval -1 upon an error */int soa_get_capability_sdp(soa_session_t const *ss, sdp_session_t const **return_sdp, char const **return_sdp_str, int *return_len){ sdp_session_t const *sdp; char const *sdp_str; SU_DEBUG_9(("soa_get_capability_sdp(%s::%p, [%p], [%p], [%p]) called\n", ss ? ss->ss_actions->soa_name : "", ss, return_sdp, return_sdp_str, return_len)); if (ss == NULL) return (void)su_seterrno(EFAULT), -1; sdp = ss->ss_caps->ssd_sdp; sdp_str = ss->ss_caps->ssd_str; if (sdp == NULL) return 0; if (return_sdp) *return_sdp = sdp; if (return_sdp_str) *return_sdp_str = sdp_str; if (return_len) *return_len = strlen(sdp_str); return 1;}int soa_set_capability_sdp(soa_session_t *ss, sdp_session_t const *sdp, char const *str, int len){ SU_DEBUG_9(("soa_set_capability_sdp(%s::%p, %p, %p, %d) called\n", ss ? ss->ss_actions->soa_name : "", ss, sdp, str, str && len == -1 ? (int)strlen(str) : len)); return soa_set_sdp(ss, soa_capability_sdp_kind, sdp, str, len);}/** Set capabilities */int soa_base_set_capability_sdp(soa_session_t *ss, sdp_session_t *sdp, char const *str0, int len0){ sdp_origin_t o[1] = {{ sizeof(o) }}; sdp_connection_t *c, c0[1] = {{ sizeof(c0) }}; char c_address[64]; sdp_time_t t[1] = {{ sizeof(t) }}; sdp_media_t *m; if (sdp->sdp_origin) *o = *sdp->sdp_origin; else o->o_address = c0; sdp->sdp_origin = o; if (soa_init_sdp_origin(ss, o, c_address) < 0) return -1; if (!sdp->sdp_subject) sdp->sdp_subject = "-"; sdp->sdp_time = t; /* Set port to zero - or should we check that port is already zero? */ for (m = sdp->sdp_media; m; m = m->m_next) m->m_port = 0; c = sdp->sdp_origin->o_address; if (sdp->sdp_connection == NULL) { for (m = sdp->sdp_media; m; m = m->m_next) if (m->m_connections == NULL) break; if (m) sdp->sdp_connection = c; } return soa_description_set(ss, ss->ss_caps, sdp, str0, len0);}/** Return SDP description of the session. * * @retval 0 if there is no description to return * @retval 1 if description is returned * @retval -1 upon an error */int soa_get_user_sdp(soa_session_t const *ss, sdp_session_t const **return_sdp, char const **return_sdp_str, int *return_len){ sdp_session_t const *sdp; char const *sdp_str; SU_DEBUG_9(("soa_get_user_sdp(%s::%p, [%p], [%p], [%p]) called\n", ss ? ss->ss_actions->soa_name : "", ss, return_sdp, return_sdp_str, return_len)); if (ss == NULL) return (void)su_seterrno(EFAULT), -1; sdp = ss->ss_user->ssd_sdp; sdp_str = ss->ss_user->ssd_str; if (sdp == NULL) return 0; if (return_sdp) *return_sdp = sdp; if (return_sdp_str) *return_sdp_str = sdp_str; if (return_len) *return_len = strlen(sdp_str); return 1;}/** * Returns the version number of user session * description. The version numbering starts from * zero and is incremented for each modification. */int soa_get_user_version(soa_session_t const *ss){ assert(ss != NULL); return ss ? ss->ss_user_version : -1;} int soa_set_user_sdp(soa_session_t *ss, sdp_session_t const *sdp, char const *str, int len){ SU_DEBUG_9(("soa_set_user_sdp(%s::%p, %p, %p, %d) called\n", ss ? ss->ss_actions->soa_name : "", ss, sdp, str, str && len == -1 ? (int)strlen(str) : len)); return soa_set_sdp(ss, soa_user_sdp_kind, sdp, str, len);}/** Set user SDP (base version). */int soa_base_set_user_sdp(soa_session_t *ss, sdp_session_t *sdp, char const *str0, int len0){ ++ss->ss_user_version; return soa_description_set(ss, ss->ss_user, sdp, str0, len0);}/** Return remote SDP description of the session. * * @retval 0 if there is no description to return * @retval 1 if description is returned * @retval -1 upon an error */int soa_get_remote_sdp(soa_session_t const *ss, sdp_session_t const **return_sdp, char const **return_sdp_str, int *return_len){ sdp_session_t const *sdp; char const *sdp_str; SU_DEBUG_9(("soa_get_remote_sdp(%s::%p, [%p], [%p], [%p]) called\n", ss ? ss->ss_actions->soa_name : "", ss, return_sdp, return_sdp_str, return_len)); if (ss == NULL) return (void)su_seterrno(EFAULT), -1; sdp = ss->ss_remote->ssd_sdp; sdp_str = ss->ss_remote->ssd_str; if (sdp == NULL) return 0; if (return_sdp) *return_sdp = sdp; if (return_sdp_str) *return_sdp_str = sdp_str; if (return_len) *return_len = strlen(sdp_str); return 1;}/** * Returns the version number of remote session * description. The version numbering starts from * zero and is incremented for each modification. */int soa_get_remote_version(soa_session_t const *ss){ assert(ss != NULL); return ss->ss_remote_version;} /** Set remote SDP (offer or answer) */int soa_set_remote_sdp(soa_session_t *ss, sdp_session_t const *sdp, char const *str, int len){ SU_DEBUG_9(("soa_set_remote_sdp(%s::%p, %p, %p, %d) called\n", ss ? ss->ss_actions->soa_name : "", ss, sdp, str, str && len == -1 ? (int)strlen(str) : len)); return soa_set_sdp(ss, soa_remote_sdp_kind, sdp, str, len);}/** Set remote SDP (base version). */int soa_base_set_remote_sdp(soa_session_t *ss, int new_version, sdp_session_t *sdp, char const *str0, int len0){ /* This is cleared in soa_generate_answer() or soa_process_answer(). */ ss->ss_unprocessed_remote = 1; if (!new_version) return 0; soa_set_activity(ss, sdp->sdp_media, 1); ss->ss_remote_version++; return soa_description_set(ss, ss->ss_remote, sdp, str0, len0);}int soa_clear_remote_sdp(soa_session_t *ss){ SU_DEBUG_9(("soa_clear_remote_sdp(%s::%p) called\n", ss ? ss->ss_actions->soa_name : "", ss)); if (!ss) return (void)su_seterrno(EFAULT), -1; ss->ss_unprocessed_remote = 0; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -