struct action_defs action_defs[] = {
{ ACTION_EXTERNAL,
"extern", &EndpointAppPBX::action_init_call, &EndpointAppPBX::action_dialing_external, &EndpointAppPBX::action_hangup_call,
- PARAM_CONNECT | PARAM_PREFIX | PARAM_COMPLETE | PARAM_TYPE | PARAM_CAPA | PARAM_BMODE | PARAM_INFO1 | PARAM_HLC | PARAM_EXTHLC | PARAM_PRESENT | PARAM_INTERFACES | PARAM_CALLERID | PARAM_CALLERIDTYPE | PARAM_KEYPAD | PARAM_TIMEOUT,
+ PARAM_CONNECT | PARAM_PREFIX | PARAM_COMPLETE | PARAM_TYPE | PARAM_CAPA | PARAM_BMODE | PARAM_INFO1 | PARAM_HLC | PARAM_EXTHLC | PARAM_PRESENT | PARAM_INTERFACES | PARAM_CALLERID | PARAM_CALLERIDTYPE | PARAM_KEYPAD | PARAM_CONTEXT | PARAM_TIMEOUT,
"Call is routed to extern number as dialed."},
{ ACTION_INTERNAL,
"intern", &EndpointAppPBX::action_init_call, &EndpointAppPBX::action_dialing_internal, &EndpointAppPBX::action_hangup_call,
"outdial", &EndpointAppPBX::action_init_call, &EndpointAppPBX::action_dialing_external, &EndpointAppPBX::action_hangup_call,
PARAM_CONNECT | PARAM_PREFIX | PARAM_COMPLETE | PARAM_TYPE | PARAM_CAPA | PARAM_BMODE | PARAM_INFO1 | PARAM_HLC | PARAM_EXTHLC | PARAM_PRESENT | PARAM_INTERFACES | PARAM_CALLERID | PARAM_CALLERIDTYPE | PARAM_KEYPAD | PARAM_TIMEOUT,
"Same as 'extern'"},
- { ACTION_REMOTE,
- "remote", &EndpointAppPBX::action_init_remote, &EndpointAppPBX::action_dialing_remote, &EndpointAppPBX::action_hangup_call,
- PARAM_CONNECT | PARAM_APPLICATION | PARAM_CONTEXT | PARAM_EXTEN | PARAM_TIMEOUT,
- "Call is routed to Remote application, like Asterisk."},
{ ACTION_VBOX_RECORD,
"vbox-record",&EndpointAppPBX::action_init_call, &EndpointAppPBX::action_dialing_vbox_record, &EndpointAppPBX::action_hangup_call,
PARAM_CONNECT | PARAM_EXTENSION | PARAM_ANNOUNCEMENT | PARAM_TIMEOUT,
/* parse service value */
case COND_TYPE_CAPABILITY:
- if (!strncasecmp("speech", p, 6))
+ if (!strncasecmp("speech", p, 6)) {
cond->integer_value = INFO_BC_SPEECH;
- else if (!strncasecmp("audio", p, 5))
+ p += 6;
+ } else if (!strncasecmp("audio", p, 5)) {
cond->integer_value = INFO_BC_AUDIO;
- else if (!strncasecmp("video", p, 5))
+ p += 5;
+ } else if (!strncasecmp("video", p, 5)) {
cond->integer_value = INFO_BC_VIDEO;
- else if (!strncasecmp("digital-restricted", p, 18))
+ p += 5;
+ } else if (!strncasecmp("digital-restricted", p, 18)) {
cond->integer_value = INFO_BC_DATARESTRICTED;
- else if (!strncasecmp("digital-unrestricted", p, 20))
+ p += 18;
+ } else if (!strncasecmp("digital-unrestricted", p, 20)) {
cond->integer_value = INFO_BC_DATAUNRESTRICTED;
- else if (!strncasecmp("digital-unrestricted-tones", p, 26))
+ p += 20;
+ } else if (!strncasecmp("digital-unrestricted-tones", p, 26)) {
cond->integer_value = INFO_BC_DATAUNRESTRICTED_TONES;
- else {
+ p += 26;
+ } else {
SPRINT(failure, "Given service type is invalid or misspelled.");
goto parse_error;
}
/* parse bmode value */
case COND_TYPE_BMODE:
- if (!strncasecmp("transparent", p, 11))
+ if (!strncasecmp("transparent", p, 11)) {
cond->integer_value = INFO_BMODE_CIRCUIT;
- else if (!strncasecmp("hdlc", p, 4))
+ p += 11;
+ } else if (!strncasecmp("hdlc", p, 4)) {
cond->integer_value = INFO_BMODE_PACKET;
- else {
+ p += 4;
+ } else {
SPRINT(failure, "Given bchannel mode is invalid or misspelled.");
goto parse_error;
}
/* parse service value */
case COND_TYPE_HLC:
- if (!strncasecmp("telephony", p, 9))
+ if (!strncasecmp("telephony", p, 9)) {
cond->integer_value = INFO_HLC_TELEPHONY;
- else if (!strncasecmp("faxg2g3", p, 7))
+ p += 9;
+ } else if (!strncasecmp("faxg2g3", p, 7)) {
cond->integer_value = INFO_HLC_FAXG2G3;
- else if (!strncasecmp("faxg4", p, 5))
+ p += 7;
+ } else if (!strncasecmp("faxg4", p, 5)) {
cond->integer_value = INFO_HLC_FAXG4;
- else if (!strncasecmp("teletex1", p, 8))
+ p += 5;
+ } else if (!strncasecmp("teletex1", p, 8)) {
cond->integer_value = INFO_HLC_TELETEX1;
- else if (!strncasecmp("teletex2", p, 8))
+ p += 8;
+ } else if (!strncasecmp("teletex2", p, 8)) {
cond->integer_value = INFO_HLC_TELETEX2;
- else if (!strncasecmp("teletex3", p, 8))
+ p += 8;
+ } else if (!strncasecmp("teletex3", p, 8)) {
cond->integer_value = INFO_HLC_TELETEX3;
- else if (!strncasecmp("videotex1", p, 9))
+ p += 8;
+ } else if (!strncasecmp("videotex1", p, 9)) {
cond->integer_value = INFO_HLC_VIDEOTEX1;
- else if (!strncasecmp("videotex2", p, 9))
+ p += 9;
+ } else if (!strncasecmp("videotex2", p, 9)) {
cond->integer_value = INFO_HLC_VIDEOTEX2;
- else if (!strncasecmp("telex", p, 5))
+ p += 9;
+ } else if (!strncasecmp("telex", p, 5)) {
cond->integer_value = INFO_HLC_TELEX;
- else if (!strncasecmp("mhs", p, 3))
+ p += 5;
+ } else if (!strncasecmp("mhs", p, 3)) {
cond->integer_value = INFO_HLC_MHS;
- else if (!strncasecmp("osi", p, 3))
+ p += 3;
+ } else if (!strncasecmp("osi", p, 3)) {
cond->integer_value = INFO_HLC_OSI;
- else if (!strncasecmp("maintenance", p, 11))
+ p += 3;
+ } else if (!strncasecmp("maintenance", p, 11)) {
cond->integer_value = INFO_HLC_MAINTENANCE;
- else if (!strncasecmp("management", p, 10))
+ p += 11;
+ } else if (!strncasecmp("management", p, 10)) {
cond->integer_value = INFO_HLC_MANAGEMENT;
- else if (!strncasecmp("audiovisual", p, 11))
+ p += 10;
+ } else if (!strncasecmp("audiovisual", p, 11)) {
cond->integer_value = INFO_HLC_AUDIOVISUAL;
- else {
+ p += 11;
+ } else {
SPRINT(failure, "Given HLC type is invalid or misspelled.");
goto parse_error;
}
istrue,
couldbetrue,
condition,
- dialing_required,
- avail,
- any;
+ dialing_required;
struct route_rule *rule = ruleset->rule_first;
struct route_cond *cond;
struct route_action *action = NULL;
unsigned long comp_len;
- int j, jj;
+ int j;
char isdn_port[10];
char *argv[11]; /* check also number of args below */
char callerid[64], callerid2[64], redirid[64];
FILE *tfp;
long long timeout, now_ll = 0, match_timeout = 0;
struct timeval current_time;
+#ifdef WITH_MISDN
struct mISDNport *mISDNport;
+ int avail,
+ any;
+ int jj;
+#endif
struct admin_list *admin;
time_t now;
struct tm *now_tm;
break;
case MATCH_PORT:
+#ifdef WITH_MISDN
if (ea_endpoint->ep_portlist)
if ((ea_endpoint->ep_portlist->port_type & PORT_CLASS_MASK) != PORT_CLASS_mISDN)
break;
integer = e_callerinfo.isdn_port;
goto match_integer;
+#endif
+ break;
case MATCH_INTERFACE:
if (!e_callerinfo.interface[0])
case MATCH_FREE:
case MATCH_NOTFREE:
+#ifdef WITH_MISDN
if (!(comp_len = (unsigned long)strchr(cond->string_value, ':')))
break;
comp_len = comp_len-(unsigned long)cond->string_value;
if (avail < atoi(cond->string_value + comp_len + 1))
istrue = 1;
}
+#endif
break;
case MATCH_DOWN:
+#ifdef WITH_MISDN
mISDNport = mISDNport_first;
while(mISDNport) {
if (mISDNport->ifport)
}
if (!mISDNport) /* all down */
istrue = 1;
+#endif
break;
case MATCH_UP:
+#ifdef WITH_MISDN
mISDNport = mISDNport_first;
while(mISDNport) {
if (mISDNport->ifport)
}
if (mISDNport) /* one link at least */
istrue = 1;
+#endif
break;
case MATCH_BUSY:
case MATCH_IDLE:
+#ifdef WITH_MISDN
any = 0;
mISDNport = mISDNport_first;
while(mISDNport) {
istrue = 1;
if (!mISDNport && cond->match==MATCH_IDLE)
istrue = 1;
+#endif
break;
case MATCH_REMOTE:
cond = cond->next;
}
- if (timeout>now_ll && match==1) /* the matching rule with timeout in the future */
- if (match_timeout == 0 || timeout < match_timeout) { /* first timeout or lower */
- /* set timeout in the furture */
- match_timeout = timeout;
- e_match_to_action = rule->action_first;
- e_match_to_extdialing = e_dialinginfo.id + dialing_required;
+ if (timeout>now_ll && match==1) { /* the matching rule with timeout in the future */
+ if (match_timeout == 0 || timeout < match_timeout) { /* first timeout or lower */
+ /* set timeout in the furture */
+ match_timeout = timeout;
+ e_match_to_action = rule->action_first;
+ e_match_to_extdialing = e_dialinginfo.id + dialing_required;
+ }
match = 0; /* matches in the future */
}
if (match == 1) {
if (match_timeout == 0)
unsched_timer(&e_match_timeout); /* no timeout */
else {
- schedule_timer(&e_match_timeout, match_timeout / 1000000, match_timeout % 1000000);
+ schedule_timer(&e_match_timeout, (match_timeout-now_ll) / 1000000, (match_timeout-now_ll) % 1000000);
}
return(action);
}
0,
};
-struct route_action action_remote = {
- NULL,
- NULL,
- ACTION_REMOTE,
- 0,
- 0,
-};
-
struct route_action action_vbox = {
NULL,
NULL,