|
|
|
@ -2,6 +2,8 @@
|
|
|
|
|
|
|
|
|
|
const char *_session = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* retornará o erro genérico do comandos */ |
|
|
|
|
int id_error_generic(request_api *api){ |
|
|
|
|
|
|
|
|
@ -27,8 +29,14 @@ int id_error_generic(request_api *api){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* essa estrutura será inseridas o comando e seus domínios */ |
|
|
|
|
struct s_idrequest request_validated [] = { |
|
|
|
|
/* grupos de chamada */ |
|
|
|
|
{ "Originate", METHOD_CALL }, |
|
|
|
|
{ "schedule", METHOD_CALL }, |
|
|
|
|
|
|
|
|
@ -45,6 +53,11 @@ struct s_idrequest request_validated [] = {
|
|
|
|
|
{0} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* obter informações do /var/www/html/include/bd
|
|
|
|
|
* nesse arquivo será obtido informações de login para AMI */ |
|
|
|
|
int get_access(struct s_asterisk *asterisk){ |
|
|
|
@ -157,6 +170,10 @@ int get_access(struct s_asterisk *asterisk){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* identifica o comando da request */ |
|
|
|
|
int identify_request(const char *request){ |
|
|
|
|
int i = 0; |
|
|
|
@ -176,6 +193,11 @@ int identify_request(const char *request){
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* libera ponteiro request_api -> informações do comando */ |
|
|
|
|
int request_free(request_api *api ){ |
|
|
|
|
|
|
|
|
@ -192,105 +214,9 @@ int request_free(request_api *api ){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* usado para o method_call
|
|
|
|
|
* Isso indica que esse request deve ser uma ligação */ |
|
|
|
|
int method_call(json_t *json_from_api, const char *request/*, struct s_client *client*/){ |
|
|
|
|
|
|
|
|
|
request_api *api_call = calloc(1, sizeof(request_api)); |
|
|
|
|
if(!api_call){ |
|
|
|
|
const char *session = json_string_value( json_object_get(json_from_api, KEY_SESSION)); |
|
|
|
|
response_command_error(session, "", CALL_FAIL, FAIL_ALLOC); |
|
|
|
|
return -1; /* falta espaço no cliente retorna para o servidor */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
memset(&api_call->call, 0, sizeof(struct s_protocol_call)); |
|
|
|
|
|
|
|
|
|
new_strcpy(&api_call->call.request, request); |
|
|
|
|
api_call->call.id_request = METHOD_CALL; |
|
|
|
|
|
|
|
|
|
/* obtém session do json e copia para api_call.call */ |
|
|
|
|
const char *session = json_string_value( json_object_get( json_from_api, KEY_SESSION ) ); |
|
|
|
|
if(!session){ |
|
|
|
|
response_command_error(NULL, "", CALL_FAIL, JSON_KEY_SESSION); |
|
|
|
|
request_free(api_call); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
new_strcpy(&api_call->call.session, session); |
|
|
|
|
_session = session; |
|
|
|
|
|
|
|
|
|
/* obtém document do json e copia para api_call.call */ |
|
|
|
|
const char *document = json_string_value(json_object_get(json_from_api, KEY_DOCUMENT)); |
|
|
|
|
if(!document){ |
|
|
|
|
response_command_error(session, "", CALL_FAIL, JSON_KEY_DOCUMENT); |
|
|
|
|
request_free(api_call); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
new_strcpy(&api_call->call.document, document); |
|
|
|
|
|
|
|
|
|
/* obtém branch do json e copia para api_call.call - branch o chamador(originador) */ |
|
|
|
|
const char *branch = json_string_value(json_object_get(json_from_api, KEY_BRANCH)); |
|
|
|
|
if(!branch){ |
|
|
|
|
response_command_error(session, "", CALL_FAIL, JSON_KEY_BRANCH); |
|
|
|
|
request_free(api_call); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
new_strcpy(&api_call->call.branch, branch); |
|
|
|
|
|
|
|
|
|
/* obtém session do json e copia para api_call.call number - chamado(receber a chamada do branch) */ |
|
|
|
|
const char *number = json_string_value(json_object_get(json_from_api, KEY_NUMBER)); |
|
|
|
|
if(!number){ |
|
|
|
|
request_error(api_call, CALL_FAIL, JSON_KEY_NUMBER); |
|
|
|
|
request_free(api_call); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
new_strcpy(&api_call->call.number, number); |
|
|
|
|
|
|
|
|
|
pthread_t pthread; |
|
|
|
|
int ret = pthread_create(&pthread, NULL, to_asterisk, (void*)api_call); /* cria uma thread */ |
|
|
|
|
if(0 != ret){ |
|
|
|
|
request_error(api_call, CALL_FAIL, PTHREAD_FAIL);/*fazer return rede erro do thread*/ |
|
|
|
|
request_free(api_call); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int method_campaign(json_t *json_from_api, const char *request ){ |
|
|
|
|
|
|
|
|
|
request_api api_campaign; |
|
|
|
|
memset(&api_campaign.campaign, 0, sizeof(struct s_protocol_campaign));
|
|
|
|
|
|
|
|
|
|
new_strcpy(&api_campaign.campaign.request, request); |
|
|
|
|
api_campaign.campaign.id_request = METHOD_CAMPAIGN; |
|
|
|
|
|
|
|
|
|
const char *document = json_string_value(json_object_get(json_from_api, KEY_DOCUMENT)); |
|
|
|
|
if(!document) |
|
|
|
|
goto fail; |
|
|
|
|
new_strcpy(&api_campaign.campaign.document, document); |
|
|
|
|
|
|
|
|
|
const char *session = json_string_value(json_object_get(json_from_api, KEY_SESSION)); |
|
|
|
|
if(!session) |
|
|
|
|
goto fail; |
|
|
|
|
new_strcpy(&api_campaign.campaign.session, session); |
|
|
|
|
|
|
|
|
|
const char *campaignid = json_string_value(json_object_get(json_from_api, KEY_NUMBER)); |
|
|
|
|
if(!campaignid) |
|
|
|
|
goto fail; |
|
|
|
|
new_strcpy(&api_campaign.campaign.campaignid, campaignid); |
|
|
|
|
|
|
|
|
|
printf("%d\n", api_campaign.campaign.id_request); |
|
|
|
|
printf("%s\n", api_campaign.campaign.document); |
|
|
|
|
printf("%s\n", api_campaign.campaign.session); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
|
free(api_campaign.campaign.request); |
|
|
|
|
free(api_campaign.campaign.session); |
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int get_info_ami(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
@ -405,54 +331,12 @@ int get_info_ami(struct s_asterisk *asterisk){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int method_agent(json_t *json_from_api, const char *request ){ |
|
|
|
|
|
|
|
|
|
request_api api_agent; |
|
|
|
|
|
|
|
|
|
memset(&api_agent.agent, 0, sizeof(struct s_protocol_agent)); |
|
|
|
|
|
|
|
|
|
new_strcpy(&api_agent.agent.request, request); |
|
|
|
|
api_agent.agent.id_request = METHOD_AGENT; |
|
|
|
|
|
|
|
|
|
const char *document = json_string_value(json_object_get(json_from_api, KEY_DOCUMENT)); |
|
|
|
|
if(!document) |
|
|
|
|
goto fail; |
|
|
|
|
new_strcpy(&api_agent.agent.document, document); |
|
|
|
|
|
|
|
|
|
const char *session = json_string_value(json_object_get(json_from_api, KEY_SESSION)); |
|
|
|
|
if(!session) |
|
|
|
|
goto fail; |
|
|
|
|
new_strcpy(&api_agent.agent.session, session); |
|
|
|
|
|
|
|
|
|
const char *operatorid = json_string_value(json_object_get(json_from_api, KEY_OPERATORID)); |
|
|
|
|
if(!operatorid) |
|
|
|
|
goto fail; |
|
|
|
|
new_strcpy(&api_agent.agent.operatorid, operatorid); |
|
|
|
|
|
|
|
|
|
printf("%d\n", api_agent.agent.id_request); |
|
|
|
|
printf("%s\n", api_agent.agent.document); |
|
|
|
|
printf("%s\n", api_agent.agent.session); |
|
|
|
|
printf("%s\n", api_agent.agent.operatorid); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
|
free(api_agent.agent.request); |
|
|
|
|
free(api_agent.agent.session); |
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char *json_session_get(json_t *root){ |
|
|
|
|
|
|
|
|
|
return json_string_value( json_object_get(root, KEY_SESSION)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Recebe a json do servidor e identifica seu domínio
|
|
|
|
|
* METHOD_CALL |
|
|
|
|
* METHOD_AGENT |
|
|
|
|
* METHOD_CAMPAIGN */ |
|
|
|
|
int parse_from_api(json_t *json_from_api, struct s_client *client){ |
|
|
|
|
/* Recebe a json do servidor e identifica seu domínio */ |
|
|
|
|
int method_from_api(json_t *json_from_api, struct s_client *client){ |
|
|
|
|
|
|
|
|
|
client->last_command = time(NULL); |
|
|
|
|
const char *session = NULL; // é usado obter erro se ocasionar erro nesta função
|
|
|
|
@ -490,6 +374,12 @@ int parse_from_api(json_t *json_from_api, struct s_client *client){
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* socket para ami do asterisk */ |
|
|
|
|
void create_socket_ami(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
@ -503,6 +393,11 @@ void create_socket_ami(struct s_asterisk *asterisk){
|
|
|
|
|
fcntl(asterisk->sock_net, F_SETFL, O_NONBLOCK); /* socket não block */ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* função padrão para enviar para o asterisk, isto é, ami do asterisk */ |
|
|
|
|
int send_asterisk(struct s_asterisk *asterisk, char *str){ |
|
|
|
|
|
|
|
|
@ -526,6 +421,12 @@ int send_asterisk(struct s_asterisk *asterisk, char *str){
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Fazer login no AMI */ |
|
|
|
|
int send_credentials(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
@ -541,6 +442,12 @@ int send_credentials(struct s_asterisk *asterisk){
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* O mesmo que strstr, porém escolhe quantos caracteres serão testados */ |
|
|
|
|
char *strnstr(const char *s, const char *find, size_t slen){ |
|
|
|
|
char c, sc; |
|
|
|
@ -562,6 +469,12 @@ char *strnstr(const char *s, const char *find, size_t slen){
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Espera a resposta da autenticação
|
|
|
|
|
* Espera por 10 segundos a resposta |
|
|
|
|
* Se cair a conexão no login também retornará false */ |
|
|
|
@ -615,6 +528,12 @@ int wait_response_login(struct s_asterisk *asterisk){
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* limpar buffer antes de começar o comando */ |
|
|
|
|
void clean_buffer_network(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
@ -626,15 +545,19 @@ void clean_buffer_network(struct s_asterisk *asterisk){
|
|
|
|
|
if(pfd[0].revents & POLLIN) { |
|
|
|
|
/* limpa o buffer */ |
|
|
|
|
recv(asterisk->sock_net, asterisk->buffer_from_asterisk, SIZE_buffer_AMI - 1, MSG_DONTWAIT); |
|
|
|
|
memset(&asterisk->buffer_from_asterisk, 0, SIZE_buffer_AMI); |
|
|
|
|
memset( &asterisk->buffer_from_asterisk, 0, SIZE_buffer_AMI ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int verify_reponse_event(struct s_asterisk *asterisk/*, struct s_response_ami *ami_call*/, int *result){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int verify_reponse_event(struct s_asterisk *asterisk/*, struct s_response_ami *ami_call*/, int *result){ |
|
|
|
|
|
|
|
|
|
char name_event[26] = "Event: OriginateResponse"; |
|
|
|
|
char *point = NULL; |
|
|
|
|
char *p = asterisk->buffer_from_asterisk; |
|
|
|
@ -674,6 +597,12 @@ int verify_reponse_event(struct s_asterisk *asterisk/*, struct s_response_ami *a
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int verify_reponse_action(struct s_asterisk *asterisk, int *result){ |
|
|
|
|
|
|
|
|
|
char init_response[60] = "Response: Success\r\nActionID: "; |
|
|
|
@ -702,6 +631,12 @@ int verify_reponse_action(struct s_asterisk *asterisk, int *result){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int verify_reponse_ring(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
|
char name_event[26] = "Event: DialBegin"; |
|
|
|
@ -760,6 +695,11 @@ int verify_reponse_ring(struct s_asterisk *asterisk){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int verify_reponse_answered(struct s_asterisk *asterisk, int *result){ |
|
|
|
|
|
|
|
|
|
char name_event[26] = "Event: DialEnd"; |
|
|
|
@ -850,6 +790,11 @@ int verify_reponse_answered(struct s_asterisk *asterisk, int *result){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int verify_reponse_hangup(struct s_asterisk *asterisk, int *result){ |
|
|
|
|
|
|
|
|
|
char name_event[26] = "Event: Hangup"; |
|
|
|
@ -918,147 +863,8 @@ int verify_reponse_hangup(struct s_asterisk *asterisk, int *result){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int monitor_call(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
|
struct s_response_ami ami_call;
|
|
|
|
|
ami_call.action = 0; |
|
|
|
|
ami_call.response_action = 0; |
|
|
|
|
ami_call.event = 0; |
|
|
|
|
ami_call.ring = 0; |
|
|
|
|
ami_call.answered = 0; |
|
|
|
|
ami_call.hangup = 0; |
|
|
|
|
int result_response = 0; |
|
|
|
|
|
|
|
|
|
while(1){ |
|
|
|
|
struct pollfd pfd[1]; |
|
|
|
|
pfd[0].fd = asterisk->sock_net; |
|
|
|
|
pfd[0].events = POLLIN; |
|
|
|
|
|
|
|
|
|
if(poll(pfd, 1, 30) == -1){ /* erro no pool, caso erro retorna fail na ligação */ |
|
|
|
|
request_error(asterisk->request, CALL_FAIL, POLL_FAIL); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(pfd[0].revents & POLLHUP) { |
|
|
|
|
request_error(asterisk->request, CALL_FAIL, CONNECTION_CLOSE);/* connection down */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if(pfd[0].revents & POLLIN) { |
|
|
|
|
/* buffer */ |
|
|
|
|
int bytes; |
|
|
|
|
bytes = recv(asterisk->sock_net, asterisk->buffer_from_asterisk, SIZE_buffer_AMI - 1, MSG_DONTWAIT); |
|
|
|
|
asterisk->buffer_from_asterisk[bytes] = '\0'; |
|
|
|
|
|
|
|
|
|
/* identifica apenas se AMI recebeu e conseguiu manipular,
|
|
|
|
|
* apenas se a action foi recebida e está formatada corretamente*/ |
|
|
|
|
if(ami_call.response_action == 0 &&
|
|
|
|
|
verify_reponse_action(asterisk, &result_response) == 1){ |
|
|
|
|
|
|
|
|
|
ami_call.response_action = 1; |
|
|
|
|
request_ok(asterisk->request, CALL_OK, ACTION_OK); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
else if(result_response == -1){ |
|
|
|
|
request_error(asterisk->request, CALL_FAIL, ACTION_ERROR); /* action return error */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* verifica o evento resposta Originate */ |
|
|
|
|
result_response = 0; |
|
|
|
|
if(ami_call.response_action == 1 &&
|
|
|
|
|
verify_reponse_event(asterisk, &result_response) == 1){ |
|
|
|
|
|
|
|
|
|
ami_call.event = 1; |
|
|
|
|
request_ok(asterisk->request, CALL_OK, ACTION_EVENT_OK); |
|
|
|
|
} |
|
|
|
|
else if(result_response == -1){ |
|
|
|
|
request_error(asterisk->request, CALL_FAIL, ACTION_EVENT_FAIL); /* fail */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Verifica se está tocando, apenas depois que o primeiro (remetente) atende.
|
|
|
|
|
* Isto é, toque do canal */ |
|
|
|
|
result_response = 0; |
|
|
|
|
if(ami_call.response_action == 1 &&
|
|
|
|
|
ami_call.ring == 0 &&
|
|
|
|
|
ami_call.event == 1 &&
|
|
|
|
|
verify_reponse_ring(asterisk) == 1){ |
|
|
|
|
request_ok(asterisk->request, CALL_RING, CALL_RING); |
|
|
|
|
ami_call.ring = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Apenas verifica se o destinatário atendeu */ |
|
|
|
|
result_response = 0; |
|
|
|
|
if(ami_call.response_action == 1 &&
|
|
|
|
|
ami_call.answered == 0 &&
|
|
|
|
|
verify_reponse_answered(asterisk, &result_response) == 1){ |
|
|
|
|
|
|
|
|
|
ami_call.answered = 1; |
|
|
|
|
request_ok(asterisk->request, CALL_ANSWERED, CALL_ANSWERED); /* atendida */ |
|
|
|
|
} |
|
|
|
|
else if(result_response == -1){ |
|
|
|
|
fflush(stdout); |
|
|
|
|
request_error(asterisk->request, CALL_UNANSWERED, CALL_UNANSWERED); /* não atendida */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* termina a chamada. Aqui também retornará o erro ou a causa do hangup */ |
|
|
|
|
result_response = 0; |
|
|
|
|
if(ami_call.response_action == 1 &&
|
|
|
|
|
ami_call.event == 1 && |
|
|
|
|
ami_call.hangup == 0 &&
|
|
|
|
|
verify_reponse_hangup(asterisk, &result_response) == 1){ |
|
|
|
|
|
|
|
|
|
switch(result_response){ |
|
|
|
|
case 20: |
|
|
|
|
request_error(asterisk->request, CALL_NOT_REGISTER, CALL_NOT_REGISTER); /* ramal não registrado */ |
|
|
|
|
break; |
|
|
|
|
case 21: |
|
|
|
|
request_error(asterisk->request, CALL_REJECT, CALL_REJECT); /* chamada rejeitada */ |
|
|
|
|
break; |
|
|
|
|
case 17: |
|
|
|
|
/* O se tocar, então o ramal naõ está ocupado, logo se sair ele rejeitou */ |
|
|
|
|
if(ami_call.ring == 1) |
|
|
|
|
request_error(asterisk->request, CALL_REJECT, CALL_REJECT); /* chamada rejeitada, isto é, recebeu sinal, mas chegou a tocar*/ |
|
|
|
|
else |
|
|
|
|
request_error(asterisk->request, CALL_BUSY, CALL_BUSY); /* ocupado */ |
|
|
|
|
break; |
|
|
|
|
case 19: |
|
|
|
|
request_error(asterisk->request, CALL_UNANSWERED, CALL_UNANSWERED); /* não respondida */ |
|
|
|
|
break; |
|
|
|
|
case 16: |
|
|
|
|
if(ami_call.answered == 0){ |
|
|
|
|
request_error(asterisk->request, CALL_HANGUP_RING, CALL_HANGUP_RING);/* O remetende desligou no toque */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
request_ok(asterisk->request, HANGUP_SUCCESS, SIGNAL_COMMAND_END);/* Foi desligada normalmente */ |
|
|
|
|
return 1; |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
if(ami_call.answered == 1) |
|
|
|
|
request_error(asterisk->request, CALL_FAIL_CURRENT, CALL_FAIL_CURRENT); /* Algum erro enquanto a chamada estava em curso */ |
|
|
|
|
else |
|
|
|
|
request_error(asterisk->request, CALL_FAIL, CALL_FAIL); /* algum erro antes do destinatário atender */ |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
usleep(10000); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int insert_command_api(struct s_asterisk *asterisk){ |
|
|
|
@ -1129,6 +935,10 @@ OtherChannelId: %s\r\n\r\n", asterisk->actionid, /* ActionID */
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int ami(struct s_asterisk *asterisk){ |
|
|
|
|
|
|
|
|
|
if(send_credentials(asterisk) == -1){ |
|
|
|
@ -1171,8 +981,12 @@ int to_ami(struct s_asterisk *asterisk){
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Essa função será iniciado pela thread
|
|
|
|
|
* */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Essa função será iniciado pela thread */ |
|
|
|
|
void *to_asterisk(void *arg){ |
|
|
|
|
struct s_asterisk asterisk; |
|
|
|
|
asterisk.request = (request_api *) arg; |
|
|
|
@ -1200,6 +1014,12 @@ fail:
|
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int request_ok(request_api *api, int code, int code_extra){ |
|
|
|
|
if(!api){ |
|
|
|
|
reponse_server_ok(NULL, code, code_extra); |
|
|
|
@ -1222,6 +1042,13 @@ int request_ok(request_api *api, int code, int code_extra){
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int request_error(request_api *api, int code, int code_extra){ |
|
|
|
|
|
|
|
|
|
if(!api){ |
|
|
|
|