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

📄 rvsdpmsg.c

📁 h.248协议源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
Filename    :rvsdpmsg.c
Description : Access functions for SDP structure
******************************************************************************
                Copyright (c) 1999 RADVision Inc.
************************************************************************
NOTICE:
This document contains information that is proprietary to RADVision LTD.
No part of this publication may be reproduced in any form whatsoever 
without written prior approval by RADVision LTD..

RADVision LTD. reserves the right to revise this publication and make 
changes without obligation to notify any person of such revisions or 
changes.
******************************************************************************
$Revision:1.0$
$Date:12/20/99$
$Author:Dan Elbert$
******************************************************************************/

#include "rvtypes.h"
#include "rvsdpmsg.h"
#include "rvalloc.h"
#include "rvdefalloc.h"

#define RV_SDPVERSION "0"


RvSdpMsg *rvSdpMsgConstructA(RvSdpMsg * sdp, RvAlloc * a) 
{
	sdp->alloc = a;

	strcpy(sdp->sdp_version,RV_SDPVERSION);
	sdp->origin = NULL;
	rvStringConstruct(&sdp->session_id, "", a);
	rvStringConstruct(&sdp->uri, "", a);
	rvListConstruct(RvSdpEmail)(&sdp->email_list,a);
	rvListConstruct(RvSdpPhone)(&sdp->phone_list,a);
	rvSdpCommonFieldsConstruct(&sdp->fields,a);
	rvListConstruct(RvSdpSessionTime)(&sdp->session_time,a);
#ifdef RV_SDPTIME_FULL
	rvListConstruct(RvSdpTimeZoneAdjust)(&sdp->zone_adjustment_list,a);
#endif
	rvListConstruct(RvSdpMediaDescr)(&sdp->media_descriptors,a);
		
	sdp->sdp_msg = NULL;
	sdp->msg_len = 0;

	return sdp;
}

/* Public functions */
RvSdpMsg*  rvSdpMsgConstruct(RvSdpMsg * sdp) {
	return rvSdpMsgConstructA(sdp, &rvDefaultAlloc);
}

void rvSdpMsgDestruct(RvSdpMsg * sdp)  {

	rvSdpCommonFieldsDestruct(&sdp->fields,sdp->alloc);

	if(sdp->origin!=NULL) {
		rvSdpOriginDestruct(sdp->origin);
		rvAllocDeallocate(sdp->alloc,sizeof(RvSdpOrigin),sdp->origin);
	}

	rvStringDestruct(&sdp->session_id);
	rvStringDestruct(&sdp->uri);
	rvListDestruct(RvSdpEmail)(&sdp->email_list);
	rvListDestruct(RvSdpPhone)(&sdp->phone_list);
	rvListDestruct(RvSdpSessionTime)(&sdp->session_time);
#ifdef RV_SDPTIME_FULL
	rvListDestruct(RvSdpTimeZoneAdjust)(&sdp->zone_adjustment_list);
#endif
	rvListDestruct(RvSdpMediaDescr)(&sdp->media_descriptors);
}


RvSdpMsg* rvSdpMsgCopy(RvSdpMsg *d, const RvSdpMsg *s) {
	rvSdpMsgDestruct(d);
	return rvSdpMsgConstructCopyA(d,s,d->alloc);
}


RvSdpMsg* rvSdpMsgConstructCopyA(RvSdpMsg *d, const RvSdpMsg *s, RvAlloc *a) 
{
	RvSdpOrigin * origin;
	RvSdpConnection * s_conn;
	RvSdpKey * key;
	RvSdpBandwidth * bandwidth;
	size_t i;
	RvSdpAttribute * attr;
	RvSdpRtpMap * map,* new_map;

	rvSdpMsgConstructA(d,a);

	rvSdpMsgSetVersionN(d,rvSdpMsgGetVersion(s),strlen(rvSdpMsgGetVersion(s)));
	if( (origin = rvSdpMsgGetOrigin(s))!=NULL ) {
		d->origin = (RvSdpOrigin *)rvAllocAllocate(d->alloc,sizeof(RvSdpOrigin));
		rvSdpOriginConstructCopyA(d->origin,origin,d->alloc);
	}

	rvSdpMsgSetSessionName(d,rvSdpMsgGetSessionName(s));
	rvSdpMsgSetSessionInformation(d,rvSdpMsgGetSessionInformation(s));
	rvSdpMsgSetURI(d,rvSdpMsgGetURI(s));
	rvSdpEmailListCopy(&d->email_list,&s->email_list);
	rvSdpPhoneListCopy(&d->phone_list,&s->phone_list);

	if( (s_conn = rvSdpMsgGetConnection(s))!=NULL ) {
		d->fields.connection = (RvSdpConnection *)rvAllocAllocate(d->alloc,sizeof(RvSdpConnection));
		rvSdpConnectionConstructCopyA(d->fields.connection,s_conn,d->alloc);
	}
	
	if( (key = rvSdpMsgGetKey(s))!=NULL ) 
		rvSdpCommonFieldsSetKeyCopy(&d->fields,key,d->alloc);

	if( (bandwidth = rvSdpMsgGetBandwidth(s))!=NULL )
		rvSdpMsgSetBandwidth(d,rvSdpBandwidthGetType(bandwidth),rvSdpBandwidthGetValue(bandwidth));

	rvSdpSessionTimeListCopy(&d->session_time,&s->session_time);
#ifdef RV_SDPTIME_FULL
	rvSdpTimeZoneAdjustListCopy(&d->zone_adjustment_list,&s->zone_adjustment_list);
#endif
	for(i=0;i<rvSdpMsgGetNumOfAttr(s);i++) {
		attr = rvSdpMsgGetAttribute(s,i);
		rvSdpMsgAddAttr(d,rvSdpAttributeGetName(attr),rvSdpAttributeGetValue(attr));
	}

	for(i=0;i<rvSdpMsgGetNumOfRtpMap(s);i++) {	
		map = rvSdpMsgGetRtpMap(s,i);
		new_map = rvSdpMsgAddRtpMap(d,rvSdpRtpMapGetPayload(map),rvSdpRtpMapGetEncodingName(map),
										rvSdpRtpMapGetClockRate(map));
		rvSdpRtpMapSetEncodingParameters(new_map,rvSdpRtpMapGetEncodingParameters(map));
	}

	rvSdpMsgSetConnectionMode(d,rvSdpMsgGetConnectionMode(s));

	rvSdpMediaDescrListCopy(&d->media_descriptors,&s->media_descriptors);

	return d;
}

RvSdpMsg* rvSdpMsgConstructCopy(RvSdpMsg *d, const RvSdpMsg *s) {
	return rvSdpMsgConstructCopyA(d,s,&rvDefaultAlloc);
}


/****************************************************/
/*		Method to get the SIP text  				*/
/****************************************************/
const char * rvSdpMsgGetText(RvSdpMsg *d,int * len) {
	*len = d->msg_len;
	return d->sdp_msg;
}



/****************************************************/
/*		SESSION LEVEL METHODS						*/
/****************************************************/

/*------ Version Field ---------------------------------*/

void rvSdpMsgSetVersionN(RvSdpMsg* x,const char * version,size_t len) {
	strncpy(x->sdp_version,version,len);
}

/*------ Origin Field ---------------------------------*/
void rvSdpMsgSetOriginN(RvSdpMsg *x,
					   const char * username,size_t ulen,
					   const char * session_id,size_t slen,
					   const char * version,size_t vlen,
					   RvSdpNetType nettype,RvSdpAddrType addrtype,
					   const char * address,size_t alen) {
	if(x->origin!=NULL)
		rvSdpOriginDestruct(x->origin);
	else
		x->origin = (RvSdpOrigin *)rvAllocAllocate(x->alloc,sizeof(RvSdpOrigin));
	rvSdpOriginConstructN(x->origin,username,ulen,
							session_id,slen,version,vlen,nettype,addrtype,
							address,alen,x->alloc);
}

/*------ Session Id Field -----------------------------*/
void rvSdpMsgSetSessionNameN(RvSdpMsg* x,const char * sess_id,size_t len) {
	rvStringAssignN(&x->session_id,sess_id,len);
}

/*------ Uri Field ------------------------------------*/
void rvSdpMsgSetURIN(RvSdpMsg* x,const char * uri,size_t len) {
	rvStringAssignN(&(x)->uri,uri,len);
}

/*------ Email Field ---------------------------------*/
RvSdpEmail* rvSdpMsgAddEmailN(RvSdpMsg* x,const char * email_addr,size_t len,const char* string,size_t slen) {
	RvSdpEmail * email = rvListAllocBack(RvSdpEmail)(&x->email_list);
	rvSdpEmailConstructN(email,email_addr,len,string,slen,x->alloc);
	return email;
}

size_t	rvSdpMsgGetNumOfEmail(const RvSdpMsg* x) {
	return rvListSize(&x->email_list);
}
RvSdpEmail * rvSdpMsgGetEmail(const RvSdpMsg* x,size_t i) {
	return rvListAt(RvSdpEmail)(&x->email_list,i);
}
void rvSdpMsgRemoveEmail(RvSdpMsg* x,size_t index) {
	size_t j;
	RvListIter(RvSdpEmail) iter = rvListBegin(&x->email_list);
	if (index < rvListSize(&x->email_list)) {
		for (j = 0; j < index; ++j)
			iter = rvListIterNext(iter);
		rvListErase(RvSdpEmail)(&x->email_list, iter);
	}
}
void rvSdpMsgClearEmail(RvSdpMsg* x) {
	rvListClear(RvSdpEmail)(&x->email_list);
}


/*------ Phone Field ---------------------------------*/
RvSdpPhone * rvSdpMsgAddPhoneN(RvSdpMsg* x,const char * phone_number,size_t plen,const char* string,size_t slen) {
	RvSdpPhone * phone = rvListAllocBack(RvSdpPhone)(&x->phone_list);
	rvSdpPhoneConstructN(phone,phone_number,plen,string,slen,x->alloc);
	return phone;
}
size_t	rvSdpMsgGetNumOfPhones(const RvSdpMsg* x) {
	return rvListSize(&x->phone_list);
}
RvSdpPhone * rvSdpMsgGetPhone(const RvSdpMsg* x,size_t i) {
	return rvListAt(RvSdpPhone)(&x->phone_list,i);
}

void rvSdpMsgRemovePhone(RvSdpMsg* x, size_t index) {
	size_t j;
	RvListIter(RvSdpPhone) iter = rvListBegin(&x->phone_list);
	if (index < rvListSize(&x->phone_list)) {
		for (j = 0; j < index; ++j)
			iter = rvListIterNext(iter);
		rvListErase(RvSdpPhone)(&x->phone_list, iter);
	}
}

void rvSdpMsgClearPhones(RvSdpMsg* x) {
	rvListClear(RvSdpPhone)(&x->phone_list);
}

/*------ Connection Field ---------------------------*/
RvSdpConnection* rvSdpMsgGetConnection(const RvSdpMsg* x) {
	return x->fields.connection;
}

void rvSdpMsgSetConnection(RvSdpMsg* x,RvSdpNetType net_type,RvSdpAddrType addr_type,const char* addr) {

	rvSdpCommonFieldsSetConnectionN(&x->fields,net_type,addr_type,addr,strlen(addr),x->alloc); 
}

/*------ Bandwidth Field ---------------------------*/
void rvSdpMsgSetBandwidth(RvSdpMsg* x,const char *bwtype,int b) {
	rvSdpCommonFieldsSetBandwidthN(&x->fields,bwtype,strlen(bwtype),b,x->alloc);
}

/*------ Key Field ----------------------------------*/
RvSdpKey*	rvSdpMsgGetKey(const RvSdpMsg* x) {
	return x->fields.key;
}

void rvSdpMsgSetKey(RvSdpMsg* x,RvSdpEncrMethod em,const char* key) {	
	rvSdpCommonFieldsSetKeyN(&x->fields,em,key,strlen(key),x->alloc);
}

/*------ Time Fields  ---------------------------------*/
RvSdpSessionTime * rvSdpMsgAddSessionTime(RvSdpMsg* x,RvUint32 start,RvUint32 stop) {
	RvSdpSessionTime * time = rvListAllocBack(RvSdpSessionTime)(&x->session_time);
	rvSdpSessionTimeConstructA(time,start,stop,x->alloc);
	return time;
}

void rvSdpMsgClearSessionTime(RvSdpMsg* descr) {
	rvListClear(RvSdpSessionTime)(&descr->session_time);
}

size_t rvSdpMsgGetNumOfSessionTime(RvSdpMsg* descr) {
	return rvListSize(&descr->session_time);
}

RvSdpSessionTime* rvSdpMsgGetSessionTime(RvSdpMsg* descr,size_t i) {
	return rvListAt(RvSdpSessionTime)(&descr->session_time,i);
}

void rvSdpMsgRemoveSessionTime(RvSdpMsg* descr, size_t index) {
	size_t j;
	RvListIter(RvSdpSessionTime) iter = rvListBegin(&descr->session_time);
	if (index < rvListSize(&descr->session_time)) {
		for (j = 0; j < index; ++j)
			iter = rvListIterNext(iter);
		rvListErase(RvSdpSessionTime)(&descr->session_time, iter);
	}
}

RvSdpTimeZoneAdjust * rvSdpMsgTimeAddZoneAdjustment(RvSdpMsg* x,RvUint32 time,RvInt32 adjust_time,RvSdpTimeUnit units) {
	RvSdpTimeZoneAdjust * zone = NULL;

⌨️ 快捷键说明

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