1 /*
2 * Copyright (c) 2010, Sangoma Technologies
3 * David Yat Sin <dyatsin@sangoma.com>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * * Neither the name of the original author; nor the names of any contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
26 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 * Contributors:
35 *
36 * Moises Silva <moy@sangoma.com>
37 *
38 */
39
40 #include "private/ftdm_core.h"
41
ftdm_sigmsg_add_var(ftdm_sigmsg_t * sigmsg,const char * var_name,const char * value)42 FT_DECLARE(ftdm_status_t) ftdm_sigmsg_add_var(ftdm_sigmsg_t *sigmsg, const char *var_name, const char *value)
43 {
44 char *t_name = 0, *t_val = 0;
45
46 if (!sigmsg || !var_name || !value) {
47 return FTDM_FAIL;
48 }
49
50 if (!sigmsg->variables) {
51 /* initialize on first use */
52 sigmsg->variables = create_hashtable(16, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
53 ftdm_assert_return(sigmsg->variables, FTDM_FAIL, "Failed to create hash table\n");
54 }
55
56 t_name = ftdm_strdup(var_name);
57 t_val = ftdm_strdup(value);
58 hashtable_insert(sigmsg->variables, t_name, t_val, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE);
59 return FTDM_SUCCESS;
60 }
61
ftdm_sigmsg_remove_var(ftdm_sigmsg_t * sigmsg,const char * var_name)62 FT_DECLARE(ftdm_status_t) ftdm_sigmsg_remove_var(ftdm_sigmsg_t *sigmsg, const char *var_name)
63 {
64 if (sigmsg && sigmsg->variables) {
65 hashtable_remove(sigmsg->variables, (void *)var_name);
66 }
67 return FTDM_SUCCESS;
68 }
69
ftdm_sigmsg_get_var(ftdm_sigmsg_t * sigmsg,const char * var_name)70 FT_DECLARE(const char *) ftdm_sigmsg_get_var(ftdm_sigmsg_t *sigmsg, const char *var_name)
71 {
72 const char *var = NULL;
73
74 if (!sigmsg || !sigmsg->variables || !var_name) {
75 return NULL;
76 }
77
78 var = (const char *)hashtable_search(((struct hashtable*)sigmsg->variables), (void *)var_name);
79 return var;
80 }
81
ftdm_sigmsg_get_var_iterator(const ftdm_sigmsg_t * sigmsg,ftdm_iterator_t * iter)82 FT_DECLARE(ftdm_iterator_t *) ftdm_sigmsg_get_var_iterator(const ftdm_sigmsg_t *sigmsg, ftdm_iterator_t *iter)
83 {
84 ftdm_hash_iterator_t *hashiter = NULL;
85 if (!sigmsg) {
86 return NULL;
87 }
88
89 hashiter = sigmsg->variables == NULL ? NULL : hashtable_first(sigmsg->variables);
90
91 if (hashiter == NULL) {
92 return NULL;
93 }
94
95 if (!(iter = ftdm_get_iterator(FTDM_ITERATOR_VARS, iter))) {
96 return NULL;
97 }
98 iter->pvt.hashiter = hashiter;
99 return iter;
100 }
101
ftdm_get_current_var(ftdm_iterator_t * iter,const char ** var_name,const char ** var_val)102 FT_DECLARE(ftdm_status_t) ftdm_get_current_var(ftdm_iterator_t *iter, const char **var_name, const char **var_val)
103 {
104 const void *key = NULL;
105 void *val = NULL;
106
107 *var_name = NULL;
108 *var_val = NULL;
109
110 ftdm_assert_return(iter && (iter->type == FTDM_ITERATOR_VARS) && iter->pvt.hashiter, FTDM_FAIL, "Cannot get variable from invalid iterator!\n");
111
112 hashtable_this(iter->pvt.hashiter, &key, NULL, &val);
113
114 *var_name = key;
115 *var_val = val;
116
117 return FTDM_SUCCESS;
118 }
119
120
ftdm_usrmsg_add_var(ftdm_usrmsg_t * usrmsg,const char * var_name,const char * value)121 FT_DECLARE(ftdm_status_t) ftdm_usrmsg_add_var(ftdm_usrmsg_t *usrmsg, const char *var_name, const char *value)
122 {
123 char *t_name = 0, *t_val = 0;
124
125 if (!usrmsg || !var_name || !value) {
126 return FTDM_FAIL;
127 }
128
129 if (!usrmsg->variables) {
130 /* initialize on first use */
131 usrmsg->variables = create_hashtable(16, ftdm_hash_hashfromstring, ftdm_hash_equalkeys);
132 ftdm_assert_return(usrmsg->variables, FTDM_FAIL, "Failed to create hash table\n");
133 }
134
135 t_name = ftdm_strdup(var_name);
136 t_val = ftdm_strdup(value);
137 hashtable_insert(usrmsg->variables, t_name, t_val, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE);
138 return FTDM_SUCCESS;
139 }
140
ftdm_usrmsg_get_var(ftdm_usrmsg_t * usrmsg,const char * var_name)141 FT_DECLARE(const char *) ftdm_usrmsg_get_var(ftdm_usrmsg_t *usrmsg, const char *var_name)
142 {
143 const char *var = NULL;
144
145 if (!usrmsg || !usrmsg->variables || !var_name) {
146 return NULL;
147 }
148
149 var = (const char *)hashtable_search(((struct hashtable*)usrmsg->variables), (void *)var_name);
150 return var;
151 }
152