Added Progress messages. (receive only)
authorAndreas Eversberg <jolly@eversberg.eu>
Sun, 23 May 2010 11:46:26 +0000 (13:46 +0200)
committerAndreas Eversberg <jolly@eversberg.eu>
Sun, 23 May 2010 11:46:26 +0000 (13:46 +0200)
README
apppbx.cpp
apppbx.h
dss1.cpp
lcradmin.c
lcrsocket.h
message.h
socket_server.c

diff --git a/README b/README
index 13fd99c..9eef237 100644 (file)
--- a/README
+++ b/README
@@ -544,6 +544,6 @@ Changes after Version 1.7
 - Fix by Peter: NULL pointer issue in asterisk frame.
 - Fixes a locking bug in chan_lcr. Thanx to WIMPy for that report.
 - Fixed forwarding of sending-complete information.
 - Fix by Peter: NULL pointer issue in asterisk frame.
 - Fixes a locking bug in chan_lcr. Thanx to WIMPy for that report.
 - Fixed forwarding of sending-complete information.
-
+- Added progress messages (receive only).
 
 
 
 
index 6836715..cfaf6cb 100644 (file)
@@ -2469,6 +2469,25 @@ void EndpointAppPBX::port_notify(struct port_list *portlist, int message_type, u
 
 }
 
 
 }
 
+/* port MESSAGE_PROGRESS */
+void EndpointAppPBX::port_progress(struct port_list *portlist, int message_type, union parameter *param)
+{
+       logmessage(message_type, param, portlist->port_id, DIRECTION_IN);
+
+       struct lcr_msg *message;
+
+       /* signal to call tool */
+       admin_call_response(e_adminid, ADMIN_CALL_PROGRESS, "", 0, param->progressinfo.location, param->progressinfo.progress);
+
+       /* send progress to call if available */
+       if (ea_endpoint->ep_join_id) {
+               message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_PROGRESS);
+               memcpy(&message->param.progressinfo, &param->progressinfo, sizeof(struct progress_info));
+               message_put(message);
+       }
+
+}
+
 /* port MESSAGE_FACILITY */
 void EndpointAppPBX::port_facility(struct port_list *portlist, int message_type, union parameter *param)
 {
 /* port MESSAGE_FACILITY */
 void EndpointAppPBX::port_facility(struct port_list *portlist, int message_type, union parameter *param)
 {
@@ -2665,6 +2684,12 @@ void EndpointAppPBX::ea_message_port(unsigned int port_id, int message_type, uni
                port_notify(portlist, message_type, param);
                break;
 
                port_notify(portlist, message_type, param);
                break;
 
+               /* PORT sends a PROGRESS message */
+               case MESSAGE_PROGRESS:
+               PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received progress.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
+               port_progress(portlist, message_type, param);
+               break;
+
                /* PORT sends a SUSPEND message */
                case MESSAGE_SUSPEND:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received suspend.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
                /* PORT sends a SUSPEND message */
                case MESSAGE_SUSPEND:
                PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received suspend.\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id);
@@ -4108,6 +4133,65 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
                end_trace();
                break;
 
                end_trace();
                break;
 
+               case MESSAGE_PROGRESS:
+               switch(param->progressinfo.progress) {
+                       case 0x01:
+                       logtext = "Call is not end to end ISDN";
+                       break;
+                       case 0x02:
+                       logtext = "Destination address is non-ISDN";
+                       break;
+                       case 0x03:
+                       logtext = "Origination address is non-ISDN";
+                       break;
+                       case 0x04:
+                       logtext = "Call has returned to the ISDN";
+                       break;
+                       case 0x08:
+                       logtext = "In-band info or pattern available";
+                       break;
+                       default:
+                       SPRINT(buffer, "%d", param->progressinfo.progress);
+                       logtext = buffer;
+
+               }
+               trace_header("PROGRESS", dir);
+               if (dir == DIRECTION_OUT)
+                       add_trace("to", NULL, "CH(%lu)", port_id);
+               if (dir == DIRECTION_IN)
+                       add_trace("from", NULL, "CH(%lu)", port_id);
+               add_trace("indicator", NULL, "%s", logtext);
+               switch(param->progressinfo.location) {
+                       case LOCATION_USER:
+                       add_trace("cause", "location", "0-User");
+                       break;
+                       case LOCATION_PRIVATE_LOCAL:
+                       add_trace("cause", "location", "1-Local-PBX");
+                       break;
+                       case LOCATION_PUBLIC_LOCAL:
+                       add_trace("cause", "location", "2-Local-Exchange");
+                       break;
+                       case LOCATION_TRANSIT:
+                       add_trace("cause", "location", "3-Transit");
+                       break;
+                       case LOCATION_PUBLIC_REMOTE:
+                       add_trace("cause", "location", "4-Remote-Exchange");
+                       break;
+                       case LOCATION_PRIVATE_REMOTE:
+                       add_trace("cause", "location", "5-Remote-PBX");
+                       break;
+                       case LOCATION_INTERNATIONAL:
+                       add_trace("cause", "location", "7-International-Exchange");
+                       break;
+                       case LOCATION_BEYOND:
+                       add_trace("cause", "location", "10-Beyond-Interworking");
+                       break;
+                       default:
+                       add_trace("cause", "location", "%d", param->progressinfo.location);
+               }
+               end_trace();
+               break;
+
                case MESSAGE_INFORMATION:
                trace_header("INFORMATION", dir);
                if (dir == DIRECTION_OUT)
                case MESSAGE_INFORMATION:
                trace_header("INFORMATION", dir);
                if (dir == DIRECTION_OUT)
index 8d2cb07..a2608cc 100644 (file)
--- a/apppbx.h
+++ b/apppbx.h
@@ -206,6 +206,7 @@ class EndpointAppPBX : public EndpointApp
        void port_disconnect_release(struct port_list *portlist, int message_type, union parameter *param);
        void port_timeout(struct port_list *portlist, int message_type, union parameter *param);
        void port_notify(struct port_list *portlist, int message_type, union parameter *param);
        void port_disconnect_release(struct port_list *portlist, int message_type, union parameter *param);
        void port_timeout(struct port_list *portlist, int message_type, union parameter *param);
        void port_notify(struct port_list *portlist, int message_type, union parameter *param);
+       void port_progress(struct port_list *portlist, int message_type, union parameter *param);
        void port_facility(struct port_list *portlist, int message_type, union parameter *param);
        void port_suspend(struct port_list *portlist, int message_type, union parameter *param);
        void port_resume(struct port_list *portlist, int message_type, union parameter *param);
        void port_facility(struct port_list *portlist, int message_type, union parameter *param);
        void port_suspend(struct port_list *portlist, int message_type, union parameter *param);
        void port_resume(struct port_list *portlist, int message_type, union parameter *param);
index d1430dc..c80a672 100644 (file)
--- a/dss1.cpp
+++ b/dss1.cpp
@@ -801,6 +801,13 @@ void Pdss1::setup_acknowledge_ind(unsigned int cmd, unsigned int pid, struct l3_
        dec_ie_progress(l3m, &coding, &location, &progress);
        end_trace();
 
        dec_ie_progress(l3m, &coding, &location, &progress);
        end_trace();
 
+       if (progress >= 0) {
+               message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_PROGRESS);
+               message->param.progressinfo.progress = progress;
+               message->param.progressinfo.location = location;
+               message_put(message);
+       }
+
        /* process channel */
        ret = received_first_reply_to_setup(cmd, channel, exclusive);
        if (ret < 0) {
        /* process channel */
        ret = received_first_reply_to_setup(cmd, channel, exclusive);
        if (ret < 0) {
@@ -850,6 +857,13 @@ void Pdss1::proceeding_ind(unsigned int cmd, unsigned int pid, struct l3_msg *l3
        dec_ie_redir_dn(l3m, &type, &plan, &present, (unsigned char *)redir, sizeof(redir));
        end_trace();
 
        dec_ie_redir_dn(l3m, &type, &plan, &present, (unsigned char *)redir, sizeof(redir));
        end_trace();
 
+       if (progress >= 0) {
+               message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_PROGRESS);
+               message->param.progressinfo.progress = progress;
+               message->param.progressinfo.location = location;
+               message_put(message);
+       }
+
        ret = received_first_reply_to_setup(cmd, channel, exclusive);
        if (ret < 0) {
                message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
        ret = received_first_reply_to_setup(cmd, channel, exclusive);
        if (ret < 0) {
                message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_RELEASE);
@@ -926,6 +940,13 @@ void Pdss1::alerting_ind(unsigned int cmd, unsigned int pid, struct l3_msg *l3m)
        dec_ie_redir_dn(l3m, &type, &plan, &present, (unsigned char *)redir, sizeof(redir));
        end_trace();
 
        dec_ie_redir_dn(l3m, &type, &plan, &present, (unsigned char *)redir, sizeof(redir));
        end_trace();
 
+       if (progress >= 0) {
+               message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_PROGRESS);
+               message->param.progressinfo.progress = progress;
+               message->param.progressinfo.location = location;
+               message_put(message);
+       }
+
        /* process channel */
        ret = received_first_reply_to_setup(cmd, channel, exclusive);
        if (ret < 0) {
        /* process channel */
        ret = received_first_reply_to_setup(cmd, channel, exclusive);
        if (ret < 0) {
@@ -1099,6 +1120,13 @@ void Pdss1::disconnect_ind(unsigned int cmd, unsigned int pid, struct l3_msg *l3
                location = LOCATION_PRIVATE_LOCAL;
        }
 
                location = LOCATION_PRIVATE_LOCAL;
        }
 
+       if (progress >= 0) {
+               message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_PROGRESS);
+               message->param.progressinfo.progress = progress;
+               message->param.progressinfo.location = proglocation;
+               message_put(message);
+       }
+
        /* release if remote sends us no tones */
        if (!p_m_mISDNport->earlyb) {
                l3_msg *l3m;
        /* release if remote sends us no tones */
        if (!p_m_mISDNport->earlyb) {
                l3_msg *l3m;
@@ -1639,6 +1667,13 @@ void Pdss1::progress_ind(unsigned int cmd, unsigned int pid, struct l3_msg *l3m)
        l1l2l3_trace_header(p_m_mISDNport, this, L3_PROGRESS_IND, DIRECTION_IN);
        dec_ie_progress(l3m, &coding, &location, &progress);
        end_trace();
        l1l2l3_trace_header(p_m_mISDNport, this, L3_PROGRESS_IND, DIRECTION_IN);
        dec_ie_progress(l3m, &coding, &location, &progress);
        end_trace();
+
+       if (progress >= 0) {
+               message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_PROGRESS);
+               message->param.progressinfo.progress = progress;
+               message->param.progressinfo.location = location;
+               message_put(message);
+       }
 }
 
 
 }
 
 
index c7691ee..882105b 100644 (file)
@@ -1579,7 +1579,11 @@ next:
                goto next;
 
                case ADMIN_CALL_NOTIFY:
                goto next;
 
                case ADMIN_CALL_NOTIFY:
-               printf("NOTIFY\n notify=%d\n number=%s\n", msg.u.call.notify, msg.u.call.callerid); fflush(stdout);
+               printf("NOTIFY\n notify=%d\n number=%s\n", msg.u.call.notify_progress, msg.u.call.callerid); fflush(stdout);
+               goto next;
+
+               case ADMIN_CALL_PROGRESS:
+               printf("PROGRESS\n progress=%d\n location=%d\n", msg.u.call.notify_progress, msg.u.call.location); fflush(stdout);
                goto next;
 
                case ADMIN_CALL_DISCONNECT:
                goto next;
 
                case ADMIN_CALL_DISCONNECT:
index 43543c1..7ecf7ad 100644 (file)
@@ -39,6 +39,7 @@ enum { /* messages */
        ADMIN_CALL_DISCONNECT,
        ADMIN_CALL_RELEASE,
        ADMIN_CALL_NOTIFY,
        ADMIN_CALL_DISCONNECT,
        ADMIN_CALL_RELEASE,
        ADMIN_CALL_NOTIFY,
+       ADMIN_CALL_PROGRESS,
        ADMIN_TRACE_REQUEST,
        ADMIN_TRACE_RESPONSE,
        ADMIN_MESSAGE,
        ADMIN_TRACE_REQUEST,
        ADMIN_TRACE_RESPONSE,
        ADMIN_MESSAGE,
@@ -130,7 +131,7 @@ struct admin_call {
        int             present; /* presentation */
        int             cause; /* cause to send */
        int             location;
        int             present; /* presentation */
        int             cause; /* cause to send */
        int             location;
-       int             notify;
+       int             notify_progress;
        int             bc_capa;
        int             bc_mode;
        int             bc_info1;
        int             bc_capa;
        int             bc_mode;
        int             bc_info1;
index 3c775cc..c23314a 100644 (file)
--- a/message.h
+++ b/message.h
@@ -237,6 +237,12 @@ struct notify_info {
        int local;                      /* if set, endpoints gets information about audio channel (open/close) */
 };
 
        int local;                      /* if set, endpoints gets information about audio channel (open/close) */
 };
 
+/* call-info structure PROGRESS */
+struct progress_info {
+       int progress;                   /* progress indicator */
+       int location;                   /* progress location */
+};
+
 /* call-info structure FACILITY */
 struct facility_info {
        char data[256];                 /* data info about facility */
 /* call-info structure FACILITY */
 struct facility_info {
        char data[256];                 /* data info about facility */
@@ -333,6 +339,7 @@ union parameter {
        struct connect_info connectinfo; /* CONNECT INFO */
        struct disconnect_info disconnectinfo; /* DISCONNECT INFO */
        struct notify_info notifyinfo; /* some notifications */
        struct connect_info connectinfo; /* CONNECT INFO */
        struct disconnect_info disconnectinfo; /* DISCONNECT INFO */
        struct notify_info notifyinfo; /* some notifications */
+       struct progress_info progressinfo; /* some progress */
        struct facility_info facilityinfo; /* some notifications */
        struct park_info parkinfo; /* MESSAGE_SUSPEND, MESSAGE_RESUME */
        int state; /* MESSAGE_TIMEOUT */
        struct facility_info facilityinfo; /* some notifications */
        struct park_info parkinfo; /* MESSAGE_SUSPEND, MESSAGE_RESUME */
        int state; /* MESSAGE_TIMEOUT */
@@ -383,7 +390,8 @@ enum { /* messages between entities */
        MESSAGE_DISCONNECT,     /* disconnect with cause */
        MESSAGE_RELEASE,        /* release with cause */
        MESSAGE_TIMEOUT,        /* protocol state has timed out (port->epoint) */
        MESSAGE_DISCONNECT,     /* disconnect with cause */
        MESSAGE_RELEASE,        /* release with cause */
        MESSAGE_TIMEOUT,        /* protocol state has timed out (port->epoint) */
-       MESSAGE_NOTIFY,         /* used to send progress and notify infos */
+       MESSAGE_NOTIFY,         /* used to send notify info */
+       MESSAGE_PROGRESS,       /* used to send progress info */
        MESSAGE_FACILITY,       /* used to facility infos, like aocd */
        MESSAGE_SUSPEND,        /* suspend port */
        MESSAGE_RESUME,         /* resume port */
        MESSAGE_FACILITY,       /* used to facility infos, like aocd */
        MESSAGE_SUSPEND,        /* suspend port */
        MESSAGE_RESUME,         /* resume port */
index 3083085..70895b0 100644 (file)
@@ -538,7 +538,7 @@ int admin_call(struct admin_list *admin, struct admin_message *msg)
 /*
  * this function is called for response whenever a call state changes.
  */
 /*
  * this function is called for response whenever a call state changes.
  */
-void admin_call_response(int adminid, int message, const char *connected, int cause, int location, int notify)
+void admin_call_response(int adminid, int message, const char *connected, int cause, int location, int notify_progress)
 {
        struct admin_list       *admin;
        struct admin_queue      *response, **responsep; /* response pointer */
 {
        struct admin_list       *admin;
        struct admin_queue      *response, **responsep; /* response pointer */
@@ -573,7 +573,7 @@ void admin_call_response(int adminid, int message, const char *connected, int ca
        SCPY(response->am[0].u.call.callerid, connected);
        response->am[0].u.call.cause = cause;
        response->am[0].u.call.location = location;
        SCPY(response->am[0].u.call.callerid, connected);
        response->am[0].u.call.cause = cause;
        response->am[0].u.call.location = location;
-       response->am[0].u.call.notify = notify;
+       response->am[0].u.call.notify_progress = notify_progress;
 
        /* attach to response chain */
        *responsep = response;
 
        /* attach to response chain */
        *responsep = response;