Added Progress messages. (receive only)

This commit is contained in:
Andreas Eversberg 2010-05-23 13:46:26 +02:00
parent 5b5923141c
commit be404a4926
8 changed files with 139 additions and 6 deletions

2
README
View File

@ -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.
- Added progress messages (receive only).

View 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)
{
@ -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 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);
@ -4108,6 +4133,65 @@ void EndpointAppPBX::logmessage(int message_type, union parameter *param, unsign
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)

View File

@ -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_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);

View File

@ -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();
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) {
@ -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();
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);
@ -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();
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) {
@ -1099,6 +1120,13 @@ void Pdss1::disconnect_ind(unsigned int cmd, unsigned int pid, struct l3_msg *l3
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;
@ -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();
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);
}
}

View File

@ -1579,7 +1579,11 @@ next:
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:

View File

@ -39,6 +39,7 @@ enum { /* messages */
ADMIN_CALL_DISCONNECT,
ADMIN_CALL_RELEASE,
ADMIN_CALL_NOTIFY,
ADMIN_CALL_PROGRESS,
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 notify;
int notify_progress;
int bc_capa;
int bc_mode;
int bc_info1;

View File

@ -237,6 +237,12 @@ struct notify_info {
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 */
@ -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 progress_info progressinfo; /* some progress */
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_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 */

View 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.
*/
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 */
@ -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;
response->am[0].u.call.notify = notify;
response->am[0].u.call.notify_progress = notify_progress;
/* attach to response chain */
*responsep = response;