error inside information elements are now reported inside trace and main log,
[lcr.git] / apppbx.cpp
index 1cef961..66aba31 100644 (file)
@@ -25,7 +25,7 @@ class EndpointAppPBX *apppbx_first = NULL;
 /*
  * EndpointAppPBX constructor
  */
-EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint) : EndpointApp(epoint)
+EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint, int origin) : EndpointApp(epoint, origin)
 {
        class EndpointAppPBX **apppointer;
 
@@ -38,8 +38,9 @@ EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint) : EndpointApp(epoint)
 
        /* initialize */
         memset(&e_ext, 0, sizeof(struct extension));
+       // *************** NOTE: also change value in read_extension() **************
        e_ext.rights = 4; /* international */
-       e_ext.rxvol = e_ext.txvol = 256;
+       e_ext.rx_gain = e_ext.tx_gain = 0;
         e_state = EPOINT_STATE_IDLE;
         e_ext.number[0] = '\0';
        e_extension_interface[0] = '\0';
@@ -49,7 +50,7 @@ EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint) : EndpointApp(epoint)
         memset(&e_redirinfo, 0, sizeof(struct redir_info));
         memset(&e_capainfo, 0, sizeof(struct capa_info));
         e_start = e_stop = 0;
-//      e_origin = 0;
+       e_origin = origin;
        e_ruleset = ruleset_main;
        if (e_ruleset)
                e_rule = e_ruleset->rule_first;
@@ -173,158 +174,6 @@ void EndpointAppPBX::new_state(int state)
 }
 
 
-/* screen caller id
- * out==0: incomming caller id, out==1: outgoing caller id
- */
-void EndpointAppPBX::screen(int out, char *id, int idsize, int *type, int *present, struct interface *interface)
-{
-       char                    *msn1;
-       struct interface_msn    *ifmsn;
-       struct interface_screen *ifscreen;
-       char suffix[64];
-
-       /* screen incoming caller id */
-       if (!out)
-       {
-               /* check for MSN numbers, use first MSN if no match */
-               msn1 = NULL;
-               ifmsn = interface->ifmsn;
-               while(ifmsn)
-               {
-                       if (!msn1)
-                               msn1 = ifmsn->msn;
-                       if (!strcmp(ifmsn->msn, id))
-                       {
-                               break;
-                       }
-                       ifmsn = ifmsn->next;
-               }
-               if (ifmsn)
-               {
-                       trace_header("SCREEN (found in MSN list)", DIRECTION_IN);
-                       add_trace("msn", NULL, "%s", id);
-                       end_trace();
-               }
-               if (!ifmsn && msn1) // not in list, first msn given
-               {
-                       trace_header("SCREEN (not found MSN in list)", DIRECTION_IN);
-                       add_trace("msn", "given", "%s", id);
-                       add_trace("msn", "used", "%s", msn1);
-                       end_trace();
-                       UNCPY(id, msn1, idsize);
-                       id[idsize-1] = '\0';
-               }
-       }
-
-       /* check screen list */
-       if (out)
-               ifscreen = interface->ifscreen_out;
-       else
-               ifscreen = interface->ifscreen_in;
-       while (ifscreen)
-       {
-               if (ifscreen->match_type==-1 || ifscreen->match_type==*type)
-               if (ifscreen->match_present==-1 || ifscreen->match_present==*present)
-               {
-                       if (strchr(ifscreen->match,'%'))
-                       {
-                               if (!strncmp(ifscreen->match, id, strchr(ifscreen->match,'%')-ifscreen->match))
-                                       break;
-                       } else
-                       {
-                               if (!strcmp(ifscreen->match, id))
-                                       break;
-                       }
-               }
-               ifscreen = ifscreen->next;
-       }
-       if (ifscreen) // match
-       {
-               trace_header("SCREEN (found in screen list)", out?DIRECTION_OUT:DIRECTION_IN);
-               switch(*type)
-               {
-                       case INFO_NTYPE_UNKNOWN:
-                       add_trace("given", "type", "unknown");
-                       break;
-                       case INFO_NTYPE_SUBSCRIBER:
-                       add_trace("given", "type", "subscriber");
-                       break;
-                       case INFO_NTYPE_NATIONAL:
-                       add_trace("given", "type", "national");
-                       break;
-                       case INFO_NTYPE_INTERNATIONAL:
-                       add_trace("given", "type", "international");
-                       break;
-               }
-               switch(*present)
-               {
-                       case INFO_PRESENT_ALLOWED:
-                       add_trace("given", "present", "allowed");
-                       break;
-                       case INFO_PRESENT_RESTRICTED:
-                       add_trace("given", "present", "restricted");
-                       break;
-                       case INFO_PRESENT_NOTAVAIL:
-                       add_trace("given", "present", "not available");
-                       break;
-               }
-               add_trace("given", "id", "%s", id[0]?id:"<empty>");
-               if (ifscreen->result_type != -1)
-               {
-                       *type = ifscreen->result_type;
-                       switch(*type)
-                       {
-                               case INFO_NTYPE_UNKNOWN:
-                               add_trace("used", "type", "unknown");
-                               break;
-                               case INFO_NTYPE_SUBSCRIBER:
-                               add_trace("used", "type", "subscriber");
-                               break;
-                               case INFO_NTYPE_NATIONAL:
-                               add_trace("used", "type", "national");
-                               break;
-                               case INFO_NTYPE_INTERNATIONAL:
-                               add_trace("used", "type", "international");
-                               break;
-                       }
-               }
-               if (ifscreen->result_present != -1)
-               {
-                       *present = ifscreen->result_present;
-                       switch(*present)
-                       {
-                               case INFO_PRESENT_ALLOWED:
-                               add_trace("used", "present", "allowed");
-                               break;
-                               case INFO_PRESENT_RESTRICTED:
-                               add_trace("used", "present", "restricted");
-                               break;
-                               case INFO_PRESENT_NOTAVAIL:
-                               add_trace("used", "present", "not available");
-                               break;
-                       }
-               }
-               if (strchr(ifscreen->match,'%'))
-               {
-                       SCPY(suffix, strchr(ifscreen->match,'%') - ifscreen->match + id);
-                       UNCPY(id, ifscreen->result, idsize);
-                       id[idsize-1] = '\0';
-                       if (strchr(ifscreen->result,'%'))
-                       {
-                               *strchr(ifscreen->result,'%') = '\0';
-                               UNCAT(id, suffix, idsize);
-                               id[idsize-1] = '\0';
-                       }
-               } else
-               {
-                       UNCPY(id, ifscreen->result, idsize);
-                       id[idsize-1] = '\0';
-               }
-               add_trace("used", "id", "%s", id[0]?id:"<empty>");
-               end_trace();
-       }
-}
-
 /* release join and port (as specified)
  */
 void EndpointAppPBX::release(int release, int joinlocation, int joincause, int portlocation, int portcause)
@@ -450,7 +299,7 @@ void EndpointAppPBX::release(int release, int joinlocation, int joincause, int p
 
 
 /* cancel callerid if restricted, unless anon-ignore is enabled at extension or port is of type external (so called police gets caller id :)*/
-void apply_callerid_restriction(int anon_ignore, char *id, int *ntype, int *present, int *screen, char *extension, char *name)
+void apply_callerid_restriction(struct extension *ext, char *id, int *ntype, int *present, int *screen, char *extension, char *name)
 {
        PDEBUG(DEBUG_EPOINT, "id='%s' ntype=%d present=%d screen=%d extension='%s' name='%s'\n", (id)?id:"NULL", (ntype)?*ntype:-1, (present)?*present:-1, (screen)?*screen:-1, (extension)?extension:"NULL", (name)?name:"NULL");
 
@@ -459,13 +308,11 @@ void apply_callerid_restriction(int anon_ignore, char *id, int *ntype, int *pres
                return;
 
        /* only extensions are restricted */
-       if (!extension)
-               return;
-       if (!extension[0])
+       if (!ext->number[0])
                return;
 
        /* if we enabled anonymouse ignore */
-       if (anon_ignore)
+       if (ext->anon_ignore)
                return;
 
        /* else we remove the caller id */
@@ -697,11 +544,6 @@ void EndpointAppPBX::set_tone(struct port_list *portlist, char *tone)
        /* store for suspended processes */
        SCPY(e_tone, tone);
 
-       if (!portlist)
-       {
-               PDEBUG(DEBUG_EPOINT, "EPOINT(%d) no endpoint to notify tone.\n", ea_endpoint->ep_serial);
-               return;
-       }
 
        if (e_join_pattern /* pattern are provided */
         && !(e_ext.own_setup && e_state == EPOINT_STATE_IN_SETUP)
@@ -727,6 +569,10 @@ void EndpointAppPBX::set_tone(struct port_list *portlist, char *tone)
                SCPY(message->param.tone.name, tone);
                message_put(message);
                logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
+       } else
+       {
+               PDEBUG(DEBUG_EPOINT, "EPOINT(%d) no port to notify tone.\n", ea_endpoint->ep_serial);
+               return;
        }
 }
 
@@ -867,14 +713,26 @@ foundif:
                                }
                                i++;
                        }
+                       if (*channel)
+                               break;
+                       trace_header("CHANNEL SELECTION (no channel is 'free')", DIRECTION_NONE);
+                       add_trace("port", NULL, "%d", ifport->portnum);
+                       add_trace("position", NULL, "%d", index);
+                       end_trace();
                        break;
 
                        case CHANNEL_ANY: /* don't ask for channel */
                        if (mISDNport->b_reserved >= mISDNport->b_num)
                        {
+                               trace_header("CHANNEL SELECTION (cannot ask for 'any' channel, all reserved)", DIRECTION_NONE);
+                               add_trace("port", NULL, "%d", ifport->portnum);
+                               add_trace("position", NULL, "%d", index);
+                               add_trace("total", NULL, "%d", mISDNport->b_num);
+                               add_trace("reserved", NULL, "%d", mISDNport->b_reserved);
+                               end_trace();
                                break; /* all channel in use or reserverd */
                        }
-                       trace_header("CHANNEL SELECTION (using 'any channel')", DIRECTION_NONE);
+                       trace_header("CHANNEL SELECTION (using 'any' channel)", DIRECTION_NONE);
                        add_trace("port", NULL, "%d", ifport->portnum);
                        add_trace("position", NULL, "%d", index);
                        end_trace();
@@ -882,7 +740,7 @@ foundif:
                        break;
 
                        case CHANNEL_NO: /* call waiting */
-                       trace_header("CHANNEL SELECTION (using 'no channel', call-waiting)", DIRECTION_NONE);
+                       trace_header("CHANNEL SELECTION (using 'no' channel, call-waiting)", DIRECTION_NONE);
                        add_trace("port", NULL, "%d", ifport->portnum);
                        add_trace("position", NULL, "%d", index);
                        end_trace();
@@ -891,10 +749,25 @@ foundif:
 
                        default:
                        if (selchannel->channel<1 || selchannel->channel==16)
+                       {
+                               trace_header("CHANNEL SELECTION (channel out of range)", DIRECTION_NONE);
+                               add_trace("port", NULL, "%d", ifport->portnum);
+                               add_trace("position", NULL, "%d", index);
+                               add_trace("channel", NULL, "%d", selchannel->channel);
+                               end_trace();
                                break; /* invalid channels */
+                       }
                        i = selchannel->channel-1-(selchannel->channel>=17);
                        if (i >= mISDNport->b_num)
+                       {
+                               trace_header("CHANNEL SELECTION (channel out of range)", DIRECTION_NONE);
+                               add_trace("port", NULL, "%d", ifport->portnum);
+                               add_trace("position", NULL, "%d", index);
+                               add_trace("channel", NULL, "%d", selchannel->channel);
+                               add_trace("channels", NULL, "%d", mISDNport->b_num);
+                               end_trace();
                                break; /* channel not in port */
+                       }
                        if (mISDNport->b_port[i] == NULL)
                        {
                                *channel = selchannel->channel;
@@ -980,13 +853,6 @@ void EndpointAppPBX::out_setup(void)
                SCPY(port_settings.tones_dir, e_ext.tones_dir);
        else
                SCPY(port_settings.tones_dir, options.tones_dir);
-       port_settings.tout_setup = e_ext.tout_setup;
-       port_settings.tout_dialing = e_ext.tout_dialing;
-       port_settings.tout_proceeding = e_ext.tout_proceeding;
-       port_settings.tout_alerting = e_ext.tout_alerting;
-       port_settings.tout_disconnect = e_ext.tout_disconnect;
-//     port_settings.tout_hold = e_ext.tout_hold;
-//     port_settings.tout_park = e_ext.tout_park;
        port_settings.no_seconds = e_ext.no_seconds;
        
        /* NOTE: currently the try_card feature is not supported. it should be used later to try another card, if the outgoing call fails on one port */
@@ -1135,7 +1001,7 @@ void EndpointAppPBX::out_setup(void)
                                goto check_anycall_intern;
                        }
                        /* directory.list */
-                       if (e_callerinfo.id[0] && (e_ext.centrex || e_ext.display_name))
+                       if (e_callerinfo.id[0] && e_ext.display_name)
                        {
                                dirname = parse_directory(e_callerinfo.id, e_callerinfo.ntype);
                                if (dirname)
@@ -1153,14 +1019,14 @@ void EndpointAppPBX::out_setup(void)
 //terminal                     if (e_dialinginfo.id)
 //terminal                             SCPY(message->param.setup.to_terminal, e_dialinginfo.id);
                        /* handle restricted caller ids */
-                       apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name);
-                       apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL);
+                       apply_callerid_restriction(&e_ext, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name);
+                       apply_callerid_restriction(&e_ext, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL);
                        /* display callerid if desired for extension */
                        SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name));
 //printf("\n\ndisplay = %s\n\n\n",message->param.setup.callerinfo.display);
                        /* use cnip, if enabld */
-                       if (!e_ext.centrex)
-                               message->param.setup.callerinfo.name[0] = '\0';
+       //              if (!e_ext.centrex)
+       //                      message->param.setup.callerinfo.name[0] = '\0';
                        /* screen clip if prefix is required */
                        if (message->param.setup.callerinfo.id[0] && e_ext.clip_prefix[0])
                        {
@@ -1272,8 +1138,8 @@ void EndpointAppPBX::out_setup(void)
 //terminal                     if (e_dialinginfo.id)
 //terminal                             SCPY(message->param.setup.to_terminal, e_dialinginfo.id);
                                /* handle restricted caller ids */
-                       apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name);
-                       apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL);
+                       apply_callerid_restriction(&e_ext, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name);
+                       apply_callerid_restriction(&e_ext, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL);
                        /* display callerid if desired for extension */
                        SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name));
                        message_put(message);
@@ -1347,8 +1213,8 @@ void EndpointAppPBX::out_setup(void)
 //terminal                     if (e_dialinginfo.id)
 //terminal                             SCPY(message->param.setup.to_terminal, e_dialinginfo.id);
                                /* handle restricted caller ids */
-                       apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name);
-                       apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL);
+                       apply_callerid_restriction(&e_ext, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name);
+                       apply_callerid_restriction(&e_ext, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL);
                        /* display callerid if desired for extension */
                        SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name));
                        message_put(message);
@@ -1625,7 +1491,7 @@ void EndpointAppPBX::port_setup(struct port_list *portlist, int message_type, un
                interface = interface->next;
        }
        if (interface)
-               screen(0, e_callerinfo.id, sizeof(e_callerinfo.id), &e_callerinfo.ntype, &e_callerinfo.present, interface);
+               do_screen(0, e_callerinfo.id, sizeof(e_callerinfo.id), &e_callerinfo.ntype, &e_callerinfo.present, interface);
 
        /* process extension */
        if (e_callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION)
@@ -1703,12 +1569,12 @@ void EndpointAppPBX::port_setup(struct port_list *portlist, int message_type, un
 
                /* set volume of rx and tx */
                if (param->setup.callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION)
-               if (e_ext.txvol!=256 || e_ext.rxvol!=256)
+               if (e_ext.tx_gain!=0 || e_ext.rx_gain!=0)
                {
                        message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_mISDNSIGNAL);
                        message->param.mISDNsignal.message = mISDNSIGNAL_VOLUME;
-                       message->param.mISDNsignal.rxvol = e_ext.txvol;
-                       message->param.mISDNsignal.txvol = e_ext.rxvol;
+                       message->param.mISDNsignal.rx_gain = e_ext.tx_gain;
+                       message->param.mISDNsignal.tx_gain = e_ext.rx_gain;
                        message_put(message);
                }
 
@@ -1815,14 +1681,20 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty
                                keypad_function(param->information.id[0]);
                } else
                {
-                       trace_header("DTMF (not enabled by extension's settings)", DIRECTION_IN);
+                       if (e_ext.number[0])
+                               trace_header("KEYPAD (not enabled by extension's settings)", DIRECTION_IN);
+                       else
+                               trace_header("KEYPAD (not enabled for external interfaces)", DIRECTION_IN);
                        end_trace();
                }
                return;
        }
        if (e_state != EPOINT_STATE_IN_OVERLAP)
        {
-               trace_header("DTMF (ignored, not connected and not dialing)", DIRECTION_IN);
+               if (e_ext.number[0])
+                       trace_header("KEYPAD (ignored, not connected and not dialing)", DIRECTION_IN);
+               else
+                       trace_header("KEYPAD (not enabled for external interfaces)", DIRECTION_IN);
                end_trace();
                return;
        }
@@ -2157,7 +2029,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type,
                interface = interface->next;
        }
        if (interface)
-               screen(0, e_connectinfo.id, sizeof(e_connectinfo.id), &e_connectinfo.ntype, &e_connectinfo.present, interface);
+               do_screen(0, e_connectinfo.id, sizeof(e_connectinfo.id), &e_connectinfo.ntype, &e_connectinfo.present, interface);
 
        /* screen connected name */
        if (e_ext.name[0])
@@ -2187,12 +2059,12 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type,
        new_state(EPOINT_STATE_CONNECT);
 
        /* set volume of rx and tx */
-       if (e_ext.txvol!=256 || e_ext.rxvol!=256)
+       if (e_ext.tx_gain!=0 || e_ext.rx_gain!=0)
        {
                message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_mISDNSIGNAL);
                message->param.mISDNsignal.message = mISDNSIGNAL_VOLUME;
-               message->param.mISDNsignal.rxvol = e_ext.txvol;
-               message->param.mISDNsignal.txvol = e_ext.rxvol;
+               message->param.mISDNsignal.rx_gain = e_ext.tx_gain;
+               message->param.mISDNsignal.tx_gain = e_ext.rx_gain;
                message_put(message);
        }
 
@@ -2567,13 +2439,13 @@ void EndpointAppPBX::port_notify(struct port_list *portlist, int message_type, u
                case INFO_NOTIFY_USER_RESUMED:
                /* set volume of rx and tx */
                if (param->setup.callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION)
-               if (e_ext.txvol!=256 || e_ext.rxvol!=256)
+               if (e_ext.tx_gain!=0 || e_ext.rx_gain!=0)
                if (portlist)
                {
                        message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_mISDNSIGNAL);
                        message->param.mISDNsignal.message = mISDNSIGNAL_VOLUME;
-                       message->param.mISDNsignal.rxvol = e_ext.txvol;
-                       message->param.mISDNsignal.txvol = e_ext.rxvol;
+                       message->param.mISDNsignal.rx_gain = e_ext.tx_gain;
+                       message->param.mISDNsignal.tx_gain = e_ext.rx_gain;
                        message_put(message);
                }
                /* set current tone */
@@ -2901,14 +2773,15 @@ void EndpointAppPBX::ea_message_port(unsigned long port_id, int message_type, un
                port_resume(portlist, message_type, param);
                break;
 
+#if 0
                /* port assigns bchannel */
-               case MESSAGE_BCHANNEL: /* indicates the assigned bchannel  */
-               case MESSAGE_BCHANNEL_FREE: /* requests bchannel back (e.g. when call is holded) */
-               PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received bchannel assignment.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
+               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);
                /* only one port is expected to be connected to bchannel */
                message = message_forward(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, param);
                logmessage(message->type, &message->param, portlist->port_id, DIRECTION_IN);
                break;
+#endif
 
 
                default:
@@ -3080,7 +2953,6 @@ void EndpointAppPBX::join_alerting(struct port_list *portlist, int message_type,
 void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type, union parameter *param)
 {
        struct message *message;
-       struct interface        *interface;
 
        new_state(EPOINT_STATE_CONNECT);
 //                     UCPY(e_join_tone, "");
@@ -3092,19 +2964,6 @@ void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type,
        {
                message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_CONNECT);
                memcpy(&message->param, param, sizeof(union parameter));
-               /* screen incoming caller id */
-               interface = interface_first;
-               while(interface)
-               {
-                       if (!strcmp(e_connectinfo.interface, interface->name))
-                       {
-                               break;
-                       }
-                       interface = interface->next;
-               }
-               if (interface)
-                       screen(1, e_connectinfo.id, sizeof(e_connectinfo.id), &e_connectinfo.ntype, &e_connectinfo.present, interface);
-               memcpy(&message->param.connectinfo, &e_connectinfo, sizeof(e_connectinfo));
 
                /* screen clip if prefix is required */
                if (e_ext.number[0] && message->param.connectinfo.id[0] && e_ext.clip_prefix[0])
@@ -3122,13 +2981,13 @@ void EndpointAppPBX::join_connect(struct port_list *portlist, int message_type,
                }
 
                /* handle restricted caller ids */
-               apply_callerid_restriction(e_ext.anon_ignore, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name);
+               apply_callerid_restriction(&e_ext, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name);
                /* display callerid if desired for extension */
                SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name));
 
                /* use conp, if enabld */
-               if (!e_ext.centrex)
-                       message->param.connectinfo.name[0] = '\0';
+//             if (!e_ext.centrex)
+//                     message->param.connectinfo.name[0] = '\0';
 
                /* send connect */
                message_put(message);
@@ -3358,19 +3217,6 @@ void EndpointAppPBX::join_setup(struct port_list *portlist, int message_type, un
        memcpy(&e_redirinfo, &param->setup.redirinfo, sizeof(e_redirinfo));
        memcpy(&e_capainfo, &param->setup.capainfo, sizeof(e_capainfo));
 
-       /* screen incoming caller id */
-       interface = interface_first;
-       while(interface)
-       {
-               if (!strcmp(e_callerinfo.interface, interface->name))
-               {
-                       break;
-               }
-               interface = interface->next;
-       }
-       if (interface)
-               screen(1, e_callerinfo.id, sizeof(e_callerinfo.id), &e_callerinfo.ntype, &e_callerinfo.present, interface);
-
        /* process (voice over) data calls */
        if (e_ext.datacall && e_capainfo.bearer_capa!=INFO_BC_SPEECH && e_capainfo.bearer_capa!=INFO_BC_AUDIO)
        {
@@ -3418,10 +3264,13 @@ void EndpointAppPBX::join_notify(struct port_list *portlist, int message_type, u
                                /* unhold if */
                                if (new_state!=NOTIFY_STATE_HOLD && new_state!=NOTIFY_STATE_SUSPEND)
                                {
-                                       while(portlist)
+                                       if (!strcmp(e_tone, "hold")) // don't interrupt other tones
                                        {
-                                               set_tone(portlist, "");
-                                               portlist = portlist->next;
+                                               while(portlist)
+                                               {
+                                                       set_tone(portlist, "");
+                                                       portlist = portlist->next;
+                                               }
                                        }
                                        portlist = ea_endpoint->ep_portlist;
                                        e_hold = 0;
@@ -3450,7 +3299,7 @@ void EndpointAppPBX::join_notify(struct port_list *portlist, int message_type, u
                message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_NOTIFY);
                memcpy(&message->param.notifyinfo, &param->notifyinfo, sizeof(struct notify_info));
                /* handle restricted caller ids */
-               apply_callerid_restriction(e_ext.anon_ignore, message->param.notifyinfo.id, &message->param.notifyinfo.ntype, &message->param.notifyinfo.present, 0, message->param.notifyinfo.extension, NULL);
+               apply_callerid_restriction(&e_ext, message->param.notifyinfo.id, &message->param.notifyinfo.ntype, &message->param.notifyinfo.present, 0, message->param.notifyinfo.extension, NULL);
                /* display callerid if desired for extension */
                SCPY(message->param.notifyinfo.display, apply_callerid_display(message->param.notifyinfo.id, message->param.notifyinfo.itype, message->param.notifyinfo.ntype, message->param.notifyinfo.present, 0, message->param.notifyinfo.extension, NULL));
                message_put(message);
@@ -3459,7 +3308,7 @@ void EndpointAppPBX::join_notify(struct port_list *portlist, int message_type, u
        }
 }
 
-/* call sends messages to the endpoint
+/* JOIN sends messages to the endpoint
  */
 void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, union parameter *param)
 {
@@ -3468,7 +3317,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
 
        if (!join_id)
        {
-               PERROR("EPOINT(%d) error: call == NULL.\n", ea_endpoint->ep_serial);
+               PERROR("EPOINT(%d) error: JOIN == NULL.\n", ea_endpoint->ep_serial);
                return;
        }
 
@@ -3477,7 +3326,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
        /* send MESSAGE_DATA to port */
        if (message_type == MESSAGE_DATA)
        {
-               if (join_id == ea_endpoint->ep_join_id) // still linked with call
+               if (join_id == ea_endpoint->ep_join_id) // still linked with JOIN
                {
                        /* skip if no port relation */
                        if (!portlist)
@@ -3491,28 +3340,34 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                }
        }
 
-//     PDEBUG(DEBUG_EPOINT, "EPOINT(%d) received message %d for active call (terminal %s, caller id %s state=%d)\n", ea_endpoint->ep_serial, message, e_ext.number, e_callerinfo.id, e_state);
+//     PDEBUG(DEBUG_EPOINT, "EPOINT(%d) received message %d for active JOIN (terminal %s, caller id %s state=%d)\n", ea_endpoint->ep_serial, message, e_ext.number, e_callerinfo.id, e_state);
        switch(message_type)
        {
-               /* CALL SENDS CRYPT message */
+               /* JOIN SENDS TONE message */
+               case MESSAGE_TONE:
+               PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received tone message: '%d'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->tone.name);
+               set_tone(portlist, param->tone.name);
+               break;
+
+               /* JOIN SENDS CRYPT message */
                case MESSAGE_CRYPT:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received crypt message: '%d'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->crypt.type);
                join_crypt(portlist, message_type, param);
                break;
 
-               /* CALL sends INFORMATION message */
+               /* JOIN sends INFORMATION message */
                case MESSAGE_INFORMATION:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received more digits: '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->information.id);
                join_information(portlist, message_type, param);
                break;
 
-               /* CALL sends FACILITY message */
+               /* JOIN sends FACILITY message */
                case MESSAGE_FACILITY:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received facility\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                join_facility(portlist, message_type, param);
                break;
 
-               /* CALL sends OVERLAP 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);
                if (e_state!=EPOINT_STATE_IN_SETUP
@@ -3524,7 +3379,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                join_overlap(portlist, message_type, param);
                break;
 
-               /* CALL sends PROCEEDING message */
+               /* JOIN sends PROCEEDING message */
                case MESSAGE_PROCEEDING:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s (caller id '%s') received proceeding\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                if(e_state!=EPOINT_STATE_IN_OVERLAP)
@@ -3535,7 +3390,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                join_proceeding(portlist, message_type, param);
                break;
 
-               /* CALL sends ALERTING message */
+               /* JOIN sends ALERTING message */
                case MESSAGE_ALERTING:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received alerting\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                if (e_state!=EPOINT_STATE_IN_OVERLAP
@@ -3547,7 +3402,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                join_alerting(portlist, message_type, param);
                break;
 
-               /* CALL sends CONNECT message */
+               /* JOIN sends CONNECT message */
                case MESSAGE_CONNECT:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received connect\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                if (e_state!=EPOINT_STATE_IN_OVERLAP
@@ -3560,29 +3415,29 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                join_connect(portlist, message_type, param);
                break;
 
-               /* CALL sends DISCONNECT/RELEASE message */
-               case MESSAGE_DISCONNECT: /* call disconnect */
-               case MESSAGE_RELEASE: /* call releases */
+               /* JOIN sends DISCONNECT/RELEASE message */
+               case MESSAGE_DISCONNECT: /* JOIN disconnect */
+               case MESSAGE_RELEASE: /* JOIN releases */
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received %s with cause %d location %d\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, (message_type==MESSAGE_DISCONNECT)?"disconnect":"release", param->disconnectinfo.cause, param->disconnectinfo.location);
                join_disconnect_release(message_type, param);
                break;
 
-               /* CALL sends SETUP message */
+               /* JOIN sends SETUP message */
                case MESSAGE_SETUP:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint received setup from terminal='%s',id='%s' to id='%s' (dialing itype=%d)\n", ea_endpoint->ep_serial, param->setup.callerinfo.extension, param->setup.callerinfo.id, param->setup.dialinginfo.id, param->setup.dialinginfo.itype);
                join_setup(portlist, message_type, param);
                break;
 
-               /* CALL sends special mISDNSIGNAL message */
+               /* JOIN sends special mISDNSIGNAL message */
                case MESSAGE_mISDNSIGNAL: /* isdn message to port */
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received mISDNsignal message.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                join_mISDNsignal(portlist, message_type, param);
                break;
 
-               /* call requests bchannel */
+#if 0
+               /* JOIN requests bchannel */
                case MESSAGE_BCHANNEL: /* indicates the need of own bchannel access */
-               case MESSAGE_BCHANNEL_FREE: /* indicates that the bchannel is free */
-               PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received bchannel request.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
+               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);
                /* only one port is expected to be connected to bchannel */
                if (!portlist)
                        break;
@@ -3594,8 +3449,9 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                message = message_forward(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, param);
                logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
                break;
+#endif
 
-               /* CALL has pattern available */
+               /* JOIN has pattern available */
                case MESSAGE_PATTERN: /* indicating pattern available */
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received pattern availability.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                if (!e_join_pattern)
@@ -3620,7 +3476,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                }
                break;
 
-               /* CALL has no pattern available */
+               /* JOIN has no pattern available */
                case MESSAGE_NOPATTERN: /* indicating no pattern available */
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received pattern NOT available.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                if (e_join_pattern)
@@ -3635,7 +3491,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                break;
 
 #if 0
-               /* CALL (dunno at the moment) */
+               /* JOIN (dunno at the moment) */
                case MESSAGE_REMOTE_AUDIO:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received audio remote request.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);
@@ -3644,7 +3500,7 @@ void EndpointAppPBX::ea_message_join(unsigned long join_id, int message_type, un
                break;
 #endif
 
-               /* CALL sends a notify message */
+               /* JOIN sends a notify message */
                case MESSAGE_NOTIFY:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received notify.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                join_notify(portlist, message_type, param);
@@ -3855,7 +3711,7 @@ reject:
        message->param.connectinfo.itype = eapp->e_callerinfo.itype;
        message->param.connectinfo.ntype = eapp->e_callerinfo.ntype;
        /* handle restricted caller ids */
-       apply_callerid_restriction(e_ext.anon_ignore, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name);
+       apply_callerid_restriction(&e_ext, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name);
        /* display callerid if desired for extension */
        SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype,  message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name));
        message_put(message);
@@ -4305,10 +4161,10 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                        add_trace("cause", "location", "3-Transit");
                        break;
                        case LOCATION_PUBLIC_REMOTE:
-                       add_trace("cause", "location", "4-Remote-PBX");
+                       add_trace("cause", "location", "4-Remote-Exchange");
                        break;
                        case LOCATION_PRIVATE_REMOTE:
-                       add_trace("cause", "location", "5-Remote-Exchange");
+                       add_trace("cause", "location", "5-Remote-PBX");
                        break;
                        case LOCATION_INTERNATIONAL:
                        add_trace("cause", "location", "7-International-Exchange");
@@ -4478,13 +4334,32 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                end_trace();
                break;
 
+#if 0
                case MESSAGE_BCHANNEL:
-               case MESSAGE_BCHANNEL_FREE:
                trace_header("BCHANNEL", dir);
+               switch(param->bchannel.type)
+               {
+                       case BCHANNEL_REQUEST:
+                       add_trace("type", NULL, "request");
+                       break;
+                       case BCHANNEL_ASSIGN:
+                       add_trace("type", NULL, "assign");
+                       break;
+                       case BCHANNEL_ASSIGN_ACK:
+                       add_trace("type", NULL, "assign_ack");
+                       break;
+                       case BCHANNEL_REMOVE:
+                       add_trace("type", NULL, "remove");
+                       break;
+                       case BCHANNEL_REMOVE_ACK:
+                       add_trace("type", NULL, "remove_ack");
+                       break;
+               }
                if (param->bchannel.addr)
                        add_trace("address", NULL, "%x", param->bchannel.addr);
                end_trace();
                break;
+#endif
 
                default:
                PERROR("EPOINT(%d) message not of correct type (%d)\n", ea_endpoint->ep_serial, message_type);