belle_sip_parameters.c 6.14 KB
Newer Older
jehan's avatar
jehan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
	belle-sip - SIP (RFC3261) library.
    Copyright (C) 2010  Belledonne Communications SARL

    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 3 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, see <http://www.gnu.org/licenses/>.
*/
#include "belle-sip/belle-sip.h"
#include "belle-sip/parameters.h"
#include "belle_sip_internal.h"
jehan's avatar
jehan committed
21
#include "belle-sip/headers.h"
jehan's avatar
jehan committed
22

Simon Morlat's avatar
Simon Morlat committed
23 24 25
void belle_sip_parameters_init(belle_sip_parameters_t *obj){
}

jehan's avatar
jehan committed
26
void belle_sip_parameters_clean(belle_sip_parameters_t* params) {
jehan's avatar
jehan committed
27 28
	if (params->param_list) belle_sip_list_free_with_data (params->param_list, (void (*)(void*))belle_sip_param_pair_destroy);
	if (params->paramnames_list) belle_sip_list_free(params->paramnames_list);
jehan's avatar
jehan committed
29 30 31 32 33
	params->paramnames_list=NULL;
	params->param_list=NULL;
}
static void belle_sip_parameters_destroy(belle_sip_parameters_t* params) {
	belle_sip_parameters_clean(params);
jehan's avatar
jehan committed
34 35
}

36
void belle_sip_parameters_copy_parameters_from(belle_sip_parameters_t *params, const belle_sip_parameters_t *orig){
37 38 39 40 41
	belle_sip_list_t* list=orig->param_list;
	for(;list!=NULL;list=list->next){
		belle_sip_param_pair_t* container = (belle_sip_param_pair_t* )(list->data);
		belle_sip_parameters_set_parameter( params,container->name,container->value);
	}
jehan's avatar
jehan committed
42
}
Simon Morlat's avatar
Simon Morlat committed
43

44 45 46 47 48
static void belle_sip_parameters_clone(belle_sip_parameters_t *params, const belle_sip_parameters_t *orig){
	belle_sip_parameters_copy_parameters_from(params,orig);
}


49
belle_sip_error_code belle_sip_parameters_marshal(const belle_sip_parameters_t* params, char* buff, size_t buff_size, size_t *offset) {
jehan's avatar
jehan committed
50
	belle_sip_list_t* list=params->param_list;
Ghislain MARY's avatar
Ghislain MARY committed
51
	belle_sip_error_code error=BELLE_SIP_OK;
jehan's avatar
jehan committed
52 53 54
	for(;list!=NULL;list=list->next){
		belle_sip_param_pair_t* container = (belle_sip_param_pair_t* )(list->data);
		if (container->value) {
55
			error=belle_sip_snprintf(buff,buff_size,offset,";%s=%s", container->name, container->value);
jehan's avatar
jehan committed
56
		} else {
57
			error=belle_sip_snprintf(buff,buff_size,offset,";%s", container->name);
jehan's avatar
jehan committed
58
		}
Ghislain MARY's avatar
Ghislain MARY committed
59
		if (error!=BELLE_SIP_OK) return error;
jehan's avatar
jehan committed
60
	}
Ghislain MARY's avatar
Ghislain MARY committed
61
	return error;
jehan's avatar
jehan committed
62
}
63
BELLE_SIP_NEW_HEADER(parameters,header,"parameters")
64
const belle_sip_list_t *belle_sip_parameters_get_parameters(const belle_sip_parameters_t* obj) {
jehan's avatar
jehan committed
65 66
	return obj->param_list;
}
jehan's avatar
jehan committed
67

68
const char* belle_sip_parameters_get_parameter_base(const belle_sip_parameters_t* params,const char* name,belle_sip_compare_func func) {
jehan's avatar
jehan committed
69
	belle_sip_list_t *  lResult = belle_sip_list_find_custom(params->param_list, func, name);
jehan's avatar
jehan committed
70 71 72 73 74 75 76
	if (lResult) {
		return ((belle_sip_param_pair_t*)(lResult->data))->value;
	}
	else {
		return NULL;
	}
}
77
const char* belle_sip_parameters_get_parameter(const belle_sip_parameters_t* params,const char* name) {
jehan's avatar
jehan committed
78 79
	return belle_sip_parameters_get_parameter_base(params,name,(belle_sip_compare_func)belle_sip_param_pair_comp_func);
}
80
const char* belle_sip_parameters_get_case_parameter(const belle_sip_parameters_t* params,const char* name) {
jehan's avatar
jehan committed
81 82 83
	return belle_sip_parameters_get_parameter_base(params,name,(belle_sip_compare_func)belle_sip_param_pair_case_comp_func);
}

84
unsigned int belle_sip_parameters_has_parameter(const belle_sip_parameters_t* params,const char* name) {
jehan's avatar
jehan committed
85 86
	return belle_sip_list_find_custom(params->param_list, (belle_sip_compare_func)belle_sip_param_pair_comp_func, name) != NULL;
}
87 88

void belle_sip_parameters_set_parameter(belle_sip_parameters_t* params,const char* name,const char* value) {
jehan's avatar
jehan committed
89
	/*1 check if present*/
90
	belle_sip_param_pair_t* lNewpair;
jehan's avatar
jehan committed
91 92 93
	belle_sip_list_t *  lResult = belle_sip_list_find_custom(params->paramnames_list, (belle_sip_compare_func)strcmp, name);
	/* first remove from header names list*/
	if (lResult) {
Simon Morlat's avatar
Simon Morlat committed
94
		params->paramnames_list=belle_sip_list_delete_link(params->paramnames_list,lResult);
jehan's avatar
jehan committed
95 96 97 98 99
	}
	/* next from header list*/
	lResult = belle_sip_list_find_custom(params->param_list, (belle_sip_compare_func)belle_sip_param_pair_comp_func, name);
	if (lResult) {
		belle_sip_param_pair_destroy(lResult->data);
Simon Morlat's avatar
Simon Morlat committed
100
		params->param_list=belle_sip_list_delete_link(params->param_list,lResult);
jehan's avatar
jehan committed
101 102
	}
	/* 2 insert*/
103
	lNewpair = belle_sip_param_pair_new(name,value);
jehan's avatar
jehan committed
104 105 106 107
	params->param_list=belle_sip_list_append(params->param_list,lNewpair);
	params->paramnames_list=belle_sip_list_append(params->paramnames_list,lNewpair->name);
}

108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
void belle_sip_parameters_set(belle_sip_parameters_t *parameters, const char* params){
	belle_sip_parameters_clean(parameters);
	if (params && *params!='\0'){
		char *tmp=belle_sip_strdup(params);
		char *end_of_param;
		char *current=tmp;
		char *equal;
		char *next;
		
		do{
			end_of_param=strchr(current,';');
			equal=strchr(current,'=');
			if (!end_of_param) {
				end_of_param=current+strlen(current);
				next=end_of_param;
			}else{
				*end_of_param='\0';
				next=end_of_param+1;
			}
			if (equal && equal<end_of_param){
				*equal='\0';
				belle_sip_parameters_set_parameter(parameters,current,equal+1);
			}else{
				belle_sip_parameters_set_parameter(parameters,current,NULL);
			}
			current=next;
		}while(*current!='\0');
		belle_sip_free(tmp);
	}
}

jehan's avatar
jehan committed
139
const belle_sip_list_t*	belle_sip_parameters_get_parameter_names(const belle_sip_parameters_t* params) {
jehan's avatar
jehan committed
140
	return params?params->paramnames_list:NULL;
jehan's avatar
jehan committed
141
}
142

143
void belle_sip_parameters_remove_parameter(belle_sip_parameters_t* params,const char* name) {
jehan's avatar
jehan committed
144 145 146 147
	/*1 check if present*/
	belle_sip_list_t *  lResult = belle_sip_list_find_custom(params->paramnames_list, (belle_sip_compare_func)strcmp, name);
	/* first remove from header names list*/
	if (lResult) {
Simon Morlat's avatar
Simon Morlat committed
148
		params->paramnames_list=belle_sip_list_delete_link(params->paramnames_list,lResult);
jehan's avatar
jehan committed
149 150 151 152 153 154
		/*next remove node*/
		lResult = belle_sip_list_find_custom(params->param_list, (belle_sip_compare_func)belle_sip_param_pair_comp_func, name);
		if (lResult) {
			belle_sip_param_pair_destroy(lResult->data);
			params->param_list=belle_sip_list_delete_link(params->param_list,lResult);
		}
jehan's avatar
jehan committed
155 156 157
	}
}