Fix lot of warnings
[lcr.git] / action.cpp
index 67c8396..d0a1c9f 100644 (file)
@@ -9,67 +9,15 @@
 **                                                                           **
 \*****************************************************************************/ 
 
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <poll.h>
 #include "main.h"
-#include "linux/isdnif.h"
 
 extern char **environ;
 
 
-/* create caller id from digits by comparing with national and international
- * prefixes.
- */
-char *nationalize_callerinfo(char *string, int *ntype)
-{
-       if (!strncmp(options.international, string, strlen(options.international)))
-       {
-               *ntype = INFO_NTYPE_INTERNATIONAL;
-               return(string+strlen(options.international)); 
-       }
-       if (!strncmp(options.national, string, strlen(options.national)))
-       {
-               *ntype = INFO_NTYPE_NATIONAL;
-               return(string+strlen(options.national)); 
-       }
-       *ntype = INFO_NTYPE_SUBSCRIBER;
-       return(string);
-}
-
-/* create number (including access codes) from caller id
- * prefixes.
- */
-char *numberrize_callerinfo(char *string, int ntype)
-{
-       static char result[256];
-
-       switch(ntype)
-       {
-               case INFO_NTYPE_INTERNATIONAL:
-               UCPY(result, options.international);
-               SCAT(result, string);
-               return(result);
-               break;
-
-               case INFO_NTYPE_NATIONAL:
-               UCPY(result, options.national);
-               SCAT(result, string);
-               return(result);
-               break;
-
-               default:
-               return(string);
-       }
-}
-
-
 /*
  * process init 'internal' / 'external' / 'remote' / 'vbox-record' / 'partyline'...
  */
-void EndpointAppPBX::_action_init_call(char *remote)
+int EndpointAppPBX::_action_init_call(char *remote)
 {
        class Join              *join;
        struct port_list        *portlist = ea_endpoint->ep_portlist;
@@ -80,7 +28,7 @@ void EndpointAppPBX::_action_init_call(char *remote)
        {
                if (options.deb & DEBUG_EPOINT)
                        PERROR("EPOINT(%d): We already have a call instance, this should never happen!\n", ea_endpoint->ep_serial);
-               return;
+               return(0);
        }
 
        /* create join */
@@ -100,10 +48,10 @@ void EndpointAppPBX::_action_init_call(char *remote)
                        trace_header("ACTION remote (not available)", DIRECTION_NONE);
                        add_trace("application", NULL, "%s", remote);
                        end_trace();
-                       message_disconnect_port(portlist, CAUSE_RESSOURCEUNAVAIL, LOCATION_PRIVATE_LOCAL, "");
+                       message_disconnect_port(portlist, CAUSE_OUTOFORDER, LOCATION_PRIVATE_LOCAL, "");
                        new_state(EPOINT_STATE_OUT_DISCONNECT);
-                       set_tone(portlist,"cause_22");
-                       return;
+                       set_tone(portlist,"cause_1b");
+                       return(0);
                }
                join = new JoinRemote(ea_endpoint->ep_serial, remote, admin->sock);
        }
@@ -112,6 +60,7 @@ void EndpointAppPBX::_action_init_call(char *remote)
        if (!join)
                FATAL("No memoy for Join instance.\n");
        ea_endpoint->ep_join_id = join->j_serial;
+       return(1);
 }
 void EndpointAppPBX::action_init_call(void)
 {
@@ -119,44 +68,6 @@ void EndpointAppPBX::action_init_call(void)
 }
 void EndpointAppPBX::action_init_remote(void)
 {
-       struct route_param      *rparam;
-       struct port_list        *portlist = ea_endpoint->ep_portlist;
-       struct lcr_msg          *message;
-       struct capa_info        capainfo;
-       struct caller_info      callerinfo;
-       struct redir_info       redirinfo;
-       struct dialing_info     dialinginfo;
-       char remote[32];
-
-       if (!(rparam = routeparam(e_action, PARAM_APPLICATION)))
-       {
-               trace_header("ACTION remote (no application given)", DIRECTION_NONE);
-               end_trace();
-               new_state(EPOINT_STATE_OUT_DISCONNECT);
-               message_disconnect_port(portlist, CAUSE_SERVICEUNAVAIL, LOCATION_PRIVATE_LOCAL, "");
-               set_tone(portlist, "cause_3f");
-               return;
-       }
-       SCPY(remote, rparam->string_value);
-       _action_init_call(remote);
-
-       /* create bearer/caller/dialinginfo */
-       memcpy(&capainfo, &e_capainfo, sizeof(capainfo));
-       memcpy(&callerinfo, &e_callerinfo, sizeof(callerinfo));
-       memcpy(&redirinfo, &e_redirinfo, sizeof(redirinfo));
-       memset(&dialinginfo, 0, sizeof(dialinginfo));
-
-       /* send setup to remote */
-       trace_header("ACTION remote (setup)", DIRECTION_NONE);
-       add_trace("number", NULL, dialinginfo.id);
-       add_trace("remote", NULL, remote);
-       end_trace();
-       message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_SETUP);
-       memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info));
-       memcpy(&message->param.setup.redirinfo, &redirinfo, sizeof(struct redir_info));
-       memcpy(&message->param.setup.callerinfo, &callerinfo, sizeof(struct caller_info));
-       memcpy(&message->param.setup.capainfo, &capainfo, sizeof(struct capa_info));
-       message_put(message);
 }
 
 /*
@@ -438,22 +349,79 @@ void EndpointAppPBX::action_dialing_external(void)
 
 void EndpointAppPBX::action_dialing_remote(void)
 {
-       struct lcr_msg *message;
-       struct dialing_info dialinginfo;
-//     struct route_param *rparam;
-
-       /* create bearer/caller/dialinginfo */
-       memset(&dialinginfo, 0, sizeof(dialinginfo));
+       struct route_param      *rparam;
+       struct port_list        *portlist = ea_endpoint->ep_portlist;
+       struct lcr_msg          *message;
+       struct capa_info        capainfo;
+       struct caller_info      callerinfo;
+       struct redir_info       redirinfo;
+       struct dialing_info     dialinginfo;
+       char                    context[128] = "";
+       char                    remote[32];
 
-       if (dialinginfo.id[0])
+       if (!ea_endpoint->ep_join_id)
        {
-               /* add or update outgoing call */
-               trace_header("ACTION remote (dialing)", DIRECTION_NONE);
+               /* no join yet, sending setup */
+               if (!(rparam = routeparam(e_action, PARAM_APPLICATION)))
+               {
+                       trace_header("ACTION remote (no application given)", DIRECTION_NONE);
+                       end_trace();
+                       new_state(EPOINT_STATE_OUT_DISCONNECT);
+                       message_disconnect_port(portlist, CAUSE_SERVICEUNAVAIL, LOCATION_PRIVATE_LOCAL, "");
+                       set_tone(portlist, "cause_3f");
+                       return;
+               }
+               SCPY(remote, rparam->string_value);
+               if (!_action_init_call(remote))
+                       return;
+
+               /* create bearer/caller/dialinginfo */
+               memcpy(&capainfo, &e_capainfo, sizeof(capainfo));
+               memcpy(&callerinfo, &e_callerinfo, sizeof(callerinfo));
+               memcpy(&redirinfo, &e_redirinfo, sizeof(redirinfo));
+               memset(&dialinginfo, 0, sizeof(dialinginfo));
+
+               if ((rparam = routeparam(e_action, PARAM_CONTEXT)))
+               {
+                       SCPY(context, rparam->string_value);
+               }
+               if ((rparam = routeparam(e_action, PARAM_EXTEN)))
+               {
+                       SCPY(dialinginfo.id, rparam->string_value);
+                       dialinginfo.ntype = INFO_NTYPE_UNKNOWN;
+               } else
+               {
+                       SCPY(dialinginfo.id, e_extdialing);
+               }
+               e_extdialing = e_dialinginfo.id + strlen(e_dialinginfo.id);
+               /* send setup to remote */
+               trace_header("ACTION remote (setup)", DIRECTION_NONE);
                add_trace("number", NULL, dialinginfo.id);
+               add_trace("remote", NULL, remote);
+               if (context[0])
+                       add_trace("context", NULL, context);
                end_trace();
-               message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_INFORMATION);
-               memcpy(&message->param.information, &dialinginfo, sizeof(struct dialing_info));
+               message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_SETUP);
+               memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info));
+               memcpy(&message->param.setup.redirinfo, &redirinfo, sizeof(struct redir_info));
+               memcpy(&message->param.setup.callerinfo, &callerinfo, sizeof(struct caller_info));
+               memcpy(&message->param.setup.capainfo, &capainfo, sizeof(struct capa_info));
+               SCPY(message->param.setup.context, context);
                message_put(message);
+       } else
+       {
+               /* send overlap digits */
+               trace_header("ACTION remote (dialing)", DIRECTION_NONE);
+               add_trace("number", NULL, e_extdialing);
+               end_trace();
+               if (e_extdialing[0])
+               {
+                       message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_INFORMATION);
+                       memcpy(&message->param.information, &e_dialinginfo, sizeof(struct dialing_info));
+                       SCPY(message->param.information.id, e_extdialing);
+                       e_extdialing = e_dialinginfo.id + strlen(e_dialinginfo.id);
+                       message_put(message);
+               }
        }
 }
 
@@ -601,7 +569,7 @@ void EndpointAppPBX::action_init_partyline(void)
                if (!(relation=joinpbx->add_relation()))
                        FATAL("No memory for join relation\n");
                relation->type = RELATION_TYPE_SETUP;
-               relation->channel_state = CHANNEL_STATE_CONNECT;
+               relation->channel_state = 1;
                relation->rx_state = NOTIFY_STATE_ACTIVE;
                relation->tx_state = NOTIFY_STATE_ACTIVE;
                relation->epoint_id = ea_endpoint->ep_serial;
@@ -839,7 +807,7 @@ void EndpointAppPBX::_action_callerid_calleridnext(int next)
                                (!next)?e_ext.callerid_type:e_ext.id_next_call_type = INFO_NTYPE_UNKNOWN;
                        } else
                        {
-                               SCPY((!next)?e_ext.callerid:e_ext.id_next_call, nationalize_callerinfo(callerid,&((!next)?e_ext.callerid_type:e_ext.id_next_call_type)));
+                               SCPY((!next)?e_ext.callerid:e_ext.id_next_call, nationalize_callerinfo(callerid,&((!next)?e_ext.callerid_type:e_ext.id_next_call_type), options.national, options.international));
                        }
                        if (!next) e_ext.id_next_call_type = -1;
                        PDEBUG(DEBUG_EPOINT, "EPOINT(%d): nationalized callerid: '%s' type=%d\n", ea_endpoint->ep_serial, (!next)?e_ext.callerid:e_ext.id_next_call, (!next)?e_ext.callerid_type:e_ext.id_next_call_type);
@@ -855,9 +823,9 @@ void EndpointAppPBX::_action_callerid_calleridnext(int next)
                trace_header("ACTION change-callerid (only next call)", DIRECTION_NONE);
        else
                trace_header("ACTION change-callerid (all future calls)", DIRECTION_NONE);
-       add_trace("old", "caller id", "%s", numberrize_callerinfo(old_id, old_type));
+       add_trace("old", "caller id", "%s", numberrize_callerinfo(old_id, old_type, options.national, options.international));
        add_trace("old", "present", "%s", (old_present==INFO_PRESENT_RESTRICTED)?"restricted":"allowed");
-       add_trace("new", "caller id", "%s", numberrize_callerinfo(new_id, new_type));
+       add_trace("new", "caller id", "%s", numberrize_callerinfo(new_id, new_type, options.national, options.international));
        add_trace("new", "present", "%s", (new_present==INFO_PRESENT_RESTRICTED)?"restricted":"allowed");
        end_trace();
        message_disconnect_port(portlist, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, "");
@@ -1020,12 +988,12 @@ void EndpointAppPBX::_action_redial_reply(int in)
        {
                /* find next entry */
                e_select++;
-               if (e_select >= MAX_REMEMBER)
+               if (e_select >= MAX_REMEMBER) {
                        e_select--;
-               else if (in)
+               } else if (in) {
                        if (e_ext.last_in[e_select][0] == '\0')
                                e_select--;
-               else
+               else
                        if (e_ext.last_out[e_select][0] == '\0')
                                e_select--;
 
@@ -2041,7 +2009,8 @@ void EndpointAppPBX::action_hangup_execute(void)
 {
        struct route_param *rparam;
        pid_t pid;
-       char *command = "", isdn_port[10];
+       char *command = (char *)"";
+       char isdn_port[10];
        char *argv[11]; /* check also number of args below */
        int i = 0;
 
@@ -2054,8 +2023,8 @@ void EndpointAppPBX::action_hangup_execute(void)
                end_trace();
                return;
        }
-       argv[i++] = "/bin/sh";
-       argv[i++] = "-c";
+       argv[i++] = (char *)"/bin/sh";
+       argv[i++] = (char *)"-c";
        argv[i++] = command;
        argv[i++] = command;
        if ((rparam = routeparam(e_action, PARAM_PARAM)))
@@ -2063,7 +2032,7 @@ void EndpointAppPBX::action_hangup_execute(void)
                argv[i++] = rparam->string_value;
        }
        argv[i++] = e_extdialing;
-       argv[i++] = numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype);
+       argv[i++] = (char *)numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype, options.national, options.international);
        argv[i++] = e_callerinfo.extension;
        argv[i++] = e_callerinfo.name;
        SPRINT(isdn_port, "%d", e_callerinfo.isdn_port);
@@ -2092,7 +2061,7 @@ void EndpointAppPBX::action_hangup_execute(void)
 void EndpointAppPBX::action_hangup_file(void)
 {
        struct route_param *rparam;
-       char *file, *content, *mode;
+       const char *file, *content, *mode;
        FILE *fp;
 
        /* get file / content */
@@ -2548,7 +2517,7 @@ void EndpointAppPBX::process_hangup(int cause, int location)
                }
 
                if (e_callerinfo.id[0])
-                       SPRINT(callertext, "%s", numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype));
+                       SPRINT(callertext, "%s", numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype, options.national, options.international));
                else
                        SPRINT(callertext, "unknown");
                /* allpy restriction */
@@ -2566,7 +2535,7 @@ void EndpointAppPBX::process_hangup(int cause, int location)
                        if (e_callerinfo.extension[0])
                                SPRINT(callertext, "intern:%s", e_callerinfo.extension);
                        else
-                               SPRINT(callertext, "extern:%s", numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype));
+                               SPRINT(callertext, "extern:%s", numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype, options.national, options.international));
                        if (!!strcmp(callertext, e_ext.last_in[0]))
                        {
                                i = MAX_REMEMBER-1;