e_dtmf = 0;
e_dtmf_time = 0;
e_dtmf_last = 0;
+ e_enablekeypad = 0;
e_cfnr_release = 0;
e_cfnr_call = 0;
e_password_timeout = 0;
e_dtmf = 0;
e_dtmf_time = 0;
e_dtmf_last = 0;
+ e_enablekeypad = 0;
e_cfnr_release = 0;
e_cfnr_call = 0;
e_multipoint_cause = 0;
if (!interface->ifport)
{
/* no ports */
- trace_header("CHANNEL SELECTION (interface has no active ports, skipping)", DIRECTION_NONE);
+ trace_header("CHANNEL SELECTION (active ports, skipping)", DIRECTION_NONE);
add_trace("interface", NULL, "%s", interface->name);
end_trace();
interface = interface->next;
/* see if link is up on PTP*/
if (mISDNport->l2hold && !mISDNport->l2link)
{
- trace_header("CHANNEL SELECTION (port holds layer 2, but layer 2 is down, skipping)", DIRECTION_NONE);
+ trace_header("CHANNEL SELECTION (port's layer 2 is down, skipping)", DIRECTION_NONE);
add_trace("port", NULL, "%d", ifport->portnum);
add_trace("position", NULL, "%d", index);
end_trace();
if (ifport != ifport_start)
goto nextport;
+ if (!ifname) {
+ interface = interface->next;
+ goto checknext;
+ }
+
return(NULL); /* no port found */
}
struct port_settings port_settings;
int channel = 0;
int earlyb;
+ int mode = B_MODE_TRANSPARENT;
+
+ /* set bchannel mode */
+ mode = e_capainfo.source_mode;
/* create settings for creating port */
memset(&port_settings, 0, sizeof(port_settings));
}
/* creating INTERNAL port */
SPRINT(portname, "%s-%d-out", mISDNport->ifport->interface->name, mISDNport->portnum);
- port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force);
+ port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force, mode);
if (!port)
FATAL("No memory for DSS1 Port instance\n");
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) got port %s\n", ea_endpoint->ep_serial, port->p_name);
{
/* creating EXTERNAL port*/
SPRINT(portname, "%s-%d-out", mISDNport->ifport->interface->name, mISDNport->portnum);
- if (!(port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force)))
+ if (!(port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force, mode)))
FATAL("No memory for DSS1 Port instance\n");
earlyb = mISDNport->earlyb;
} else
}
/* creating EXTERNAL port*/
SPRINT(portname, "%s-%d-out", mISDNport->ifport->interface->name, mISDNport->portnum);
- if (!(port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force)))
+ if (!(port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force, mode)))
FATAL("No memory for DSS1 Port instance\n");
earlyb = mISDNport->earlyb;
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) created port %s\n", ea_endpoint->ep_serial, port->p_name);
memcpy(&e_dialinginfo, ¶m->setup.dialinginfo, sizeof(e_dialinginfo));
memcpy(&e_redirinfo, ¶m->setup.redirinfo, sizeof(e_redirinfo));
memcpy(&e_capainfo, ¶m->setup.capainfo, sizeof(e_capainfo));
- e_dtmf = param->setup.dtmf;
+// e_dtmf = param->setup.dtmf;
/* screen incoming caller id */
interface = interface_first;
while(interface)
{
logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
+ /* ignore information message without digit information */
+ if (!param->information.id[0])
+ return;
+
e_overlap = 1;
/* turn off dtmf detection, in case dtmf is sent with keypad information */
/* keypad when connected */
if (e_state == EPOINT_STATE_CONNECT)
{
- if (e_ext.keypad)
+ if (e_ext.keypad || e_enablekeypad)
{
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) keypad information received during connect: %s.\n", ea_endpoint->ep_serial, param->information.id);
/* processing keypad function */
}
if (e_action)
if (e_action->index==ACTION_OUTDIAL
- || e_action->index==ACTION_EXTERNAL)
+ || e_action->index==ACTION_EXTERNAL
+ || e_action->index==ACTION_REMOTE)
{
if (!e_extdialing)
set_tone(portlist, "dialing");
/* signal to call tool */
admin_call_response(e_adminid, ADMIN_CALL_ALERTING, "", 0, 0, 0);
+//#warning hack!!
+// if (e_adminid)
+// set_tone(portlist, "hold");
new_state(EPOINT_STATE_OUT_ALERTING);
/* check if pattern is available */
{
struct lcr_msg *message;
char buffer[256];
- unsigned long port_id = portlist->port_id;
+ unsigned int port_id = portlist->port_id;
struct port_list *tportlist;
class Port *port;
struct interface *interface;
{
struct lcr_msg *message;
char buffer[256];
- unsigned long port_id = portlist->port_id;
+ unsigned int port_id = portlist->port_id;
int cause,
location;
/* port sends message to the endpoint
*/
-void EndpointAppPBX::ea_message_port(unsigned long port_id, int message_type, union parameter *param)
+void EndpointAppPBX::ea_message_port(unsigned int port_id, int message_type, union parameter *param)
{
struct port_list *portlist;
struct lcr_msg *message;
set_tone(portlist, "dialtone");
return;
}
- if (e_ext.number[0])
- set_tone(portlist, "dialpbx");
- else
- set_tone(portlist, "dialtone");
+ if (e_dialinginfo.id[0])
+ {
+ set_tone(portlist, "dialing");
+ } else
+ {
+ if (e_ext.number[0])
+ set_tone(portlist, "dialpbx");
+ else
+ set_tone(portlist, "dialtone");
+ }
}
/* join MESSAGE_PROCEEDING */
new_state(EPOINT_STATE_CONNECT);
// UCPY(e_join_tone, "");
+//
if (e_ext.number[0])
e_dtmf = 1; /* allow dtmf */
+
e_powerdialing = 0;
memcpy(&e_connectinfo, ¶m->connectinfo, sizeof(e_callerinfo));
if(portlist)
/* JOIN sends messages to the endpoint
*/
-void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, union parameter *param)
+void EndpointAppPBX::ea_message_join(unsigned int join_id, int message_type, union parameter *param)
{
struct port_list *portlist;
struct lcr_msg *message;
/* JOIN sends OVERLAP message */
case MESSAGE_OVERLAP:
- PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received 'more info available'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
+ PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received 'more info required'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
if (e_state!=EPOINT_STATE_IN_SETUP
&& e_state!=EPOINT_STATE_IN_OVERLAP)
{
join_notify(portlist, message_type, param);
break;
+ /* JOIN wants keypad / dtml */
+ case MESSAGE_ENABLEKEYPAD:
+ PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received keypad enable request.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
+ e_enablekeypad = 1;
+ e_dtmf = 1;
+ trace_header("ENABLE KEYPAD", DIRECTION_NONE);
+ end_trace();
+ break;
+
default:
PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received a wrong message: #%d\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, message);
}
/* connnecting our endpoint */
new_state(EPOINT_STATE_CONNECT);
- e_dtmf = 1;
+ if (e_ext.number[0])
+ e_dtmf = 1;
set_tone(ea_endpoint->ep_portlist, NULL);
/* now we send a release to the ringing endpoint */
return(0);
}
-void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsigned long port_id, int dir)
+void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsigned int port_id, int dir)
{
char *logtext = "unknown";
char buffer[64];
}
if (param->setup.dialinginfo.id[0])
add_trace("dialing", NULL, "%s", param->setup.dialinginfo.id);
+ if (param->setup.dialinginfo.display[0])
+ add_trace("display", NULL, "%s", param->setup.dialinginfo.display);
+ if (param->setup.dialinginfo.sending_complete)
+ add_trace("complete", NULL, "true", param->setup.dialinginfo.sending_complete);
end_trace();
break;
default:
add_trace("connect id", "present", "not available");
}
+ if (param->connectinfo.display[0])
+ add_trace("display", NULL, "%s", param->connectinfo.display);
end_trace();
break;
default:
add_trace("cause", "location", "%d", param->disconnectinfo.location);
}
+ if (param->disconnectinfo.display[0])
+ add_trace("display", NULL, "%s", param->disconnectinfo.display);
end_trace();
break;
add_trace("to", NULL, "CH(%lu)", port_id);
if (dir == DIRECTION_IN)
add_trace("from", NULL, "CH(%lu)", port_id);
- add_trace("dialing", NULL, "%s", param->information.id);
+ if (param->information.id[0])
+ add_trace("dialing", NULL, "%s", param->information.id);
+ if (param->information.display[0])
+ add_trace("display", NULL, "%s", param->information.display);
+ if (param->information.sending_complete)
+ add_trace("complete", NULL, "true", param->information.sending_complete);
end_trace();
break;