00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <stdlib.h>
00037 #include<stdio.h>
00038 #include <string.h>
00039 #include "../../str.h"
00040 #include "../../dprint.h"
00041 #include "../../parser/parse_event.h"
00042 #include "../../mem/shm_mem.h"
00043 #include "../../mem/mem.h"
00044 #include "event_list.h"
00045 #include "hash.h"
00046
00047 #define MAX_EVNAME_SIZE 20
00048
00049 int search_event_params(event_t* ev, event_t* searched_ev);
00050
00051 event_t* shm_copy_event(event_t* e)
00052 {
00053 event_t* ev= NULL;
00054 param_t* p1, *p2;
00055 int size;
00056
00057 ev= (event_t*)shm_malloc(sizeof(event_t));
00058 if(ev== NULL)
00059 {
00060 ERR_MEM(SHARE_MEM);
00061 }
00062 memset(ev, 0, sizeof(event_t));
00063
00064 ev->text.s= (char*)shm_malloc(e->text.len* sizeof(char));
00065 if(ev->text.s== NULL)
00066 {
00067 ERR_MEM(SHARE_MEM);
00068 }
00069 memcpy(ev->text.s, e->text.s, e->text.len);
00070 ev->text.len= e->text.len;
00071
00072 p1= e->params;
00073 while(p1)
00074 {
00075 size= sizeof(param_t)+ (p1->name.len+ p1->body.len)* sizeof(char);
00076 p2= (param_t*)shm_malloc(size);
00077 if(p2== NULL)
00078 {
00079 ERR_MEM(SHARE_MEM);
00080 }
00081 memset(p2, 0, size);
00082
00083 size= sizeof(param_t);
00084 CONT_COPY(p2, p2->name, p1->name);
00085 if(p1->body.s && p1->body.len)
00086 CONT_COPY(p2, p2->body, p1->body);
00087 p2->next= ev->params;
00088 ev->params= p2;
00089 p1= p1->next;
00090 }
00091 ev->parsed= e->parsed;
00092
00093 return ev;
00094
00095 error:
00096 shm_free_event(ev);
00097 return NULL;
00098 }
00099
00100 void shm_free_event(event_t* ev)
00101 {
00102 if(ev== NULL)
00103 return;
00104
00105 if(ev->text.s)
00106 shm_free(ev->text.s);
00107
00108 free_event_params(ev->params, SHM_MEM_TYPE);
00109
00110 shm_free(ev);
00111 }
00112
00113
00114 int add_event(pres_ev_t* event)
00115 {
00116 pres_ev_t* ev= NULL;
00117 event_t parsed_event;
00118 str wipeer_name;
00119 char* sep;
00120 char buf[50];
00121 int not_in_list= 0;
00122
00123 memset(&parsed_event, 0, sizeof(event_t));
00124
00125 if(event->name.s== NULL || event->name.len== 0)
00126 {
00127 LM_ERR("NULL event name\n");
00128 return -1;
00129 }
00130
00131 if(event->content_type.s== NULL || event->content_type.len== 0)
00132 {
00133 LM_ERR("NULL content_type param\n");
00134 return -1;
00135 }
00136
00137 ev= contains_event(&event->name, &parsed_event);
00138 if(ev== NULL)
00139 {
00140 not_in_list= 1;
00141 ev= (pres_ev_t*)shm_malloc(sizeof(pres_ev_t));
00142 if(ev== NULL)
00143 {
00144 free_event_params(parsed_event.params, PKG_MEM_TYPE);
00145 ERR_MEM(SHARE_MEM);
00146 }
00147 memset(ev, 0, sizeof(pres_ev_t));
00148 ev->name.s= (char*)shm_malloc(event->name.len* sizeof(char));
00149 if(ev->name.s== NULL)
00150 {
00151 free_event_params(parsed_event.params, PKG_MEM_TYPE);
00152 ERR_MEM(SHARE_MEM);
00153 }
00154 memcpy(ev->name.s, event->name.s, event->name.len);
00155 ev->name.len= event->name.len;
00156
00157 ev->evp= shm_copy_event(&parsed_event);
00158 if(ev->evp== NULL)
00159 {
00160 LM_ERR("copying event_t structure\n");
00161 free_event_params(parsed_event.params, PKG_MEM_TYPE);
00162 goto error;
00163 }
00164 free_event_params(parsed_event.params, PKG_MEM_TYPE);
00165 }
00166 else
00167 {
00168 free_event_params(parsed_event.params, PKG_MEM_TYPE);
00169 if(ev->content_type.s)
00170 {
00171 LM_DBG("Event already registered\n");
00172 return 0;
00173 }
00174 }
00175
00176 ev->content_type.s=(char*)shm_malloc(event->content_type.len* sizeof(char)) ;
00177 if(ev->content_type.s== NULL)
00178 {
00179 ERR_MEM(SHARE_MEM);
00180 }
00181 ev->content_type.len= event->content_type.len;
00182 memcpy(ev->content_type.s, event->content_type.s, event->content_type.len);
00183
00184 sep= strchr(event->name.s, '.');
00185 if(sep && strncmp(sep+1, "winfo", 5)== 0)
00186 {
00187 ev->type= WINFO_TYPE;
00188 wipeer_name.s= event->name.s;
00189 wipeer_name.len= sep - event->name.s;
00190 ev->wipeer= contains_event(&wipeer_name, NULL);
00191 if (ev->wipeer) {
00192 LM_DBG("Found wipeer event [%.*s] for event [%.*s]\n",wipeer_name.len,wipeer_name.s,event->name.len,event->name.s);
00193 }
00194 }
00195 else
00196 {
00197 ev->type= PUBL_TYPE;
00198 if (event->name.len + 6 > 50) {
00199 LM_ERR("buffer too small\n");
00200 goto error;
00201 }
00202 wipeer_name.s= buf;
00203 memcpy(wipeer_name.s, event->name.s, event->name.len);
00204 wipeer_name.len= event->name.len;
00205 memcpy(wipeer_name.s+ wipeer_name.len, ".winfo", 6);
00206 wipeer_name.len+= 6;
00207 ev->wipeer= contains_event(&wipeer_name, NULL);
00208 if (ev->wipeer) {
00209 LM_DBG("Found wipeer event [%.*s] for event [%.*s]\n",wipeer_name.len,wipeer_name.s,event->name.len,event->name.s);
00210 }
00211 }
00212
00213 if(ev->wipeer)
00214 ev->wipeer->wipeer= ev;
00215
00216 if(event->req_auth &&
00217 ( event->get_auth_status==0 ||event->get_rules_doc== 0))
00218 {
00219 LM_ERR("bad event structure\n");
00220 goto error;
00221 }
00222 ev->req_auth= event->req_auth;
00223 ev->agg_nbody= event->agg_nbody;
00224 ev->apply_auth_nbody= event->apply_auth_nbody;
00225 ev->get_auth_status= event->get_auth_status;
00226 ev->get_rules_doc= event->get_rules_doc;
00227 ev->evs_publ_handl= event->evs_publ_handl;
00228 ev->etag_not_new= event->etag_not_new;
00229 ev->aux_body_processing= event->aux_body_processing;
00230 ev->aux_free_body= event->aux_free_body;
00231 ev->free_body= event->free_body;
00232 ev->default_expires= event->default_expires;
00233
00234 if(not_in_list)
00235 {
00236 ev->next= EvList->events;
00237 EvList->events= ev;
00238 }
00239 EvList->ev_count++;
00240
00241 LM_DBG("succesfully added event: %.*s - len= %d\n",ev->name.len,
00242 ev->name.s, ev->name.len);
00243 return 0;
00244 error:
00245 if(ev && not_in_list)
00246 {
00247 free_pres_event(ev);
00248 }
00249 return -1;
00250 }
00251
00252 void free_pres_event(pres_ev_t* ev)
00253 {
00254 if(ev== NULL)
00255 return;
00256
00257 if(ev->name.s)
00258 shm_free(ev->name.s);
00259 if(ev->content_type.s)
00260 shm_free(ev->content_type.s);
00261 if(ev->wipeer)
00262 ev->wipeer->wipeer = 0;
00263 shm_free_event(ev->evp);
00264 shm_free(ev);
00265
00266 }
00267
00268 evlist_t* init_evlist(void)
00269 {
00270 evlist_t* list= NULL;
00271
00272 list= (evlist_t*)shm_malloc(sizeof(evlist_t));
00273 if(list== NULL)
00274 {
00275 LM_ERR("no more share memory\n");
00276 return NULL;
00277 }
00278 list->ev_count= 0;
00279 list->events= NULL;
00280
00281 return list;
00282 }
00283
00284 pres_ev_t* contains_event(str* sname, event_t* parsed_event)
00285 {
00286 event_t event;
00287 pres_ev_t* e;
00288
00289 memset(&event, 0, sizeof(event_t));
00290 if(event_parser(sname->s, sname->len, &event)< 0)
00291 {
00292 LM_ERR("parsing event\n");
00293 return NULL;
00294 }
00295 if(parsed_event)
00296 *parsed_event= event;
00297 else
00298 {
00299 free_event_params(event.params, PKG_MEM_TYPE);
00300 }
00301 e= search_event(&event);
00302
00303 return e;
00304 }
00305
00306 void free_event_params(param_t* params, int mem_type)
00307 {
00308 param_t* t1, *t2;
00309 t2= t1= params;
00310
00311 while(t1)
00312 {
00313 t2= t1->next;
00314 if(mem_type == SHM_MEM_TYPE)
00315 shm_free(t1);
00316 else
00317 pkg_free(t1);
00318 t1= t2;
00319 }
00320
00321 }
00322
00323 pres_ev_t* search_event(event_t* event)
00324 {
00325 pres_ev_t* pres_ev;
00326 pres_ev= EvList->events;
00327
00328 LM_DBG("start event= [%.*s]\n", event->text.len, event->text.s);
00329
00330 while(pres_ev)
00331 {
00332 if(pres_ev->evp->parsed== event->parsed)
00333 {
00334 if(event->params== NULL && pres_ev->evp->params== NULL)
00335 {
00336 return pres_ev;
00337 }
00338
00339
00340 if(search_event_params(event, pres_ev->evp)< 0)
00341 goto cont;
00342
00343
00344 if(search_event_params(pres_ev->evp, event)< 0)
00345 goto cont;
00346
00347 return pres_ev;
00348 }
00349 cont: pres_ev= pres_ev->next;
00350 }
00351 return NULL;
00352
00353 }
00354
00355 int search_event_params(event_t* ev, event_t* searched_ev)
00356 {
00357 param_t* ps, *p;
00358 int found;
00359
00360 ps= ev->params;
00361
00362 while(ps)
00363 {
00364 p= searched_ev->params;
00365 found= 0;
00366
00367 while(p)
00368 {
00369 if(p->name.len== ps->name.len &&
00370 strncmp(p->name.s,ps->name.s, ps->name.len)== 0)
00371 if((p->body.s== 0 && ps->body.s== 0) ||
00372 (p->body.len== ps->body.len &&
00373 strncmp(p->body.s,ps->body.s,ps->body.len)== 0))
00374 {
00375 found= 1;
00376 break;
00377 }
00378 p= p->next;
00379 }
00380 if(found== 0)
00381 return -1;
00382 ps= ps->next;
00383 }
00384
00385 return 1;
00386
00387 }
00388 int get_event_list(str** ev_list)
00389 {
00390 pres_ev_t* ev= EvList->events;
00391 int i;
00392 str* list;
00393 *ev_list= NULL;
00394
00395 if(EvList->ev_count== 0)
00396 return 0;
00397
00398 list= (str*)pkg_malloc(sizeof(str));
00399 if(list== NULL)
00400 {
00401 LM_ERR("No more memory\n");
00402 return -1;
00403 }
00404 memset(list, 0, sizeof(str));
00405 list->s= (char*)pkg_malloc(EvList->ev_count* MAX_EVNAME_SIZE);
00406 if(list->s== NULL)
00407 {
00408 LM_ERR("No more memory\n");
00409 pkg_free(list);
00410 return -1;
00411 }
00412 list->s[0]= '\0';
00413
00414 for(i= 0; i< EvList->ev_count; i++)
00415 {
00416 if(i> 0)
00417 {
00418 memcpy(list->s+ list->len, ", ", 2);
00419 list->len+= 2;
00420 }
00421 memcpy(list->s+ list->len, ev->name.s, ev->name.len );
00422 list->len+= ev->name.len ;
00423 ev= ev->next;
00424 }
00425
00426 *ev_list= list;
00427 return 0;
00428 }
00429
00430 void destroy_evlist(void)
00431 {
00432 pres_ev_t* e1, *e2;
00433 if (EvList)
00434 {
00435 e1= EvList->events;
00436 while(e1)
00437 {
00438 e2= e1->next;
00439 free_pres_event(e1);
00440 e1= e2;
00441 }
00442 shm_free(EvList);
00443 }
00444 }
00445