X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=blobdiff_plain;f=apppbx.cpp;h=6836715a9f0dcf76d7886d68880a82c77de09e9b;hp=46b1f627a5fb56858b59c8a2d73e93600466fb51;hb=5b5923141c3ac53d3e63395d9197080d087342f3;hpb=b0bd74e35e935aa976b68c594def4e8d2c22ef95 diff --git a/apppbx.cpp b/apppbx.cpp index 46b1f62..6836715 100644 --- a/apppbx.cpp +++ b/apppbx.cpp @@ -201,7 +201,7 @@ void EndpointAppPBX::new_state(int state) /* release join and port (as specified) */ -void EndpointAppPBX::release(int release, int joinlocation, int joincause, int portlocation, int portcause) +void EndpointAppPBX::release(int release, int joinlocation, int joincause, int portlocation, int portcause, int force) { struct port_list *portlist; struct lcr_msg *message; @@ -238,6 +238,7 @@ void EndpointAppPBX::release(int release, int joinlocation, int joincause, int p message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_RELEASE); message->param.disconnectinfo.cause = portcause; message->param.disconnectinfo.location = portlocation; + message->param.disconnectinfo.force = force; // set, if port should release imediately message_put(message); logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT); } @@ -594,7 +595,7 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) if (!interface) { if (!there_is_an_external && !(ifname && ifname[0])) { trace_header("CHANNEL SELECTION (no external interface specified)", DIRECTION_NONE); - add_trace("info", NULL, "Add 'external' parameter to interface.conf."); + add_trace("info", NULL, "Add 'extern' parameter to interface.conf."); end_trace(); } return(NULL); @@ -879,7 +880,7 @@ void EndpointAppPBX::out_setup(void) } if (atemp) { PERROR("EPOINT(%d) noknocking and currently a call\n", ea_endpoint->ep_serial); - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_BUSY, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYSPE_ join, port */ + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_BUSY, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYSPE_ join, port */ return; /* must exit here */ } } @@ -892,9 +893,10 @@ void EndpointAppPBX::out_setup(void) // if (!read_extension(&e_ext, exten)) if (!read_extension(&e_ext, e_dialinginfo.id)) { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) extension %s not configured\n", ea_endpoint->ep_serial, e_dialinginfo.id); - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_OUTOFORDER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, join, port */ + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_OUTOFORDER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, join, port */ return; /* must exit here */ } + e_dialinginfo.sending_complete = 1; if (e_dialinginfo.itype == INFO_ITYPE_VBOX) { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) dialing directly to VBOX\n", ea_endpoint->ep_serial); @@ -1156,7 +1158,7 @@ void EndpointAppPBX::out_setup(void) end_trace(); if (!ea_endpoint->ep_join_id) break; - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, cause, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, join, port */ + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, cause, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, join, port */ return; /* must exit here */ } break; @@ -1212,6 +1214,7 @@ void EndpointAppPBX::out_setup(void) SCPY(dialinginfo.id, number); dialinginfo.itype = INFO_ITYPE_ISDN; dialinginfo.ntype = e_dialinginfo.ntype; + dialinginfo.sending_complete = e_dialinginfo.sending_complete; portlist = ea_endpoint->portlist_new(port->p_serial, port->p_type, mISDNport->earlyb); if (!portlist) { PERROR("EPOINT(%d) cannot allocate port_list relation\n", ea_endpoint->ep_serial); @@ -1245,7 +1248,7 @@ void EndpointAppPBX::out_setup(void) end_trace(); if (!ea_endpoint->ep_join_id) break; - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOCHANNEL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, join, port */ + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOCHANNEL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, join, port */ return; /* must exit here */ } break; @@ -1424,7 +1427,7 @@ void EndpointAppPBX::hookflash(void) port->set_echotest(0); } if (ea_endpoint->ep_join_id) { - release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, join, port */ + release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, join, port */ } e_ruleset = ruleset_main; if (e_ruleset) @@ -2237,7 +2240,7 @@ void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int mes } if (message_type == MESSAGE_RELEASE) ea_endpoint->free_portlist(portlist); - release(RELEASE_ALL, location, cause, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, callcause, portcause */ + release(RELEASE_ALL, location, cause, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, callcause, portcause */ return; /* must exit here */ } @@ -2254,7 +2257,7 @@ void EndpointAppPBX::port_timeout(struct port_list *portlist, int message_type, add_trace("state", NULL, "outgoing setup/dialing"); end_trace(); /* no user responding */ - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOUSER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOUSER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); return; /* must exit here */ case PORT_STATE_IN_SETUP: @@ -2269,7 +2272,7 @@ void EndpointAppPBX::port_timeout(struct port_list *portlist, int message_type, end_trace(); param->disconnectinfo.cause = CAUSE_NOUSER; /* no user responding */ param->disconnectinfo.location = LOCATION_PRIVATE_LOCAL; - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOUSER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOUSER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); return; /* must exit here */ case PORT_STATE_IN_PROCEEDING: @@ -2283,7 +2286,7 @@ void EndpointAppPBX::port_timeout(struct port_list *portlist, int message_type, end_trace(); param->disconnectinfo.cause = CAUSE_NOANSWER; /* no answer */ param->disconnectinfo.location = LOCATION_PRIVATE_LOCAL; - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOANSWER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NOANSWER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); return; /* must exit here */ case PORT_STATE_CONNECT: @@ -2291,7 +2294,7 @@ void EndpointAppPBX::port_timeout(struct port_list *portlist, int message_type, end_trace(); param->disconnectinfo.cause = CAUSE_NORMAL; /* normal */ param->disconnectinfo.location = LOCATION_PRIVATE_LOCAL; - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); return; /* must exit here */ case PORT_STATE_IN_ALERTING: @@ -2305,7 +2308,7 @@ void EndpointAppPBX::port_timeout(struct port_list *portlist, int message_type, add_trace("state", NULL, "disconnect"); end_trace(); PDEBUG(DEBUG_EPOINT, "EPOINT(%d) in this special case, we release due to disconnect timeout.\n", ea_endpoint->ep_serial); - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); return; /* must exit here */ default: @@ -2323,7 +2326,7 @@ void EndpointAppPBX::port_timeout(struct port_list *portlist, int message_type, message_disconnect_port(portlist, param->disconnectinfo.cause, param->disconnectinfo.location, ""); portlist = portlist->next; } - release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, join, port */ + release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, join, port */ } /* port MESSAGE_NOTIFY */ @@ -2919,7 +2922,7 @@ void EndpointAppPBX::join_disconnect_release(int message_type, union parameter * /* we are powerdialing, if e_powerdial_on is set and limit is not exceeded if given */ if (e_powerdial_on && ((e_powercount+1)ep_portlist) { /* or no port */ process_hangup(param->disconnectinfo.cause, param->disconnectinfo.location); - release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, param->disconnectinfo.cause); /* RELEASE_TYPE, join, port */ + release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, param->disconnectinfo.cause, 0); /* RELEASE_TYPE, join, port */ return; /* must exit here */ } /* save cause */ @@ -2992,7 +2995,7 @@ void EndpointAppPBX::join_disconnect_release(int message_type, union parameter * || !e_join_pattern) { /* no patterns */ PDEBUG(DEBUG_EPOINT, "EPOINT(%d) we have own cause or we have no patterns. (own_cause=%d pattern=%d)\n", ea_endpoint->ep_serial, e_ext.own_cause, e_join_pattern); if (message_type != MESSAGE_RELEASE) - release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, join, port */ + release(RELEASE_JOIN, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, 0); /* RELEASE_TYPE, join, port */ e_join_pattern = 0; } else { /* else we enable audio */ message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_join_id, EPOINT_TO_JOIN, MESSAGE_AUDIOPATH);