forked from mirrors/linphone-iphone
158 lines
3.8 KiB
C
158 lines
3.8 KiB
C
/*
|
|
linphone
|
|
Copyright (C) 2010 Simon MORLAT (simon.morlat@free.fr)
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
/**
|
|
This header files defines the Signaling Abstraction Layer.
|
|
The purpose of this layer is too allow experiment different call signaling
|
|
protocols and implementations under linphone, for example SIP, JINGLE...
|
|
**/
|
|
|
|
#include "sal.h"
|
|
|
|
SalMediaDescription *sal_media_description_new(){
|
|
SalMediaDescription *md=ms_new0(SalMediaDescription,1);
|
|
md->refcount=1;
|
|
return md;
|
|
}
|
|
|
|
static void sal_media_description_destroy(SalMediaDescription *md){
|
|
int i;
|
|
for(i=0;i<SAL_MEDIA_DESCRIPTION_MAX_STREAMS;i++){
|
|
ms_list_for_each(md->streams[i].payloads,(void (*)(void *))payload_type_destroy);
|
|
ms_list_free(md->streams[i].payloads);
|
|
}
|
|
ms_free(md);
|
|
}
|
|
|
|
void sal_media_description_ref(SalMediaDescription *md){
|
|
md->refcount++;
|
|
}
|
|
|
|
void sal_media_description_unref(SalMediaDescription *md){
|
|
md->refcount--;
|
|
if (md->refcount==0){
|
|
sal_media_description_destroy (md);
|
|
}
|
|
}
|
|
|
|
SalStreamDescription *sal_media_description_find_stream(SalMediaDescription *md,
|
|
SalMediaProto proto, SalStreamType type){
|
|
int i;
|
|
for(i=0;i<md->nstreams;++i){
|
|
SalStreamDescription *ss=&md->streams[i];
|
|
if (ss->proto==proto && ss->type==type) return ss;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool_t sal_media_description_empty(SalMediaDescription *md){
|
|
int i;
|
|
for(i=0;i<md->nstreams;++i){
|
|
SalStreamDescription *ss=&md->streams[i];
|
|
if (ss->port!=0) return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
static void assign_string(char **str, const char *arg){
|
|
if (*str){
|
|
ms_free(*str);
|
|
*str=NULL;
|
|
}
|
|
if (arg)
|
|
*str=ms_strdup(arg);
|
|
}
|
|
|
|
void sal_op_set_contact(SalOp *op, const char *contact){
|
|
assign_string(&((SalOpBase*)op)->contact,contact);
|
|
}
|
|
|
|
void sal_op_set_route(SalOp *op, const char *route){
|
|
assign_string(&((SalOpBase*)op)->route,route);
|
|
}
|
|
|
|
void sal_op_set_from(SalOp *op, const char *from){
|
|
assign_string(&((SalOpBase*)op)->from,from);
|
|
}
|
|
|
|
void sal_op_set_to(SalOp *op, const char *to){
|
|
assign_string(&((SalOpBase*)op)->to,to);
|
|
}
|
|
|
|
void sal_op_set_user_pointer(SalOp *op, void *up){
|
|
((SalOpBase*)op)->user_pointer=up;
|
|
}
|
|
|
|
Sal *sal_op_get_sal(const SalOp *op){
|
|
return ((SalOpBase*)op)->root;
|
|
}
|
|
|
|
const char *sal_op_get_from(const SalOp *op){
|
|
return ((SalOpBase*)op)->from;
|
|
}
|
|
|
|
const char *sal_op_get_to(const SalOp *op){
|
|
return ((SalOpBase*)op)->to;
|
|
}
|
|
|
|
const char *sal_op_get_contact(const SalOp *op){
|
|
return ((SalOpBase*)op)->contact;
|
|
}
|
|
|
|
const char *sal_op_get_route(const SalOp *op){
|
|
return ((SalOpBase*)op)->route;
|
|
}
|
|
|
|
void *sal_op_get_user_pointer(const SalOp *op){
|
|
return ((SalOpBase*)op)->user_pointer;
|
|
}
|
|
|
|
const char *sal_op_get_proxy(const SalOp *op){
|
|
return ((SalOpBase*)op)->route;
|
|
}
|
|
|
|
void __sal_op_init(SalOp *b, Sal *sal){
|
|
memset(b,0,sizeof(SalOpBase));
|
|
((SalOpBase*)b)->root=sal;
|
|
}
|
|
|
|
void __sal_op_free(SalOp *op){
|
|
SalOpBase *b=(SalOpBase *)op;
|
|
if (b->from) {
|
|
ms_free(b->from);
|
|
b->from=NULL;
|
|
}
|
|
if (b->to) {
|
|
ms_free(b->to);
|
|
b->to=NULL;
|
|
}
|
|
if (b->route) {
|
|
ms_free(b->route);
|
|
b->route=NULL;
|
|
}
|
|
if (b->contact) {
|
|
ms_free(b->contact);
|
|
b->contact=NULL;
|
|
}
|
|
if (b->local_media)
|
|
sal_media_description_unref(b->local_media);
|
|
if (b->remote_media)
|
|
sal_media_description_unref(b->remote_media);
|
|
ms_free(op);
|
|
}
|