mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	This commit adds res_geolocation which creates the core capabilities to manipulate Geolocation information on SIP INVITEs. An upcoming commit will add res_pjsip_geolocation which will allow the capabilities to be used with the pjsip channel driver. This commit message is intentionally short because this isn't a simple capability. See the documentation at https://wiki.asterisk.org/wiki/display/AST/Geolocation for more information. THE CAPABILITIES IMPLEMENTED HERE MAY CHANGE BASED ON USER FEEDBACK! ASTERISK-30127 Change-Id: Ibfde963121b1ecf57fd98ee7060c4f0808416303
		
			
				
	
	
		
			169 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Asterisk -- An open source telephony toolkit.
 | |
|  *
 | |
|  * Copyright (C) 2022, Sangoma Technologies Corporation
 | |
|  *
 | |
|  * George Joseph <gjoseph@sangoma.com>
 | |
|  *
 | |
|  * See http://www.asterisk.org for more information about
 | |
|  * the Asterisk project. Please do not directly contact
 | |
|  * any of the maintainers of this project for assistance;
 | |
|  * the project provides a web site, mailing lists and IRC
 | |
|  * channels for your use.
 | |
|  *
 | |
|  * This program is free software, distributed under the terms of
 | |
|  * the GNU General Public License Version 2. See the LICENSE file
 | |
|  * at the top of the source tree.
 | |
|  */
 | |
| 
 | |
| #ifndef GEOLOC_PRIVATE_H_
 | |
| #define GEOLOC_PRIVATE_H_
 | |
| 
 | |
| #include "asterisk/module.h"
 | |
| #include "asterisk/config.h"
 | |
| #include "asterisk/sorcery.h"
 | |
| #include "asterisk/lock.h"
 | |
| #include "asterisk/res_geolocation.h"
 | |
| 
 | |
| #define CONFIG_STR_TO_ENUM_DECL(_stem) int geoloc_ ## _stem ## _str_to_enum(const char *str);
 | |
| CONFIG_STR_TO_ENUM_DECL(pidf_element)
 | |
| CONFIG_STR_TO_ENUM_DECL(format);
 | |
| CONFIG_STR_TO_ENUM_DECL(action);
 | |
| #define GEOLOC_ENUM_TO_NAME_DECL(_stem) const char * geoloc_ ## _stem ## _to_name(int ix);
 | |
| GEOLOC_ENUM_TO_NAME_DECL(pidf_element)
 | |
| GEOLOC_ENUM_TO_NAME_DECL(format);
 | |
| GEOLOC_ENUM_TO_NAME_DECL(action);
 | |
| 
 | |
| 
 | |
| #define CONFIG_STR_TO_ENUM(_stem) \
 | |
| int geoloc_ ## _stem ## _str_to_enum(const char *str) \
 | |
| { \
 | |
| 	int i; \
 | |
| 	for (i = 0; i < ARRAY_LEN(_stem ## _names); i++) { \
 | |
| 		if (ast_strings_equal(str, _stem ## _names[i])) { \
 | |
| 			return i; \
 | |
| 		} \
 | |
| 	} \
 | |
| 	return -1; \
 | |
| }
 | |
| 
 | |
| #define CONFIG_ENUM_HANDLER(_object, _stem) \
 | |
| static int _stem ## _handler(const struct aco_option *opt, struct ast_variable *var, void *obj) \
 | |
| { \
 | |
| 	struct ast_geoloc_ ## _object *_thisobject = obj; \
 | |
| 	int enumval = geoloc_ ## _stem ## _str_to_enum(var->value); \
 | |
| 	if (enumval == -1) { \
 | |
| 		return -1; \
 | |
| 	} \
 | |
| 	_thisobject->_stem = enumval; \
 | |
| 	return 0; \
 | |
| }
 | |
| 
 | |
| 
 | |
| #define GEOLOC_ENUM_TO_NAME(_stem) \
 | |
| const char * geoloc_ ## _stem ## _to_name(int ix) \
 | |
| { \
 | |
| 	if (!ARRAY_IN_BOUNDS(ix, _stem ## _names)) { \
 | |
| 		return "none"; \
 | |
| 	} else { \
 | |
| 		return _stem ## _names[ix]; \
 | |
| 	} \
 | |
| }
 | |
| 
 | |
| #define CONFIG_ENUM_TO_STR(_object, _stem) \
 | |
| static int _stem ## _to_str(const void *obj, const intptr_t *args, char **buf) \
 | |
| { \
 | |
| 	const struct ast_geoloc_ ## _object *_thisobject = obj; \
 | |
| 	if (!ARRAY_IN_BOUNDS(_thisobject->_stem, _stem ## _names)) { \
 | |
| 		*buf = ast_strdup("none"); \
 | |
| 	} else { \
 | |
| 		*buf = ast_strdup(_stem ## _names[_thisobject->_stem]); \
 | |
| 	} \
 | |
| 	return 0; \
 | |
| }
 | |
| 
 | |
| #define CONFIG_ENUM(_object, _stem) \
 | |
| CONFIG_STR_TO_ENUM(_stem) \
 | |
| GEOLOC_ENUM_TO_NAME(_stem) \
 | |
| CONFIG_ENUM_HANDLER(_object, _stem) \
 | |
| CONFIG_ENUM_TO_STR(_object, _stem)
 | |
| 
 | |
| #define CONFIG_VAR_LIST_HANDLER(_object, _stem) \
 | |
| static int _stem ## _handler(const struct aco_option *opt, struct ast_variable *var, void *obj) \
 | |
| { \
 | |
| 	struct ast_geoloc_ ## _object *_thisobject = obj; \
 | |
| 	struct ast_variable *new_var; \
 | |
| 	char *item_string, *item, *item_name, *item_value; \
 | |
| 	int rc = 0;\
 | |
| 	if (ast_strlen_zero(var->value)) { return 0; } \
 | |
| 	item_string = ast_strdupa(var->value); \
 | |
| 	while ((item = ast_strsep(&item_string, ',', AST_STRSEP_ALL))) { \
 | |
| 		item_name = ast_strsep(&item, '=', AST_STRSEP_ALL); \
 | |
| 		item_value = ast_strsep(&item, '=', AST_STRSEP_ALL); \
 | |
| 		new_var = ast_variable_new(item_name, item_value, ""); \
 | |
| 		if (!new_var) { \
 | |
| 			rc = -1; \
 | |
| 			break; \
 | |
| 		} \
 | |
| 		ast_variable_list_append(&_thisobject->_stem, new_var); \
 | |
| 	} \
 | |
| 	return rc; \
 | |
| }
 | |
| 
 | |
| #define CONFIG_VAR_LIST_DUP(_object, _stem) \
 | |
| static int _stem ## _dup(const void *obj, struct ast_variable **fields) \
 | |
| { \
 | |
| 	const struct ast_geoloc_ ## _object *_thisobject = obj; \
 | |
| 	if (_thisobject->_stem) { \
 | |
| 		*fields = ast_variables_dup(_thisobject->_stem); \
 | |
| 	} \
 | |
| 	return 0; \
 | |
| }
 | |
| 
 | |
| #define CONFIG_VAR_LIST_TO_STR(_object, _stem) \
 | |
| static int _stem ## _to_str(const void *obj, const intptr_t *args, char **buf) \
 | |
| { \
 | |
| 	const struct ast_geoloc_ ## _object *_thisobject = obj; \
 | |
| 	struct ast_str *str = ast_variable_list_join(_thisobject->_stem, ",", "=", "\"", NULL); \
 | |
| 	*buf = ast_strdup(ast_str_buffer(str)); \
 | |
| 	ast_free(str); \
 | |
| 	return 0; \
 | |
| }
 | |
| 
 | |
| #define CONFIG_VAR_LIST(_object, _stem) \
 | |
| CONFIG_VAR_LIST_HANDLER(_object, _stem) \
 | |
| CONFIG_VAR_LIST_DUP(_object, _stem) \
 | |
| CONFIG_VAR_LIST_TO_STR(_object, _stem)
 | |
| 
 | |
| int geoloc_config_load(void);
 | |
| int geoloc_config_reload(void);
 | |
| int geoloc_config_unload(void);
 | |
| 
 | |
| struct ast_xml_node *geoloc_civicaddr_list_to_xml(const struct ast_variable *resolved_location,
 | |
| 	const char *ref_string);
 | |
| int geoloc_civicaddr_load(void);
 | |
| int geoloc_civicaddr_unload(void);
 | |
| int geoloc_civicaddr_reload(void);
 | |
| 
 | |
| struct ast_xml_node *geoloc_gml_list_to_xml(const struct ast_variable *resolved_location,
 | |
| 	const char *ref_string);
 | |
| int geoloc_gml_unload(void);
 | |
| int geoloc_gml_load(void);
 | |
| int geoloc_gml_reload(void);
 | |
| 
 | |
| int geoloc_dialplan_unload(void);
 | |
| int geoloc_dialplan_load(void);
 | |
| int geoloc_dialplan_reload(void);
 | |
| 
 | |
| int geoloc_channel_unload(void);
 | |
| int geoloc_channel_load(void);
 | |
| int geoloc_channel_reload(void);
 | |
| 
 | |
| int geoloc_eprofile_unload(void);
 | |
| int geoloc_eprofile_load(void);
 | |
| int geoloc_eprofile_reload(void);
 | |
| 
 | |
| struct ast_sorcery *geoloc_get_sorcery(void);
 | |
| 
 | |
| #endif /* GEOLOC_PRIVATE_H_ */
 |