| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "asterisk.h"
 | 
					
						
							|  |  |  | #include "asterisk/config.h"
 | 
					
						
							|  |  |  | #include "asterisk/cli.h"
 | 
					
						
							|  |  |  | #include "asterisk/module.h"
 | 
					
						
							|  |  |  | #include "asterisk/channel.h"
 | 
					
						
							|  |  |  | #include "asterisk/pbx.h"
 | 
					
						
							|  |  |  | #include "asterisk/strings.h"
 | 
					
						
							|  |  |  | #include "asterisk/utils.h"
 | 
					
						
							|  |  |  | #include "asterisk/app.h"
 | 
					
						
							|  |  |  | #include "asterisk/res_geolocation.h"
 | 
					
						
							|  |  |  | #include "geoloc_private.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void varlist_to_str(struct ast_variable *list, struct ast_str** buf, size_t len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct ast_variable *var = list; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (; var; var = var->next) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s=\"%s\"%s", var->name, var->value, var->next ? "," : ""); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int geoloc_profile_read(struct ast_channel *chan, | 
					
						
							|  |  |  | 	const char *cmd, char *data, struct ast_str **buf, ssize_t len) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char *parsed_data = ast_strdupa(data); | 
					
						
							|  |  |  | 	struct ast_datastore *ds; | 
					
						
							|  |  |  | 	struct ast_geoloc_eprofile *eprofile = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AST_DECLARE_APP_ARGS(args, | 
					
						
							|  |  |  | 		AST_APP_ARG(field); | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Check for zero arguments */ | 
					
						
							|  |  |  | 	if (ast_strlen_zero(parsed_data)) { | 
					
						
							|  |  |  | 		ast_log(LOG_ERROR, "%s: Cannot call without arguments\n", cmd); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-1"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AST_STANDARD_APP_ARGS(args, parsed_data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ast_strlen_zero(args.field)) { | 
					
						
							|  |  |  | 		ast_log(LOG_ERROR, "%s: Cannot call without a field to query\n", cmd); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-1"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ds = ast_geoloc_datastore_find(chan); | 
					
						
							|  |  |  | 	if (!ds) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_NOTICE, "%s: There is no geoloc profile on this channel\n", cmd); | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-2"); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	eprofile = ast_geoloc_datastore_get_eprofile(ds, 0); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	if (!eprofile) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_NOTICE, "%s: There is no geoloc profile on this channel\n", cmd); | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-2"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "0"); | 
					
						
							|  |  |  | 	if (ast_strings_equal(args.field, "inheritable")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", ds->inheritance ? "true" : "false"); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "id")) { | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		ast_str_append(buf, len, "%s", eprofile->id); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "location_reference")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", eprofile->location_reference); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "method")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", eprofile->method); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "allow_routing_use")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", eprofile->allow_routing_use ? "yes" : "no"); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "profile_precedence")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", ast_geoloc_precedence_to_name(eprofile->precedence)); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "format")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_str_append(buf, len, "%s", ast_geoloc_format_to_name(eprofile->format)); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "pidf_element")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_str_append(buf, len, "%s", ast_geoloc_pidf_element_to_name(eprofile->pidf_element)); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "location_source")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", eprofile->location_source); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "notes")) { | 
					
						
							|  |  |  | 		ast_str_append(buf, len, "%s", eprofile->notes); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "location_info")) { | 
					
						
							|  |  |  | 		varlist_to_str(eprofile->location_info, buf, len); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "location_info_refinement")) { | 
					
						
							|  |  |  | 		varlist_to_str(eprofile->location_refinement, buf, len); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "location_variables")) { | 
					
						
							|  |  |  | 		varlist_to_str(eprofile->location_variables, buf, len); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "effective_location")) { | 
					
						
							|  |  |  | 		varlist_to_str(eprofile->effective_location, buf, len); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "usage_rules")) { | 
					
						
							|  |  |  | 		varlist_to_str(eprofile->usage_rules, buf, len); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "confidence")) { | 
					
						
							|  |  |  | 		varlist_to_str(eprofile->confidence, buf, len); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		ast_log(LOG_ERROR, "%s: Field '%s' is not valid\n", cmd, args.field); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-3"); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ao2_ref(eprofile, -1); | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | #define TEST_ENUM_VALUE(_chan_name, _ep, _field, _value) \
 | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | ({ \ | 
					
						
							|  |  |  | 	enum ast_geoloc_ ## _field v; \ | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	v = ast_geoloc_ ## _field ## _str_to_enum(_value); \ | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	if (v == AST_GEOLOC_INVALID_VALUE) { \ | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_ERROR, "%s: %s '%s' is invalid\n", _chan_name, #_field, value); \ | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-3"); \ | 
					
						
							|  |  |  | 		return 0; \ | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} \ | 
					
						
							|  |  |  | 	_ep->_field = v; \ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | #define TEST_VARLIST(_chan_name, _ep, _field, _value) \
 | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | ({ \ | 
					
						
							|  |  |  | 	struct ast_variable *_list; \ | 
					
						
							|  |  |  | 	_list = ast_variable_list_from_quoted_string(_value, ",", "=", "\"" ); \ | 
					
						
							|  |  |  | 	if (!_list) { \ | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_ERROR, "%s: %s '%s' is malformed or contains invalid values", _chan_name, #_field, _value); \ | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-3"); \ | 
					
						
							|  |  |  | 		return 0; \ | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} \ | 
					
						
							|  |  |  | 	ast_variables_destroy(_ep->_field); \ | 
					
						
							|  |  |  | 	_ep->_field = _list; \ | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int geoloc_profile_write(struct ast_channel *chan, const char *cmd, char *data, | 
					
						
							|  |  |  | 	 const char *value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	char *parsed_data = ast_strdupa(data); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	const char *chan_name = ast_channel_name(chan); | 
					
						
							|  |  |  | 	struct ast_datastore *ds; /* Reminder: datastores aren't ao2 objects */ | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	RAII_VAR(struct ast_geoloc_eprofile *, eprofile, NULL, ao2_cleanup); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AST_DECLARE_APP_ARGS(args, | 
					
						
							|  |  |  | 		AST_APP_ARG(field); | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Check for zero arguments */ | 
					
						
							|  |  |  | 	if (ast_strlen_zero(parsed_data)) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_ERROR, "%s: Cannot call without arguments\n", chan_name); | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-1"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AST_STANDARD_APP_ARGS(args, parsed_data); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ast_strlen_zero(args.field)) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_ERROR, "%s: Cannot call without a field to set\n", chan_name); | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-1"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ds = ast_geoloc_datastore_find(chan); | 
					
						
							|  |  |  | 	if (!ds) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ds = ast_geoloc_datastore_create(ast_channel_name(chan)); | 
					
						
							|  |  |  | 		if (!ds) { | 
					
						
							|  |  |  | 			ast_log(LOG_WARNING, "%s: Unable to create geolocation datastore\n", chan_name); | 
					
						
							|  |  |  | 			pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-2"); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		ast_channel_datastore_add(chan, ds); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	eprofile = ast_geoloc_datastore_get_eprofile(ds, 0); | 
					
						
							|  |  |  | 	if (!eprofile) { | 
					
						
							|  |  |  | 		int rc; | 
					
						
							|  |  |  | 		eprofile = ast_geoloc_eprofile_alloc(chan_name); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		if (!eprofile) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 			ast_log(LOG_ERROR, "%s: Could not allocate eprofile\n", chan_name); | 
					
						
							|  |  |  | 			pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-2"); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		rc = ast_geoloc_datastore_add_eprofile(ds, eprofile); | 
					
						
							|  |  |  | 		if (rc <= 0) { | 
					
						
							|  |  |  | 			ast_log(LOG_ERROR, "%s: Could not add eprofile to datastore\n", chan_name); | 
					
						
							|  |  |  | 			pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-2"); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	if (ast_strings_equal(args.field, "inheritable")) { | 
					
						
							|  |  |  | 		ast_geoloc_datastore_set_inheritance(ds, ast_true(value)); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "location_reference")) { | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		struct ast_geoloc_location *loc = ast_geoloc_get_location(value); | 
					
						
							|  |  |  | 		ao2_cleanup(loc); | 
					
						
							|  |  |  | 		if (!loc) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 			ast_log(LOG_ERROR, "%s: Location reference '%s' doesn't exist\n", chan_name, value); | 
					
						
							|  |  |  | 			pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-3"); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		ast_string_field_set(eprofile, location_reference, value); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "method")) { | 
					
						
							|  |  |  | 		ast_string_field_set(eprofile, method, value); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "allow_routing_use")) { | 
					
						
							|  |  |  | 		eprofile->allow_routing_use = ast_true(value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "profile_precedence")) { | 
					
						
							|  |  |  | 		TEST_ENUM_VALUE(chan_name, eprofile, precedence, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "format")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_ENUM_VALUE(chan_name, eprofile, format, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "pidf_element")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_ENUM_VALUE(chan_name, eprofile, pidf_element, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "location_info")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_VARLIST(chan_name, eprofile, location_info, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "location_source")) { | 
					
						
							|  |  |  | 		ast_string_field_set(eprofile, location_source, value); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "location_info_refinement")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_VARLIST(chan_name, eprofile, location_refinement, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "location_variables")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_VARLIST(chan_name, eprofile, location_variables, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "effective_location")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_VARLIST(chan_name, eprofile, effective_location, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else if (ast_strings_equal(args.field, "usage_rules")) { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		TEST_VARLIST(chan_name, eprofile, usage_rules, value); | 
					
						
							|  |  |  | 	} else if (ast_strings_equal(args.field, "confidence")) { | 
					
						
							|  |  |  | 		TEST_VARLIST(chan_name, eprofile, confidence, value); | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 		ast_log(LOG_ERROR, "%s: Field '%s' is not valid\n", chan_name, args.field); | 
					
						
							|  |  |  | 		pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "-3"); | 
					
						
							|  |  |  | 		return 0; | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ast_geoloc_eprofile_refresh_location(eprofile); | 
					
						
							| 
									
										
										
										
											2022-08-05 07:50:49 -06:00
										 |  |  | 	pbx_builtin_setvar_helper(chan, "GEOLOCPROFILESTATUS", "0"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-15 06:29:50 -07:00
										 |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct ast_custom_function geoloc_function = { | 
					
						
							|  |  |  | 	.name = "GEOLOC_PROFILE", | 
					
						
							|  |  |  | 	.read2 = geoloc_profile_read, | 
					
						
							|  |  |  | 	.write = geoloc_profile_write, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int geoloc_dialplan_unload(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	ast_custom_function_unregister(&geoloc_function); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return AST_MODULE_LOAD_SUCCESS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int geoloc_dialplan_load(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int res = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	res = ast_custom_function_register(&geoloc_function); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res == 0 ? AST_MODULE_LOAD_SUCCESS : AST_MODULE_LOAD_DECLINE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int geoloc_dialplan_reload(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return AST_MODULE_LOAD_SUCCESS; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 |