void sipomatic_iterate(Sipomatic *obj) { MSList *elem; MSList *to_be_destroyed=NULL; Call *call; double elapsed; eXosip_event_t *ev; while((ev=eXosip_event_wait(0,0))!=NULL){ sipomatic_process_event(obj,ev); } elem=obj->calls; while(elem!=NULL){ call=(Call*)elem->data; elapsed=time(NULL)-call->time; switch(call->state){ case CALL_STATE_INIT: if (elapsed>obj->acceptance_time){ call_accept(call); } break; case CALL_STATE_RUNNING: if (elapsed>obj->max_call_time || call->eof){ call_release(call); to_be_destroyed=ms_list_append(to_be_destroyed,call); } break; } elem=ms_list_next(elem); } for(;to_be_destroyed!=NULL; to_be_destroyed=ms_list_next(to_be_destroyed)){ call_destroy((Call*)to_be_destroyed->data); } }
void sipomatic_process_event(Sipomatic *obj,eXosip_event_t *ev) { Call *call; switch(ev->type){ case EXOSIP_CALL_INVITE: call_new(obj,ev); break; case EXOSIP_CALL_CLOSED: case EXOSIP_CALL_CANCELLED: call=sipomatic_find_call(obj,ev->did); if (call==NULL){ ms_warning("Could not find call with did %i !",ev->did); } call_release(call); call_destroy(call); break; default: break; } eXosip_event_free(ev); }
void call_destroyer(void *call) { call_destroy((sip_call_t*)call); }