161 lines
4.8 KiB
C++
161 lines
4.8 KiB
C++
/*****************************************************************************\
|
|
** **
|
|
** PBX4Linux **
|
|
** **
|
|
**---------------------------------------------------------------------------**
|
|
** Copyright: Andreas Eversberg **
|
|
** **
|
|
** elektronische fernmelder identifikation **
|
|
** **
|
|
\*****************************************************************************/
|
|
|
|
#include "main.h"
|
|
|
|
enum {
|
|
EFI_STATE_HELLO,
|
|
EFI_STATE_DIE,
|
|
EFI_STATE_BENUTZERDEFINIERTE,
|
|
EFI_STATE_UNTERDRUECKTE,
|
|
EFI_STATE_RUFNUMMER_LAUTET,
|
|
EFI_STATE_DIGIT,
|
|
EFI_STATE_ICH_WIEDERHOLE,
|
|
EFI_STATE_STOP,
|
|
};
|
|
|
|
void EndpointAppPBX::action_init_efi(void)
|
|
{
|
|
// int language = e_ext.vbox_language;
|
|
// struct route_param *rparam;
|
|
struct lcr_msg *message;
|
|
struct port_list *portlist = ea_endpoint->ep_portlist;
|
|
|
|
/* if no caller id */
|
|
if (e_callerinfo.id[0] == '\0')
|
|
{
|
|
/* facility rejected */
|
|
message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_DISCONNECT);
|
|
message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
|
|
message->param.disconnectinfo.cause = CAUSE_FACILITYREJECTED;
|
|
message_put(message);
|
|
logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
|
|
new_state(EPOINT_STATE_OUT_DISCONNECT);
|
|
set_tone(portlist,"cause_22");
|
|
return;
|
|
}
|
|
|
|
/* connect */
|
|
new_state(EPOINT_STATE_CONNECT);
|
|
|
|
/* initialize the vbox */
|
|
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) initializing efi\n", ea_endpoint->ep_serial);
|
|
|
|
e_efi_state = EFI_STATE_HELLO;
|
|
set_tone_efi("hello");
|
|
|
|
e_efi_digit = 0;
|
|
}
|
|
|
|
/*
|
|
* the audio file has ended
|
|
* this is called by Endpoint::message_port(), whenever an audio of has been received
|
|
*/
|
|
void EndpointAppPBX::efi_message_eof(void)
|
|
{
|
|
// char buffer[32];
|
|
char digit[] = "number_00";
|
|
// struct lcr_msg *message;
|
|
// struct port_list *portlist = ea_endpoint->ep_portlist;
|
|
|
|
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s end of file during state: %d\n", ea_endpoint->ep_serial, e_ext.number, e_vbox_state);
|
|
|
|
switch(e_efi_state)
|
|
{
|
|
case EFI_STATE_HELLO:
|
|
e_efi_state = EFI_STATE_DIE;
|
|
set_tone_efi("die");
|
|
break;
|
|
case EFI_STATE_DIE:
|
|
if (e_callerinfo.screen==INFO_SCREEN_USER)
|
|
{
|
|
e_efi_state = EFI_STATE_BENUTZERDEFINIERTE;
|
|
set_tone_efi("benutzerdefinierte");
|
|
break;
|
|
}
|
|
// fall through
|
|
case EFI_STATE_BENUTZERDEFINIERTE:
|
|
if (e_callerinfo.present==INFO_PRESENT_RESTRICTED)
|
|
{
|
|
e_efi_state = EFI_STATE_UNTERDRUECKTE;
|
|
set_tone_efi("unterdrueckte");
|
|
break;
|
|
}
|
|
// fall through
|
|
case EFI_STATE_UNTERDRUECKTE:
|
|
e_efi_state = EFI_STATE_RUFNUMMER_LAUTET;
|
|
set_tone_efi("rufnummer_lautet");
|
|
break;
|
|
|
|
case EFI_STATE_RUFNUMMER_LAUTET:
|
|
e_efi_state = EFI_STATE_DIGIT;
|
|
e_efi_digit = 0;
|
|
// fall through
|
|
case EFI_STATE_DIGIT:
|
|
digit[8] = numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype, options.national, options.international)[e_efi_digit];
|
|
if (digit[8])
|
|
{
|
|
set_tone_efi(digit);
|
|
e_efi_digit++;
|
|
} else
|
|
{
|
|
// e_efi_state = EFI_STATE_STOP;
|
|
e_efi_state = EFI_STATE_ICH_WIEDERHOLE;
|
|
// message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_DISCONNECT);
|
|
// message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL;
|
|
// message->param.disconnectinfo.cause = CAUSE_NORMAL;
|
|
// message_put(message);
|
|
// logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
|
|
// new_state(EPOINT_STATE_OUT_DISCONNECT);
|
|
// set_tone(portlist,"cause_10");
|
|
set_tone_efi("ich_wiederhole");
|
|
}
|
|
break;
|
|
|
|
case EFI_STATE_ICH_WIEDERHOLE:
|
|
e_efi_state = EFI_STATE_DIE;
|
|
set_tone_efi("die");
|
|
break;
|
|
|
|
case EFI_STATE_STOP:
|
|
break;
|
|
|
|
default:
|
|
PERROR("efi_message_eof(ep%d): terminal %s unknown state: %d\n", ea_endpoint->ep_serial, e_ext.number, e_vbox_state);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* set the given vbox-tone with full path (without appending)
|
|
* the tone is played and after eof, a message is received
|
|
*/
|
|
void EndpointAppPBX::set_tone_efi(const char *tone)
|
|
{
|
|
struct lcr_msg *message;
|
|
|
|
if (tone == NULL)
|
|
tone = "";
|
|
|
|
if (!ea_endpoint->ep_portlist)
|
|
{
|
|
PERROR("EPOINT(%d) no portlist\n", ea_endpoint->ep_serial);
|
|
}
|
|
message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_VBOX_TONE);
|
|
SCPY(message->param.tone.dir, (char *)"tones_efi");
|
|
SCPY(message->param.tone.name, tone);
|
|
message_put(message);
|
|
|
|
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s set tone '%s'\n", ea_endpoint->ep_serial, e_ext.number, tone);
|
|
}
|
|
|