aboutsummaryrefslogtreecommitdiffstats
path: root/main/pbx.c
diff options
context:
space:
mode:
authoreliel <eliel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 14:48:42 +0000
committereliel <eliel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 14:48:42 +0000
commit7a61a43adbc1ef91229e7757f6ac88619adff202 (patch)
tree80476efaba3fcc99c7526182d9ad935264c099eb /main/pbx.c
parentf28601a4b00a7b39fd8d3826b02c98e4b868e476 (diff)
Implement AstData API data providers as part of the GSOC 2010 project,
midterm evaluation. Review: https://reviewboard.asterisk.org/r/757/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@274727 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/pbx.c')
-rw-r--r--main/pbx.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/main/pbx.c b/main/pbx.c
index 24203ede7..dbc4db497 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -9717,6 +9717,57 @@ static void device_state_cb(const struct ast_event *event, void *unused)
}
}
+/*!
+ * \internal
+ * \brief Implements the hints data provider.
+ */
+static int hints_data_provider_get(const struct ast_data_search *search,
+ struct ast_data *data_root)
+{
+ struct ast_data *data_hint;
+ struct ast_hint *hint;
+ int watchers;
+ struct ast_state_cb *watcher;
+
+ AST_RWLIST_RDLOCK(&hints);
+ if (AST_RWLIST_EMPTY(&hints)) {
+ AST_RWLIST_UNLOCK(&hints);
+ return 0;
+ }
+
+ AST_RWLIST_TRAVERSE(&hints, hint, list) {
+ watchers = 0;
+ AST_LIST_TRAVERSE(&hint->callbacks, watcher, entry) {
+ watchers++;
+ }
+ data_hint = ast_data_add_node(data_root, "hint");
+ if (!data_hint) {
+ continue;
+ }
+ ast_data_add_str(data_hint, "extension", ast_get_extension_name(hint->exten));
+ ast_data_add_str(data_hint, "context", ast_get_context_name(ast_get_extension_context(hint->exten)));
+ ast_data_add_str(data_hint, "application", ast_get_extension_app(hint->exten));
+ ast_data_add_str(data_hint, "state", ast_extension_state2str(hint->laststate));
+ ast_data_add_int(data_hint, "watchers", watchers);
+
+ if (!ast_data_search_match(search, data_hint)) {
+ ast_data_remove_node(data_root, data_hint);
+ }
+ }
+ AST_RWLIST_UNLOCK(&hints);
+
+ return 0;
+}
+
+static const struct ast_data_handler hints_data_provider = {
+ .version = AST_DATA_HANDLER_VERSION,
+ .get = hints_data_provider_get
+};
+
+static const struct ast_data_entry pbx_data_providers[] = {
+ AST_DATA_ENTRY("asterisk/core/hints", &hints_data_provider),
+};
+
int load_pbx(void)
{
int x;
@@ -9729,6 +9780,7 @@ int load_pbx(void)
ast_verb(1, "Registering builtin applications:\n");
ast_cli_register_multiple(pbx_cli, ARRAY_LEN(pbx_cli));
+ ast_data_register_multiple_core(pbx_data_providers, ARRAY_LEN(pbx_data_providers));
__ast_custom_function_register(&exception_function, NULL);
__ast_custom_function_register(&testtime_function, NULL);