"capability=speech|audio|video|digital-restricted|digital-unrestricted|digital-unrestricted-tones", "Alter the service type of the call."},
{ PARAM_BMODE,
"bmode", PARAM_TYPE_BMODE,
- "capability=transparent|hdlc", "Alter the bchannel mode of the call. Use hdlc for data calls."},
+ "bmode=transparent|hdlc", "Alter the bchannel mode of the call. Use hdlc for data calls."},
{ PARAM_INFO1,
"infolayer1", PARAM_TYPE_INTEGER,
"infolayer1=<value>", "Alter the layer 1 information of a call. Use 3 for ALAW or 2 for uLAW."},
"disconnect", NULL, &EndpointAppPBX::action_dialing_disconnect, NULL,
PARAM_CONNECT | PARAM_CAUSE | PARAM_LOCATION | PARAM_SAMPLE | PARAM_DISPLAY,
"Caller gets disconnected optionally with given cause and given sample and given display text."},
- { ACTION_HELP,
- "help", NULL, &EndpointAppPBX::action_dialing_help, NULL,
- PARAM_CONNECT | PARAM_TIMEOUT,
- NULL},
-// "Caller will be able to select from current rules that would match. (using * and #)"},
{ ACTION_DEFLECT,
"deflect", NULL, &EndpointAppPBX::action_dialing_deflect, NULL,
PARAM_DEST,
struct route_param *param;
struct route_param **param_pointer = NULL;
char failure[256];
+ unsigned long long allowed_params;
/* check the integrity of IDs for ACTION_* and PARAM_* */
i = 0;
/* reading ruleset name text */
i = 0;
- while((*p>='a' && *p<='z') || (*p>='A' && *p<='Z') || (*p>='0' && *p<='9'))
+ while(*p>' ' && *p<127 && *p!=']')
{
if (*p>='A' && *p<='Z') *p = *p-'A'+'a'; /* lower case */
key[i++] = *p++;
SPRINT(failure, "Unknown action name '%s'.", key);
goto parse_error;
}
+ allowed_params = action_defs[index].params;
/* alloc memory for action */
action = (struct route_action *)MALLOC(sizeof(struct route_action));
goto parse_error;
}
+ /* check if item is allowed for the action */
+ if (!(param_defs[index].id & allowed_params))
+ {
+ SPRINT(failure, "Param name '%s' exists, but not for this action.", key);
+ goto parse_error;
+ }
+
/* params without values must not have any parameter */
if (param_defs[index].type == PARAM_TYPE_NULL)
{