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).
.
struct s_peer ( s_list_peer )
struct s_peer ( s_peer )
├── unsigned long long id;
├── char *callerid_number;
├── 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 */;
CREATE TABLE `channel` (
`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,
`channel_state` int(11) NOT NULL DEFAULT 0,
`channel_state_desc` varchar(16) DEFAULT NULL,

46
src/channel/channel.c

@ -27,6 +27,7 @@
#include <parse_events.h>
#include <bridge/bridge.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;
int channelstate = 0, priority = 0, seconds_multiplier = 3600;
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,
*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, ":");
}
str_peer = (char *) alloc( 1, strlen_n( channel_name ) );
struct s_peer *peer = get_peer( channel_peer_split( channel_name, str_peer ) );
if( !peer ){
FAIL("channel sem peer %s - peer \"%s\"", channel_name, str_peer );
}
exten_number = split_exten_number_from_channel_name( channel_name );
struct s_peer *peer = get_peer( exten_number );
struct s_list_queue *queue = get_queue_number (exten_number);
/* Procura o canal no banco de dados e insere se não encontrar */
rmdb_get_channel = get_channel_id_db(Select_channel_id, uniqueid);
if (rmdb_get_channel) {
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( calleridname, "<unknown>" ) ? calleridname : 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->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{
_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);
}
}
if(str_peer) free(str_peer);
if(exten_number) { free(exten_number); }
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_channel_insert );
FREE_RESPONSE_MARIADB_CHANNEL( rmdb_get_channel );
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;
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_get_channel );
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,
*context, *uniqueid, *linkedid;
int channelstate = 0, priority = 0;
char *str_peer = NULL;
char *exten_number = NULL;
RESPONSE_MARIADB *rmdb_insert = NULL;
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" );
if( !linkedid ){ FAIL( "Fail linkedid - function %s", __func__ ); }
str_peer = (char *) alloc( 1, strlen_n( channel ) );
struct s_peer *peer = get_peer( channel_peer_split( channel, str_peer ) );
if( !peer ){
FAIL("channel sem peer %s - peer \"%s\" - uniqueid %s", channel, str_peer, uniqueid );
}
exten_number = split_exten_number_from_channel_name( channel );
struct s_peer *peer = get_peer( exten_number );
struct s_list_queue *queue = get_queue_number (exten_number);
{ /* 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( calleridname, "<unknown>" ) ? calleridname : 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->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
// 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 );
insert_peer_channel( peer->callerid_number, node_chn );
insert_channel( exten_number, node_chn );
}
else{
_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 );
// _LOG("Success New Channel Uniqueid=%s", uniqueid);
return 1;
fail:
if(str_peer) free(str_peer);
if(exten_number) { free(exten_number); }
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){
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
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_LONG( channelstate );
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, \
follow_ch_id, transfer_FROM_chn_id, transfer_to_chn_id FROM channel C;", NULL },
{ 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) \
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 },
{ Delete_channel, "DELETE FROM channel 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;
}
if( cm->node_up->num_member < 2 ){
if( cm->peer_node_up->num_member < 2 ){
return 1;
}
@ -230,7 +230,7 @@ int parse_event_dialbegin( PARAM_EVENT_SMANAGER ){
// cria a call de login de agente
const char *call_uniqueid = new_call_uniqueid(destination_channel);
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;
}
// 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);
parse_create_call( call_uniqueid, uniqueid, "Regular" );
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, destination_channel->uniqueid, destination_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->peer_node_up->callerid_number, NULL );
}
return 1;
fail:
@ -428,7 +428,7 @@ int parse_event_unhold( PARAM_EVENT_SMANAGER ){
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 ){
return 1;
}

10
src/frame/call_frame.c

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

32
src/frame/channel_frame.c

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

4
src/frame/channel_frame.h

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

4
src/frame/frame_asterisk.h

@ -168,7 +168,8 @@ struct s_channel {
char *local_bridge;
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_tries:2;
@ -285,6 +286,7 @@ struct s_list_queue {
char *queue_number;
char *strategy;
struct s_list_queue_member *queue_member; // não free
struct s_channel *channel; // não free
unsigned int action_update;
struct s_list_queue *next;

4
src/frame/frame_globals.h

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

4
src/frame/peer_frame.c

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

7
src/frame/queue_frame.c

@ -159,7 +159,12 @@ void free_queue( struct s_list_queue **queue ){
QM = &(*QM)->next;
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_number);
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){
return NULL;
}
peer_walk = peer;
exten_walk = exten_number;
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);
/* Separar peer da chavel channel */
char *channel_peer_split(const char *channel, char *peer);
// Separa exten do nome do channel
char *split_exten_number_from_channel_name(const char *channel_name);
#endif

6
src/transfer/transfer.c

@ -100,7 +100,7 @@ int parse_event_blindtransfer ( PARAM_EVENT_SMANAGER ){
// call de transferencia
transfer_call_uniqueid = new_call_uniqueid(transferee_channel);
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
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);
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_create_call_member( transfer_call_uniqueid, destination_uniqueid, transfer_destination_channel->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, 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->peer_node_up->callerid_number, NULL);
// uniqueid da call anterior
previous_call_uniqueid = get_call_uniqueid_from_a_call_member_uniqueid(transferer_call_on_hold_uniqueid);

Loading…
Cancel
Save