Browse Source

Código pronto

master
Rodgger 2 years ago
parent
commit
1cb06106b1
  1. 2
      Makefile
  2. 135
      src/ami.c
  3. 17
      src/ami.h
  4. 99
      src/ami_c.h
  5. 142
      src/asterisk.c
  6. 76
      src/asterisk.h
  7. 77
      src/net.c
  8. 26
      src/net.h
  9. 20
      src/parse_action.c
  10. 8
      src/parse_event.c

2
Makefile

@ -24,7 +24,7 @@ $(NAME_LIBRARY):$(OBJ)
$(DIR_OBJ)%.o: $(DIR_SRC)%.c
$(CC) -shared -fPIC -Wall -g -c -o $@ $< $(CFLAGS) -I$(DIR_SRC)
$(CC) -shared -fPIC -Wall -g -Bsymbolic -c -o $@ $< $(CFLAGS) -I$(DIR_SRC)
install:$(NAME_LIBRARY)

135
src/ami.c

@ -13,7 +13,7 @@
* \warning Não deve ser liberada diretamente esse ponteiro. Use a função close_ami.
* \return retorna NULL caso tenha erro
*/
AMI *init_ami(){
AMI *ami_init(){
AMI *ami = calloc(1, sizeof(AMI));
if(!ami){
return NULL;
@ -26,18 +26,44 @@ AMI *init_ami(){
* Essa função encerrará essa instância com ami. A memória será liberada dessa instância
* \return sucesso 0, falha -1
*/
int close_ami(AMI *ami){
int ami_close(AMI *ami){
void *res;
if(pthread_cancel(ami->thread.pthread_net) != 0){
return -1;
}
if(pthread_join(ami->thread.pthread_net, &res) != 0){
return -1;
}
if(res != PTHREAD_CANCELED){
return -1;
}
ami_free( ami );
return 0;
}
int ami_pause(AMI *ami){
ami->net.pause = 1;
return 0;
}
int ami_unpause(AMI *ami){
ami->net.pause = 0;
return 0;
}
/*!
* A conexão com a AMI e algumas informações serão refeitas
* \return sucesso 0, falha -1
*/
int restart_ami(AMI *ami){
int ami_restart(AMI *ami){
ami_connect_login_down(&ami->net, &ami->asterisk);
return 0;
}
@ -46,7 +72,7 @@ int restart_ami(AMI *ami){
* Defini as credenciais necessárias para fazer login com a ami
* \return sucesso 0, falha -1
*/
int set_credentials( AMI *ami, const char *username, const char *password ){
int ami_set_credentials( AMI *ami, const char *username, const char *password ){
if(!username || !password){
return -1;
@ -74,12 +100,12 @@ int set_credentials( AMI *ami, const char *username, const char *password ){
* defini o caminho para conectar ao ami
* \return sucesso 0, falha -1
*/
int set_net( AMI *ami, const char *address, int port ){
int ami_set_net( AMI *ami, const char *address, int port ){
if(!address)
return -1;
if(strlen(address) >= MAX_LEN_ADDRESS){
if(strlen(address) > MAX_LEN_ADDRESS){
return -1;
}
@ -100,7 +126,7 @@ int set_net( AMI *ami, const char *address, int port ){
*/
int ami_c (AMI *ami ){
net_start(ami);
ami_net_start(ami);
return 0;
@ -112,7 +138,7 @@ int ami_c (AMI *ami ){
* Retorna o socket dessa instância que está sendo usado
* \return socket(int)
*/
int get_socket(AMI *ami){
int ami_get_socket(AMI *ami){
return ami->net.sock;
}
@ -123,7 +149,7 @@ int get_socket(AMI *ami){
* Caso não esteja conectado, a biblioteca continuará tentando conectar. A biblioteca irá parar de tentar conectar com a função close_ami.
* \return connectado 1, falha -1
*/
int is_connected(AMI *ami){
int ami_is_connected(AMI *ami){
return ami->net.is_connected;
}
@ -131,9 +157,9 @@ int is_connected(AMI *ami){
/*!
* Verifica se a comunicação está com login sucesso. Retorna 0 a biblioteca tentará fazer o mesmo login. Para parar as tentativas use função close_ami.
* \return sucesso 0, falha -1
* \return sucesso 1, falha -1
*/
int is_logged(AMI *ami){
int ami_is_logged(AMI *ami){
return ami->asterisk.is_logged;
}
@ -142,7 +168,7 @@ int is_logged(AMI *ami){
* Envia a action que está na struct
* \return sucesso actionid, fail -1
*/
int send_action(AMI *ami, struct ss_action *action ){
int ami_send_action(AMI *ami, struct ss_action *action ){
int return_send = -1;
const char *str_action = NULL;
@ -150,14 +176,14 @@ int send_action(AMI *ami, struct ss_action *action ){
if(ami->net.is_connected && ami->asterisk.is_logged){
str_action = build_str_action(action);
actionid_add(&ami->asterisk.list_actionid, action->args[0].value);
ami_actionid_add(&ami->asterisk.list_actionid, action->args[0].value);
return_send = dispatch_action(ami, str_action);
return_send = ami_dispatch_action(ami, str_action);
str_action_free((char *)str_action);
if(return_send == -1){
actionid_remove(&ami->asterisk.list_actionid, action->args[0].value);
ami_actionid_remove(&ami->asterisk.list_actionid, action->args[0].value);
}
}
@ -186,7 +212,7 @@ int send_action(AMI *ami, struct ss_action *action ){
*
* \return poteiro do tipo ss_action. A action será criada automaticamente na primeira posição dos argumentos
*/
struct ss_action *create_new_action(unsigned int args){
struct ss_action *ami_create_new_action(unsigned int args){
struct ss_action *action = NULL;
@ -209,7 +235,7 @@ struct ss_action *create_new_action(unsigned int args){
* Libera ponteiro para para estrutura ss_action
* \return sucesso 0 sempre
*/
int destroy_action(struct ss_action *action){
int ami_destroy_action(struct ss_action *action){
free(action->args);
free(action);
@ -224,8 +250,8 @@ int destroy_action(struct ss_action *action){
* \param events lista de eventos obtidas pela função get_events
*
*/
void destroy_events(AMI *ami, EVENT *events){
list_event_free(events);
void ami_destroy_events(AMI *ami, EVENT *events){
ami_list_event_free(events);
}
@ -236,8 +262,8 @@ void destroy_events(AMI *ami, EVENT *events){
* \param response ponteiro da estrutura response
*
*/
void destroy_response(AMI *ami, RESPONSE *response){
response_free(response);
void ami_destroy_response(AMI *ami, RESPONSE *response){
ami_response_free(response);
}
@ -246,11 +272,11 @@ void destroy_response(AMI *ami, RESPONSE *response){
* \param ami a sua instância que está usando a biblioteca
* \return events lista de eventos, NULL caso não tenha eventos
*/
EVENT *get_events(AMI *ami){
EVENT *ami_get_events(AMI *ami){
EVENT *events;
pthread_mutex_lock(&ami->thread.mutex_events);
events = isolate_events(&ami->events);
events = ami_isolate_events(&ami->events);
pthread_mutex_unlock(&ami->thread.mutex_events);
return events;
@ -263,10 +289,10 @@ EVENT *get_events(AMI *ami){
* \param actionid da action que vai procurar
* \return response ou NULL não RESPONSE (talvez AMI ainda não retornou)
*/
RESPONSE *get_actions_response(AMI *ami, const char *actionid){
RESPONSE *ami_get_actions_response(AMI *ami, const char *actionid){
RESPONSE *response = NULL;
pthread_mutex_lock(&ami->thread.mutex_actions);
response = isolate_action_response(get_action( &ami->actions, actionid ));
response = ami_isolate_action_response(ami_get_action( &ami->actions, actionid ));
pthread_mutex_unlock(&ami->thread.mutex_actions);
return response;
@ -279,10 +305,10 @@ RESPONSE *get_actions_response(AMI *ami, const char *actionid){
* \param actionid identificação das actions
* \return event ou NULL não eventos (talvez AMI ainda não enviou)
*/
EVENT *get_actions_event(AMI *ami, const char *actionid){
EVENT *ami_get_actions_event(AMI *ami, const char *actionid){
EVENT *events = NULL;
pthread_mutex_lock(&ami->thread.mutex_actions);
events = isolate_action_events( get_action( &ami->actions, actionid ));
events = ami_isolate_action_events( ami_get_action( &ami->actions, actionid ));
pthread_mutex_unlock(&ami->thread.mutex_actions);
return events;
@ -296,7 +322,7 @@ EVENT *get_actions_event(AMI *ami, const char *actionid){
* \param status status > 0 eventos OFF, status <= 0 eventos ON
* \return sempre 0
*/
int set_disable_events( AMI *ami, int status ){
int ami_set_disable_events( AMI *ami, int status ){
pthread_mutex_lock(&ami->thread.mutex_events);
if( status > 0 ){
@ -316,9 +342,58 @@ int set_disable_events( AMI *ami, int status ){
* \param ami instânca da biblioteca ami
* \return 0 eventos ON, 1 eventos OFF
*/
int get_disable_events(AMI *ami){
int ami_get_disable_events(AMI *ami){
return ami->asterisk.disable_events;
}
/*!
* Obtém o valor dos argumentos do Response ou EVENTS
* \param args
* \pamra key
* \return value ou NULL se o valor é nulo ou não existe
*/
const char *ami_get_value( AMI *ami, ARGS *args, const char *key ){
const char *value = NULL;
value = ami_get_key_value(&args, key);
return value;
}
/*!
* Verifica se a chave existi na lista de argumentos
* \param args lista de argumentos
* \param value a chave
* \return existe 0 ou não existe -1
*/
int ami_has_key( AMI *ami, ARGS *args, const char *key){
int exist;
exist = ami_exist_key(&args, key);
return exist;
}
/*
*
*
*/
EVENT *ami_get_event_name( AMI *ami, EVENT *list_event, const char *event_name ){
while( list_event ){
if( !strcasecmp(list_event->event, event_name) ){
return list_event;
}
list_event = list_event->next;
}
return NULL;
}

17
src/ami.h

@ -15,9 +15,9 @@
#define MAX_BUFFER_NET PATH_MAX + PATH_MAX /*!< O comprimento máximo que poderá obter através do recv */
typedef struct s_actionid {
typedef struct s_ami_actionid {
char actionid[MAX_LEN_VALUE_ACTION];
struct s_actionid *next;
struct s_ami_actionid *next;
} ACTIONID;
@ -25,7 +25,7 @@ typedef struct s_actionid {
* Estrutura asterisk
* Dentro do AMI
*/
typedef struct s_asterisk {
typedef struct s_ami_asterisk {
unsigned int is_logged:1; /*!< */
unsigned int disable_events:1; /*!< disativa os eventos sem actionid */
ACTIONID *list_actionid;
@ -37,9 +37,8 @@ typedef struct s_asterisk {
* Estrutura contém as informações de thread dessa instância
* Dentro AMI
*/
typedef struct s_thread {
typedef struct s_ami_thread {
pthread_t pthread_net; /*!< thread de rede */
int thread_net; /*!< identificação da thread */
pthread_mutex_t mutex_events; /*<! controle para colocar EVENT externo */
pthread_mutex_t mutex_actions; /*<! controle para colocar RESPONSE e EVENT (das actions) externo */
} THREAD;
@ -50,7 +49,7 @@ typedef struct s_thread {
* Informações sobre comunicação
* Dentro AMI
*/
typedef struct s_net{
typedef struct s_ami_net{
int address; /*!< endereço IPV4 da ami em binary */
char str_address[MAX_LEN_ADDRESS + 1]; /*!< endereço IPV4 da ami em ascii */
int port; /*!< número da porta que a ami está escutando */
@ -60,7 +59,7 @@ typedef struct s_net{
unsigned int imcomplete_net:1;
unsigned int is_connected:1; /*<! Está conectado */
int timeout;
int q_ndata;
int pause;
} NET;
@ -69,7 +68,7 @@ typedef struct s_net{
* Informação sobre credenciais para fazer login no ami.
* Dentro AMI
*/
typedef struct s_credentials{
typedef struct s_ami_credentials{
char username[MAX_LEN_USERNAME + 1]; /*!< usuário do ami */
char password[MAX_LEN_PASSWORD + 1]; /*!< secret (password) do ami */
} CREDENTIAL;
@ -82,7 +81,7 @@ typedef struct s_credentials{
* Essa estrutura será opaco para o user externo
*/
struct ami {
int error_code; /*!< erro no ami */
int error_code; /*!< error no ami */
NET net; /*!< sobre a transmissão */
CREDENTIAL credential; /*!< credenciais do ami */
ACTION *actions; /*!< action recebido da ami. Respostas e event */

99
src/ami_c.h

@ -11,6 +11,7 @@
#define MAX_LEN_ACTION 0x80
#define MAX_LEN_EVENT 0x4000
/*!
* Estrutura dos dados que chegam da ami
* Ex:
@ -19,10 +20,10 @@
* key: value\n
* key: value\n
*/
typedef struct s_args {
typedef struct s_ami_args {
char *key; /*!< chave do argumento */
char *value; /*!< value do argumento */
struct s_args *next;
struct s_ami_args *next;
} ARGS;
@ -30,7 +31,7 @@ typedef struct s_args {
/*!
* Estrutura de dados da resposta da AMI e suas chaves e valores
*/
typedef struct s_response {
typedef struct s_ami_response {
char *response; /*!< valor da chave response no bloco */
ARGS *args; /*!< argumentos do bloco response */
int count; /*!< quantidade de argumentos */
@ -41,39 +42,45 @@ typedef struct s_response {
/*!
* informação do evento
*/
typedef struct s_event{
typedef struct s_ami_event{
char *event; /*!< nome do evento */
ARGS *args; /*!< argumentos do evento */
int count; /*!< constagem do event. decrescente 1000 - 0 */
struct s_event *next;
struct s_ami_event *next;
} EVENT;
/*!
* informação da action recebida
* Dentro ami
* informação da action recebida da ami
*/
typedef struct s_action{
typedef struct s_ami_action{
RESPONSE *response;
char *actionid;
EVENT *events;
struct s_action *next;
struct s_ami_action *next;
} ACTION;
/*!
* argumentos das action
*/
struct ss_args {
char key[MAX_LEN_KEY_ACTION];
char value[MAX_LEN_VALUE_ACTION];
};
/*!
* estrutura da action
*/
struct ss_action {
char name_action[MAX_LEN_NAME_ACTION];
int count_args;
struct ss_args *args;
};
// estrutura opaca
typedef struct ami AMI;
@ -83,7 +90,7 @@ typedef struct ami AMI;
* \warning Não deve ser liberada diretamente esse ponteiro. Use a função close_ami.
* \return retorna NULL caso tenha erro
*/
AMI *init_ami();
AMI *ami_init();
@ -92,7 +99,7 @@ AMI *init_ami();
* Essa função encerrará essa instância com ami. A memória será liberada dessa instância
* \return sucesso 0, falha -1
*/
int close_ami(AMI *ami);
int ami_close(AMI *ami);
@ -101,7 +108,7 @@ int close_ami(AMI *ami);
* A conexão com a AMI e algumas informações serão refeitas
* \return sucesso 0, falha -1
*/
int restart_ami(AMI *ami);
int ami_restart_(AMI *ami);
@ -110,7 +117,7 @@ int restart_ami(AMI *ami);
* Defini as credenciais necessárias para fazer login com a ami
* \return sucesso 0, falha -1
*/
int set_credentials( AMI *ami, const char *username, const char *password );
int ami_set_credentials( AMI *ami, const char *username, const char *password );
@ -119,7 +126,7 @@ int set_credentials( AMI *ami, const char *username, const char *password );
* defini o caminho para conectar ao ami
* \return sucesso 0, falha -1
*/
int set_net( AMI *ami, const char *address, int port );
int ami_set_net( AMI *ami, const char *address, int port );
@ -137,7 +144,7 @@ int ami_c (AMI *ami );
* Retorna o socket dessa instância que está sendo usado
* \return socket(int)
*/
int get_socket(AMI *ami);
int ami_get_socket(AMI *ami);
@ -145,18 +152,18 @@ int get_socket(AMI *ami);
/*!
* Está connectado ao ami do asterisk.\n
* Caso não esteja conectado, a biblioteca continuará tentando conectar. A biblioteca irá parar de tentar conectar com a função close_ami.
* \return connectado 1, falha -1
* \return connectado 1, falha 0
*/
int is_connected(AMI *ami);
int ami_is_connected(AMI *ami);
/*!
* Verifica se a comunicação está com login sucesso. Retorna 0 a biblioteca tentará fazer o mesmo login. Para parar as tentativas use função close_ami.
* \return sucesso 0, falha -1
* \return sucesso 1, falha 0
*/
int is_logged(AMI *ami);
int ami_is_logged(AMI *ami);
@ -165,7 +172,7 @@ int is_logged(AMI *ami);
* Envia a action que está na struct
* \return sucesso actionid, fail -1
*/
int send_action(AMI *ami, struct ss_action *action );
int ami_send_action(AMI *ami, struct ss_action *action );
@ -191,7 +198,7 @@ int send_action(AMI *ami, struct ss_action *action );
*
* \return poteiro do tipo ss_action. A action será criada automaticamente na primeira posição dos argumentos
*/
struct ss_action *create_new_action(unsigned int args);
struct ss_action *ami_create_new_action(unsigned int args);
@ -200,7 +207,7 @@ struct ss_action *create_new_action(unsigned int args);
* Libera ponteiro para para estrutura ss_action
* \return sucesso 0 sempre
*/
int destroy_action(struct ss_action *action);
int ami_destroy_action(struct ss_action *action);
@ -210,7 +217,7 @@ int destroy_action(struct ss_action *action);
* \param events lista de eventos obtidas pela função get_events
*
*/
void destroy_events(AMI *ami, EVENT *events);
void ami_destroy_events(AMI *ami, EVENT *events);
@ -220,7 +227,7 @@ void destroy_events(AMI *ami, EVENT *events);
* \param response ponteiro da estrutura response
*
*/
void destroy_response(AMI *ami, RESPONSE *response);
void ami_destroy_response(AMI *ami, RESPONSE *response);
@ -229,7 +236,7 @@ void destroy_response(AMI *ami, RESPONSE *response);
* \param ami estrutura
* \return events lista de eventos, NULL caso não tenha eventos
*/
EVENT *get_events(AMI *ami);
EVENT *ami_get_events(AMI *ami);
@ -239,7 +246,7 @@ EVENT *get_events(AMI *ami);
* \param actionid da action que vai procurar
* \return response ou NULL não RESPONSE (talvez AMI ainda não retornou)
*/
RESPONSE *get_actions_response(AMI *ami, const char *actionid);
RESPONSE *ami_get_actions_response(AMI *ami, const char *actionid);
@ -249,7 +256,7 @@ RESPONSE *get_actions_response(AMI *ami, const char *actionid);
* \param actionid identificação das actions
* \return event ou NULL não eventos (talvez AMI ainda não enviou)
*/
EVENT *get_actions_event(AMI *ami, const char *actionid);
EVENT *ami_get_actions_event(AMI *ami, const char *actionid);
@ -259,18 +266,48 @@ EVENT *get_actions_event(AMI *ami, const char *actionid);
* \param status status > 0 eventos OFF, status <= 0 eventos ON
* \return sempre 0
*/
int set_disable_events( AMI *ami, int status );
int ami_set_disable_events( AMI *ami, int status );
/*!
* Retorna se os eventos sem actionid estão desativados
* \param ami instânca da biblioteca ami
* \param ami instânca da biblioteca ami, estrutura opaca
* \return 0 eventos ON, 1 eventos OFF
*/
int get_disable_events(AMI *ami);
int ami_get_disable_events(AMI *ami);
/*!
* Obtém o valor dos argumentos do Response ou EVENTS
* \param ami estrutura opaca
* \param args lista de argumentos
* \pamra key chave do argumento
* \return value ou NULL se o valor é nulo ou não existe
*/
const char *ami_get_value(AMI *ami, ARGS *args, const char *key );
/*!
* Verifica se a chave existi na lista de argumentos
* \param ami estrutura opaca
* \param args lista de argumentos
* \param value a chave
* \return existe 0 ou não existe -1
*/
int ami_has_key( AMI *ami, ARGS *args, const char *key);
/*!
* Procurar um evento dentro da lista de eventos.
* \param ami estrutura opaca
* \param list_event lista de eventos
* \param event_name nome do evento que será procurado
* \return ponteiro para o primeiro evento na lista ou ponteiro NULL não existe evento
*/
EVENT *ami_get_event_name( AMI *ami, EVENT *list_event, const char *event_name );
#endif

142
src/asterisk.c

@ -2,6 +2,31 @@
#include <string.h>
int ami_free(AMI *ami){
ami_list_action_free(ami->actions);
ami_list_event_free(ami->events);
ami_list_actionid_free( ami->asterisk.list_actionid );
free(ami);
return 0;
}
int ami_list_actionid_free( ACTIONID *list_actionid ){
if(list_actionid){
ami_list_actionid_free( list_actionid->next );
}
free( list_actionid );
return 0;
}
/*!
* Verifica se o evento continua esperando informação da AMI
@ -10,7 +35,7 @@
* \param actionid valor da actionid que será verificada
* \return sucesso 0, falha -1
*/
int is_actionid(struct s_actionid **list_actions, const char *actionid){
int ami_is_actionid(ACTIONID **list_actions, const char *actionid){
int bytes = strlen(actionid);
@ -34,13 +59,13 @@ int is_actionid(struct s_actionid **list_actions, const char *actionid){
*
* \return sucesso 0, falha -1
*/
int actionid_add(struct s_actionid **list_actions, const char *actionid){
int ami_actionid_add(ACTIONID **list_actions, const char *actionid){
while( (*list_actions) ){
list_actions = &(*list_actions)->next;
}
*list_actions = calloc(1, sizeof(struct s_actionid));
*list_actions = calloc(1, sizeof(ACTIONID));
strcpy((*list_actions)->actionid, actionid);
@ -57,16 +82,16 @@ int actionid_add(struct s_actionid **list_actions, const char *actionid){
* \param actionid actionid que será excluída da lista
* \return sucesso 0, falha -1
*/
int actionid_remove( struct s_actionid **list_actions, const char *actionid ){
int ami_actionid_remove( ACTIONID **list_actions, const char *actionid ){
struct s_actionid *drop_actionid = NULL;
ACTIONID *drop_actionid = NULL;
while( (*list_actions) ){
if( !strcmp( (*list_actions)->actionid, actionid ) ){
drop_actionid = *list_actions;
*list_actions = (*list_actions)->next;
actionid_free(drop_actionid);
ami_actionid_free(drop_actionid);
return 0;
}
}
@ -80,7 +105,7 @@ int actionid_remove( struct s_actionid **list_actions, const char *actionid ){
* \param drop_actionid ponteiro para estrutura
* \return 0 sempre
*/
int actionid_free( struct s_actionid *drop_actionid ){
int ami_actionid_free( ACTIONID *drop_actionid ){
free(drop_actionid);
return 0;
@ -93,7 +118,7 @@ int actionid_free( struct s_actionid *drop_actionid ){
* \param arg actionid que será verificada se está na lista
* \return 0 não existe, 1 existe
*/
int exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid){
int ami_exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid){
while(*list_actionid){
if(!strcmp((*list_actionid)->actionid, actionid->actionid)){
@ -108,8 +133,6 @@ int exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid){
////* EVENT *////
/*!
* Redireciona se o evento é uma resposta ou não da action
@ -118,17 +141,17 @@ int exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid){
* \param event estrutura evento
* \return sucesso 0, falha -1 ( o ponteiro event é liberado)
*/
int event_redirect(AMI *ami, EVENT *event){
int ami_event_redirect(AMI *ami, EVENT *event){
const char *str_actionid = "Actionid";
if(exist_key(&event->args, str_actionid) == -1){
if(ami_exist_key(&event->args, str_actionid) == -1){
if(ami->asterisk.disable_events == 0){
event_add(&ami->events, event);
ami_event_add(&ami->events, event);
}
}
else{
if(action_event_add(&ami->actions, event) == -1){
event_free(event);
if(ami_action_event_add(&ami->actions, event) == -1){
ami_event_free(event);
return -1;
}
}
@ -143,9 +166,8 @@ int event_redirect(AMI *ami, EVENT *event){
* Adicionar eventos lista de eventos da ami.
* \param event lista de eventos recebido do AMI
* \param next próximo evento que será incluído na lista de eventos
*
*/
void event_add(EVENT **event, EVENT *next){
void ami_event_add(EVENT **event, EVENT *next){
EVENT **init_event = event;
size_t len_event = 0;
@ -160,7 +182,7 @@ void event_add(EVENT **event, EVENT *next){
if( len_event >= MAX_LEN_EVENT ){
EVENT *p_event = *init_event;
*init_event = p_event->next;
event_free(p_event);
ami_event_free(p_event);
}
}
@ -173,7 +195,7 @@ void event_add(EVENT **event, EVENT *next){
*
* \return p_event um novo espaço para alocar eventos da AMI
*/
EVENT *event_create(){
EVENT *ami_event_create(){
EVENT *p_event = calloc(1, sizeof(EVENT));
return p_event;
}
@ -184,14 +206,14 @@ EVENT *event_create(){
*
* \param event estrutura que contém um evento da AMI
*/
void event_free( EVENT *event ){
void ami_event_free( EVENT *event ){
if(!event){
return;
}
free(event->event);
list_args_free(event->args);
ami_list_args_free(event->args);
free(event);
}
@ -203,13 +225,13 @@ void event_free( EVENT *event ){
*
* \param event lista de eventos que serão liberadas
*/
void list_event_free(EVENT *event){
void ami_list_event_free(EVENT *event){
if(event){
list_event_free(event->next);
ami_list_event_free(event->next);
}
event_free(event);
ami_event_free(event);
}
@ -222,7 +244,7 @@ void list_event_free(EVENT *event){
* \param args lista de argumentos
* \param arg argumento que será inserido
*/
void args_add( ARGS **args, ARGS *arg ){
void ami_args_add( ARGS **args, ARGS *arg ){
while(*args){
args = &(*args)->next;
@ -235,10 +257,10 @@ void args_add( ARGS **args, ARGS *arg ){
/*!
* Cria uma estrutura para um argumento.
* \return arg estrutura do tipo struct s_args
* \return arg estrutura do tipo ARGS
*/
struct s_args *arg_create(){
struct s_args *arg = calloc(1, sizeof(struct s_args));
ARGS *ami_arg_create(){
ARGS *arg = calloc(1, sizeof(ARGS));
return arg;
}
@ -247,7 +269,7 @@ struct s_args *arg_create(){
* libera o ponteiro para estrutura do argumento.
* \param arg liberar ponteiro
*/
void args_free(ARGS *arg){
void ami_args_free(ARGS *arg){
if(!arg){
return;
@ -265,13 +287,13 @@ void args_free(ARGS *arg){
* \param args pointeiro para essa lista
*
*/
void list_args_free(ARGS *args){
void ami_list_args_free(ARGS *args){
if(args){
list_args_free(args->next);
ami_list_args_free(args->next);
}
args_free(args);
ami_args_free(args);
}
/*!
@ -279,7 +301,7 @@ void list_args_free(ARGS *args){
* \param args lista de argumentos
* \return sucesso actionid, NULL não existe actionid(ou valoe é nulo)
*/
const char *get_actionid(ARGS **args){
const char *ami_get_actionid(ARGS **args){
char *str_actionid = "Actionid";
@ -301,7 +323,7 @@ const char *get_actionid(ARGS **args){
* \param key chave que será procurada
* \return retorna o valor da chave, NULL chave não existe ou o valor é nulo( use exist_key para verificar se chave existe)
*/
const char *get_key_value(ARGS **args, const char *key){
const char *ami_get_key_value(ARGS **args, const char *key){
if(!key){
return NULL;
@ -326,7 +348,7 @@ const char *get_key_value(ARGS **args, const char *key){
* \param key chave do argumento
* \return existe 0, não existe -1
*/
int exist_key(ARGS **args, const char *key){
int ami_exist_key(ARGS **args, const char *key){
while(*args){
if(!strcasecmp((*args)->key, key)){
@ -345,7 +367,7 @@ int exist_key(ARGS **args, const char *key){
* Cria estrutura RESPONSE
* \return response estrutura vazia que será usada para preencher resposta da AMI
*/
RESPONSE *response_create(){
RESPONSE *ami_response_create(){
RESPONSE *response;
response = calloc(1, sizeof(RESPONSE));
return response;
@ -357,7 +379,7 @@ RESPONSE *response_create(){
* \param action estrutura action
* \param response será adicionado para o ACtion
*/
void action_response_add(ACTION *action, RESPONSE *response){
void ami_action_response_add(ACTION *action, RESPONSE *response){
if(!action->response){
action->response = response;
@ -369,13 +391,13 @@ void action_response_add(ACTION *action, RESPONSE *response){
* Libera espaço do ponteiro da entrutura RESPONSE
* \param response estrutura response que será liberada
*/
int response_free(RESPONSE *response){
int ami_response_free(RESPONSE *response){
if(!response){
return -1;
}
list_args_free(response->args);
ami_list_args_free(response->args);
free(response);
return 0;
@ -387,7 +409,7 @@ int response_free(RESPONSE *response){
* criar estrutura para preenche-la com resposta da action
* \return action nova estrutura ACTION
*/
ACTION *action_create(){
ACTION *ami_action_create(){
ACTION * action;
action = calloc(1, sizeof(ACTION));
return action;
@ -400,13 +422,13 @@ ACTION *action_create(){
* \param toremove o action que será escluída da lista
* \return
*/
int action_remove(ACTION **list_action, ACTION *toremove){
int ami_action_remove(ACTION **list_action, ACTION *toremove){
while(*list_action){
if(*list_action == toremove){
ACTION *p = (*list_action);
(*list_action) = (*list_action)->next;
action_free(p);
ami_action_free(p);
return 0;
}
@ -422,13 +444,13 @@ int action_remove(ACTION **list_action, ACTION *toremove){
* \param list_action lista das action
* \return 0
*/
int list_action_free(ACTION *list_action){
int ami_list_action_free(ACTION *list_action){
if(list_action){
list_action_free(list_action->next);
ami_list_action_free(list_action->next);
}
action_free(list_action);
ami_action_free(list_action);
return 0;
}
@ -439,15 +461,15 @@ int list_action_free(ACTION *list_action){
* \param action ponteiro para estrutura action
* \return sempre sucesso 0
*/
int action_free(ACTION *action){
int ami_action_free(ACTION *action){
if(!action){
return -1;
}
response_free(action->response);
ami_response_free(action->response);
free(action->actionid);
list_event_free(action->events);
ami_list_event_free(action->events);
free(action);
return 0;
@ -460,13 +482,13 @@ int action_free(ACTION *action){
* \param next estrutura action que será inserida
* \return sucesso 0, falha -1 (ponteiro next será liberado)
*/
int action_add(ACTION **action, ACTION *next){
int ami_action_add(ACTION **action, ACTION *next){
ACTION **init_action = action;
size_t len_action = 0;
if(!next->actionid){
action_free(next);
ami_action_free(next);
return -1;
}
@ -478,7 +500,7 @@ int action_add(ACTION **action, ACTION *next){
if(len_action > MAX_LEN_ACTION){
ACTION *p_action = *init_action;
*init_action = p_action->next;
action_free(p_action);
ami_action_free(p_action);
}
*action = next;
@ -494,9 +516,9 @@ int action_add(ACTION **action, ACTION *next){
* \para event estrutura EVENT
* \return sucesso 0, event não adicionado -1
*/
int action_event_add(ACTION **list_action, EVENT *event){
int ami_action_event_add(ACTION **list_action, EVENT *event){
const char *actionid = get_actionid(&event->args);
const char *actionid = ami_get_actionid(&event->args);
if(!actionid){
return -1;
@ -504,7 +526,7 @@ int action_event_add(ACTION **list_action, EVENT *event){
while((*list_action)){
if(!strcasecmp((*list_action)->actionid, actionid)){
event_add(&(*list_action)->events, event);
ami_event_add(&(*list_action)->events, event);
return 0;
}
@ -522,12 +544,12 @@ int action_event_add(ACTION **list_action, EVENT *event){
* \param action ponteiro action
* \return sucesso 0, falha -1
*/
int set_action_actionid( ACTION *action ){
int ami_set_action_actionid( ACTION *action ){
const char *actionid = NULL;
RESPONSE *response = action->response;
actionid = get_key_value(&response->args, "Actionid");
actionid = ami_get_key_value(&response->args, "Actionid");
if( NULL == actionid ){
return -1;
}
@ -546,7 +568,7 @@ int set_action_actionid( ACTION *action ){
* \param actionid procurar a actions que tem o mesmo
* \return sucesso action, NULL não existe action com aquela actionid
*/
ACTION *get_action(ACTION **list_actions, const char* actionid){
ACTION *ami_get_action(ACTION **list_actions, const char* actionid){
if(!(*list_actions)){
return NULL;
}
@ -569,7 +591,7 @@ ACTION *get_action(ACTION **list_actions, const char* actionid){
* \param events lista de eventos
* \return np_events
*/
EVENT *isolate_events(EVENT **events){
EVENT *ami_isolate_events(EVENT **events){
EVENT *np_events;
np_events = *events;
*events = NULL;
@ -583,7 +605,7 @@ EVENT *isolate_events(EVENT **events){
* \param action estrutura da resposta
* \return reponse
*/
RESPONSE *isolate_action_response( ACTION *action ){
RESPONSE *ami_isolate_action_response( ACTION *action ){
RESPONSE *response = NULL;
@ -603,7 +625,7 @@ RESPONSE *isolate_action_response( ACTION *action ){
* \param action estrutura de resposta
* \return events
*/
EVENT *isolate_action_events(ACTION *action){
EVENT *ami_isolate_action_events(ACTION *action){
EVENT *events = NULL;

76
src/asterisk.h

@ -3,11 +3,17 @@
#define ASTERISK_H 1
int ami_free( AMI *ami );
int ami_list_actionid_free( ACTIONID *list_actionid );
/*!
* A função é usado para inicializar ami com métodos que retornarão informação ami ami
* \param ami estrutura sobre informações da ami (asterisk)
*/
int init_methods( AMI *ami );
int ami_init_methods( AMI *ami );
@ -18,7 +24,7 @@ int init_methods( AMI *ami );
* \param actionid valor da actionid que será verificada
* \return sucesso 0, falha -1
*/
int is_actionid(struct s_actionid **list_actions, const char *actionid);
int ami_is_actionid(ACTIONID **list_actions, const char *actionid);
@ -30,7 +36,7 @@ int is_actionid(struct s_actionid **list_actions, const char *actionid);
*
* \return sucesso 0, falha -1
*/
int actionid_add(struct s_actionid **list_actions, const char *actionid);
int ami_actionid_add(ACTIONID **list_actions, const char *actionid);
@ -43,7 +49,7 @@ int actionid_add(struct s_actionid **list_actions, const char *actionid);
*
* \return sucesso 0, falha -1
*/
int actionid_remove( struct s_actionid **list_actions, const char *actionid );
int ami_actionid_remove( ACTIONID **list_actions, const char *actionid );
@ -52,7 +58,7 @@ int actionid_remove( struct s_actionid **list_actions, const char *actionid );
* \param drop_actionid ponteiro para estrutura
* \return 0 sempre
*/
int actionid_free( struct s_actionid *drop_actionid );
int ami_actionid_free( ACTIONID *drop_actionid );
@ -62,7 +68,7 @@ int actionid_free( struct s_actionid *drop_actionid );
* \param arg actionid que será verificada se está na lista
* \return 0 não existe, 1 existe
*/
int exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid);
int ami_exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid);
@ -72,7 +78,7 @@ int exist_actionid(ACTIONID **list_actionid, ACTIONID *actionid);
* \param arg actionid que será verificada
* \return 0 não existe, 1 existe
*/
int exist_actionid_internal(ACTIONID **list_actionid, ACTIONID *actionid);
int ami_exist_actionid_internal(ACTIONID **list_actionid, ACTIONID *actionid);
/*!
@ -82,7 +88,7 @@ int exist_actionid_internal(ACTIONID **list_actionid, ACTIONID *actionid);
* \param event estrutura evento
* \return sucesso 0, falha -1 ( o ponteiro event é liberado)
*/
int event_redirect(AMI *ami, EVENT *event);
int ami_event_redirect(AMI *ami, EVENT *event);
@ -93,7 +99,7 @@ int event_redirect(AMI *ami, EVENT *event);
* \param next próximo evento que será incluído na lista de eventos
*
*/
void event_add(EVENT **event, EVENT *next);
void ami_event_add(EVENT **event, EVENT *next);
@ -104,7 +110,7 @@ void event_add(EVENT **event, EVENT *next);
*
* \return p_event um novo espaço para alocar eventos da AMI
*/
EVENT *event_create();
EVENT *ami_event_create();
@ -113,7 +119,7 @@ EVENT *event_create();
*
* \param event estrutura que contém um evento da AMI
*/
void event_free( EVENT *event );
void ami_event_free( EVENT *event );
@ -122,7 +128,7 @@ void event_free( EVENT *event );
*
* \param event lista de eventos que serão liberadas
*/
void list_event_free(EVENT *event);
void ami_list_event_free(EVENT *event);
@ -133,7 +139,7 @@ void list_event_free(EVENT *event);
* \param arg
*
*/
void args_event_add(EVENT *event, struct s_args *arg);
void ami_args_event_add(EVENT *event, ARGS *arg);
@ -144,7 +150,7 @@ void args_event_add(EVENT *event, struct s_args *arg);
* \param key chave do argumento
* \return existe 0, não existe -1
*/
int exist_key(ARGS **args, const char *key);
int ami_exist_key(ARGS **args, const char *key);
/*!
@ -153,7 +159,7 @@ int exist_key(ARGS **args, const char *key);
* \param key chave que será procurada
* \return retorna o valor da chave, NULL chave não existe ou o valor é nulo( use exist_key para verificar se chave existe)
*/
const char *get_key_value(ARGS **args, const char *key);
const char *ami_get_key_value(ARGS **args, const char *key);
/*!
@ -161,15 +167,15 @@ const char *get_key_value(ARGS **args, const char *key);
* \param args lista de argumentos
* \param arg argumento que será inserido na lista
*/
void args_add( ARGS **args, ARGS *arg );
void ami_args_add( ARGS **args, ARGS *arg );
/*!
* Cria uma estrutura para um argumento.
* \return arg estrutura do tipo struct s_args
* \return arg estrutura do tipo ARGS
*/
struct s_args *arg_create();
ARGS *ami_arg_create();
@ -178,7 +184,7 @@ struct s_args *arg_create();
*
* \return void
*/
void args_free(ARGS *arg);
void ami_args_free(ARGS *arg);
@ -187,7 +193,7 @@ void args_free(ARGS *arg);
* \param args pointeiro para essa lista
*
*/
void list_args_free(ARGS *args);
void ami_list_args_free(ARGS *args);
@ -195,7 +201,7 @@ void list_args_free(ARGS *args);
* Cria estrutura RESPONSE
* \return response estrutura vazia que será usada para preencher resposta da AMI
*/
RESPONSE *response_create();
RESPONSE *ami_response_create();
@ -204,7 +210,7 @@ RESPONSE *response_create();
* \param action estrutura action
* \param response será adicionado para o ACtion
*/
void action_response_add(ACTION *action, RESPONSE *response);
void ami_action_response_add(ACTION *action, RESPONSE *response);
@ -212,7 +218,7 @@ void action_response_add(ACTION *action, RESPONSE *response);
* Libera espaço do ponteiro da entrutura RESPONSE
* \param response estrutura response que será liberada
*/
int response_free(RESPONSE *response);
int ami_response_free(RESPONSE *response);
@ -220,7 +226,7 @@ int response_free(RESPONSE *response);
* criar estrutura para preenche-la com resposta da action
* \return ACTION nova estrutura ACTION
*/
ACTION *action_create();
ACTION *ami_action_create();
@ -230,7 +236,7 @@ ACTION *action_create();
* \param toremove o action que será escluída da lista
* \return 0 sempre
*/
int action_remove(ACTION **list_action, ACTION *toremove);
int ami_action_remove(ACTION **list_action, ACTION *toremove);
@ -239,7 +245,7 @@ int action_remove(ACTION **list_action, ACTION *toremove);
* \param list_action lista das action
* \return 0
*/
int list_action_free(ACTION *list_action);
int ami_list_action_free(ACTION *list_action);
@ -252,7 +258,7 @@ int list_action_free(ACTION *list_action);
*
* \return sucesso 0, falha -1
*/
int actionid_remove( struct s_actionid **list_actions, const char *actionid );
int ami_actionid_remove( ACTIONID **list_actions, const char *actionid );
@ -261,7 +267,7 @@ int actionid_remove( struct s_actionid **list_actions, const char *actionid );
* \param action ponteiro para estrutura action
* \return sempre sucesso 0
*/
int action_free(ACTION *action);
int ami_action_free(ACTION *action);
@ -271,7 +277,7 @@ int action_free(ACTION *action);
* \param next estrutura action que será inserida
* \return sucesso 0, falha -1
*/
int action_add(ACTION **action, ACTION *next);
int ami_action_add(ACTION **action, ACTION *next);
@ -280,7 +286,7 @@ int action_add(ACTION **action, ACTION *next);
* \param action ponteiro action
* \return sucesso 0, falha -1
*/
int set_action_actionid( ACTION *action );
int ami_set_action_actionid( ACTION *action );
/*!
@ -290,7 +296,7 @@ int set_action_actionid( ACTION *action );
* \para event estrutura EVENT
* \return sucesso 0, event não adicionado -1
*/
int action_event_add(ACTION **list_action, EVENT *event);
int ami_action_event_add(ACTION **list_action, EVENT *event);
/*!
@ -299,7 +305,7 @@ int action_event_add(ACTION **list_action, EVENT *event);
* \param actionid procurar a actions que tem o mesmo
* \return sucesso action, NULL não existe action com aquela actionid
*/
ACTION *get_action(ACTION **list_actions, const char* actionid);
ACTION *ami_get_action(ACTION **list_actions, const char* actionid);
/*!
@ -307,7 +313,7 @@ ACTION *get_action(ACTION **list_actions, const char* actionid);
* \param events lista de eventos
* \return np_events
*/
EVENT *isolate_events(EVENT **events);
EVENT *ami_isolate_events(EVENT **events);
/*!
@ -315,7 +321,7 @@ EVENT *isolate_events(EVENT **events);
* \param action estrutura da resposta
* \return reponse
*/
RESPONSE *isolate_action_response( ACTION *action );
RESPONSE *ami_isolate_action_response( ACTION *action );
/*!
@ -323,7 +329,7 @@ RESPONSE *isolate_action_response( ACTION *action );
* \param action estrutura de resposta
* \return events
*/
EVENT *isolate_action_events(ACTION *action);
EVENT *ami_isolate_action_events(ACTION *action);
#endif

77
src/net.c

@ -12,7 +12,7 @@
*
* \return sucesso 0
*/
static int create_socket(NET *net);
static int ami_create_socket(NET *net);
@ -21,9 +21,11 @@ static int create_socket(NET *net);
* \param ami identifica qual instância da conexão
* \return sucesso 0
*/
int net_start(AMI *ami){
int ami_net_start(AMI *ami){
ami->thread.thread_net = pthread_create(&ami->thread.pthread_net, NULL, net, (void *)ami);
if( pthread_create(&ami->thread.pthread_net, NULL, ami_net, (void *)ami) == -1 ){
return -1;
}
return 0;
}
@ -37,26 +39,26 @@ int net_start(AMI *ami){
* \param void_ami identifica qual instância da conexão em tipo void *
* \return void *
*/
void *net(void *void_ami){
void *ami_net(void *void_ami){
AMI *ami = void_ami;
create_socket(&ami->net);
ami_create_socket(&ami->net);
while(1){
if(ami->net.is_connected == 0){
connect_ami(&ami->net);
ami_connect_ami(&ami->net);
}
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 0){
if(dispatch_login(ami) == -1){
connect_login_down(&ami->net, &ami->asterisk);
if(ami_dispatch_login(ami) == -1){
ami_connect_login_down(&ami->net, &ami->asterisk);
}
}
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 1){
communication_ami(ami);
connect_login_down(&ami->net, &ami->asterisk);
ami_communication_ami(ami);
ami_connect_login_down(&ami->net, &ami->asterisk);
}
@ -71,9 +73,9 @@ void *net(void *void_ami){
* Retira o login e a conexão definida da estrutura.\n
* Reset conexão e login
*/
void connect_login_down(NET *net, ASTERISK *asterisk){
connect_down(net);
login_down(asterisk);
void ami_connect_login_down(NET *net, ASTERISK *asterisk){
ami_connect_down(net);
ami_login_down(asterisk);
}
@ -82,11 +84,11 @@ void connect_login_down(NET *net, ASTERISK *asterisk){
* Derruba a conexão com o ami
* \param net estrutura de informações de rede da biblioteca
*/
void connect_down(NET *net){
void ami_connect_down(NET *net){
net->is_connected = 0;
net->imcomplete_net = 0;
sock_close(net->sock);
ami_sock_close(net->sock);
}
@ -96,7 +98,7 @@ void connect_down(NET *net){
* Levanta a conexão, isto é, define na estrutura que a conexão está conectada.
* \param net estrutura responsável por tratar rede
*/
void connect_up(NET *net){
void ami_connect_up(NET *net){
net->is_connected = 1;
}
@ -107,7 +109,7 @@ void connect_up(NET *net){
* \param asterisk estrutura sobre o asterisk a ami do outro lado
* \return void
*/
void login_down(ASTERISK *asterisk){
void ami_login_down(ASTERISK *asterisk){
asterisk->is_logged = 0;
}
@ -117,10 +119,12 @@ void login_down(ASTERISK *asterisk){
* Define na estrutura que está logado
*
*/
void login_up(ASTERISK *asterisk){
void ami_login_up(ASTERISK *asterisk){
asterisk->is_logged = 1;
}
/*!
* Envia uma action para asterisk. send_action é função externa. dispatch_action é uma função interna
* \param ami estrutura de instância da biblioteca
@ -128,7 +132,7 @@ void login_up(ASTERISK *asterisk){
* \warning Essa função ainda não tem tratamento de erro
* \return sucesso 1, falha -1
*/
int dispatch_action(AMI *ami, const char *action){
int ami_dispatch_action(AMI *ami, const char *action){
if( !ami->net.is_connected ){
return -1;
@ -159,7 +163,7 @@ int dispatch_action(AMI *ami, const char *action){
* envia a action para login ami
* \return sucesso 0, falha -1
*/
int dispatch_login(AMI *ami){
int ami_dispatch_login(AMI *ami){
if( ami->net.is_connected == 0 || ami->asterisk.is_logged == 1 ){
return -1;
@ -169,18 +173,18 @@ int dispatch_login(AMI *ami){
str_login = build_str_login(&ami->credential);
if( dispatch_action(ami, str_login) == -1 ){
if( ami_dispatch_action(ami, str_login) == -1 ){
return -1;
}
free_str_login((char *) str_login);
if( done_login( &ami->net ) == -1 ){
connect_login_down(&ami->net, &ami->asterisk);
if( ami_done_login( &ami->net ) == -1 ){
ami_connect_login_down(&ami->net, &ami->asterisk);
return -1;
}
login_up(&ami->asterisk);
ami_login_up(&ami->asterisk);
return 0;
}
@ -190,7 +194,7 @@ int dispatch_login(AMI *ami){
* Fecha o socket que está conectado com a ami
*
*/
int sock_close(int sock){
int ami_sock_close(int sock){
if(close(sock) == -1){
if(errno == EINTR){
@ -211,11 +215,11 @@ int sock_close(int sock){
*
* \return sucesso 0, falha -1
*/
int done_login( NET *net ){
int ami_done_login( NET *net ){
int len_message_login = 512;
int len_message_login = 90;
char result_login[len_message_login];
char login_success[56] = "Response: Success\r\nMessage: Authentication accepted\r\n";
char login_success[56] = "Response: Success\r\nMessage: Authentication accepted";
int bytes = 0;
int attempt_wait_login = 0;
@ -269,7 +273,7 @@ int done_login( NET *net ){
*
* \return sucesso 0, falha -1
*/
int connect_ami(NET *net){
int ami_connect_ami(NET *net){
while(1){
@ -278,7 +282,7 @@ int connect_ami(NET *net){
continue;
}
connect_up(net);
ami_connect_up(net);
break;
}
@ -291,7 +295,7 @@ int connect_ami(NET *net){
* Cria um sockect e defini opções desse conexão
* \return sucesso 0
*/
static int create_socket(NET *net){
static int ami_create_socket(NET *net){
bzero(&net->sock_addr, sizeof(net->sock_addr));
@ -313,7 +317,7 @@ static int create_socket(NET *net){
* Direciona os dados que chegam da ami para determinados ramos
* \return void
*/
int communication_ami(AMI *ami){
int ami_communication_ami(AMI *ami){
int bytes = 0;
char more_buffer[MAX_BUFFER_NET + MAX_BUFFER_NET];
@ -330,7 +334,7 @@ int communication_ami(AMI *ami){
return -1;
}
if(pfd[0].revents & POLLHUP) {
if(pfd[0].revents & POLLHUP) { // Hang up
return -1;
}
@ -345,7 +349,7 @@ int communication_ami(AMI *ami){
bytes = recv(ami->net.sock, ami->net.buffer_net, MAX_BUFFER_NET - 1, 0);
ami->net.buffer_net[bytes] = '\0';
// bloco de comando não terminado
// verifica se o final bloco
if(bytes >= (MAX_BUFFER_NET - 1) ||
(ami->net.buffer_net[bytes - 1] != '\n' ||
ami->net.buffer_net[bytes - 2] != '\r' ||
@ -357,7 +361,7 @@ int communication_ami(AMI *ami){
buffer = ami->net.buffer_net;
}
else{
// receber o restante do blo
// receber o restante do bloco
strcpy(more_buffer, ami->net.buffer_net);
bytes = recv(ami->net.sock, (more_buffer + bytes), MAX_BUFFER_NET - 1, 0);
more_buffer[bytes] = '\0';
@ -367,6 +371,9 @@ int communication_ami(AMI *ami){
buffer = more_buffer;
}
if(ami->net.pause == 1){
continue;
}
char *block = NULL;
block = define_block(buffer, &buffer);

26
src/net.h

@ -10,7 +10,7 @@
* \param ami identifica qual instância da conexão
* \return sucesso 0
*/
int net_start(AMI *ami);
int ami_net_start(AMI *ami);
@ -20,7 +20,7 @@ int net_start(AMI *ami);
* \param void_ami identifica qual instância da conexão em tipo void *
* \return void *
*/
void *net(void *void_ami);
void *ami_net(void *void_ami);
@ -29,7 +29,7 @@ void *net(void *void_ami);
* Retira o login e a conexão definida da estrutura.\n
* Reset conexão e login
*/
void connect_login_down(NET *net, ASTERISK *asterisk);
void ami_connect_login_down(NET *net, ASTERISK *asterisk);
@ -38,7 +38,7 @@ void connect_login_down(NET *net, ASTERISK *asterisk);
* Derruba a conexão com o ami
* \param net estrutura de informações de rede da biblioteca
*/
void connect_down(NET *net);
void ami_connect_down(NET *net);
@ -48,7 +48,7 @@ void connect_down(NET *net);
* \param net l
* \return
*/
void connect_up(NET *net);
void ami_connect_up(NET *net);
@ -58,7 +58,7 @@ void connect_up(NET *net);
* \param asterisk estrutura sobre o asterisk a ami do outro lado
* \return void
*/
void login_down(ASTERISK *asterisk);
void ami_login_down(ASTERISK *asterisk);
@ -67,7 +67,7 @@ void login_down(ASTERISK *asterisk);
* Define na estrutura que está logado
*
*/
void login_up(ASTERISK *asterisk);
void ami_login_up(ASTERISK *asterisk);
@ -78,7 +78,7 @@ void login_up(ASTERISK *asterisk);
* \param action action que será enviado
* \return sucesso 1, falha -1
*/
int dispatch_action(AMI *ami, const char *action);
int ami_dispatch_action(AMI *ami, const char *action);
@ -87,7 +87,7 @@ int dispatch_action(AMI *ami, const char *action);
* envia a action para login ami
* \return sucesso 0, falha -1
*/
int dispatch_login(AMI *ami);
int ami_dispatch_login(AMI *ami);
@ -96,7 +96,7 @@ int dispatch_login(AMI *ami);
* Fecha o socket que está conectado com a ami
*
*/
int sock_close(int sock);
int ami_sock_close(int sock);
@ -106,7 +106,7 @@ int sock_close(int sock);
*
* \return sucesso 0, falha -1
*/
int done_login( NET *net );
int ami_done_login( NET *net );
@ -116,7 +116,7 @@ int done_login( NET *net );
*
* \return sucesso 0, falha -1
*/
int connect_ami(NET *net);
int ami_connect_ami(NET *net);
@ -126,7 +126,7 @@ int connect_ami(NET *net);
* Direciona os dados que chegam da ami para determinados ramos
* \return void
*/
int communication_ami(AMI *ami);
int ami_communication_ami(AMI *ami);

20
src/parse_action.c

@ -21,8 +21,8 @@ void parse_response(AMI *ami, const char *buffer){
return ;
}
p_action = action_create();
p_action->response = response_create();
p_action = ami_action_create();
p_action->response = ami_response_create();
p_response = p_action->response;
buffer = buffer + 10;
@ -34,7 +34,7 @@ void parse_response(AMI *ami, const char *buffer){
while(buffer < p_end){
ARGS *arg = arg_create();
ARGS *arg = ami_arg_create();
// argumento key
len = len_key_ami( buffer );
@ -58,13 +58,13 @@ void parse_response(AMI *ami, const char *buffer){
arg->value[len] = '\0';
buffer = buffer + len + 2;
args_add(&p_response->args, arg);
ami_args_add(&p_response->args, arg);
len_command = len_command_old_ami(buffer);
privilege = get_key_value(&p_response->args, "Privilege");
privilege = ami_get_key_value(&p_response->args, "Privilege");
// action comando legado
if( len_command && !strcmp(arg->key, "ActionID") && !ami_strcmp(privilege, "Command")){
arg = arg_create();
arg = ami_arg_create();
arg->key = calloc(1, 7);
strcpy(arg->key, "Output"); // padronizar com a versão mais nova
arg->key[6] = '\0';
@ -72,18 +72,18 @@ void parse_response(AMI *ami, const char *buffer){
arg->value = calloc(1, len_command + 1 );
strncpy(arg->value, buffer, len_command);
arg->value[len_command] = '\0';
args_add(&p_response->args, arg);
ami_args_add(&p_response->args, arg);
break;
}
}
if(set_action_actionid(p_action) == -1){
action_free(p_action);
if(ami_set_action_actionid(p_action) == -1){
ami_action_free(p_action);
return;
}
pthread_mutex_lock(&ami->thread.mutex_actions);
action_add( &ami->actions, p_action );
ami_action_add( &ami->actions, p_action );
pthread_mutex_unlock(&ami->thread.mutex_actions);
}

8
src/parse_event.c

@ -18,7 +18,7 @@ void parse_event(AMI *ami, char *buffer){
return;
}
p_event = event_create();
p_event = ami_event_create();
buffer = buffer + 7;
size_t len = len_action_ami(buffer);
@ -33,7 +33,7 @@ void parse_event(AMI *ami, char *buffer){
buffer = buffer + len + 2;
while(buffer < p_end){
ARGS *arg = arg_create();
ARGS *arg = ami_arg_create();
len = len_key_ami( buffer );
if( len ){
@ -57,11 +57,11 @@ void parse_event(AMI *ami, char *buffer){
}
buffer = buffer + len + 2;
args_add(&p_event->args, arg);
ami_args_add(&p_event->args, arg);
}
pthread_mutex_lock(&ami->thread.mutex_events);
event_redirect(ami, p_event);
ami_event_redirect(ami, p_event);
pthread_mutex_unlock(&ami->thread.mutex_events);
}

Loading…
Cancel
Save