OpenSolaris_b135/lib/libcommputil/common/sdp.h

/*
 * 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 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SDP_H
#define	_SDP_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/types.h>

#define	SDP_VERSION_FIELD	'v'
#define	SDP_ORIGIN_FIELD	'o'
#define	SDP_NAME_FIELD		's'
#define	SDP_INFO_FIELD		'i'
#define	SDP_URI_FIELD		'u'
#define	SDP_EMAIL_FIELD		'e'
#define	SDP_PHONE_FIELD		'p'
#define	SDP_CONNECTION_FIELD	'c'
#define	SDP_BANDWIDTH_FIELD	'b'
#define	SDP_TIME_FIELD		't'
#define	SDP_REPEAT_FIELD	'r'
#define	SDP_ZONE_FIELD		'z'
#define	SDP_KEY_FIELD		'k'
#define	SDP_ATTRIBUTE_FIELD	'a'
#define	SDP_MEDIA_FIELD		'm'

/* SDP Parse errors */
#define	SDP_VERSION_ERROR	0x00000001
#define	SDP_ORIGIN_ERROR	0x00000002
#define	SDP_NAME_ERROR		0x00000004
#define	SDP_INFO_ERROR		0x00000008
#define	SDP_URI_ERROR		0x00000010
#define	SDP_EMAIL_ERROR		0x00000020
#define	SDP_PHONE_ERROR		0x00000040
#define	SDP_CONNECTION_ERROR	0x00000080
#define	SDP_BANDWIDTH_ERROR	0x00000100
#define	SDP_TIME_ERROR		0x00000200
#define	SDP_REPEAT_TIME_ERROR	0x00000400
#define	SDP_ZONE_ERROR		0x00000800
#define	SDP_KEY_ERROR		0x00001000
#define	SDP_ATTRIBUTE_ERROR	0x00002000
#define	SDP_MEDIA_ERROR		0x00004000
#define	SDP_FIELDS_ORDER_ERROR	0x00008000
#define	SDP_MISSING_FIELDS	0x00010000

#define	SDP_AUDIO		"audio"
#define	SDP_VIDEO		"video"
#define	SDP_TEXT		"text"
#define	SDP_APPLICATION		"application"
#define	SDP_MESSAGE		"message"
#define	SDP_RTPMAP		"rtpmap"

#define	SDP_SESSION_VERSION_1	1

typedef struct sdp_list {
	void			*value;
	struct sdp_list		*next;
} sdp_list_t;

/*
 * SDP origin field.
 * o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
 */
typedef struct sdp_origin {
	char			*o_username;
	uint64_t 		o_id;
	uint64_t 		o_version;
	char			*o_nettype;
	char			*o_addrtype;
	char			*o_address;
} sdp_origin_t;

/*
 * SDP connection field.
 * c=<nettype> <addrtype> <connection-address>[/ttl]/<number of addresses>
 */
typedef struct sdp_conn {
	char			*c_nettype;
	char			*c_addrtype;
	char			*c_address;
	int 			c_addrcount;
	struct sdp_conn		*c_next;
	uint8_t			c_ttl;
} sdp_conn_t;

/*
 * SDP repeat field. Always found in time structure.
 * r=<repeat interval> <active duration> <offsets from start-time>
 */
typedef struct sdp_repeat {
	uint64_t		r_interval;
	uint64_t		r_duration;
	sdp_list_t 		*r_offset;
	struct sdp_repeat	*r_next;
} sdp_repeat_t;

/*
 * SDP time field.
 * t=<start-time> <stop-time>
 */
typedef struct sdp_time {
	uint64_t 		t_start;
	uint64_t 		t_stop;
	sdp_repeat_t 		*t_repeat;
	struct sdp_time		*t_next;
} sdp_time_t;

/*
 * SDP time zone field.
 * z=<adjustment time> <offset> <adjustment time> <offset> ....
 */
typedef struct sdp_zone {
	uint64_t 		z_time;
	char			*z_offset;
	struct sdp_zone		*z_next;
} sdp_zone_t;

/*
 * SDP attribute field.
 * a=<attribute> or a=<attribute>:<value>
 */
typedef struct sdp_attr {
	char			*a_name;
	char			*a_value;
	struct sdp_attr		*a_next;
} sdp_attr_t;

/*
 * SDP bandwidth field.
 * b=<bwtype>:<bandwidth>
 */
typedef struct sdp_bandwidth {
	char			*b_type;
	uint64_t 		b_value;
	struct sdp_bandwidth	*b_next;
} sdp_bandwidth_t;

/*
 * SDP key field to session or media section of SDP.
 * k=<method> or k=<method>:<encryption key>
 */
typedef struct sdp_key {
	char			*k_method;
	char			*k_enckey;
} sdp_key_t;

typedef struct sdp_session	sdp_session_t;

/*
 * SDP media section, contains media fields and other fields within
 * media section.
 * m=<media> <port>[/portcount] <proto> <fmt> ...
 */
typedef struct sdp_media {
	char			*m_name;
	uint_t			m_port;
	int			m_portcount;
	char			*m_proto;
	sdp_list_t 		*m_format;
	char			*m_info;
	sdp_conn_t 		*m_conn;
	sdp_bandwidth_t 	*m_bw;
	sdp_key_t 		*m_key;
	sdp_attr_t 		*m_attr;
	struct sdp_media 	*m_next;
	sdp_session_t		*m_session;
} sdp_media_t;

struct sdp_session {
	int			sdp_session_version;
	int 			s_version;
	sdp_origin_t 		*s_origin;
	char			*s_name;
	char			*s_info;
	char			*s_uri;
	sdp_list_t 		*s_email;
	sdp_list_t 		*s_phone;
	sdp_conn_t 		*s_conn;
	sdp_bandwidth_t 	*s_bw;
	sdp_time_t 		*s_time;
	sdp_zone_t 		*s_zone;
	sdp_key_t 		*s_key;
	sdp_attr_t 		*s_attr;
	sdp_media_t 		*s_media;
};

extern int		sdp_parse(const char *, int, int, sdp_session_t **,
			    uint_t *);
extern sdp_media_t	*sdp_find_media(sdp_media_t *, const char *);
extern sdp_attr_t	*sdp_find_attribute(sdp_attr_t *, const char *);
extern sdp_attr_t	*sdp_find_media_rtpmap(sdp_media_t *, const char *);
extern sdp_session_t	*sdp_clone_session(const sdp_session_t *);
extern sdp_session_t	*sdp_new_session();
extern int		sdp_add_origin(sdp_session_t *, const char *, uint64_t,
			    uint64_t, const char *, const char *, const char *);
extern int		sdp_add_name(sdp_session_t *, const char *);
extern int		sdp_add_information(char **, const char *);
extern int		sdp_add_uri(sdp_session_t *, const char *);
extern int		sdp_add_email(sdp_session_t *, const char *);
extern int		sdp_add_phone(sdp_session_t *, const char *);
extern int		sdp_add_connection(sdp_conn_t **, const char *,
			    const char *, const char *, uint8_t, int);
extern int		sdp_add_bandwidth(sdp_bandwidth_t **, const char *,
			    uint64_t);
extern int		sdp_add_repeat(sdp_time_t *, uint64_t, uint64_t,
			    const char *);
extern int		sdp_add_time(sdp_session_t *, uint64_t, uint64_t,
			    sdp_time_t **);
extern int		sdp_add_zone(sdp_session_t *, uint64_t, const char *);
extern int		sdp_add_key(sdp_key_t **, const char *, const char *);
extern int		sdp_add_attribute(sdp_attr_t **, const char *,
			    const char *);
extern int		sdp_add_media(sdp_session_t *, const char *, uint_t,
			    int, const char *, const char *, sdp_media_t **);
extern int		sdp_delete_all_field(sdp_session_t *, const char);
extern int		sdp_delete_all_media_field(sdp_media_t *, const char);
extern int		sdp_delete_media(sdp_media_t **, sdp_media_t *);
extern int		sdp_delete_attribute(sdp_attr_t **, sdp_attr_t *);
extern void		sdp_free_session(sdp_session_t *);
extern char		*sdp_session_to_str(const sdp_session_t *, int *);


#ifdef __cplusplus
}
#endif

#endif /* _SDP_H */