diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 69c0beb9ea..e3d982c690 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -3243,6 +3243,11 @@ static struct ast_custom_function chan_pjsip_parse_uri_function = { .read = pjsip_acf_parse_uri_read, }; +static struct ast_custom_function chan_pjsip_parse_uri_from_function = { + .name = "PJSIP_PARSE_URI_FROM", + .read = pjsip_acf_parse_uri_read, +}; + static struct ast_custom_function media_offer_function = { .name = "PJSIP_MEDIA_OFFER", .read = pjsip_acf_media_offer_read, @@ -3305,6 +3310,11 @@ static int load_module(void) goto end; } + if (ast_custom_function_register(&chan_pjsip_parse_uri_from_function)) { + ast_log(LOG_ERROR, "Unable to register PJSIP_PARSE_URI_FROM dialplan function\n"); + goto end; + } + if (ast_custom_function_register(&media_offer_function)) { ast_log(LOG_WARNING, "Unable to register PJSIP_MEDIA_OFFER dialplan function\n"); goto end; @@ -3378,6 +3388,7 @@ end: ast_custom_function_unregister(&media_offer_function); ast_custom_function_unregister(&chan_pjsip_dial_contacts_function); ast_custom_function_unregister(&chan_pjsip_parse_uri_function); + ast_custom_function_unregister(&chan_pjsip_parse_uri_from_function); ast_custom_function_unregister(&session_refresh_function); ast_unregister_application(app_pjsip_hangup); ast_manager_unregister(app_pjsip_hangup); @@ -3410,6 +3421,7 @@ static int unload_module(void) ast_custom_function_unregister(&media_offer_function); ast_custom_function_unregister(&chan_pjsip_dial_contacts_function); ast_custom_function_unregister(&chan_pjsip_parse_uri_function); + ast_custom_function_unregister(&chan_pjsip_parse_uri_from_function); ast_custom_function_unregister(&session_refresh_function); ast_unregister_application(app_pjsip_hangup); ast_manager_unregister(app_pjsip_hangup); diff --git a/channels/pjsip/dialplan_functions.c b/channels/pjsip/dialplan_functions.c index f1365adba9..7d0484c9ae 100644 --- a/channels/pjsip/dialplan_functions.c +++ b/channels/pjsip/dialplan_functions.c @@ -724,6 +724,7 @@ static int parse_uri_cb(void *data) int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen) { struct parse_uri_args func_args = { 0, }; + int reading_uri_from_var; AST_DECLARE_APP_ARGS(args, AST_APP_ARG(uri_str); @@ -732,8 +733,29 @@ int pjsip_acf_parse_uri_read(struct ast_channel *chan, const char *cmd, char *da AST_STANDARD_APP_ARGS(args, data); + reading_uri_from_var = !strcasecmp(cmd, "PJSIP_PARSE_URI_FROM"); + + if (reading_uri_from_var) { + const char *var; + + if (ast_strlen_zero(args.uri_str)) { + ast_log(LOG_WARNING, "The name of a variable containing a URI must be specified when using the '%s' dialplan function\n", cmd); + return -1; + } + + ast_channel_lock(chan); + if ((var = pbx_builtin_getvar_helper(chan, args.uri_str))) { + args.uri_str = ast_strdupa(var); + } + ast_channel_unlock(chan); + } + if (ast_strlen_zero(args.uri_str)) { - ast_log(LOG_WARNING, "An URI must be specified when using the '%s' dialplan function\n", cmd); + if (reading_uri_from_var) { + ast_log(LOG_WARNING, "The variable provided to the '%s' dialplan function must contain a URI\n", cmd); + } else { + ast_log(LOG_WARNING, "A URI must be specified when using the '%s' dialplan function\n", cmd); + } return -1; } diff --git a/channels/pjsip/dialplan_functions_doc.xml b/channels/pjsip/dialplan_functions_doc.xml index be4ce91b96..3d19d929ba 100644 --- a/channels/pjsip/dialplan_functions_doc.xml +++ b/channels/pjsip/dialplan_functions_doc.xml @@ -223,7 +223,7 @@ 17.0.0 - Parse an uri and return a type part of the URI. + Parse a URI and return a type part of the URI. @@ -272,7 +272,66 @@ - Parse an URI and return a specified part of the URI. + Parse a URI and return a specified part of the URI. + + + + + 18.24.0 + 20.9.0 + 21.4.0 + + + Parse the contents of a variable as a URI and return a type part of the URI. + + + + Name of a variable that contains a URI to parse + + + The type parameter specifies which URI part to read + + + Display name. + + + URI scheme. + + + User part. + + + Password part. + + + Host part. + + + Port number, or zero. + + + User parameter. + + + Method parameter. + + + Transport parameter. + + + TTL param, or -1. + + + Loose routing param, or zero. + + + Maddr param. + + + + + + Parse the contents of the provided variable as a URI and return a specified part of the URI.