2
* Copyright (C) 2006 Voice Sistem S.R.L.
4
* This file is part of Kamailio, a free SIP server.
6
* Kamailio is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version
11
* Kamailio is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
* 2007-04-04 initial version (Anca Vamanu)
27
* \brief Kamailio presence module :: Events
35
#include "../../str.h"
36
#include "../../dprint.h"
37
#include "../../parser/parse_event.h"
38
#include "../../mem/shm_mem.h"
39
#include "../../mem/mem.h"
40
#include "event_list.h"
43
#define MAX_EVNAME_SIZE 20
45
int search_event_params(event_t* ev, event_t* searched_ev);
47
event_t* shm_copy_event(event_t* e)
53
ev= (event_t*)shm_malloc(sizeof(event_t));
58
memset(ev, 0, sizeof(event_t));
60
ev->name.s= (char*)shm_malloc(e->name.len* sizeof(char));
65
memcpy(ev->name.s, e->name.s, e->name.len);
66
ev->name.len= e->name.len;
71
size= sizeof(param_t)+ (p1->name.len+ p1->body.len)* sizeof(char);
72
p2= (param_t*)shm_malloc(size);
79
size= sizeof(param_t);
80
CONT_COPY(p2, p2->name, p1->name);
81
if(p1->body.s && p1->body.len)
82
CONT_COPY(p2, p2->body, p1->body);
83
p2->next= ev->params.list;
86
/* Update parameter hooks in the shmmem copy, this is needed so that
87
* we can test for the presence of the sla parameter even in the
88
* shared copy of the event */
89
if (e->params.hooks.event_dialog.call_id == p1)
90
ev->params.hooks.event_dialog.call_id = p2;
91
if (e->params.hooks.event_dialog.from_tag == p1)
92
ev->params.hooks.event_dialog.from_tag = p2;
93
if (e->params.hooks.event_dialog.to_tag == p1)
94
ev->params.hooks.event_dialog.to_tag = p2;
95
if (e->params.hooks.event_dialog.include_session_description == p1)
96
ev->params.hooks.event_dialog.include_session_description = p2;
97
if (e->params.hooks.event_dialog.sla == p1)
98
ev->params.hooks.event_dialog.sla = p2;
111
void shm_free_event(event_t* ev)
117
shm_free(ev->name.s);
119
free_event_params(ev->params.list, SHM_MEM_TYPE);
125
int add_event(pres_ev_t* event)
128
event_t parsed_event;
134
memset(&parsed_event, 0, sizeof(event_t));
136
if(event->name.s== NULL || event->name.len== 0)
138
LM_ERR("NULL event name\n");
142
if(event->content_type.s== NULL || event->content_type.len== 0)
144
LM_ERR("NULL content_type param\n");
148
ev= contains_event(&event->name, &parsed_event);
152
ev= (pres_ev_t*)shm_malloc(sizeof(pres_ev_t));
155
free_event_params(parsed_event.params.list, PKG_MEM_TYPE);
158
memset(ev, 0, sizeof(pres_ev_t));
159
ev->name.s= (char*)shm_malloc(event->name.len* sizeof(char));
160
if(ev->name.s== NULL)
164
memcpy(ev->name.s, event->name.s, event->name.len);
165
ev->name.len= event->name.len;
167
ev->evp= shm_copy_event(&parsed_event);
170
LM_ERR("copying event_t structure\n");
176
if(ev->content_type.s)
178
LM_DBG("Event already registered\n");
184
(char*)shm_malloc(event->content_type.len* sizeof(char)) ;
185
if(ev->content_type.s== NULL)
189
ev->content_type.len= event->content_type.len;
190
memcpy(ev->content_type.s, event->content_type.s, event->content_type.len);
192
for(sep=parsed_event.name.s; sep<parsed_event.name.s+parsed_event.name.len;
195
if(sep>=parsed_event.name.s+parsed_event.name.len) sep=0;
196
if(sep && strncmp(sep+1, "winfo", 5)== 0)
198
ev->type= WINFO_TYPE;
199
wipeer_name.s= parsed_event.name.s;
200
wipeer_name.len= sep - parsed_event.name.s;
201
ev->wipeer= contains_event(&wipeer_name, NULL);
203
LM_DBG("Found wipeer event [%.*s] for event [%.*s]\n",
204
wipeer_name.len,wipeer_name.s,
205
parsed_event.name.len,parsed_event.name.s);
211
if (parsed_event.name.len + 6 > 50) {
212
LM_ERR("buffer too small\n");
216
memcpy(wipeer_name.s, parsed_event.name.s, parsed_event.name.len);
217
wipeer_name.len= parsed_event.name.len;
218
memcpy(wipeer_name.s+ wipeer_name.len, ".winfo", 6);
220
ev->wipeer= contains_event(&wipeer_name, NULL);
222
LM_DBG("Found wipeer event [%.*s] for event [%.*s]\n",
223
wipeer_name.len,wipeer_name.s,
224
parsed_event.name.len,parsed_event.name.s);
229
ev->wipeer->wipeer= ev;
231
if(event->req_auth &&
232
( event->get_auth_status==0 ||event->get_rules_doc== 0))
234
LM_ERR("bad event structure\n");
237
ev->req_auth= event->req_auth;
238
ev->agg_nbody= event->agg_nbody;
239
ev->apply_auth_nbody= event->apply_auth_nbody;
240
ev->get_auth_status= event->get_auth_status;
241
ev->get_rules_doc= event->get_rules_doc;
242
ev->get_pidf_doc= event->get_pidf_doc;
243
ev->evs_publ_handl= event->evs_publ_handl;
244
ev->evs_subs_handl= event->evs_subs_handl;
245
ev->etag_not_new= event->etag_not_new;
246
ev->aux_body_processing= event->aux_body_processing;
247
ev->aux_free_body= event->aux_free_body;
248
ev->free_body= event->free_body;
249
ev->default_expires= event->default_expires;
253
ev->next= EvList->events;
258
LM_DBG("succesfully added event: %.*s - len= %d\n",ev->name.len,
259
ev->name.s, ev->name.len);
261
free_event_params(parsed_event.params.list, PKG_MEM_TYPE);
264
free_event_params(parsed_event.params.list, PKG_MEM_TYPE);
265
if(ev && not_in_list)
272
void free_pres_event(pres_ev_t* ev)
278
shm_free(ev->name.s);
279
if(ev->content_type.s)
280
shm_free(ev->content_type.s);
282
ev->wipeer->wipeer = 0;
283
shm_free_event(ev->evp);
288
evlist_t* init_evlist(void)
290
evlist_t* list= NULL;
292
list= (evlist_t*)shm_malloc(sizeof(evlist_t));
295
LM_ERR("no more share memory\n");
304
pres_ev_t* contains_event(str* sname, event_t* parsed_event)
310
pe = (parsed_event)?parsed_event:&event;
312
memset(pe, 0, sizeof(event_t));
313
if(event_parser(sname->s, sname->len, pe)< 0)
315
LM_ERR("parsing event\n");
321
free_event_params(pe->params.list, PKG_MEM_TYPE);
322
pe->params.list = NULL;
328
void free_event_params(param_t* params, int mem_type)
336
if(mem_type == SHM_MEM_TYPE)
345
pres_ev_t* search_event(event_t* event)
348
pres_ev= EvList->events;
350
LM_DBG("start event= [%.*s/%d]\n", event->name.len, event->name.s,
355
if((pres_ev->evp->type== event->type && event->type!=EVENT_OTHER)
356
|| (pres_ev->evp->name.len== event->name.len &&
357
strncasecmp(pres_ev->evp->name.s,event->name.s,
358
pres_ev->evp->name.len)== 0))
360
if(event->params.list== NULL && pres_ev->evp->params.list== NULL)
365
/* search all parameters in event in ev */
366
if(search_event_params(event, pres_ev->evp)< 0)
369
/* search all parameters in ev in event */
370
if(search_event_params(pres_ev->evp, event)< 0)
375
cont: pres_ev= pres_ev->next;
381
int search_event_params(event_t* ev, event_t* searched_ev)
390
p= searched_ev->params.list;
395
if(p->name.len== ps->name.len &&
396
strncmp(p->name.s,ps->name.s, ps->name.len)== 0)
397
if((p->body.s== 0 && ps->body.s== 0) ||
398
(p->body.len== ps->body.len &&
399
strncmp(p->body.s,ps->body.s,ps->body.len)== 0))
414
int get_event_list(str** ev_list)
416
pres_ev_t* ev= EvList->events;
421
if(EvList->ev_count== 0)
424
list= (str*)pkg_malloc(sizeof(str));
427
LM_ERR("No more memory\n");
430
memset(list, 0, sizeof(str));
431
list->s= (char*)pkg_malloc(EvList->ev_count* MAX_EVNAME_SIZE);
434
LM_ERR("No more memory\n");
440
for(i= 0; i< EvList->ev_count; i++)
444
memcpy(list->s+ list->len, ", ", 2);
447
memcpy(list->s+ list->len, ev->name.s, ev->name.len );
448
list->len+= ev->name.len ;
456
void destroy_evlist(void)