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 $(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) 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. * \warning Não deve ser liberada diretamente esse ponteiro. Use a função close_ami.
* \return retorna NULL caso tenha erro * \return retorna NULL caso tenha erro
*/ */
AMI *init_ami(){ AMI *ami_init(){
AMI *ami = calloc(1, sizeof(AMI)); AMI *ami = calloc(1, sizeof(AMI));
if(!ami){ if(!ami){
return NULL; 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 * Essa função encerrará essa instância com ami. A memória será liberada dessa instância
* \return sucesso 0, falha -1 * \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; 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 * A conexão com a AMI e algumas informações serão refeitas
* \return sucesso 0, falha -1 * \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; return 0;
} }
@ -46,7 +72,7 @@ int restart_ami(AMI *ami){
* Defini as credenciais necessárias para fazer login com a ami * Defini as credenciais necessárias para fazer login com a ami
* \return sucesso 0, falha -1 * \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){ if(!username || !password){
return -1; return -1;
@ -74,12 +100,12 @@ int set_credentials( AMI *ami, const char *username, const char *password ){
* defini o caminho para conectar ao ami * defini o caminho para conectar ao ami
* \return sucesso 0, falha -1 * \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) if(!address)
return -1; return -1;
if(strlen(address) >= MAX_LEN_ADDRESS){ if(strlen(address) > MAX_LEN_ADDRESS){
return -1; return -1;
} }
@ -100,7 +126,7 @@ int set_net( AMI *ami, const char *address, int port ){
*/ */
int ami_c (AMI *ami ){ int ami_c (AMI *ami ){
net_start(ami); ami_net_start(ami);
return 0; return 0;
@ -112,7 +138,7 @@ int ami_c (AMI *ami ){
* Retorna o socket dessa instância que está sendo usado * Retorna o socket dessa instância que está sendo usado
* \return socket(int) * \return socket(int)
*/ */
int get_socket(AMI *ami){ int ami_get_socket(AMI *ami){
return ami->net.sock; 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. * 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 -1
*/ */
int is_connected(AMI *ami){ int ami_is_connected(AMI *ami){
return ami->net.is_connected; 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. * 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; return ami->asterisk.is_logged;
} }
@ -142,7 +168,7 @@ int is_logged(AMI *ami){
* Envia a action que está na struct * Envia a action que está na struct
* \return sucesso actionid, fail -1 * \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; int return_send = -1;
const char *str_action = NULL; 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){ if(ami->net.is_connected && ami->asterisk.is_logged){
str_action = build_str_action(action); 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); str_action_free((char *)str_action);
if(return_send == -1){ 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 * \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; 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 * Libera ponteiro para para estrutura ss_action
* \return sucesso 0 sempre * \return sucesso 0 sempre
*/ */
int destroy_action(struct ss_action *action){ int ami_destroy_action(struct ss_action *action){
free(action->args); free(action->args);
free(action); free(action);
@ -224,8 +250,8 @@ int destroy_action(struct ss_action *action){
* \param events lista de eventos obtidas pela função get_events * \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){
list_event_free(events); ami_list_event_free(events);
} }
@ -236,8 +262,8 @@ void destroy_events(AMI *ami, EVENT *events){
* \param response ponteiro da estrutura response * \param response ponteiro da estrutura response
* *
*/ */
void destroy_response(AMI *ami, RESPONSE *response){ void ami_destroy_response(AMI *ami, RESPONSE *response){
response_free(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 * \param ami a sua instância que está usando a biblioteca
* \return events lista de eventos, NULL caso não tenha eventos * \return events lista de eventos, NULL caso não tenha eventos
*/ */
EVENT *get_events(AMI *ami){ EVENT *ami_get_events(AMI *ami){
EVENT *events; EVENT *events;
pthread_mutex_lock(&ami->thread.mutex_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); pthread_mutex_unlock(&ami->thread.mutex_events);
return events; return events;
@ -263,10 +289,10 @@ EVENT *get_events(AMI *ami){
* \param actionid da action que vai procurar * \param actionid da action que vai procurar
* \return response ou NULL não RESPONSE (talvez AMI ainda não retornou) * \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; RESPONSE *response = NULL;
pthread_mutex_lock(&ami->thread.mutex_actions); 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); pthread_mutex_unlock(&ami->thread.mutex_actions);
return response; return response;
@ -279,10 +305,10 @@ RESPONSE *get_actions_response(AMI *ami, const char *actionid){
* \param actionid identificação das actions * \param actionid identificação das actions
* \return event ou NULL não eventos (talvez AMI ainda não enviou) * \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; EVENT *events = NULL;
pthread_mutex_lock(&ami->thread.mutex_actions); 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); pthread_mutex_unlock(&ami->thread.mutex_actions);
return events; 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 * \param status status > 0 eventos OFF, status <= 0 eventos ON
* \return sempre 0 * \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); pthread_mutex_lock(&ami->thread.mutex_events);
if( status > 0 ){ if( status > 0 ){
@ -316,9 +342,58 @@ int set_disable_events( AMI *ami, int status ){
* \param ami instânca da biblioteca ami * \param ami instânca da biblioteca ami
* \return 0 eventos ON, 1 eventos OFF * \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; 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 */ #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]; char actionid[MAX_LEN_VALUE_ACTION];
struct s_actionid *next; struct s_ami_actionid *next;
} ACTIONID; } ACTIONID;
@ -25,7 +25,7 @@ typedef struct s_actionid {
* Estrutura asterisk * Estrutura asterisk
* Dentro do AMI * Dentro do AMI
*/ */
typedef struct s_asterisk { typedef struct s_ami_asterisk {
unsigned int is_logged:1; /*!< */ unsigned int is_logged:1; /*!< */
unsigned int disable_events:1; /*!< disativa os eventos sem actionid */ unsigned int disable_events:1; /*!< disativa os eventos sem actionid */
ACTIONID *list_actionid; ACTIONID *list_actionid;
@ -37,9 +37,8 @@ typedef struct s_asterisk {
* Estrutura contém as informações de thread dessa instância * Estrutura contém as informações de thread dessa instância
* Dentro AMI * Dentro AMI
*/ */
typedef struct s_thread { typedef struct s_ami_thread {
pthread_t pthread_net; /*!< thread de rede */ 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_events; /*<! controle para colocar EVENT externo */
pthread_mutex_t mutex_actions; /*<! controle para colocar RESPONSE e EVENT (das actions) externo */ pthread_mutex_t mutex_actions; /*<! controle para colocar RESPONSE e EVENT (das actions) externo */
} THREAD; } THREAD;
@ -50,7 +49,7 @@ typedef struct s_thread {
* Informações sobre comunicação * Informações sobre comunicação
* Dentro AMI * Dentro AMI
*/ */
typedef struct s_net{ typedef struct s_ami_net{
int address; /*!< endereço IPV4 da ami em binary */ int address; /*!< endereço IPV4 da ami em binary */
char str_address[MAX_LEN_ADDRESS + 1]; /*!< endereço IPV4 da ami em ascii */ 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 */ 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 imcomplete_net:1;
unsigned int is_connected:1; /*<! Está conectado */ unsigned int is_connected:1; /*<! Está conectado */
int timeout; int timeout;
int q_ndata; int pause;
} NET; } NET;
@ -69,7 +68,7 @@ typedef struct s_net{
* Informação sobre credenciais para fazer login no ami. * Informação sobre credenciais para fazer login no ami.
* Dentro AMI * Dentro AMI
*/ */
typedef struct s_credentials{ typedef struct s_ami_credentials{
char username[MAX_LEN_USERNAME + 1]; /*!< usuário do ami */ char username[MAX_LEN_USERNAME + 1]; /*!< usuário do ami */
char password[MAX_LEN_PASSWORD + 1]; /*!< secret (password) do ami */ char password[MAX_LEN_PASSWORD + 1]; /*!< secret (password) do ami */
} CREDENTIAL; } CREDENTIAL;
@ -82,7 +81,7 @@ typedef struct s_credentials{
* Essa estrutura será opaco para o user externo * Essa estrutura será opaco para o user externo
*/ */
struct ami { struct ami {
int error_code; /*!< erro no ami */ int error_code; /*!< error no ami */
NET net; /*!< sobre a transmissão */ NET net; /*!< sobre a transmissão */
CREDENTIAL credential; /*!< credenciais do ami */ CREDENTIAL credential; /*!< credenciais do ami */
ACTION *actions; /*!< action recebido da ami. Respostas e event */ 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_ACTION 0x80
#define MAX_LEN_EVENT 0x4000 #define MAX_LEN_EVENT 0x4000
/*! /*!
* Estrutura dos dados que chegam da ami * Estrutura dos dados que chegam da ami
* Ex: * Ex:
@ -19,10 +20,10 @@
* key: value\n * key: value\n
* key: value\n * key: value\n
*/ */
typedef struct s_args { typedef struct s_ami_args {
char *key; /*!< chave do argumento */ char *key; /*!< chave do argumento */
char *value; /*!< value do argumento */ char *value; /*!< value do argumento */
struct s_args *next; struct s_ami_args *next;
} ARGS; } ARGS;
@ -30,7 +31,7 @@ typedef struct s_args {
/*! /*!
* Estrutura de dados da resposta da AMI e suas chaves e valores * 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 */ char *response; /*!< valor da chave response no bloco */
ARGS *args; /*!< argumentos do bloco response */ ARGS *args; /*!< argumentos do bloco response */
int count; /*!< quantidade de argumentos */ int count; /*!< quantidade de argumentos */
@ -41,39 +42,45 @@ typedef struct s_response {
/*! /*!
* informação do evento * informação do evento
*/ */
typedef struct s_event{ typedef struct s_ami_event{
char *event; /*!< nome do evento */ char *event; /*!< nome do evento */
ARGS *args; /*!< argumentos do evento */ ARGS *args; /*!< argumentos do evento */
int count; /*!< constagem do event. decrescente 1000 - 0 */ int count; /*!< constagem do event. decrescente 1000 - 0 */
struct s_event *next; struct s_ami_event *next;
} EVENT; } EVENT;
/*! /*!
* informação da action recebida * informação da action recebida da ami
* Dentro ami
*/ */
typedef struct s_action{ typedef struct s_ami_action{
RESPONSE *response; RESPONSE *response;
char *actionid; char *actionid;
EVENT *events; EVENT *events;
struct s_action *next; struct s_ami_action *next;
} ACTION; } ACTION;
/*!
* argumentos das action
*/
struct ss_args { struct ss_args {
char key[MAX_LEN_KEY_ACTION]; char key[MAX_LEN_KEY_ACTION];
char value[MAX_LEN_VALUE_ACTION]; char value[MAX_LEN_VALUE_ACTION];
}; };
/*!
* estrutura da action
*/
struct ss_action { struct ss_action {
char name_action[MAX_LEN_NAME_ACTION]; char name_action[MAX_LEN_NAME_ACTION];
int count_args; int count_args;
struct ss_args *args; struct ss_args *args;
}; };
// estrutura opaca
typedef struct ami AMI; 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. * \warning Não deve ser liberada diretamente esse ponteiro. Use a função close_ami.
* \return retorna NULL caso tenha erro * \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 * Essa função encerrará essa instância com ami. A memória será liberada dessa instância
* \return sucesso 0, falha -1 * \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 * A conexão com a AMI e algumas informações serão refeitas
* \return sucesso 0, falha -1 * \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 * Defini as credenciais necessárias para fazer login com a ami
* \return sucesso 0, falha -1 * \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 * defini o caminho para conectar ao ami
* \return sucesso 0, falha -1 * \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 * Retorna o socket dessa instância que está sendo usado
* \return socket(int) * \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 * 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. * 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. * 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 * Envia a action que está na struct
* \return sucesso actionid, fail -1 * \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 * \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 * Libera ponteiro para para estrutura ss_action
* \return sucesso 0 sempre * \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 * \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 * \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 * \param ami estrutura
* \return events lista de eventos, NULL caso não tenha eventos * \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 * \param actionid da action que vai procurar
* \return response ou NULL não RESPONSE (talvez AMI ainda não retornou) * \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 * \param actionid identificação das actions
* \return event ou NULL não eventos (talvez AMI ainda não enviou) * \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 * \param status status > 0 eventos OFF, status <= 0 eventos ON
* \return sempre 0 * \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 * 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 * \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 #endif

142
src/asterisk.c

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

76
src/asterisk.h

@ -3,11 +3,17 @@
#define ASTERISK_H 1 #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 * 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) * \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 * \param actionid valor da actionid que será verificada
* \return sucesso 0, falha -1 * \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 * \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 * \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 * \param drop_actionid ponteiro para estrutura
* \return 0 sempre * \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 * \param arg actionid que será verificada se está na lista
* \return 0 não existe, 1 existe * \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 * \param arg actionid que será verificada
* \return 0 não existe, 1 existe * \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 * \param event estrutura evento
* \return sucesso 0, falha -1 ( o ponteiro event é liberado) * \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 * \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 * \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 * \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 * \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 * \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 * \param key chave do argumento
* \return existe 0, não existe -1 * \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 * \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) * \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 args lista de argumentos
* \param arg argumento que será inserido na lista * \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. * 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 * \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 * \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 * Cria estrutura RESPONSE
* \return response estrutura vazia que será usada para preencher resposta da AMI * \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 action estrutura action
* \param response será adicionado para o 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 * Libera espaço do ponteiro da entrutura RESPONSE
* \param response estrutura response que será liberada * \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 * criar estrutura para preenche-la com resposta da action
* \return ACTION nova estrutura 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 * \param toremove o action que será escluída da lista
* \return 0 sempre * \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 * \param list_action lista das action
* \return 0 * \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 * \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 * \param action ponteiro para estrutura action
* \return sempre sucesso 0 * \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 * \param next estrutura action que será inserida
* \return sucesso 0, falha -1 * \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 * \param action ponteiro action
* \return sucesso 0, falha -1 * \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 * \para event estrutura EVENT
* \return sucesso 0, event não adicionado -1 * \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 * \param actionid procurar a actions que tem o mesmo
* \return sucesso action, NULL não existe action com aquela actionid * \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 * \param events lista de eventos
* \return np_events * \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 * \param action estrutura da resposta
* \return reponse * \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 * \param action estrutura de resposta
* \return events * \return events
*/ */
EVENT *isolate_action_events(ACTION *action); EVENT *ami_isolate_action_events(ACTION *action);
#endif #endif

77
src/net.c

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

26
src/net.h

@ -10,7 +10,7 @@
* \param ami identifica qual instância da conexão * \param ami identifica qual instância da conexão
* \return sucesso 0 * \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 * * \param void_ami identifica qual instância da conexão em tipo void *
* \return 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 * Retira o login e a conexão definida da estrutura.\n
* Reset conexão e login * 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 * Derruba a conexão com o ami
* \param net estrutura de informações de rede da biblioteca * \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 * \param net l
* \return * \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 * \param asterisk estrutura sobre o asterisk a ami do outro lado
* \return void * \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 * 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 * \param action action que será enviado
* \return sucesso 1, falha -1 * \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 * envia a action para login ami
* \return sucesso 0, falha -1 * \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 * 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 * \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 * \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 * Direciona os dados que chegam da ami para determinados ramos
* \return void * \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 ; return ;
} }
p_action = action_create(); p_action = ami_action_create();
p_action->response = response_create(); p_action->response = ami_response_create();
p_response = p_action->response; p_response = p_action->response;
buffer = buffer + 10; buffer = buffer + 10;
@ -34,7 +34,7 @@ void parse_response(AMI *ami, const char *buffer){
while(buffer < p_end){ while(buffer < p_end){
ARGS *arg = arg_create(); ARGS *arg = ami_arg_create();
// argumento key // argumento key
len = len_key_ami( buffer ); len = len_key_ami( buffer );
@ -58,13 +58,13 @@ void parse_response(AMI *ami, const char *buffer){
arg->value[len] = '\0'; arg->value[len] = '\0';
buffer = buffer + len + 2; buffer = buffer + len + 2;
args_add(&p_response->args, arg); ami_args_add(&p_response->args, arg);
len_command = len_command_old_ami(buffer); 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 // action comando legado
if( len_command && !strcmp(arg->key, "ActionID") && !ami_strcmp(privilege, "Command")){ if( len_command && !strcmp(arg->key, "ActionID") && !ami_strcmp(privilege, "Command")){
arg = arg_create(); arg = ami_arg_create();
arg->key = calloc(1, 7); arg->key = calloc(1, 7);
strcpy(arg->key, "Output"); // padronizar com a versão mais nova strcpy(arg->key, "Output"); // padronizar com a versão mais nova
arg->key[6] = '\0'; arg->key[6] = '\0';
@ -72,18 +72,18 @@ void parse_response(AMI *ami, const char *buffer){
arg->value = calloc(1, len_command + 1 ); arg->value = calloc(1, len_command + 1 );
strncpy(arg->value, buffer, len_command); strncpy(arg->value, buffer, len_command);
arg->value[len_command] = '\0'; arg->value[len_command] = '\0';
args_add(&p_response->args, arg); ami_args_add(&p_response->args, arg);
break; break;
} }
} }
if(set_action_actionid(p_action) == -1){ if(ami_set_action_actionid(p_action) == -1){
action_free(p_action); ami_action_free(p_action);
return; return;
} }
pthread_mutex_lock(&ami->thread.mutex_actions); 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); pthread_mutex_unlock(&ami->thread.mutex_actions);
} }

8
src/parse_event.c

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

Loading…
Cancel
Save