|
|
@ -29,10 +29,10 @@ |
|
|
|
* channel V |¨¨¨¨¨¨¨¨¨¨¨ |
|
|
|
* channel V |¨¨¨¨¨¨¨¨¨¨¨ |
|
|
|
* | agent-| | |
|
|
|
* | agent-| | |
|
|
|
* V V V |
|
|
|
* V V V |
|
|
|
* call Queue |
|
|
|
* call queue member
|
|
|
|
* | | |
|
|
|
* |
|
|
|
|
* V V |
|
|
|
* V
|
|
|
|
* bridge info |
|
|
|
* bridge
|
|
|
|
*¨ |
|
|
|
*¨ |
|
|
|
* Essa será a estrutura da permanecia |
|
|
|
* Essa será a estrutura da permanecia |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -46,7 +46,6 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static struct s_peer *_peer = NULL; |
|
|
|
static struct s_peer *_peer = NULL; |
|
|
|
static struct s_queue *_queue = NULL; |
|
|
|
|
|
|
|
static struct s_list_channel *list_channel = NULL; |
|
|
|
static struct s_list_channel *list_channel = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -234,7 +233,7 @@ int free_peer(struct s_peer *peer){ |
|
|
|
free(peer->callerid_name); |
|
|
|
free(peer->callerid_name); |
|
|
|
free(peer->status); |
|
|
|
free(peer->status); |
|
|
|
free(peer->address); |
|
|
|
free(peer->address); |
|
|
|
free(peer->time); |
|
|
|
free(peer->_time); |
|
|
|
free_variable(peer->variable); |
|
|
|
free_variable(peer->variable); |
|
|
|
free_channel(peer->channel); |
|
|
|
free_channel(peer->channel); |
|
|
|
free_agent(peer->agent); |
|
|
|
free_agent(peer->agent); |
|
|
@ -701,198 +700,124 @@ int free_bridge(struct s_bridge *bridge){ |
|
|
|
} |
|
|
|
} |
|
|
|
/* end bridge */ |
|
|
|
/* end bridge */ |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
* queue
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
struct s_queue* create_queue(){ |
|
|
|
|
|
|
|
struct s_queue *queue; |
|
|
|
|
|
|
|
queue = (struct s_queue *) calloc(1, sizeof(struct s_queue)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return queue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int insert_queue(struct s_queue *queue){ |
|
|
|
|
|
|
|
struct s_queue **Q = &_queue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while(*Q){ |
|
|
|
|
|
|
|
if(strcasecmp_n((*Q)->queue_name, queue->queue_name) == 0){ |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Q = &(*Q)->next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*Q = queue; |
|
|
|
/* queue member */ |
|
|
|
|
|
|
|
struct s_queue_member *create_queue_member(){ |
|
|
|
|
|
|
|
struct s_queue_member *member; |
|
|
|
|
|
|
|
member = (struct s_queue_member *) calloc(1, sizeof(struct s_queue_member)); |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
return member; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct s_queue *get_queue(const char *name){ |
|
|
|
|
|
|
|
struct s_queue **Q = &_queue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while(*Q){ |
|
|
|
int count_queue_member_name(const char *peer_name, const char *queue_name){ |
|
|
|
if(strcasecmp_n((*Q)->queue_name, name) == 0){ |
|
|
|
|
|
|
|
return *Q; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Q = &(*Q)->next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int count_queue(){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int len = 0; |
|
|
|
int len = 0; |
|
|
|
struct s_queue *queue = _queue; |
|
|
|
struct s_peer *peer = get_peer(peer_name); |
|
|
|
|
|
|
|
if(peer){ |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
while(queue){ |
|
|
|
struct s_queue_member *member; |
|
|
|
++len; |
|
|
|
member = peer->member; |
|
|
|
queue = queue->next; |
|
|
|
while(member){ |
|
|
|
|
|
|
|
member = member->next; |
|
|
|
|
|
|
|
len++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return len; |
|
|
|
return len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int queue_empty(){ |
|
|
|
|
|
|
|
if(!_queue){ |
|
|
|
|
|
|
|
return 1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
int count_queue_member(struct s_peer *peer, const char *queue_name){ |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue *get_queue_id(int id){ |
|
|
|
int len = 0; |
|
|
|
struct s_queue *persist_queue = _queue; |
|
|
|
struct s_queue_member *member; |
|
|
|
int queue_id = 0; |
|
|
|
|
|
|
|
|
|
|
|
if(!peer){ |
|
|
|
while(persist_queue){ |
|
|
|
return 0; |
|
|
|
if(queue_id == id) |
|
|
|
} |
|
|
|
return persist_queue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
persist_queue = persist_queue->next; |
|
|
|
member = peer->member; |
|
|
|
++queue_id; |
|
|
|
while(member){ |
|
|
|
|
|
|
|
member = member->next; |
|
|
|
|
|
|
|
len++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
return len; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int remove_queue_all(){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue *current = _queue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!_queue) |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while(current){ |
|
|
|
|
|
|
|
_queue = current->next; |
|
|
|
|
|
|
|
remove_queue_member_all(current->queue_name); |
|
|
|
|
|
|
|
free_queue(current); |
|
|
|
|
|
|
|
current = _queue; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_queue = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member *get_queue_member_name(const char *peer_name, const char *queue_name){ |
|
|
|
|
|
|
|
|
|
|
|
int remove_queue(struct s_queue *queue){ |
|
|
|
struct s_queue_member *queue_member; |
|
|
|
|
|
|
|
|
|
|
|
struct s_queue **Q = &_queue; |
|
|
|
struct s_peer *peer = get_peer(peer_name); |
|
|
|
|
|
|
|
if(!peer) return NULL; |
|
|
|
|
|
|
|
|
|
|
|
while(*Q){ |
|
|
|
queue_member = peer->member; |
|
|
|
if(strcasecmp_n((*Q)->queue_name, queue->queue_name) == 0){ |
|
|
|
while(queue_member){ |
|
|
|
*Q = queue->next; |
|
|
|
if(!strcasecmp_n(queue_member->queue_name, queue_name)){ |
|
|
|
free_queue(queue); |
|
|
|
return queue_member; |
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
Q = &(*Q)->next; |
|
|
|
|
|
|
|
|
|
|
|
queue_member = queue_member->next; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int free_queue(struct s_queue *queue){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
struct s_queue_member *get_queue_member(struct s_peer *peer, const char *queue_name){ |
|
|
|
* int id; |
|
|
|
|
|
|
|
* char *name; |
|
|
|
|
|
|
|
* char *state; |
|
|
|
|
|
|
|
* int count_agent; |
|
|
|
|
|
|
|
* struct s_queue_member *member;
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!queue) {return -1;} |
|
|
|
struct s_queue_member *queue_member; |
|
|
|
|
|
|
|
|
|
|
|
free(queue->queue_name); |
|
|
|
queue_member = peer->member; |
|
|
|
free(queue->queue_number); |
|
|
|
while(queue_member){ |
|
|
|
free(queue->strategy); |
|
|
|
if(!strcasecmp_n(queue_member->queue_name, queue_name)){ |
|
|
|
|
|
|
|
return queue_member; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
queue_member = queue_member->next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
free(queue); |
|
|
|
return NULL; |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
/* end queue */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* queue member */ |
|
|
|
|
|
|
|
struct s_queue_member *create_queue_member(){ |
|
|
|
|
|
|
|
struct s_queue_member *member; |
|
|
|
|
|
|
|
member = (struct s_queue_member *) calloc(1, sizeof(struct s_queue_member)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return member; |
|
|
|
int insert_queue_member_name(const char *peer_name, struct s_queue_member *member){ |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_peer *peer = get_peer(peer_name); |
|
|
|
|
|
|
|
if(!peer){ |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int count_queue_member(const char *queue_name){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int len = 0; |
|
|
|
struct s_queue_member **QM = &peer->member; |
|
|
|
struct s_queue_member *member; |
|
|
|
while(*QM){ |
|
|
|
struct s_queue *queue; |
|
|
|
|
|
|
|
queue = get_queue(queue_name); |
|
|
|
|
|
|
|
if( !queue ) {return 0;} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
member = queue->member; |
|
|
|
QM = &(*QM)->next; |
|
|
|
while(member){ |
|
|
|
|
|
|
|
member = member->next; |
|
|
|
|
|
|
|
len++; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return len; |
|
|
|
*QM = member; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member *get_queue_member_id(const char *queue_name, size_t id){ |
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member *queue_member; |
|
|
|
|
|
|
|
struct s_queue *queue; |
|
|
|
|
|
|
|
int id_queue_member = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
queue = get_queue(queue_name); |
|
|
|
|
|
|
|
if(!queue) return NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
queue_member = queue->member; |
|
|
|
int insert_queue_member(struct s_peer *peer, struct s_queue_member *member){ |
|
|
|
while(queue_member){ |
|
|
|
|
|
|
|
if(id_queue_member == id) |
|
|
|
|
|
|
|
return queue_member; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
queue_member = queue_member->next; |
|
|
|
if(!peer){ |
|
|
|
++id_queue_member; |
|
|
|
return -1;; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
struct s_queue_member **QM = &peer->member; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int insert_queue_member(const char *queue_name, struct s_queue_member *member){ |
|
|
|
|
|
|
|
struct s_queue *queue = get_queue(queue_name); |
|
|
|
|
|
|
|
if(!queue) { return -1; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member **QM = &queue->member; |
|
|
|
|
|
|
|
while(*QM){ |
|
|
|
while(*QM){ |
|
|
|
if(strcasecmp_n((*QM)->ramal, member->ramal) == 0){ |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QM = &(*QM)->next; |
|
|
|
QM = &(*QM)->next; |
|
|
|
} |
|
|
|
} |
|
|
@ -902,44 +827,35 @@ int insert_queue_member(const char *queue_name, struct s_queue_member *member){ |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member *get_queue_member(const char *queue_name, const char *member_name){ |
|
|
|
|
|
|
|
struct s_queue *queue = get_queue(queue_name); |
|
|
|
|
|
|
|
if(!queue) { return NULL; } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member **QM = &queue->member; |
|
|
|
|
|
|
|
while(*QM){ |
|
|
|
|
|
|
|
if(strcasecmp_n((*QM)->ramal, member_name) == 0){ |
|
|
|
|
|
|
|
return *QM; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return NULL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int remove_queue_member_all(const char *queue_name){ |
|
|
|
int remove_queue_member_name(const char *peer_name, const char *queue_name){ |
|
|
|
struct s_queue *queue = get_queue(queue_name); |
|
|
|
|
|
|
|
if(!queue) {return -1;} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member *current = queue->member; |
|
|
|
struct s_peer *peer = get_peer(peer_name); |
|
|
|
while(current){ |
|
|
|
if(!peer){ |
|
|
|
queue->member = current->next; |
|
|
|
return -1; |
|
|
|
free_queue_member(current); |
|
|
|
|
|
|
|
current = queue->member; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
queue->member = NULL; |
|
|
|
struct s_queue_member *qm, **QM = &peer->member; |
|
|
|
|
|
|
|
while(*QM){ |
|
|
|
|
|
|
|
if(strcasecmp_n((*QM)->queue_name, queue_name) == 0){ |
|
|
|
|
|
|
|
qm = (*QM)->next; |
|
|
|
|
|
|
|
free_queue_member(*QM); |
|
|
|
|
|
|
|
*QM = qm; |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int remove_queue_member(const char *queue_name, const char *member_name){ |
|
|
|
|
|
|
|
struct s_queue *queue = get_queue(queue_name); |
|
|
|
|
|
|
|
if(!queue) {return -1;} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct s_queue_member *qm, **QM = &queue->member; |
|
|
|
|
|
|
|
|
|
|
|
int remove_queue_member(struct s_peer *peer, const char *queue_name){ |
|
|
|
|
|
|
|
struct s_queue_member *qm, **QM = &peer->member; |
|
|
|
while(*QM){ |
|
|
|
while(*QM){ |
|
|
|
if(strcasecmp_n((*QM)->ramal, member_name) == 0){ |
|
|
|
if(strcasecmp_n((*QM)->queue_name, queue_name) == 0){ |
|
|
|
qm = (*QM)->next; |
|
|
|
qm = (*QM)->next; |
|
|
|
free_queue_member(*QM); |
|
|
|
free_queue_member(*QM); |
|
|
|
*QM = qm; |
|
|
|
*QM = qm; |
|
|
@ -951,16 +867,11 @@ int remove_queue_member(const char *queue_name, const char *member_name){ |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int free_queue_member(struct s_queue_member *member){ |
|
|
|
int free_queue_member(struct s_queue_member *member){ |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
char *queue; |
|
|
|
char *queue; |
|
|
|
char *member_name; |
|
|
|
int membership; |
|
|
|
char *interface; |
|
|
|
|
|
|
|
char *state_interface; |
|
|
|
|
|
|
|
char *membership; |
|
|
|
|
|
|
|
int Penalty |
|
|
|
int Penalty |
|
|
|
int Calls_Taken; |
|
|
|
int Calls_Taken; |
|
|
|
int last_Call; |
|
|
|
int last_Call; |
|
|
@ -973,9 +884,7 @@ int free_queue_member(struct s_queue_member *member){ |
|
|
|
|
|
|
|
|
|
|
|
if(!member) { return -1; } |
|
|
|
if(!member) { return -1; } |
|
|
|
|
|
|
|
|
|
|
|
free(member->ramal); |
|
|
|
free(member->queue_name); |
|
|
|
free(member->interface); |
|
|
|
|
|
|
|
free(member->membership); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
free(member); |
|
|
|
free(member); |
|
|
|
|
|
|
|
|
|
|
|