⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sip_dialog_ui.c

📁 VoIP use SIP protocol interface
💻 C
字号:
/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END *//* * Copyright 2006 Sun Microsystems, Inc.  All rights reserved. * Use is subject to license terms. */#pragma ident	"@(#)sip_dialog_ui.c	1.1	06/08/16 SMI"#include "sip_msg.h"#include "sip_dialog.h"#include "sip_xaction.h"#include "sip_miscdefs.h"/* * Create a request using the state maintained in the dialog. */sip_msg_tsip_create_dialog_req(sip_method_t method, sip_dialog_t dialog,    char *transport, char *sent_by, int sent_by_port, char *via_param,    uint32_t maxforward, int cseq){	_sip_dialog_t	*_dialog;	sip_msg_t	sip_msg;	char		*uri;	int		oldseq = 0;	if (!sip_manage_dialog || dialog == NULL || transport == NULL ||	    sent_by == NULL) {		return (NULL);	}	if ((sip_msg = sip_new_msg()) == NULL)		return (NULL);	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	/*	 * Depending on the route set, if any, the request URI could either	 * be the contact URI or the 1st URI from the route set.	 */	uri = (char *)sip_dialog_req_uri(_dialog);	if (uri == NULL)		goto err_ret;	if (sip_add_request_line(sip_msg, method, uri) != 0) {		free(uri);		goto err_ret;	}	free(uri);	if (sip_copy_header(sip_msg, _dialog->sip_dlg_local_uri_tag, NULL) != 0)		goto err_ret;	if (sip_copy_header(sip_msg, _dialog->sip_dlg_remote_uri_tag, NULL) !=	    0) {		goto err_ret;	}	if (sip_copy_header(sip_msg, _dialog->sip_dlg_remote_target, NULL) != 0)		goto err_ret;	if (sip_add_via(sip_msg, transport, sent_by, sent_by_port, via_param) !=	    0) {		goto err_ret;	}	if (sip_add_maxforward(sip_msg, maxforward) != 0)		goto err_ret;	if (sip_copy_header(sip_msg, _dialog->sip_dlg_call_id, NULL) != 0)		goto err_ret;	if (cseq < 0) {		if (_dialog->sip_dlg_local_cseq == 0)			_dialog->sip_dlg_local_cseq = 1;		oldseq = _dialog->sip_dlg_local_cseq;		cseq = ++_dialog->sip_dlg_local_cseq;	}	if (sip_add_cseq(sip_msg, method, cseq) != 0) {		_dialog->sip_dlg_local_cseq = oldseq;		goto err_ret;	}	/*	 * The route set, even if empty, overrides any pre-existing route set.	 * If the route set is empty, the UAC MUST NOT add a Route header	 * field to the request.	 */	(void) sip_delete_header_by_name(sip_msg, SIP_ROUTE);	if (_dialog->sip_dlg_route_set != NULL) {		if (sip_copy_header(sip_msg, _dialog->sip_dlg_route_set,		    NULL) != 0) {			_dialog->sip_dlg_local_cseq = oldseq;			goto err_ret;		}	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (sip_msg);err_ret:	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	sip_free_msg(sip_msg);	return (NULL);}/* Get the Dialog method */intsip_get_dialog_method(sip_dialog_t dialog, int *error){	_sip_dialog_t	*_dialog;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog) {		if (error != NULL)			*error = EINVAL;		return (0);	}	if (dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (0);	}	_dialog = (_sip_dialog_t *)dialog;	return (_dialog->sip_dlg_method);}/* Get the Dialog state */intsip_get_dialog_state(sip_dialog_t dialog, int *error){	_sip_dialog_t	*_dialog;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog) {		if (error != NULL)			*error = EINVAL;		return (0);	}	if (dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (0);	}	_dialog = (_sip_dialog_t *)dialog;	return (_dialog->sip_dlg_state);}/* Return the dialog callid */const sip_str_t *sip_get_dialog_callid(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	const struct sip_value	*val;	const sip_str_t		*callid = NULL;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	if (dialog->sip_dlg_call_id != NULL) {		val = sip_get_header_value(_dialog->sip_dlg_call_id, error);		if (val == NULL) {			(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);			return (NULL);		}		callid = &((sip_hdr_value_t *)val)->str_val;	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (callid);}/* Return the dialog localtag. */const sip_str_t *sip_get_dialog_local_tag(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	const sip_str_t		*ltag = NULL;	const struct sip_value	*val;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	if (dialog->sip_dlg_local_uri_tag != NULL) {		val = sip_get_header_value(_dialog->sip_dlg_local_uri_tag,		    error);		if (val == NULL) {			(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);			return (NULL);		}		ltag = sip_get_param_value((sip_header_value_t)val, "tag",		    error);	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (ltag);}/* Return the dialog remotetag */const sip_str_t *sip_get_dialog_remote_tag(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	const sip_str_t		*ttag = NULL;	const struct sip_value	*val;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	if (dialog->sip_dlg_remote_uri_tag != NULL) {		val = sip_get_header_value(_dialog->sip_dlg_remote_uri_tag,		    error);		if (val == NULL) {			(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);			return (NULL);		}		ttag = sip_get_param_value((sip_header_value_t)val, "tag",		    error);	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (ttag);}/* Return the dialog localuri. */const struct sip_uri *sip_get_dialog_local_uri(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	const _sip_uri_t	*luri = NULL;	const struct sip_value	*val;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	if (dialog->sip_dlg_local_uri_tag != NULL) {		val = sip_get_header_value(_dialog->sip_dlg_local_uri_tag,		    error);		if (val == NULL) {			(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);			return (NULL);		}		luri = val->sip_value_parse_uri;	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return ((sip_uri_t)luri);}/* Return the dialog remoteuri. */const struct sip_uri *sip_get_dialog_remote_uri(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	const _sip_uri_t	*ruri = NULL;	const struct sip_value	*val;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	if (dialog->sip_dlg_remote_uri_tag != NULL) {		val = sip_get_header_value(dialog->sip_dlg_remote_uri_tag,		    error);		if (val == NULL) {			(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);			return (NULL);		}		ruri = val->sip_value_parse_uri;	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return ((sip_uri_t)ruri);}/* Return the dialog remotetarg. */const struct sip_uri *sip_get_dialog_remote_target_uri(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	const struct sip_uri	*rtarg = NULL;	const struct sip_value	*val;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	if (dialog->sip_dlg_remote_target != NULL) {		val = sip_get_header_value(_dialog->sip_dlg_remote_target,		    error);		if (val == NULL) {			(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);			return (NULL);		}		rtarg = val->sip_value_parse_uri;	}	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return ((sip_uri_t)rtarg);}/* Return the dialog route set */const sip_str_t *sip_get_dialog_route_set(sip_dialog_t dialog, int *error){	_sip_dialog_t		*_dialog;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (NULL);	}	_dialog = (_sip_dialog_t *)dialog;	if (_dialog->sip_dlg_rset.sip_str_len > 0)		return (&_dialog->sip_dlg_rset);	return (NULL);}/* Return the dialog secure */boolean_tsip_is_dialog_secure(sip_dialog_t dialog, int *error){	_sip_dialog_t	*_dialog;	boolean_t	issecure;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (B_FALSE);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	issecure = _dialog->sip_dlg_secure;	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (issecure);}/* Return the dialog local cseq */uint32_tsip_get_dialog_local_cseq(sip_dialog_t dialog, int *error){	_sip_dialog_t	*_dialog;	uint32_t	cseq;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (0);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	cseq = _dialog->sip_dlg_local_cseq;	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (cseq);}/* Return the dialog remote cseq */uint32_tsip_get_dialog_remote_cseq(sip_dialog_t dialog, int *error){	_sip_dialog_t	*_dialog;	uint32_t	cseq;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (0);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	cseq = _dialog->sip_dlg_remote_cseq;	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (cseq);}/* Return the dialog type */intsip_get_dialog_type(sip_dialog_t dialog, int *error){	_sip_dialog_t	*_dialog;	int		type;	if (error != NULL)		*error = 0;	if (!sip_manage_dialog || dialog == NULL) {		if (error != NULL)			*error = EINVAL;		return (-1);	}	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	type = _dialog->sip_dlg_type;	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (type);}/* Partial dialog ? */boolean_tsip_incomplete_dialog(sip_dialog_t dialog){	_sip_dialog_t	*_dialog;	boolean_t	isnew;	if (!sip_manage_dialog || dialog == NULL)		return (B_FALSE);	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	isnew = _dialog->sip_dlg_state == SIP_DLG_NEW;	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);	return (isnew);}/* Hold dialog */voidsip_hold_dialog(sip_dialog_t dialog){	_sip_dialog_t	*_dialog;	if (!sip_manage_dialog || dialog == NULL)		return;	_dialog = (_sip_dialog_t *)dialog;	(void) pthread_mutex_lock(&_dialog->sip_dlg_mutex);	SIP_DLG_REFCNT_INCR(_dialog);	(void) pthread_mutex_unlock(&_dialog->sip_dlg_mutex);}/* Release dialog */voidsip_release_dialog(sip_dialog_t dialog){	_sip_dialog_t	*_dialog;	if (!sip_manage_dialog || dialog == NULL)		return;	_dialog = (_sip_dialog_t *)dialog;	SIP_DLG_REFCNT_DECR(_dialog);}/* Delete a dialog */voidsip_delete_dialog(sip_dialog_t dialog){	if (!sip_manage_dialog || dialog == NULL)		return;	sip_dialog_terminate(dialog, NULL);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -