Ports can now be specified by number or by name.
[lcr.git] / apppbx.cpp
index 9560103..c19865b 100644 (file)
 \*****************************************************************************/ 
 
 
-#include <stdio.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <poll.h>
 #include "main.h"
 
 class EndpointAppPBX *apppbx_first = NULL;
@@ -81,6 +73,7 @@ EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint, int origin) : EndpointApp
         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;
@@ -135,7 +128,7 @@ EndpointAppPBX::~EndpointAppPBX(void)
 /*
  * trace header for application
  */
-void EndpointAppPBX::trace_header(char *name, int direction)
+void EndpointAppPBX::trace_header(const char *name, int direction)
 {
        struct trace _trace;
 
@@ -146,7 +139,7 @@ void EndpointAppPBX::trace_header(char *name, int direction)
        /* init trace with given values */
        start_trace(0,
                    NULL,
-                   numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype),
+                   numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype, options.national, options.international),
                    e_dialinginfo.id,
                    direction,
                    CATEGORY_EP,
@@ -179,7 +172,7 @@ void EndpointAppPBX::new_state(int state)
 void EndpointAppPBX::release(int release, int joinlocation, int joincause, int portlocation, int portcause)
 {
        struct port_list *portlist;
-       struct message *message;
+       struct lcr_msg *message;
        char cause[16];
 
        /* message to test call */
@@ -246,6 +239,7 @@ void EndpointAppPBX::release(int release, int joinlocation, int joincause, int p
                        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;
@@ -282,7 +276,7 @@ void EndpointAppPBX::release(int release, int joinlocation, int joincause, int p
                                } else
                                {
                                        /* numberrize caller id and use it to dial to the callback */
-                                       SCPY(e_dialinginfo.id, numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype));
+                                       SCPY(e_dialinginfo.id, numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype, options.national, options.international));
                                }
                                e_dialinginfo.itype = INFO_ITYPE_ISDN;
                                e_dialinginfo.ntype = INFO_NTYPE_UNKNOWN;
@@ -333,12 +327,12 @@ void apply_callerid_restriction(struct extension *ext, char *id, int *ntype, int
 }
 
 /* used display message to display callerid as available */
-char *EndpointAppPBX::apply_callerid_display(char *id, int itype, int ntype, int present, int screen, char *extension, char *name)
+char *EndpointAppPBX::apply_callerid_display(const char *id, int itype, int ntype, int present, int screen, const char *extension, const char *name)
 {
        static char display[81];
 
        display[0] = '\0';
-       char *cid = numberrize_callerinfo(id, ntype);
+       const char *cid = numberrize_callerinfo(id, ntype, options.national, options.international);
 
        PDEBUG(DEBUG_EPOINT, "EPOINT(%d) id='%s' itype=%d ntype=%d present=%d screen=%d extension='%s' name='%s'\n", ea_endpoint->ep_serial, (id)?id:"NULL", itype, ntype, present, screen, (extension)?extension:"NULL", (name)?name:"NULL");
 
@@ -428,7 +422,7 @@ char *EndpointAppPBX::apply_callerid_display(char *id, int itype, int ntype, int
 void EndpointAppPBX::notify_active(void)
 {
        struct port_list *portlist = ea_endpoint->ep_portlist;
-       struct message *message;
+       struct lcr_msg *message;
        int notify = 0;
 
        switch(e_tx_state)
@@ -534,9 +528,9 @@ void EndpointAppPBX::keypad_function(char digit)
 
 
 /* set tone pattern for port */
-void EndpointAppPBX::set_tone(struct port_list *portlist, char *tone)
+void EndpointAppPBX::set_tone(struct port_list *portlist, const char *tone)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        if (!tone)
                tone = "";
@@ -629,7 +623,7 @@ foundif:
        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;
@@ -678,9 +672,9 @@ foundif:
        }
 
        /* see if link is up on PTP*/
-       if (mISDNport->ptp && !mISDNport->l2link)
+       if (mISDNport->l2hold && !mISDNport->l2link)
        {
-               trace_header("CHANNEL SELECTION (port is ptp with layer 2 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();
@@ -817,6 +811,11 @@ foundif:
        if (ifport != ifport_start)
                goto nextport;
 
+       if (!ifname) {
+               interface = interface->next;
+               goto checknext;
+       }
+
        return(NULL); /* no port found */
 }
 
@@ -830,10 +829,10 @@ void EndpointAppPBX::out_setup(void)
        class Port              *port;
 //     class pdss1             *pdss1;
        struct port_list        *portlist;
-       struct message          *message;
+       struct lcr_msg          *message;
        int                     anycall = 0;
        int                     cause = CAUSE_RESSOURCEUNAVAIL;
-       char                    *p;
+       const char              *p;
        char                    cfp[64];
        struct mISDNport        *mISDNport;
        char                    portname[32];
@@ -846,6 +845,10 @@ void EndpointAppPBX::out_setup(void)
        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));
@@ -984,7 +987,7 @@ void EndpointAppPBX::out_setup(void)
                        }
                        /* 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);
@@ -1031,7 +1034,7 @@ void EndpointAppPBX::out_setup(void)
                        if (message->param.setup.callerinfo.id[0] && e_ext.clip_prefix[0])
                        {
                                SCPY(message->param.setup.callerinfo.id, e_ext.clip_prefix);
-                               SCAT(message->param.setup.callerinfo.id, numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype));
+                               SCAT(message->param.setup.callerinfo.id, numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype, options.national, options.international));
                                message->param.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN;
                        }
                        /* use internal caller id */
@@ -1092,7 +1095,7 @@ void EndpointAppPBX::out_setup(void)
                                {
                                        /* 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
@@ -1186,7 +1189,7 @@ void EndpointAppPBX::out_setup(void)
                        }
                        /* 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);
@@ -1325,7 +1328,7 @@ int EndpointAppPBX::handler(void)
        if (e_cfnr_release)
        {
                struct port_list *portlist;
-               struct message *message;
+               struct lcr_msg *message;
 
                if (now >= e_cfnr_release)
                {
@@ -1344,7 +1347,7 @@ int EndpointAppPBX::handler(void)
                        }
                        /* put on hold */
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_HOLD;
+                       message->param.audiopath = 0;
                        message_put(message);
                        /* indicate no patterns */
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_NOPATTERN);
@@ -1466,7 +1469,7 @@ void EndpointAppPBX::hookflash(void)
 /* port MESSAGE_SETUP */
 void EndpointAppPBX::port_setup(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message          *message;
+       struct lcr_msg          *message;
        char                    buffer[256];
        int                     writeext;               /* flags need to write extension after modification */
        class Port              *port;
@@ -1479,7 +1482,7 @@ void EndpointAppPBX::port_setup(struct port_list *portlist, int message_type, un
        memcpy(&e_dialinginfo, &param->setup.dialinginfo, sizeof(e_dialinginfo));
        memcpy(&e_redirinfo, &param->setup.redirinfo, sizeof(e_redirinfo));
        memcpy(&e_capainfo, &param->setup.capainfo, sizeof(e_capainfo));
-       e_dtmf = param->setup.dtmf;
+//     e_dtmf = param->setup.dtmf;
        /* screen incoming caller id */
        interface = interface_first;
        while(interface)
@@ -1634,6 +1637,10 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty
 {
        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 */
@@ -1669,7 +1676,7 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty
        /* 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 */
@@ -1706,7 +1713,8 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty
        }
        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");
@@ -1849,7 +1857,7 @@ void EndpointAppPBX::port_crypt(struct port_list *portlist, int message_type, un
 /* port MESSAGE_OVERLAP */
 void EndpointAppPBX::port_overlap(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
 
@@ -1876,7 +1884,7 @@ void EndpointAppPBX::port_overlap(struct port_list *portlist, int message_type,
 
                /* connect audio, if not already */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_CONNECT;
+               message->param.audiopath = 1;
                message_put(message);
        } else
        {
@@ -1886,7 +1894,7 @@ void EndpointAppPBX::port_overlap(struct port_list *portlist, int message_type,
 
                /* disconnect audio, if not already */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_HOLD;
+               message->param.audiopath = 0;
                message_put(message);
        }
        new_state(EPOINT_STATE_OUT_OVERLAP);
@@ -1902,7 +1910,7 @@ void EndpointAppPBX::port_overlap(struct port_list *portlist, int message_type,
 /* port MESSAGE_PROCEEDING */
 void EndpointAppPBX::port_proceeding(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
 
@@ -1919,7 +1927,7 @@ void EndpointAppPBX::port_proceeding(struct port_list *portlist, int message_typ
 
                /* connect audio, if not already */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_CONNECT;
+               message->param.audiopath = 1;
                message_put(message);
        } else
        {
@@ -1929,7 +1937,7 @@ void EndpointAppPBX::port_proceeding(struct port_list *portlist, int message_typ
 
                /* disconnect audio, if not already */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_HOLD;
+               message->param.audiopath = 0;
                message_put(message);
        }
        /* if we are in a call */
@@ -1944,12 +1952,15 @@ void EndpointAppPBX::port_proceeding(struct port_list *portlist, int message_typ
 /* port MESSAGE_ALERTING */
 void EndpointAppPBX::port_alerting(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
 
        /* 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 */
@@ -1961,7 +1972,7 @@ void EndpointAppPBX::port_alerting(struct port_list *portlist, int message_type,
 
                /* connect audio, if not already */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_CONNECT;
+               message->param.audiopath = 1;
                message_put(message);
        } else
        {
@@ -1971,7 +1982,7 @@ void EndpointAppPBX::port_alerting(struct port_list *portlist, int message_type,
 
                /* disconnect audio, if not already */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_HOLD;
+               message->param.audiopath = 0;
                message_put(message);
        }
        /* if we are in a call */
@@ -1986,9 +1997,9 @@ void EndpointAppPBX::port_alerting(struct port_list *portlist, int message_type,
 /* port MESSAGE_CONNECT */
 void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       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;
@@ -1996,7 +2007,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type,
        logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
 
        /* signal to call tool */
-       admin_call_response(e_adminid, ADMIN_CALL_CONNECT, numberrize_callerinfo(param->connectinfo.id,param->connectinfo.ntype), 0, 0, 0);
+       admin_call_response(e_adminid, ADMIN_CALL_CONNECT, numberrize_callerinfo(param->connectinfo.id,param->connectinfo.ntype, options.national, options.international), 0, 0, 0);
 
        memcpy(&e_connectinfo, &param->connectinfo, sizeof(e_connectinfo));
        PDEBUG(DEBUG_EPOINT, "EPOINT(%d) removing all other ports (start)\n", ea_endpoint->ep_serial);
@@ -2082,7 +2093,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type,
                        port = find_port_id(portlist->port_id);
                        if (port)
                        {
-                               SCPY(e_connectinfo.id, nationalize_callerinfo(port->p_dialinginfo.id, &e_connectinfo.ntype));
+                               SCPY(e_connectinfo.id, nationalize_callerinfo(port->p_dialinginfo.id, &e_connectinfo.ntype, options.national, options.international));
                                e_connectinfo.present = INFO_PRESENT_ALLOWED;
                        }
                }
@@ -2096,7 +2107,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type,
                message_put(message);
 
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_CONNECT;
+               message->param.audiopath = 1;
                message_put(message);
        } else if (!e_adminid)
        {
@@ -2196,9 +2207,9 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type,
 /* port MESSAGE_DISCONNECT MESSAGE_RELEASE */
 void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message  *message;
+       struct lcr_msg  *message;
        char            buffer[256];
-       unsigned long   port_id = portlist->port_id;
+       unsigned int    port_id = portlist->port_id;
        int             cause,
                        location;
 
@@ -2296,7 +2307,7 @@ void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int mes
                        message_put(message);
                        /* connect audio, if not already */
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_CONNECT;
+                       message->param.audiopath = 1;
                        message_put(message);
                        /* send disconnect */
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, message_type);
@@ -2410,12 +2421,12 @@ void EndpointAppPBX::port_notify(struct port_list *portlist, int message_type, u
 {
        logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
 
-       struct message *message;
-       char *logtext = "";
+       struct lcr_msg *message;
+       const char *logtext = "";
        char buffer[64];
 
        /* signal to call tool */
-       admin_call_response(e_adminid, ADMIN_CALL_NOTIFY, numberrize_callerinfo(param->notifyinfo.id,param->notifyinfo.ntype), 0, 0, param->notifyinfo.notify);
+       admin_call_response(e_adminid, ADMIN_CALL_NOTIFY, numberrize_callerinfo(param->notifyinfo.id,param->notifyinfo.ntype, options.national, options.international), 0, 0, param->notifyinfo.notify);
        if (param->notifyinfo.notify)
        {
                e_rx_state = track_notify(e_rx_state, param->notifyinfo.notify);
@@ -2430,7 +2441,7 @@ void EndpointAppPBX::port_notify(struct port_list *portlist, int message_type, u
                if (ea_endpoint->ep_join_id)
                {
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_HOLD;
+                       message->param.audiopath = 0;
                        message_put(message);
                }
                break;
@@ -2455,7 +2466,7 @@ void EndpointAppPBX::port_notify(struct port_list *portlist, int message_type, u
                if (ea_endpoint->ep_join_id)
                {
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_CONNECT;
+                       message->param.audiopath = 1;
                        message_put(message);
                }
                break;
@@ -2557,7 +2568,7 @@ void EndpointAppPBX::port_facility(struct port_list *portlist, int message_type,
 {
        logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
 
-       struct message *message;
+       struct lcr_msg *message;
 
        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_FACILITY);
        memcpy(&message->param.facilityinfo, &param->facilityinfo, sizeof(struct facility_info));
@@ -2593,10 +2604,10 @@ void EndpointAppPBX::port_resume(struct port_list *portlist, int message_type, u
 
 /* 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 message *message;
+       struct lcr_msg *message;
 
        portlist = ea_endpoint->ep_portlist;
        while(portlist)
@@ -2774,6 +2785,7 @@ void EndpointAppPBX::ea_message_port(unsigned long port_id, int message_type, un
                break;
 
 #if 0
+               kann nach dem test gelöscht werden, da eine direkte funktion im join und im mISDN zum austausch der message existiert
                /* port assigns bchannel */
                case MESSAGE_BCHANNEL: /* bchannel assignment messafe */
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received bchannel message %d from port.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->bchannel.type);
@@ -2826,7 +2838,7 @@ void EndpointAppPBX::join_crypt(struct port_list *portlist, int message_type, un
 /* join MESSAGE_INFORMATION */
 void EndpointAppPBX::join_information(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        e_overlap = 1;
 
@@ -2843,7 +2855,7 @@ void EndpointAppPBX::join_information(struct port_list *portlist, int message_ty
 /* join MESSAGE_FACILITY */
 void EndpointAppPBX::join_facility(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        if (!e_ext.facility && e_ext.number[0])
        {
@@ -2863,7 +2875,7 @@ void EndpointAppPBX::join_facility(struct port_list *portlist, int message_type,
 /* join MESSAGE_MORE */
 void EndpointAppPBX::join_overlap(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        new_state(EPOINT_STATE_IN_OVERLAP);
        
@@ -2872,7 +2884,7 @@ void EndpointAppPBX::join_overlap(struct port_list *portlist, int message_type,
        {
                /* disconnect audio */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_HOLD;
+               message->param.audiopath = 0;
                message_put(message);
        }
        if (e_action) if (e_action->index == ACTION_OUTDIAL || e_action->index == ACTION_EXTERNAL)
@@ -2883,16 +2895,22 @@ void EndpointAppPBX::join_overlap(struct port_list *portlist, int message_type,
                                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 */
 void EndpointAppPBX::join_proceeding(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        new_state(EPOINT_STATE_IN_PROCEEDING);
 
@@ -2902,9 +2920,9 @@ void EndpointAppPBX::join_proceeding(struct port_list *portlist, int message_typ
                /* connect / disconnect audio */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
                if (e_ext.own_proceeding)
-                       message->param.audiopath = CHANNEL_STATE_HOLD;
+                       message->param.audiopath = 0;
                else
-                       message->param.audiopath = CHANNEL_STATE_CONNECT;
+                       message->param.audiopath = 1;
                message_put(message);
        }
 //                     UCPY(e_join_tone, "proceeding");
@@ -2920,7 +2938,7 @@ void EndpointAppPBX::join_proceeding(struct port_list *portlist, int message_typ
 /* join MESSAGE_ALERTING */
 void EndpointAppPBX::join_alerting(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        new_state(EPOINT_STATE_IN_ALERTING);
 
@@ -2930,9 +2948,9 @@ void EndpointAppPBX::join_alerting(struct port_list *portlist, int message_type,
                /* connect / disconnect audio */
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
                if (e_ext.own_alerting)
-                       message->param.audiopath = CHANNEL_STATE_HOLD;
+                       message->param.audiopath = 0;
                else
-                       message->param.audiopath = CHANNEL_STATE_CONNECT;
+                       message->param.audiopath = 1;
                message_put(message);
        }
        if (portlist)
@@ -2955,12 +2973,14 @@ void EndpointAppPBX::join_alerting(struct port_list *portlist, int message_type,
 /* join MESSAGE_CONNECT */
 void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        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, &param->connectinfo, sizeof(e_callerinfo));
        if(portlist)
@@ -2972,7 +2992,7 @@ void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type,
                if (e_ext.number[0] && message->param.connectinfo.id[0] && e_ext.clip_prefix[0])
                {
                        SCPY(message->param.connectinfo.id, e_ext.clip_prefix);
-                       SCAT(message->param.connectinfo.id, numberrize_callerinfo(e_connectinfo.id,e_connectinfo.ntype));
+                       SCAT(message->param.connectinfo.id, numberrize_callerinfo(e_connectinfo.id,e_connectinfo.ntype, options.national, options.international));
                        message->param.connectinfo.ntype = INFO_NTYPE_UNKNOWN;
                }
 
@@ -2999,7 +3019,7 @@ void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type,
        set_tone(portlist, NULL);
        e_join_pattern = 0;
        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-       message->param.audiopath = CHANNEL_STATE_CONNECT;
+       message->param.audiopath = 1;
        message_put(message);
        e_start = now;
 }
@@ -3008,7 +3028,7 @@ void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type,
 void EndpointAppPBX::join_disconnect_release(int message_type, union parameter *param)
 {
        char cause[16];
-       struct message *message;
+       struct lcr_msg *message;
        struct port_list *portlist = NULL;
 
 
@@ -3105,7 +3125,7 @@ void EndpointAppPBX::join_disconnect_release(int message_type, union parameter *
        } else /* else we enable audio */
        {
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-               message->param.audiopath = CHANNEL_STATE_CONNECT;
+               message->param.audiopath = 1;
                message_put(message);
        }
        /* send disconnect message */
@@ -3122,7 +3142,7 @@ void EndpointAppPBX::join_disconnect_release(int message_type, union parameter *
 /* join MESSAGE_SETUP */
 void EndpointAppPBX::join_setup(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 //     struct interface        *interface;
 
        /* if we already in setup state, we just update the dialing with new digits */
@@ -3147,7 +3167,7 @@ void EndpointAppPBX::join_setup(struct port_list *portlist, int message_type, un
 
                        /* disconnect audio */
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_HOLD;
+                       message->param.audiopath = 0;
                        message_put(message);
 
                        /* get dialing info */
@@ -3238,7 +3258,7 @@ void EndpointAppPBX::join_setup(struct port_list *portlist, int message_type, un
 /* join MESSAGE_mISDNSIGNAL */
 void EndpointAppPBX::join_mISDNsignal(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        while(portlist)
        {
@@ -3252,7 +3272,7 @@ void EndpointAppPBX::join_mISDNsignal(struct port_list *portlist, int message_ty
 /* join MESSAGE_NOTIFY */
 void EndpointAppPBX::join_notify(struct port_list *portlist, int message_type, union parameter *param)
 {
-       struct message *message;
+       struct lcr_msg *message;
        int new_state;
 
        if (param->notifyinfo.notify)
@@ -3313,10 +3333,10 @@ void EndpointAppPBX::join_notify(struct port_list *portlist, int message_type, u
 
 /* 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 message *message;
+       struct lcr_msg *message;
 
        if (!join_id)
        {
@@ -3372,7 +3392,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
 
                /* 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)
                {
@@ -3438,6 +3458,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                break;
 
 #if 0
+               kann nach dem test gelöscht werden, da eine direkte funktion im join und im mISDN zum austausch der message existiert
                /* JOIN requests bchannel */
                case MESSAGE_BCHANNEL: /* indicates the need of own bchannel access */
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received bchannel assignment %d from join.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->bchannel.type);
@@ -3469,13 +3490,8 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                        }
                        /* connect our audio tx and rx (blueboxing should be possibe before connect :)*/
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_CONNECT;
+                       message->param.audiopath = 1;
                        message_put(message);
-//                     /* tell remote epoint to connect audio also, because we like to hear the patterns */
-//                     message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_REMOTE_AUDIO);
-//                     message->param.audiopath = CHANNEL_STATE_CONNECT;
-//                     message_put(message);
-// patterns are available, remote already connected audio
                }
                break;
 
@@ -3488,7 +3504,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                        e_join_pattern = 0;
                        /* disconnect our audio tx and rx */
                        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-                       message->param.audiopath = CHANNEL_STATE_HOLD;
+                       message->param.audiopath = 0;
                        message_put(message);
                }
                break;
@@ -3509,6 +3525,15 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                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);
        }
@@ -3555,7 +3580,7 @@ int match_list(char *list, char *item)
 
 void EndpointAppPBX::pick_join(char *extensions)
 {
-       struct message *message;
+       struct lcr_msg *message;
        struct port_list *portlist;
        class Port *port;
        class EndpointAppPBX *eapp, *found;
@@ -3688,7 +3713,8 @@ reject:
 
        /* 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 */
@@ -3721,7 +3747,7 @@ reject:
 
        /* we send a connect to the audio path (not for vbox) */
        message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
-       message->param.audiopath = CHANNEL_STATE_CONNECT;
+       message->param.audiopath = 1;
        message_put(message);
 
        /* beeing paranoid, we make call update */
@@ -3761,7 +3787,7 @@ reject:
  */
 void EndpointAppPBX::join_join(void)
 {
-       struct message *message;
+       struct lcr_msg *message;
        struct join_relation *our_relation, *other_relation;
        struct join_relation **our_relation_pointer, **other_relation_pointer;
        class Join *our_join, *other_join;
@@ -3939,7 +3965,7 @@ void EndpointAppPBX::join_join(void)
 /* check if we have an external call
  * this is used to check for encryption ability
  */
-int EndpointAppPBX::check_external(char **errstr, class Port **port)
+int EndpointAppPBX::check_external(const char **errstr, class Port **port)
 {
        struct join_relation *relation;
        class Join *join;
@@ -4041,9 +4067,9 @@ int EndpointAppPBX::check_external(char **errstr, class Port **port)
        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";
+       const char *logtext = "unknown";
        char buffer[64];
 
        switch(message_type)
@@ -4056,7 +4082,7 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        add_trace("from", NULL, "CH(%lu)", port_id);
                if (param->setup.callerinfo.extension[0])
                        add_trace("extension", NULL, "%s", param->setup.callerinfo.extension);
-               add_trace("caller id", "number", "%s", numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype));
+               add_trace("caller id", "number", "%s", numberrize_callerinfo(param->setup.callerinfo.id, param->setup.callerinfo.ntype, options.national, options.international));
                switch(param->setup.callerinfo.present)
                {
                        case INFO_PRESENT_RESTRICTED:
@@ -4070,7 +4096,7 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                }
                if (param->setup.redirinfo.id[0])
                {
-                       add_trace("redir'ing", "number", "%s", numberrize_callerinfo(param->setup.redirinfo.id, param->setup.redirinfo.ntype));
+                       add_trace("redir'ing", "number", "%s", numberrize_callerinfo(param->setup.redirinfo.id, param->setup.redirinfo.ntype, options.national, options.international));
                        switch(param->setup.redirinfo.present)
                        {
                                case INFO_PRESENT_RESTRICTED:
@@ -4085,6 +4111,10 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                }
                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;
 
@@ -4123,7 +4153,7 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        add_trace("from", NULL, "CH(%lu)", port_id);
                if (param->connectinfo.extension[0])
                        add_trace("extension", NULL, "%s", param->connectinfo.extension);
-               add_trace("connect id", "number", "%s", numberrize_callerinfo(param->connectinfo.id, param->connectinfo.ntype));
+               add_trace("connect id", "number", "%s", numberrize_callerinfo(param->connectinfo.id, param->connectinfo.ntype, options.national, options.international));
                switch(param->connectinfo.present)
                {
                        case INFO_PRESENT_RESTRICTED:
@@ -4135,6 +4165,8 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        default:
                        add_trace("connect id", "present", "not available");
                }
+               if (param->connectinfo.display[0])
+                       add_trace("display", NULL, "%s", param->connectinfo.display);
                end_trace();
                break;
 
@@ -4178,6 +4210,8 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        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;
 
@@ -4270,7 +4304,7 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        add_trace("indicator", NULL, "%s", logtext);
                if (param->notifyinfo.id[0])
                {
-                       add_trace("redir'on", "number", "%s", numberrize_callerinfo(param->notifyinfo.id, param->notifyinfo.ntype));
+                       add_trace("redir'on", "number", "%s", numberrize_callerinfo(param->notifyinfo.id, param->notifyinfo.ntype, options.national, options.international));
                        switch(param->notifyinfo.present)
                        {
                                case INFO_PRESENT_RESTRICTED:
@@ -4294,7 +4328,12 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        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;
 
@@ -4369,9 +4408,9 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
        }
 }
 
-void EndpointAppPBX::message_disconnect_port(struct port_list *portlist, int cause, int location, char *display)
+void EndpointAppPBX::message_disconnect_port(struct port_list *portlist, int cause, int location, const char *display)
 {
-       struct message *message;
+       struct lcr_msg *message;
 
        if (!portlist)
                return;