Browse Source

conserto de crash em caso de canal estar conectado a nenhuma ponte

pull/22/head
Diego Nakaniwa 3 months ago
parent
commit
a406c5291c
  1. 50
      src/frame/call_frame.c

50
src/frame/call_frame.c

@ -506,33 +506,35 @@ int restore_calls (){
// se não existir, cria uma call
if (!get_call_uniqueid_from_a_call_member_uniqueid(channel->uniqueid)){
bridge = get_bridge(channel->bridgeid);
// se ambos os canais da bridge forem não locais, criar a ligação diretamente
if (!strstr_n (bridge->bridge_member->name, "Local/") && !strstr_n(bridge->bridge_member->next->name, "Local/")){
bridge_channel_1 = get_channel(bridge->bridge_member->uniqueid);
bridge_channel_2 = get_channel(bridge->bridge_member->next->uniqueid);
if (bridge_channel_1 && bridge_channel_2) {
// marca os canais conectados
newstrncpy(&bridge_channel_1->connected_channel_identification_number, bridge_channel_2->identification_number);
newstrncpy(&bridge_channel_2->connected_channel_identification_number, bridge_channel_1->identification_number);
newstrncpy(&bridge_channel_1->connected_channel_uniqueid, bridge_channel_2->uniqueid);
newstrncpy(&bridge_channel_2->connected_channel_uniqueid, bridge_channel_1->uniqueid);
// o canal com o maior 'priority' é o caller
if (bridge_channel_1->priority > bridge_channel_2->priority){
call_uniqueid = new_call_uniqueid(bridge_channel_1);
parse_create_call(call_uniqueid, bridge_channel_1->uniqueid, "Regular");
parse_update_call(call_uniqueid, NULL, bridge_channel_2->uniqueid);
} else {
call_uniqueid = new_call_uniqueid(bridge_channel_2);
parse_create_call(call_uniqueid, bridge_channel_2->uniqueid, "Regular");
parse_update_call(call_uniqueid, NULL, bridge_channel_1->uniqueid);
}
if (bridge){
// se ambos os canais da bridge forem não locais, criar a ligação diretamente
if (!strstr_n (bridge->bridge_member->name, "Local/") && !strstr_n(bridge->bridge_member->next->name, "Local/")){
bridge_channel_1 = get_channel(bridge->bridge_member->uniqueid);
bridge_channel_2 = get_channel(bridge->bridge_member->next->uniqueid);
if (bridge_channel_1 && bridge_channel_2) {
// marca os canais conectados
newstrncpy(&bridge_channel_1->connected_channel_identification_number, bridge_channel_2->identification_number);
newstrncpy(&bridge_channel_2->connected_channel_identification_number, bridge_channel_1->identification_number);
newstrncpy(&bridge_channel_1->connected_channel_uniqueid, bridge_channel_2->uniqueid);
newstrncpy(&bridge_channel_2->connected_channel_uniqueid, bridge_channel_1->uniqueid);
// o canal com o maior 'priority' é o caller
if (bridge_channel_1->priority > bridge_channel_2->priority){
call_uniqueid = new_call_uniqueid(bridge_channel_1);
parse_create_call(call_uniqueid, bridge_channel_1->uniqueid, "Regular");
parse_update_call(call_uniqueid, NULL, bridge_channel_2->uniqueid);
} else {
call_uniqueid = new_call_uniqueid(bridge_channel_2);
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);
}
} else { // senão, iniciar rastreio a partir da ponte
}
} else { // senão, iniciar rastreio a partir da ponte
find_call_end_nodes(channel->bridgeid);
}
}
}
}
}
channel = channel->next;

Loading…
Cancel
Save