diff --git a/include/asterisk/sorcery.h b/include/asterisk/sorcery.h index d4d62bfdb616eda1153c50808f9a451d612aeea8..873d32251ad06cde89bc5b7cc5858532a90ba9cb 100644 --- a/include/asterisk/sorcery.h +++ b/include/asterisk/sorcery.h @@ -488,6 +488,8 @@ int ast_sorcery_object_fields_register(struct ast_sorcery *sorcery, const char * * \param multiple_handler A custom handler for translating the native representation of the fields * \param opt_type Option type * \param flags Option type specific flags + * \param no_doc Field should not be documented + * \param alias Interpret and apply field value only * * \retval 0 success * \retval -1 failure @@ -495,7 +497,8 @@ int ast_sorcery_object_fields_register(struct ast_sorcery *sorcery, const char * int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char *type, const char *name, const char *default_val, enum aco_option_type opt_type, aco_option_handler config_handler, sorcery_field_handler sorcery_handler, - sorcery_fields_handler multiple_handler, unsigned int flags, unsigned int no_doc, size_t argc, ...); + sorcery_fields_handler multiple_handler, unsigned int flags, unsigned int no_doc, + unsigned int alias, size_t argc, ...); /*! * \brief Register a field within an object @@ -511,7 +514,23 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char * \retval -1 failure */ #define ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, flags, ...) \ - __ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, NULL, NULL, NULL, flags, 0, VA_NARGS(__VA_ARGS__), __VA_ARGS__) + __ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, NULL, NULL, NULL, flags, 0, 0, VA_NARGS(__VA_ARGS__), __VA_ARGS__) + +/*! + * \brief Register a field within an object as an alias + * + * \param sorcery Pointer to a sorcery structure + * \param type Type of object + * \param name Name of the field + * \param default_val Default value of the field + * \param opt_type Option type + * \param flags Option type specific flags + * + * \retval 0 success + * \retval -1 failure + */ +#define ast_sorcery_object_field_register_alias(sorcery, type, name, default_val, opt_type, flags, ...) \ + __ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, NULL, NULL, flags, 1, 1, VA_NARGS(__VA_ARGS__), __VA_ARGS__) /*! * \brief Register a field within an object without documentation @@ -527,7 +546,7 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char * \retval -1 failure */ #define ast_sorcery_object_field_register_nodoc(sorcery, type, name, default_val, opt_type, flags, ...) \ - __ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, NULL, NULL, NULL, flags, 1, VA_NARGS(__VA_ARGS__), __VA_ARGS__) + __ast_sorcery_object_field_register(sorcery, type, name, default_val, opt_type, NULL, NULL, NULL, flags, 1, 0, VA_NARGS(__VA_ARGS__), __VA_ARGS__) /*! * \brief Register a field within an object with custom handlers @@ -545,7 +564,24 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char * \retval -1 failure */ #define ast_sorcery_object_field_register_custom(sorcery, type, name, default_val, config_handler, sorcery_handler, multiple_handler, flags, ...) \ - __ast_sorcery_object_field_register(sorcery, type, name, default_val, OPT_CUSTOM_T, config_handler, sorcery_handler, multiple_handler, flags, 0, VA_NARGS(__VA_ARGS__), __VA_ARGS__); + __ast_sorcery_object_field_register(sorcery, type, name, default_val, OPT_CUSTOM_T, config_handler, sorcery_handler, multiple_handler, flags, 0, 0, VA_NARGS(__VA_ARGS__), __VA_ARGS__); + +/*! + * \brief Register a field within an object with custom handlers as an alias + * + * \param sorcery Pointer to a sorcery structure + * \param type Type of object + * \param name Name of the field + * \param default_val Default value of the field + * \param config_handler Custom configuration handler + * \param sorcery_handler Custom sorcery handler + * \param flags Option type specific flags + * + * \retval 0 success + * \retval -1 failure + */ +#define ast_sorcery_object_field_register_custom_alias(sorcery, type, name, default_val, config_handler, sorcery_handler, flags, ...) \ + __ast_sorcery_object_field_register(sorcery, type, name, default_val, OPT_CUSTOM_T, config_handler, sorcery_handler, flags, 1, 1, VA_NARGS(__VA_ARGS__), __VA_ARGS__); /*! * \brief Register a field within an object with custom handlers without documentation @@ -563,7 +599,7 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char * \retval -1 failure */ #define ast_sorcery_object_field_register_custom_nodoc(sorcery, type, name, default_val, config_handler, sorcery_handler, multiple_handler, flags, ...) \ - __ast_sorcery_object_field_register(sorcery, type, name, default_val, OPT_CUSTOM_T, config_handler, sorcery_handler, multiple_handler, flags, 1, VA_NARGS(__VA_ARGS__), __VA_ARGS__); + __ast_sorcery_object_field_register(sorcery, type, name, default_val, OPT_CUSTOM_T, config_handler, sorcery_handler, flags, 1, 0, VA_NARGS(__VA_ARGS__), __VA_ARGS__); /*! * \brief Inform any wizards to load persistent objects diff --git a/main/sorcery.c b/main/sorcery.c index cb24cae30e7d0ce9c608f64fa2d76b9aaf436aae..1d0aec75741cace4b3c8e54cbab7767dcdde17b2 100644 --- a/main/sorcery.c +++ b/main/sorcery.c @@ -811,7 +811,7 @@ int ast_sorcery_object_fields_register(struct ast_sorcery *sorcery, const char * } int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char *type, const char *name, const char *default_val, enum aco_option_type opt_type, - aco_option_handler config_handler, sorcery_field_handler sorcery_handler, sorcery_fields_handler multiple_handler, unsigned int flags, unsigned int no_doc, size_t argc, ...) + aco_option_handler config_handler, sorcery_field_handler sorcery_handler, sorcery_fields_handler multiple_handler, unsigned int flags, unsigned int no_doc, unsigned int alias, size_t argc, ...) { RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup); RAII_VAR(struct ast_sorcery_object_field *, object_field, NULL, ao2_cleanup); @@ -840,7 +840,9 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char } va_end(args); - ao2_link(object_type->fields, object_field); + if (!alias) { + ao2_link(object_type->fields, object_field); + } /* TODO: Improve this hack */ if (!argc) { diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c index 110be2906004f0a5a208ae20167220d7e73ee407..0aa63004bdb8d14ce33c411317b6101fbbcad2ae 100644 --- a/res/res_pjsip/pjsip_configuration.c +++ b/res/res_pjsip/pjsip_configuration.c @@ -1577,7 +1577,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod ast_sorcery_object_field_register(sip_sorcery, "endpoint", "type", "", OPT_NOOP_T, 0, 0); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "context", "default", OPT_STRINGFIELD_T, 0, STRFLDSET(struct ast_sip_endpoint, context)); - ast_sorcery_object_field_register(sip_sorcery, "endpoint", "disallow", "", OPT_CODEC_T, 0, FLDSET(struct ast_sip_endpoint, media.prefs, media.codecs)); + ast_sorcery_object_field_register_alias(sip_sorcery, "endpoint", "disallow", "", OPT_CODEC_T, 0, FLDSET(struct ast_sip_endpoint, media.prefs, media.codecs)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "allow", "", OPT_CODEC_T, 1, FLDSET(struct ast_sip_endpoint, media.prefs, media.codecs)); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtmf_mode", "rfc4733", dtmf_handler, dtmf_to_str, NULL, 0, 0); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "rtp_ipv6", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.ipv6));