Browse Source

modificações para inclusão da estrutura channel dentro da estrutura queue, para channels criados pelas filas em casos de transferencias

pull/28/head
Diego Nakaniwa 3 months ago
parent
commit
d023ab59d3
  1. 2
      info/camada permanência
  2. 2
      info/camada_de_persistencia.svg
  3. 3
      sql/ami_mariadb.sql
  4. 46
      src/channel/channel.c
  5. 7
      src/channel/channel_db.c
  6. 5
      src/database/database.c
  7. 10
      src/dial/dial.c
  8. 10
      src/frame/call_frame.c
  9. 32
      src/frame/channel_frame.c
  10. 4
      src/frame/channel_frame.h
  11. 4
      src/frame/frame_asterisk.h
  12. 4
      src/frame/frame_globals.h
  13. 4
      src/frame/peer_frame.c
  14. 7
      src/frame/queue_frame.c
  15. 18
      src/string_functions.c
  16. 4
      src/string_functions.h
  17. 6
      src/transfer/transfer.c

2
info/camada permanência

@ -4,7 +4,7 @@ Estruturas:
Relação das estruturas na camadas de permanência (CP). Relação das estruturas na camadas de permanência (CP).
. .
struct s_peer ( s_list_peer ) struct s_peer ( s_peer )
├── unsigned long long id; ├── unsigned long long id;
├── char *callerid_number; ├── char *callerid_number;
├── char *callerid_name; ├── char *callerid_name;

2
info/camada_de_persistencia.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

3
sql/ami_mariadb.sql

@ -137,7 +137,8 @@ DROP TABLE IF EXISTS `channel`;
/*!40101 SET character_set_client = utf8 */; /*!40101 SET character_set_client = utf8 */;
CREATE TABLE `channel` ( CREATE TABLE `channel` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`peer_id` bigint(20) unsigned NOT NULL, `peer_id` bigint(20) DEFAULT NULL,
`queue_id` bigint(20) DEFAULT NULL,
`name` varchar(128) NOT NULL, `name` varchar(128) NOT NULL,
`channel_state` int(11) NOT NULL DEFAULT 0, `channel_state` int(11) NOT NULL DEFAULT 0,
`channel_state_desc` varchar(16) DEFAULT NULL, `channel_state_desc` varchar(16) DEFAULT NULL,

46
src/channel/channel.c

@ -27,6 +27,7 @@
#include <parse_events.h> #include <parse_events.h>
#include <bridge/bridge.h> #include <bridge/bridge.h>
#include <transfer/transfer.h> #include <transfer/transfer.h>
#include <queue/queue.h>
@ -72,7 +73,7 @@ int parse_event_coreshowchannel(EVENT *event, s_manager *smanager){
*context = NULL, *uniqueid = NULL, *linkedid = NULL, *bge_uniqueid = NULL, *duration = NULL; *context = NULL, *uniqueid = NULL, *linkedid = NULL, *bge_uniqueid = NULL, *duration = NULL;
int channelstate = 0, priority = 0, seconds_multiplier = 3600; int channelstate = 0, priority = 0, seconds_multiplier = 3600;
unsigned long long int call_duration_seconds = 0; unsigned long long int call_duration_seconds = 0;
char *str_peer = NULL, *token = NULL; char *exten_number = NULL, *token = NULL;
RESPONSE_MARIADB *rmdb_channel_insert = NULL, *rmdb_get_channel = NULL, RESPONSE_MARIADB *rmdb_channel_insert = NULL, *rmdb_get_channel = NULL,
*rmdb_bridge_member_insert = NULL, *rmdb_get_bridge_member = NULL; *rmdb_bridge_member_insert = NULL, *rmdb_get_bridge_member = NULL;
@ -100,17 +101,15 @@ int parse_event_coreshowchannel(EVENT *event, s_manager *smanager){
token = strtok(NULL, ":"); token = strtok(NULL, ":");
} }
str_peer = (char *) alloc( 1, strlen_n( channel_name ) ); exten_number = split_exten_number_from_channel_name( channel_name );
struct s_peer *peer = get_peer( channel_peer_split( channel_name, str_peer ) ); struct s_peer *peer = get_peer( exten_number );
if( !peer ){ struct s_list_queue *queue = get_queue_number (exten_number);
FAIL("channel sem peer %s - peer \"%s\"", channel_name, str_peer );
}
/* Procura o canal no banco de dados e insere se não encontrar */ /* Procura o canal no banco de dados e insere se não encontrar */
rmdb_get_channel = get_channel_id_db(Select_channel_id, uniqueid); rmdb_get_channel = get_channel_id_db(Select_channel_id, uniqueid);
if (rmdb_get_channel) { if (rmdb_get_channel) {
if (!rmdb_get_channel->data){ if (!rmdb_get_channel->data){
rmdb_channel_insert = insert_channel_db( Insert_channel, peer->callerid_number, channel_name, channelstate, channelstatedesc, rmdb_channel_insert = insert_channel_db( Insert_channel, exten_number, channel_name, channelstate, channelstatedesc,
( strcmp_n( calleridnum, "<unknown>" ) ? calleridnum : NULL ), ( strcmp_n( calleridnum, "<unknown>" ) ? calleridnum : NULL ),
( strcmp_n( calleridname, "<unknown>" ) ? calleridname : NULL ), ( strcmp_n( calleridname, "<unknown>" ) ? calleridname : NULL ),
( strcmp_n( connectedlinenum, "<unknown>" ) ? connectedlinenum : NULL ), ( strcmp_n( connectedlinenum, "<unknown>" ) ? connectedlinenum : NULL ),
@ -147,11 +146,12 @@ int parse_event_coreshowchannel(EVENT *event, s_manager *smanager){
node_chn->call_duration_seconds = call_duration_seconds; node_chn->call_duration_seconds = call_duration_seconds;
node_chn->priority = priority; node_chn->priority = priority;
newstrncpy( &node_chn->identification_number, channel_peer_split( channel_name, str_peer ) ); newstrncpy( &node_chn->identification_number, exten_number);
node_chn->node_up = peer; node_chn->peer_node_up = peer;
node_chn->queue_node_up = queue;
insert_peer_channel( peer->callerid_number, node_chn ); insert_channel( exten_number, node_chn );
} }
else{ else{
_ERROR("create_channel retornou NULL"); _ERROR("create_channel retornou NULL");
@ -181,7 +181,7 @@ int parse_event_coreshowchannel(EVENT *event, s_manager *smanager){
FAIL("Falha na função %s ao inserir o channel %s (%s) na ponte de uniqueid %s", __func__, bge_uniqueid, channel_name, uniqueid); FAIL("Falha na função %s ao inserir o channel %s (%s) na ponte de uniqueid %s", __func__, bge_uniqueid, channel_name, uniqueid);
} }
} }
if(str_peer) free(str_peer); if(exten_number) { free(exten_number); }
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_channel_insert ); FREE_RESPONSE_MARIADB_CHANNEL( rmdb_channel_insert );
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_get_channel ); FREE_RESPONSE_MARIADB_CHANNEL( rmdb_get_channel );
FREE_RESPONSE_MARIADB( rmdb_bridge_member_insert, free_table_bridge_member, struct s_table_bridge_member ); FREE_RESPONSE_MARIADB( rmdb_bridge_member_insert, free_table_bridge_member, struct s_table_bridge_member );
@ -189,8 +189,7 @@ int parse_event_coreshowchannel(EVENT *event, s_manager *smanager){
return 1; return 1;
fail: fail:
if(str_peer) free(str_peer); if(exten_number) { free(exten_number); }
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_channel_insert ); FREE_RESPONSE_MARIADB_CHANNEL( rmdb_channel_insert );
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_get_channel ); FREE_RESPONSE_MARIADB_CHANNEL( rmdb_get_channel );
FREE_RESPONSE_MARIADB( rmdb_bridge_member_insert, free_table_bridge_member, struct s_table_bridge_member ); FREE_RESPONSE_MARIADB( rmdb_bridge_member_insert, free_table_bridge_member, struct s_table_bridge_member );
@ -291,7 +290,7 @@ int parse_event_newchannel(EVENT *event, s_manager *smanager){
*calleridname, *connectedlinenum, *connectedlinename, *accountcode, *calleridname, *connectedlinenum, *connectedlinename, *accountcode,
*context, *uniqueid, *linkedid; *context, *uniqueid, *linkedid;
int channelstate = 0, priority = 0; int channelstate = 0, priority = 0;
char *str_peer = NULL; char *exten_number = NULL;
RESPONSE_MARIADB *rmdb_insert = NULL; RESPONSE_MARIADB *rmdb_insert = NULL;
channel = ami_get_value( smanager->ami, event->args, "Channel" ); channel = ami_get_value( smanager->ami, event->args, "Channel" );
@ -326,14 +325,12 @@ int parse_event_newchannel(EVENT *event, s_manager *smanager){
linkedid = ami_get_value( smanager->ami, event->args, "Linkedid" ); linkedid = ami_get_value( smanager->ami, event->args, "Linkedid" );
if( !linkedid ){ FAIL( "Fail linkedid - function %s", __func__ ); } if( !linkedid ){ FAIL( "Fail linkedid - function %s", __func__ ); }
str_peer = (char *) alloc( 1, strlen_n( channel ) ); exten_number = split_exten_number_from_channel_name( channel );
struct s_peer *peer = get_peer( channel_peer_split( channel, str_peer ) ); struct s_peer *peer = get_peer( exten_number );
if( !peer ){ struct s_list_queue *queue = get_queue_number (exten_number);
FAIL("channel sem peer %s - peer \"%s\" - uniqueid %s", channel, str_peer, uniqueid );
}
{ /* banco de dados */ { /* banco de dados */
rmdb_insert = insert_channel_db( Insert_channel, peer->callerid_number, channel, channelstate, channelstatedesc, rmdb_insert = insert_channel_db( Insert_channel, exten_number, channel, channelstate, channelstatedesc,
( strcmp_n( calleridnum, "<unknown>" ) ? calleridnum : NULL ), ( strcmp_n( calleridnum, "<unknown>" ) ? calleridnum : NULL ),
( strcmp_n( calleridname, "<unknown>" ) ? calleridname : NULL ), ( strcmp_n( calleridname, "<unknown>" ) ? calleridname : NULL ),
( strcmp_n( connectedlinenum, "<unknown>" ) ? connectedlinenum : NULL ), ( strcmp_n( connectedlinenum, "<unknown>" ) ? connectedlinenum : NULL ),
@ -362,13 +359,14 @@ int parse_event_newchannel(EVENT *event, s_manager *smanager){
newstrncpy( &node_chn->uniqueid, uniqueid ); newstrncpy( &node_chn->uniqueid, uniqueid );
newstrncpy( &node_chn->linkedid, linkedid ); newstrncpy( &node_chn->linkedid, linkedid );
node_chn->node_up = peer; node_chn->peer_node_up = peer;
node_chn->queue_node_up = queue;
// dado para uso do AMID devido a inconsistencias das informações do asterisk/extensions // dado para uso do AMID devido a inconsistencias das informações do asterisk/extensions
// quanto ao registro de numeros de identificação do canal em casos de transferencia // quanto ao registro de numeros de identificação do canal em casos de transferencia
node_chn->identification_number = ( strcmp_n( calleridnum, "<unknown>" ) ? newstrncpy( &node_chn->identification_number, calleridnum ) : NULL ); node_chn->identification_number = ( strcmp_n( calleridnum, "<unknown>" ) ? newstrncpy( &node_chn->identification_number, calleridnum ) : NULL );
insert_peer_channel( peer->callerid_number, node_chn ); insert_channel( exten_number, node_chn );
} }
else{ else{
_ERROR("ERROR create_channel retornou NULL"); _ERROR("ERROR create_channel retornou NULL");
@ -376,13 +374,13 @@ int parse_event_newchannel(EVENT *event, s_manager *smanager){
} }
if(str_peer) free(str_peer); if(exten_number) {free(exten_number); }
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_insert ); FREE_RESPONSE_MARIADB_CHANNEL( rmdb_insert );
// _LOG("Success New Channel Uniqueid=%s", uniqueid); // _LOG("Success New Channel Uniqueid=%s", uniqueid);
return 1; return 1;
fail: fail:
if(str_peer) free(str_peer); if(exten_number) { free(exten_number); }
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_insert ); FREE_RESPONSE_MARIADB_CHANNEL( rmdb_insert );

7
src/channel/channel_db.c

@ -167,12 +167,13 @@ fail:
} }
RESPONSE_MARIADB *insert_channel_db( stmt_t Insert_channel, const char *peer_callerid_number, const char *channel, int channelstate, const char *channelstatedesc, RESPONSE_MARIADB *insert_channel_db( stmt_t Insert_channel, const char *exten_number, const char *channel, int channelstate, const char *channelstatedesc,
const char *calleridnum, const char *calleridname, const char *connectedlinenum, const char *connectedlinename, const char *accountcode, const char *context, int priority, const char *uniqueid, const char *linkedid){ const char *calleridnum, const char *calleridname, const char *connectedlinenum, const char *connectedlinename, const char *accountcode, const char *context, int priority, const char *uniqueid, const char *linkedid){
DB_FUNCTION_INIT( Insert_channel, 13 ); DB_FUNCTION_INIT( Insert_channel, 14 );
// MARIADB_BIND *bind, int type, void *buffer, my_bool is_unsigned, my_bool is_null // MARIADB_BIND *bind, int type, void *buffer, my_bool is_unsigned, my_bool is_null
DB_PARAM_TYPE_BLOB( peer_callerid_number ); DB_PARAM_TYPE_BLOB( exten_number );
DB_PARAM_TYPE_BLOB( exten_number );
DB_PARAM_TYPE_BLOB( channel ); DB_PARAM_TYPE_BLOB( channel );
DB_PARAM_TYPE_LONG( channelstate ); DB_PARAM_TYPE_LONG( channelstate );
DB_PARAM_TYPE_BLOB( channelstatedesc ); DB_PARAM_TYPE_BLOB( channelstatedesc );

5
src/database/database.c

@ -143,9 +143,10 @@ static s_table_query _query_prepare[] =
connected_line_name, account_code, context, priority, uniqueid, linkedid, chn_id_ref, \ connected_line_name, account_code, context, priority, uniqueid, linkedid, chn_id_ref, \
follow_ch_id, transfer_FROM_chn_id, transfer_to_chn_id FROM channel C;", NULL }, follow_ch_id, transfer_FROM_chn_id, transfer_to_chn_id FROM channel C;", NULL },
{ Insert_channel, "INSERT INTO channel \ { Insert_channel, "INSERT INTO channel \
(peer_id, name, channel_state, channel_state_desc, caller_id_num, caller_id_name, connected_line_num, connected_line_name, account_code, \ (peer_id, queue_id, name, channel_state, channel_state_desc, caller_id_num, caller_id_name, connected_line_num, connected_line_name, account_code, \
context, priority, uniqueid, linkedid) \ context, priority, uniqueid, linkedid) \
VALUES( (SELECT peer.id FROM peer WHERE peer.callerid_number = ?) , \ VALUES( (SELECT id FROM peer WHERE callerid_number = ?) , \
(SELECT id FROM queue WHERE queue_number = ?) , \
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", NULL }, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", NULL },
{ Delete_channel, "DELETE FROM channel WHERE uniqueid=?;", NULL }, { Delete_channel, "DELETE FROM channel WHERE uniqueid=?;", NULL },
{ Update_channel_state, "UPDATE channel SET channel_state=?, channel_state_desc=? WHERE uniqueid=?;", NULL }, { Update_channel_state, "UPDATE channel SET channel_state=?, channel_state_desc=? WHERE uniqueid=?;", NULL },

10
src/dial/dial.c

@ -97,7 +97,7 @@ int parse_event_dtmfend( PARAM_EVENT_SMANAGER ){
return 1; return 1;
} }
if( cm->node_up->num_member < 2 ){ if( cm->peer_node_up->num_member < 2 ){
return 1; return 1;
} }
@ -230,7 +230,7 @@ int parse_event_dialbegin( PARAM_EVENT_SMANAGER ){
// cria a call de login de agente // cria a call de login de agente
const char *call_uniqueid = new_call_uniqueid(destination_channel); const char *call_uniqueid = new_call_uniqueid(destination_channel);
parse_create_call( call_uniqueid, dest_uniqueid, "Login" ); parse_create_call( call_uniqueid, dest_uniqueid, "Login" );
parse_create_call_member( call_uniqueid, destination_channel->uniqueid, destination_channel->node_up->callerid_number, NULL ); parse_create_call_member( call_uniqueid, destination_channel->uniqueid, destination_channel->peer_node_up->callerid_number, NULL );
return 1; return 1;
} }
// dial de calls diretas entre ramais // dial de calls diretas entre ramais
@ -248,8 +248,8 @@ int parse_event_dialbegin( PARAM_EVENT_SMANAGER ){
const char *call_uniqueid = new_call_uniqueid(origin_channel); const char *call_uniqueid = new_call_uniqueid(origin_channel);
parse_create_call( call_uniqueid, uniqueid, "Regular" ); parse_create_call( call_uniqueid, uniqueid, "Regular" );
parse_update_call( call_uniqueid, NULL, dest_uniqueid); parse_update_call( call_uniqueid, NULL, dest_uniqueid);
parse_create_call_member( call_uniqueid, origin_channel->uniqueid, origin_channel->node_up->callerid_number, NULL ); parse_create_call_member( call_uniqueid, origin_channel->uniqueid, origin_channel->peer_node_up->callerid_number, NULL );
parse_create_call_member( call_uniqueid, destination_channel->uniqueid, destination_channel->node_up->callerid_number, NULL ); parse_create_call_member( call_uniqueid, destination_channel->uniqueid, destination_channel->peer_node_up->callerid_number, NULL );
} }
return 1; return 1;
fail: fail:
@ -428,7 +428,7 @@ int parse_event_unhold( PARAM_EVENT_SMANAGER ){
cm->hold = 0; cm->hold = 0;
struct s_transfer *transfer = get_last_transfer( cm->node_up->call_uniqueid ); struct s_transfer *transfer = get_last_transfer( cm->peer_node_up->call_uniqueid );
if( !transfer ){ if( !transfer ){
return 1; return 1;
} }

10
src/frame/call_frame.c

@ -436,14 +436,14 @@ int find_call_end_nodes(const char *bridge_uniqueid){
if (!call_uniqueid){ if (!call_uniqueid){
call_uniqueid = new_call_uniqueid(caller_channel); call_uniqueid = new_call_uniqueid(caller_channel);
parse_create_call(call_uniqueid, caller_channel->uniqueid, "Queue"); parse_create_call(call_uniqueid, caller_channel->uniqueid, "Queue");
parse_create_call_member( call_uniqueid, caller_channel->uniqueid, caller_channel->node_up->callerid_number, NULL ); parse_create_call_member( call_uniqueid, caller_channel->uniqueid, caller_channel->peer_node_up->callerid_number, NULL );
parse_create_call_member( call_uniqueid, callee_channel->uniqueid, callee_channel->node_up->callerid_number, NULL ); parse_create_call_member( call_uniqueid, callee_channel->uniqueid, callee_channel->peer_node_up->callerid_number, NULL );
parse_update_call (call_uniqueid, caller_channel->uniqueid, callee_channel->uniqueid); parse_update_call (call_uniqueid, caller_channel->uniqueid, callee_channel->uniqueid);
} }
// se a call ja existir coloca o segundo membro (transferencia) // se a call ja existir coloca o segundo membro (transferencia)
call = get_call(call_uniqueid); call = get_call(call_uniqueid);
if (call->num_member < 2){ if (call->num_member < 2){
parse_create_call_member( call_uniqueid, callee_channel->uniqueid, callee_channel->node_up->callerid_number, NULL ); parse_create_call_member( call_uniqueid, callee_channel->uniqueid, callee_channel->peer_node_up->callerid_number, NULL );
parse_update_call (call_uniqueid, caller_channel->uniqueid, callee_channel->uniqueid); parse_update_call (call_uniqueid, caller_channel->uniqueid, callee_channel->uniqueid);
} }
@ -528,8 +528,8 @@ int restore_calls (){
parse_create_call(call_uniqueid, bridge_channel_2->uniqueid, "Regular"); parse_create_call(call_uniqueid, bridge_channel_2->uniqueid, "Regular");
parse_update_call(call_uniqueid, NULL, bridge_channel_1->uniqueid); parse_update_call(call_uniqueid, NULL, bridge_channel_1->uniqueid);
} }
parse_create_call_member(call_uniqueid, bridge_channel_1->uniqueid, bridge_channel_1->node_up->callerid_number, NULL); parse_create_call_member(call_uniqueid, bridge_channel_1->uniqueid, bridge_channel_1->peer_node_up->callerid_number, NULL);
parse_create_call_member(call_uniqueid, bridge_channel_2->uniqueid, bridge_channel_2->node_up->callerid_number, NULL); parse_create_call_member(call_uniqueid, bridge_channel_2->uniqueid, bridge_channel_2->peer_node_up->callerid_number, NULL);
} }
} else { // senão, iniciar rastreio a partir da ponte } else { // senão, iniciar rastreio a partir da ponte
find_call_end_nodes(channel->bridgeid); find_call_end_nodes(channel->bridgeid);

32
src/frame/channel_frame.c

@ -53,26 +53,18 @@ struct s_channel *create_channel(){
} }
/* insert channel */ /* insert channel */
int insert_peer_channel( const char *peer, struct s_channel *channel ){ int insert_channel( const char *exten_number, struct s_channel *channel ){
struct s_peer *e = get_peer( peer ); struct s_peer *peer = get_peer( exten_number );
if( !e ) { return -1; } if (!peer) {
struct s_channel **C = &e->channel; struct s_list_queue *queue = get_queue_number( exten_number );
LAST_NODE( C, channel ); if (!queue) {return -1;}
struct s_channel **C = &queue->channel;
return 0; LAST_NODE( C, channel );
} } else {
struct s_channel **C = &peer->channel;
LAST_NODE( C, channel );
int insert_speer_channel( struct s_peer *peer, struct s_channel *channel ){ }
struct s_peer **P = &peer;
if( !P ) { return -1; }
struct s_channel **C = &(*P)->channel;
LAST_NODE( C, channel );
return 0; return 0;
} }

4
src/frame/channel_frame.h

@ -43,9 +43,7 @@
*/ */
struct s_channel *create_channel(); struct s_channel *create_channel();
int insert_peer_channel( const char *peer, struct s_channel *channel ); int insert_channel( const char *exten_number, struct s_channel *channel );
int insert_speer_channel( struct s_peer *peer, struct s_channel *channel );
struct s_channel *get_channel( const char *uniqueid ); struct s_channel *get_channel( const char *uniqueid );

4
src/frame/frame_asterisk.h

@ -168,7 +168,8 @@ struct s_channel {
char *local_bridge; char *local_bridge;
unsigned int localbridge:1; unsigned int localbridge:1;
struct s_peer *node_up; struct s_peer *peer_node_up;
struct s_list_queue *queue_node_up;
unsigned int action_update:1; unsigned int action_update:1;
unsigned int action_update_tries:2; unsigned int action_update_tries:2;
@ -285,6 +286,7 @@ struct s_list_queue {
char *queue_number; char *queue_number;
char *strategy; char *strategy;
struct s_list_queue_member *queue_member; // não free struct s_list_queue_member *queue_member; // não free
struct s_channel *channel; // não free
unsigned int action_update; unsigned int action_update;
struct s_list_queue *next; struct s_list_queue *next;

4
src/frame/frame_globals.h

@ -20,9 +20,7 @@
#ifndef FRAME_GLOBALS_H #ifndef FRAME_GLOBALS_H
#define FRAME_GLOBALS_H 1 #define FRAME_GLOBALS_H 1
/* s_list_peer global que também pode ter a referência por s_peer */ extern struct s_peer *_peer;
#define s_list_peer s_peer
extern struct s_list_peer *_peer;
extern struct s_list_queue *_queue; extern struct s_list_queue *_queue;
extern struct s_list_bridge *_bridge; extern struct s_list_bridge *_bridge;
extern struct s_list_agent *_agents; extern struct s_list_agent *_agents;

4
src/frame/peer_frame.c

@ -39,14 +39,14 @@
#include <frame/frame_asterisk.h> #include <frame/frame_asterisk.h>
#include <frame/frame_globals.h> #include <frame/frame_globals.h>
struct s_list_peer *_peer = NULL; struct s_peer *_peer = NULL;
/***************** PEER ***************** /***************** PEER *****************
* *
* struct s_peer { * struct s_peer {
* *
* struct s_peer ( s_list_peer ) * struct s_peer ( s_peer )
* unsigned long long id; * unsigned long long id;
* char *callerid_number; * char *callerid_number;
* char *callerid_name; * char *callerid_name;

7
src/frame/queue_frame.c

@ -159,7 +159,12 @@ void free_queue( struct s_list_queue **queue ){
QM = &(*QM)->next; QM = &(*QM)->next;
free_queue_member( &QM_remove ); free_queue_member( &QM_remove );
} }
struct s_channel **C = &(*queue)->channel;
while( (*C) ){
struct s_channel *C_remove = *C;
C = &(*C)->next;
free_channel( &C_remove );
}
free( (*queue)->queue_name ); free( (*queue)->queue_name );
free( (*queue)->queue_number); free( (*queue)->queue_number);
free( (*queue)->strategy ); free( (*queue)->strategy );

18
src/string_functions.c

@ -548,25 +548,27 @@ int count_extensions(const char *dialplan){
char *channel_peer_split(const char *channel, char *peer){ char *split_exten_number_from_channel_name(const char *channel_name){
char *peer_walk = NULL; char *exten_number = alloc( 1, strlen_n( channel_name ) );
char *point = strstr(channel, "/"); char *exten_walk = NULL;
char *point = strstr(channel_name, "/");
if(!point){ if(!point){
return NULL; return NULL;
} }
peer_walk = peer; exten_walk = exten_number;
while( ++point && (*point != '\0' && *point != '-' && *point != '/' && *point != '@' ) ){ while( ++point && (*point != '\0' && *point != '-' && *point != '/' && *point != '@' ) ){
*peer_walk = *point; *exten_walk = *point;
++peer_walk; ++exten_walk;
} }
*peer_walk = '\0'; *exten_walk = '\0';
return peer; return exten_number;
} }

4
src/string_functions.h

@ -235,8 +235,8 @@ int split_extension( const char *dialplan, struct s_extension *extension );
int count_extensions(const char *dialplan); int count_extensions(const char *dialplan);
/* Separar peer da chavel channel */ // Separa exten do nome do channel
char *channel_peer_split(const char *channel, char *peer); char *split_exten_number_from_channel_name(const char *channel_name);
#endif #endif

6
src/transfer/transfer.c

@ -100,7 +100,7 @@ int parse_event_blindtransfer ( PARAM_EVENT_SMANAGER ){
// call de transferencia // call de transferencia
transfer_call_uniqueid = new_call_uniqueid(transferee_channel); transfer_call_uniqueid = new_call_uniqueid(transferee_channel);
parse_create_call(transfer_call_uniqueid, transferee_channel->uniqueid, "Blind Transfer"); parse_create_call(transfer_call_uniqueid, transferee_channel->uniqueid, "Blind Transfer");
parse_create_call_member( transfer_call_uniqueid, transferee_channel->uniqueid, transferee_channel->node_up->callerid_number, NULL ); parse_create_call_member( transfer_call_uniqueid, transferee_channel->uniqueid, transferee_channel->peer_node_up->callerid_number, NULL );
// uniqueid da call que será terminada assim que completar a transferencia // uniqueid da call que será terminada assim que completar a transferencia
previous_call_uniqueid = get_call_uniqueid_from_a_call_member_uniqueid(transferer_uniqueid); previous_call_uniqueid = get_call_uniqueid_from_a_call_member_uniqueid(transferer_uniqueid);
@ -255,8 +255,8 @@ int parse_event_attendedtransfer ( PARAM_EVENT_SMANAGER ){
transfer_call_uniqueid = new_call_uniqueid(call_on_hold_transferee_channel); transfer_call_uniqueid = new_call_uniqueid(call_on_hold_transferee_channel);
parse_create_call(transfer_call_uniqueid, call_on_hold_transferee_channel->uniqueid, "Attended Transfer"); parse_create_call(transfer_call_uniqueid, call_on_hold_transferee_channel->uniqueid, "Attended Transfer");
parse_update_call (transfer_call_uniqueid, call_on_hold_transferee_channel->uniqueid, transfer_destination_channel->uniqueid); parse_update_call (transfer_call_uniqueid, call_on_hold_transferee_channel->uniqueid, transfer_destination_channel->uniqueid);
parse_create_call_member( transfer_call_uniqueid, destination_uniqueid, transfer_destination_channel->node_up->callerid_number, NULL ); parse_create_call_member( transfer_call_uniqueid, destination_uniqueid, transfer_destination_channel->peer_node_up->callerid_number, NULL );
parse_create_call_member( transfer_call_uniqueid, call_on_hold_transferee_channel->uniqueid, call_on_hold_transferee_channel->node_up->callerid_number, NULL); parse_create_call_member( transfer_call_uniqueid, call_on_hold_transferee_channel->uniqueid, call_on_hold_transferee_channel->peer_node_up->callerid_number, NULL);
// uniqueid da call anterior // uniqueid da call anterior
previous_call_uniqueid = get_call_uniqueid_from_a_call_member_uniqueid(transferer_call_on_hold_uniqueid); previous_call_uniqueid = get_call_uniqueid_from_a_call_member_uniqueid(transferer_call_on_hold_uniqueid);

Loading…
Cancel
Save