#include "asterisk.h"
#include "asterisk/_private.h"
#include <regex.h>
#include "asterisk/module.h"
#include "asterisk/utils.h"
#include "asterisk/lock.h"
#include "asterisk/data.h"
#include "asterisk/astobj2.h"
#include "asterisk/xml.h"
#include "asterisk/cli.h"
#include "asterisk/term.h"
#include "asterisk/manager.h"
#include "asterisk/test.h"
#include "asterisk/frame.h"
Go to the source code of this file.
Data Structures | |
struct | ast_data |
The data tree to be returned by the callbacks and managed by functions local to this file. More... | |
struct | ast_data_iterator |
This structure is used by the iterator. More... | |
struct | ast_data_search |
The list of nodes with their search requirement. More... | |
struct | data_filter |
The filter node. More... | |
struct | data_filter::glob_list_t |
glob list More... | |
struct | data_provider |
A data container node pointing to the registered handler. More... | |
Defines | |
#define | data_read_lock() ast_rwlock_rdlock(&root_data.lock) |
#define | data_unlock() ast_rwlock_unlock(&root_data.lock) |
#define | data_write_lock() ast_rwlock_wrlock(&root_data.lock) |
#define | NUM_DATA_FILTER_BUCKETS 59 |
#define | NUM_DATA_NODE_BUCKETS 59 |
#define | NUM_DATA_RESULT_BUCKETS 59 |
#define | NUM_DATA_SEARCH_BUCKETS 59 |
Enumerations | |
enum | data_search_comparison { DATA_CMP_UNKNOWN, DATA_CMP_EQ, DATA_CMP_NEQ, DATA_CMP_GT, DATA_CMP_GE, DATA_CMP_LT, DATA_CMP_LE } |
Type of comparisons allow in the search string. More... | |
Functions | |
static struct ast_data * | __ast_data_add (struct ast_data *root, const char *name, enum ast_data_type type, void *ptr) |
int | __ast_data_add_structure (struct ast_data *root, const struct ast_data_mapping_structure *mapping, size_t mapping_len, void *structure) |
Add a complete structure to a node. | |
int | __ast_data_register (const char *path, const struct ast_data_handler *handler, const char *registrar, struct ast_module *mod) |
Register a data provider. | |
int | __ast_data_register_multiple (const struct ast_data_entry *data_entries, size_t entries, const char *registrar, struct ast_module *mod) |
Register multiple data providers at once. | |
int | __ast_data_search_cmp_structure (const struct ast_data_search *search, const struct ast_data_mapping_structure *mapping, size_t mapping_len, void *structure, const char *structure_name) |
Based on a search tree, evaluate every member of a structure against it. | |
int | __ast_data_unregister (const char *path, const char *registrar) |
Unregister a data provider. | |
static void | __data_result_print_cli (int fd, const struct ast_data *root, uint32_t depth) |
ast_data * | ast_data_add_bool (struct ast_data *root, const char *childname, unsigned int boolean) |
Add a boolean node type. | |
ast_data * | ast_data_add_char (struct ast_data *root, const char *name, char value) |
Add a char node type. | |
int | ast_data_add_codecs (struct ast_data *root, const char *node_name, format_t capability) |
Add the list of codecs in the root node based on the capability parameter. | |
ast_data * | ast_data_add_dbl (struct ast_data *root, const char *childname, double dbl) |
Add a floating point node type. | |
ast_data * | ast_data_add_int (struct ast_data *root, const char *name, int value) |
Add an integer node type. | |
ast_data * | ast_data_add_ipaddr (struct ast_data *root, const char *childname, struct in_addr addr) |
Add a ipv4 address type. | |
ast_data * | ast_data_add_milliseconds (struct ast_data *root, const char *childname, unsigned int milliseconds) |
Add a milliseconds node type. | |
ast_data * | ast_data_add_node (struct ast_data *root, const char *name) |
Add a container child. | |
ast_data * | ast_data_add_password (struct ast_data *root, const char *childname, const char *value) |
Add a password node type. | |
ast_data * | ast_data_add_ptr (struct ast_data *root, const char *childname, void *ptr) |
Add a ptr node type. | |
ast_data * | ast_data_add_seconds (struct ast_data *root, const char *childname, unsigned int seconds) |
Add a seconds node type. | |
ast_data * | ast_data_add_str (struct ast_data *root, const char *childname, const char *value) |
Add a string node type. | |
ast_data * | ast_data_add_timestamp (struct ast_data *root, const char *childname, unsigned int timestamp) |
Add a timestamp node type. | |
ast_data * | ast_data_add_uint (struct ast_data *root, const char *name, unsigned int value) |
Add an unsigned integer node type. | |
void | ast_data_free (struct ast_data *root) |
Release the allocated memory of a tree. | |
ast_data * | ast_data_get (const struct ast_data_query *query) |
Retrieve a subtree from the asterisk data API. | |
ast_xml_doc * | ast_data_get_xml (const struct ast_data_query *query) |
Retrieve a subtree from the asterisk data API in XML format.. | |
int | ast_data_init (void) |
void | ast_data_iterator_end (struct ast_data_iterator *iterator) |
Release (stop using) an iterator. | |
ast_data_iterator * | ast_data_iterator_init (struct ast_data *tree, const char *elements) |
Initialize an iterator. | |
ast_data * | ast_data_iterator_next (struct ast_data_iterator *iterator) |
Get the next node of the tree. | |
void | ast_data_remove_node (struct ast_data *root, struct ast_data *child) |
Remove a node that was added using ast_data_add_. | |
int | ast_data_retrieve (struct ast_data *tree, const char *path, struct ast_data_retrieve *content) |
Retrieve a value from a node in the tree. | |
char * | ast_data_retrieve_name (struct ast_data *node) |
Get the node name. | |
enum ast_data_type | ast_data_retrieve_type (struct ast_data *node, const char *path) |
Get a node type. | |
int | ast_data_search_match (const struct ast_data_search *search, struct ast_data *data) |
Check the current generated node to know if it matches the search condition. | |
static struct data_filter * | data_filter_add_child (struct ao2_container *root, char *name) |
static int | data_filter_add_nodes (struct ao2_container *root, char *path) |
static struct data_filter * | data_filter_alloc (const char *name) |
static int | data_filter_cmp (void *obj, void *arg, int flags) |
static void | data_filter_destructor (void *obj) |
static struct data_filter * | data_filter_find (struct ao2_container *parent, const char *name) |
static struct data_filter * | data_filter_generate (const char *constfilter) |
static int | data_filter_hash (const void *obj, const int flags) |
static void | data_filter_release (struct data_filter *filter) |
static void | data_get_xml_add_child (struct ast_data *parent_data, struct ast_xml_node *parent_xml) |
static struct data_provider * | data_provider_add_child (struct ao2_container *parent, const char *name, const struct ast_data_handler *handler, const char *registrar) |
static int | data_provider_cmp (void *obj1, void *obj2, int flags) |
static struct data_provider * | data_provider_create (struct ao2_container *parent, const char *path, const char *registrar) |
static void | data_provider_destructor (void *obj) |
static struct data_provider * | data_provider_find (struct ao2_container *parent, const char *name, const char *registrar) |
static int | data_provider_hash (const void *obj, const int flags) |
static struct data_provider * | data_provider_new (const char *name, const struct ast_data_handler *handler, const char *registrar) |
static void | data_provider_print_cli (int fd, const char *name, struct ao2_container *container, struct ast_str *path) |
static int | data_provider_release (struct ao2_container *parent, const char *path, const char *registrar) |
static void | data_provider_release_all (struct ao2_container *parent, const char *registrar) |
static void | data_result_add_child (struct ast_data *root, struct ast_data *child) |
static int | data_result_cmp (void *obj, void *arg, int flags) |
static struct ast_data * | data_result_create (const char *name) |
static void | data_result_destructor (void *obj) |
static struct ast_data * | data_result_find_child (struct ast_data *root, const char *name) |
static struct ast_data * | data_result_generate (const struct ast_data_query *query, const char *search_path) |
static struct ast_data * | data_result_generate_node (const struct ast_data_query *query, const struct data_provider *root_provider, const char *parent_node_name, const struct ast_data_search *search, const struct data_filter *filter) |
static int | data_result_get_color (enum ast_data_type type) |
static struct ast_data * | data_result_get_node (struct ast_data *node, const char *path) |
static int | data_result_hash (const void *obj, const int flags) |
static void | data_result_manager_output (struct mansession *s, const char *name, struct ao2_container *container, struct ast_str *path, int id) |
static void | data_result_print_cli (int fd, const struct ast_data *root) |
static void | data_result_print_cli_node (int fd, const struct ast_data *node, uint32_t depth) |
static struct ast_data_search * | data_search_add_child (struct ao2_container *parent, const char *name) |
static struct ast_data_search * | data_search_alloc (const char *name) |
static int | data_search_cmp (void *obj, void *arg, int flags) |
static int | data_search_cmp_bool (const struct ast_data_search *root, const char *name, unsigned int value) |
static int | data_search_cmp_char (const struct ast_data_search *root, const char *name, char value) |
static int | data_search_cmp_dbl (const struct ast_data_search *root, const char *name, double value) |
static int | data_search_cmp_int (const struct ast_data_search *root, const char *name, int value) |
static int | data_search_cmp_ipaddr (const struct ast_data_search *root, const char *name, struct in_addr addr) |
static int | data_search_cmp_ptr (const struct ast_data_search *root, const char *name, void *ptr) |
static int | data_search_cmp_string (const struct ast_data_search *root, const char *name, char *value) |
static int | data_search_cmp_uint (const struct ast_data_search *root, const char *name, unsigned int value) |
static int | data_search_comparison_char (char a) |
static int | data_search_comparison_result (int cmpval, enum data_search_comparison comparison_type) |
static enum data_search_comparison | data_search_comparison_type (const char *comparison) |
static struct ast_data_search * | data_search_create (struct ao2_container *parent, const char *path) |
static void | data_search_destructor (void *obj) |
static struct ast_data_search * | data_search_find (struct ao2_container *parent, const char *name) |
static struct ast_data_search * | data_search_generate (const char *search_string) |
static struct ast_data_search * | data_search_get_node (const struct ast_data_search *node, const char *path) |
static int | data_search_hash (const void *obj, const int flags) |
static int | data_search_mapping_find (const struct ast_data_mapping_structure *map, size_t mapping_len, const char *member_name) |
static void | data_search_release (struct ast_data_search *search) |
static int | data_structure_compatible (int structure_version, uint32_t latest_compatible, uint32_t current) |
static char * | handle_cli_data_get (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static char * | handle_cli_data_show_providers (struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) |
static int | manager_data_get (struct mansession *s, const struct message *m) |
static char * | next_node_name (char **path) |
Variables | |
static struct ast_cli_entry | cli_data [] |
static const uint32_t | current_handler_version = AST_DATA_HANDLER_VERSION |
Current handler structure version. | |
static const uint32_t | current_query_version = AST_DATA_QUERY_VERSION |
Current query structure version. | |
struct { | |
int color | |
enum ast_data_type type | |
} | data_result_color [] |
static const uint32_t | latest_handler_compatible_version = 0 |
The last compatible version. | |
static const uint32_t | latest_query_compatible_version = 0 |
The last compatible version. | |
struct { | |
ao2_container * container | |
The asterisk data main content structure. | |
ast_rwlock_t lock | |
asterisk data locking mechanism. | |
} | root_data |
Eliel C. Sardanons (LU1ALY) <eliels@gmail.com>
Definition in file data.c.
#define data_read_lock | ( | ) | ast_rwlock_rdlock(&root_data.lock) |
Definition at line 234 of file data.c.
Referenced by ast_data_get(), and handle_cli_data_show_providers().
#define data_unlock | ( | ) | ast_rwlock_unlock(&root_data.lock) |
Definition at line 240 of file data.c.
Referenced by __ast_data_register(), __ast_data_unregister(), ast_data_get(), and handle_cli_data_show_providers().
#define data_write_lock | ( | ) | ast_rwlock_wrlock(&root_data.lock) |
Definition at line 227 of file data.c.
Referenced by __ast_data_register(), and __ast_data_unregister().
#define NUM_DATA_FILTER_BUCKETS 59 |
#define NUM_DATA_NODE_BUCKETS 59 |
#define NUM_DATA_RESULT_BUCKETS 59 |
#define NUM_DATA_SEARCH_BUCKETS 59 |
Type of comparisons allow in the search string.
DATA_CMP_UNKNOWN | |
DATA_CMP_EQ | |
DATA_CMP_NEQ | |
DATA_CMP_GT | |
DATA_CMP_GE | |
DATA_CMP_LT | |
DATA_CMP_LE |
Definition at line 107 of file data.c.
00107 { 00108 DATA_CMP_UNKNOWN, 00109 DATA_CMP_EQ, /* = */ 00110 DATA_CMP_NEQ, /* != */ 00111 DATA_CMP_GT, /* > */ 00112 DATA_CMP_GE, /* >= */ 00113 DATA_CMP_LT, /* < */ 00114 DATA_CMP_LE /* <= */ 00115 };
static struct ast_data* __ast_data_add | ( | struct ast_data * | root, | |
const char * | name, | |||
enum ast_data_type | type, | |||
void * | ptr | |||
) | [static] |
Definition at line 2234 of file data.c.
References ao2_ref, AST_DATA_BOOLEAN, AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, AST_DATA_INTEGER, AST_DATA_IPADDR, AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, AST_DATA_POINTER, AST_DATA_SECONDS, AST_DATA_STRING, AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_data::boolean, ast_data::character, data_filter::children, ast_data::children, data_filter_find(), data_result_add_child(), data_result_create(), ast_data::dbl, ast_data::filter, filter(), ast_data::ipaddr, ast_data::payload, ast_data::ptr, ast_data::sint, ast_data::str, ast_data::type, and ast_data::uint.
Referenced by ast_data_add_bool(), ast_data_add_char(), ast_data_add_dbl(), ast_data_add_int(), ast_data_add_ipaddr(), ast_data_add_milliseconds(), ast_data_add_node(), ast_data_add_password(), ast_data_add_ptr(), ast_data_add_seconds(), ast_data_add_str(), ast_data_add_timestamp(), and ast_data_add_uint().
02236 { 02237 struct ast_data *node; 02238 struct data_filter *filter, *filter_child = NULL; 02239 02240 if (!root || !root->children) { 02241 /* invalid data result node. */ 02242 return NULL; 02243 } 02244 02245 /* check if we need to add this node, based on the filter. */ 02246 if (root->filter) { 02247 filter = data_filter_find(root->filter->children, name); 02248 if (!filter) { 02249 return NULL; 02250 } 02251 ao2_ref(filter, -1); 02252 } 02253 02254 node = data_result_create(name); 02255 if (!node) { 02256 return NULL; 02257 } 02258 02259 node->type = type; 02260 02261 switch (type) { 02262 case AST_DATA_BOOLEAN: 02263 node->payload.boolean = *(unsigned int *) ptr; 02264 break; 02265 case AST_DATA_INTEGER: 02266 node->payload.sint = *(int *) ptr; 02267 break; 02268 case AST_DATA_TIMESTAMP: 02269 case AST_DATA_SECONDS: 02270 case AST_DATA_MILLISECONDS: 02271 case AST_DATA_UNSIGNED_INTEGER: 02272 node->payload.uint = *(unsigned int *) ptr; 02273 break; 02274 case AST_DATA_DOUBLE: 02275 node->payload.dbl = *(double *) ptr; 02276 break; 02277 case AST_DATA_PASSWORD: 02278 case AST_DATA_STRING: 02279 node->payload.str = (char *) ptr; 02280 break; 02281 case AST_DATA_CHARACTER: 02282 node->payload.character = *(char *) ptr; 02283 break; 02284 case AST_DATA_POINTER: 02285 node->payload.ptr = ptr; 02286 break; 02287 case AST_DATA_IPADDR: 02288 node->payload.ipaddr = *(struct in_addr *) ptr; 02289 break; 02290 case AST_DATA_CONTAINER: 02291 if (root->filter) { 02292 filter_child = data_filter_find(root->filter->children, name); 02293 if (filter_child) { 02294 /* do not increment the refcount because it is not neccesary. */ 02295 ao2_ref(filter_child, -1); 02296 } 02297 } 02298 node->filter = filter_child; 02299 break; 02300 default: 02301 break; 02302 } 02303 02304 data_result_add_child(root, node); 02305 02306 ao2_ref(node, -1); 02307 02308 return node; 02309 }
int __ast_data_add_structure | ( | struct ast_data * | root, | |
const struct ast_data_mapping_structure * | mapping, | |||
size_t | mapping_len, | |||
void * | structure | |||
) |
Add a complete structure to a node.
[in] | root | Where to add the structure. |
[in] | mapping | The structure mapping array. |
[in] | mapping_len | The lenght of the mapping array. |
[in] | structure | The structure pointer. |
0 | on success. | |
1 | on error. |
Definition at line 2416 of file data.c.
References ast_data_add_bool(), ast_data_add_char(), ast_data_add_dbl(), ast_data_add_int(), ast_data_add_ipaddr(), ast_data_add_milliseconds(), ast_data_add_password(), ast_data_add_ptr(), ast_data_add_seconds(), ast_data_add_str(), ast_data_add_timestamp(), ast_data_add_uint(), ast_data_mapping_structure::AST_DATA_BOOLEAN, AST_DATA_BOOLEAN, ast_data_mapping_structure::AST_DATA_CHARACTER, AST_DATA_CHARACTER, AST_DATA_CONTAINER, ast_data_mapping_structure::AST_DATA_DOUBLE, AST_DATA_DOUBLE, ast_data_mapping_structure::AST_DATA_INTEGER, AST_DATA_INTEGER, ast_data_mapping_structure::AST_DATA_IPADDR, AST_DATA_IPADDR, ast_data_mapping_structure::AST_DATA_MILLISECONDS, AST_DATA_MILLISECONDS, ast_data_mapping_structure::AST_DATA_PASSWORD, AST_DATA_PASSWORD, ast_data_mapping_structure::AST_DATA_POINTER, AST_DATA_POINTER, ast_data_mapping_structure::AST_DATA_SECONDS, AST_DATA_SECONDS, ast_data_mapping_structure::AST_DATA_STRING, AST_DATA_STRING, ast_data_mapping_structure::AST_DATA_TIMESTAMP, AST_DATA_TIMESTAMP, ast_data_mapping_structure::AST_DATA_UNSIGNED_INTEGER, AST_DATA_UNSIGNED_INTEGER, name, and type.
02419 { 02420 int i; 02421 02422 for (i = 0; i < mapping_len; i++) { 02423 switch (mapping[i].type) { 02424 case AST_DATA_INTEGER: 02425 ast_data_add_int(root, mapping[i].name, 02426 mapping[i].get.AST_DATA_INTEGER(structure)); 02427 break; 02428 case AST_DATA_UNSIGNED_INTEGER: 02429 ast_data_add_uint(root, mapping[i].name, 02430 mapping[i].get.AST_DATA_UNSIGNED_INTEGER(structure)); 02431 break; 02432 case AST_DATA_DOUBLE: 02433 ast_data_add_dbl(root, mapping[i].name, 02434 mapping[i].get.AST_DATA_DOUBLE(structure)); 02435 break; 02436 case AST_DATA_BOOLEAN: 02437 ast_data_add_bool(root, mapping[i].name, 02438 mapping[i].get.AST_DATA_BOOLEAN(structure)); 02439 break; 02440 case AST_DATA_PASSWORD: 02441 ast_data_add_password(root, mapping[i].name, 02442 mapping[i].get.AST_DATA_PASSWORD(structure)); 02443 break; 02444 case AST_DATA_TIMESTAMP: 02445 ast_data_add_timestamp(root, mapping[i].name, 02446 mapping[i].get.AST_DATA_TIMESTAMP(structure)); 02447 break; 02448 case AST_DATA_SECONDS: 02449 ast_data_add_seconds(root, mapping[i].name, 02450 mapping[i].get.AST_DATA_SECONDS(structure)); 02451 break; 02452 case AST_DATA_MILLISECONDS: 02453 ast_data_add_milliseconds(root, mapping[i].name, 02454 mapping[i].get.AST_DATA_MILLISECONDS(structure)); 02455 break; 02456 case AST_DATA_STRING: 02457 ast_data_add_str(root, mapping[i].name, 02458 mapping[i].get.AST_DATA_STRING(structure)); 02459 break; 02460 case AST_DATA_CHARACTER: 02461 ast_data_add_char(root, mapping[i].name, 02462 mapping[i].get.AST_DATA_CHARACTER(structure)); 02463 break; 02464 case AST_DATA_CONTAINER: 02465 break; 02466 case AST_DATA_IPADDR: 02467 ast_data_add_ipaddr(root, mapping[i].name, 02468 mapping[i].get.AST_DATA_IPADDR(structure)); 02469 break; 02470 case AST_DATA_POINTER: 02471 ast_data_add_ptr(root, mapping[i].name, 02472 mapping[i].get.AST_DATA_POINTER(structure)); 02473 break; 02474 } 02475 } 02476 02477 return 0; 02478 }
int __ast_data_register | ( | const char * | path, | |
const struct ast_data_handler * | handler, | |||
const char * | registrar, | |||
struct ast_module * | mod | |||
) |
Register a data provider.
[in] | path | The path of the node to register. |
[in] | handler | The structure defining this node handler. |
[in] | registrar | Who is registering this node. |
[in] | mod | The module registering this handler. |
<0 | on error. | |
0 | on success. |
Definition at line 514 of file data.c.
References ao2_container_count(), ao2_ref, ast_log(), data_provider::children, data_provider_create(), data_structure_compatible(), data_unlock, data_write_lock, data_provider::handler, LOG_ERROR, data_provider::module, data_provider::name, root_data, and ast_data_handler::version.
Referenced by __ast_data_register_multiple().
00516 { 00517 struct data_provider *node; 00518 00519 if (!path) { 00520 return -1; 00521 } 00522 00523 /* check if the handler structure is compatible. */ 00524 if (!data_structure_compatible(handler->version, 00525 latest_handler_compatible_version, 00526 current_handler_version)) { 00527 return -1; 00528 } 00529 00530 /* create the node structure for the registered handler. */ 00531 data_write_lock(); 00532 00533 node = data_provider_create(root_data.container, path, registrar); 00534 if (!node) { 00535 ast_log(LOG_ERROR, "Unable to create the specified path (%s) " 00536 "for '%s'.\n", path, registrar); 00537 data_unlock(); 00538 return -1; 00539 } 00540 00541 if (ao2_container_count(node->children) || node->handler) { 00542 ast_log(LOG_ERROR, "The node '%s' was already registered. " 00543 "We were unable to register '%s' for registrar '%s'.\n", 00544 node->name, path, registrar); 00545 ao2_ref(node, -1); 00546 data_unlock(); 00547 return -1; 00548 } 00549 00550 /* add handler to that node. */ 00551 node->handler = handler; 00552 node->module = mod; 00553 00554 ao2_ref(node, -1); 00555 00556 data_unlock(); 00557 00558 return 0; 00559 }
int __ast_data_register_multiple | ( | const struct ast_data_entry * | data_entries, | |
size_t | entries, | |||
const char * | registrar, | |||
struct ast_module * | mod | |||
) |
Register multiple data providers at once.
[in] | data_entries | An array of data_entries structures. |
[in] | entries | The number of entries in the data_entries array. |
[in] | registrar | Who is registering this nodes. |
[in] | mod | The module registering this handlers. |
<0 | on error (none of the nodes are being registered on error). | |
0 | on success. |
Definition at line 561 of file data.c.
References __ast_data_register(), __ast_data_unregister(), and data_provider::handler.
00563 { 00564 int i, res; 00565 00566 for (i = 0; i < entries; i++) { 00567 res = __ast_data_register(data_entries[i].path, data_entries[i].handler, 00568 registrar, mod); 00569 if (res) { 00570 /* unregister all the already registered nodes, and make 00571 * this an atomic action. */ 00572 while ((--i) >= 0) { 00573 __ast_data_unregister(data_entries[i].path, registrar); 00574 } 00575 return -1; 00576 } 00577 } 00578 00579 return 0; 00580 }
int __ast_data_search_cmp_structure | ( | const struct ast_data_search * | search, | |
const struct ast_data_mapping_structure * | mapping, | |||
size_t | mapping_len, | |||
void * | structure, | |||
const char * | structure_name | |||
) |
Based on a search tree, evaluate every member of a structure against it.
[in] | search | The search tree. |
[in] | mapping | The structure mapping. |
[in] | mapping_len | The lenght of the structure mapping. |
[in] | structure | The structure pointer. |
[in] | structure_name | The name of the structure to compare. |
0 | If the structure matches. | |
1 | If the structure doesn't match. |
Definition at line 1267 of file data.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_data_mapping_structure::AST_DATA_BOOLEAN, AST_DATA_BOOLEAN, ast_data_mapping_structure::AST_DATA_CHARACTER, AST_DATA_CHARACTER, AST_DATA_CONTAINER, ast_data_mapping_structure::AST_DATA_DOUBLE, AST_DATA_DOUBLE, ast_data_mapping_structure::AST_DATA_INTEGER, AST_DATA_INTEGER, ast_data_mapping_structure::AST_DATA_IPADDR, AST_DATA_IPADDR, ast_data_mapping_structure::AST_DATA_MILLISECONDS, AST_DATA_MILLISECONDS, ast_data_mapping_structure::AST_DATA_PASSWORD, AST_DATA_PASSWORD, ast_data_mapping_structure::AST_DATA_POINTER, AST_DATA_POINTER, ast_data_mapping_structure::AST_DATA_SECONDS, AST_DATA_SECONDS, ast_data_mapping_structure::AST_DATA_STRING, AST_DATA_STRING, ast_data_mapping_structure::AST_DATA_TIMESTAMP, AST_DATA_TIMESTAMP, ast_data_mapping_structure::AST_DATA_UNSIGNED_INTEGER, AST_DATA_UNSIGNED_INTEGER, ast_data_search::children, data_search_cmp_bool(), data_search_cmp_char(), data_search_cmp_dbl(), data_search_cmp_int(), data_search_cmp_ipaddr(), data_search_cmp_ptr(), data_search_cmp_string(), data_search_cmp_uint(), data_search_get_node(), data_search_mapping_find(), ast_data_mapping_structure::get, ast_data_search::name, and type.
01270 { 01271 struct ao2_iterator i; 01272 struct ast_data_search *node, *struct_children; 01273 int member, notmatch = 0; 01274 01275 if (!search) { 01276 return 0; 01277 } 01278 01279 struct_children = data_search_get_node(search, structure_name); 01280 if (!struct_children) { 01281 return 0; 01282 } 01283 01284 i = ao2_iterator_init(struct_children->children, 0); 01285 while ((node = ao2_iterator_next(&i))) { 01286 member = data_search_mapping_find(mapping, mapping_len, node->name); 01287 if (member < 0) { 01288 /* the structure member name doesn't match! */ 01289 ao2_ref(node, -1); 01290 ao2_ref(struct_children, -1); 01291 ao2_iterator_destroy(&i); 01292 return 0; 01293 } 01294 01295 notmatch = 0; 01296 switch (mapping[member].type) { 01297 case AST_DATA_PASSWORD: 01298 notmatch = data_search_cmp_string(struct_children, 01299 node->name, 01300 mapping[member].get.AST_DATA_PASSWORD(structure)); 01301 break; 01302 case AST_DATA_TIMESTAMP: 01303 notmatch = data_search_cmp_uint(struct_children, 01304 node->name, 01305 mapping[member].get.AST_DATA_TIMESTAMP(structure)); 01306 break; 01307 case AST_DATA_SECONDS: 01308 notmatch = data_search_cmp_uint(struct_children, 01309 node->name, 01310 mapping[member].get.AST_DATA_SECONDS(structure)); 01311 break; 01312 case AST_DATA_MILLISECONDS: 01313 notmatch = data_search_cmp_uint(struct_children, 01314 node->name, 01315 mapping[member].get.AST_DATA_MILLISECONDS(structure)); 01316 break; 01317 case AST_DATA_STRING: 01318 notmatch = data_search_cmp_string(struct_children, 01319 node->name, 01320 mapping[member].get.AST_DATA_STRING(structure)); 01321 break; 01322 case AST_DATA_CHARACTER: 01323 notmatch = data_search_cmp_char(struct_children, 01324 node->name, 01325 mapping[member].get.AST_DATA_CHARACTER(structure)); 01326 break; 01327 case AST_DATA_INTEGER: 01328 notmatch = data_search_cmp_int(struct_children, 01329 node->name, 01330 mapping[member].get.AST_DATA_INTEGER(structure)); 01331 break; 01332 case AST_DATA_BOOLEAN: 01333 notmatch = data_search_cmp_bool(struct_children, 01334 node->name, 01335 mapping[member].get.AST_DATA_BOOLEAN(structure)); 01336 break; 01337 case AST_DATA_UNSIGNED_INTEGER: 01338 notmatch = data_search_cmp_uint(struct_children, 01339 node->name, 01340 mapping[member].get.AST_DATA_UNSIGNED_INTEGER(structure)); 01341 break; 01342 case AST_DATA_DOUBLE: 01343 notmatch = data_search_cmp_dbl(struct_children, 01344 node->name, 01345 mapping[member].get.AST_DATA_DOUBLE(structure)); 01346 break; 01347 case AST_DATA_IPADDR: 01348 notmatch = data_search_cmp_ipaddr(struct_children, 01349 node->name, 01350 mapping[member].get.AST_DATA_IPADDR(structure)); 01351 break; 01352 case AST_DATA_POINTER: 01353 notmatch = data_search_cmp_ptr(struct_children, 01354 node->name, 01355 mapping[member].get.AST_DATA_POINTER(structure)); 01356 break; 01357 case AST_DATA_CONTAINER: 01358 break; 01359 } 01360 01361 ao2_ref(node, -1); 01362 } 01363 ao2_iterator_destroy(&i); 01364 01365 ao2_ref(struct_children, -1); 01366 01367 return notmatch; 01368 }
int __ast_data_unregister | ( | const char * | path, | |
const char * | registrar | |||
) |
Unregister a data provider.
[in] | path | Which node to unregister, if path is NULL unregister every node registered by the passed 'registrar'. |
[in] | registrar | Who is trying to unregister this node, only the owner (the one who registered the node) will be able to unregister it. |
<0 | on error. | |
0 | on success. |
Definition at line 582 of file data.c.
References ast_log(), data_provider_release(), data_provider_release_all(), data_unlock, data_write_lock, LOG_ERROR, and root_data.
Referenced by __ast_data_register_multiple().
00583 { 00584 int ret = 0; 00585 00586 data_write_lock(); 00587 if (path) { 00588 ret = data_provider_release(root_data.container, path, registrar); 00589 } else { 00590 data_provider_release_all(root_data.container, registrar); 00591 } 00592 data_unlock(); 00593 00594 if (path && ret) { 00595 ast_log(LOG_ERROR, "Unable to unregister '%s' for '%s'\n", 00596 path, registrar); 00597 } 00598 00599 return ret; 00600 }
static void __data_result_print_cli | ( | int | fd, | |
const struct ast_data * | root, | |||
uint32_t | depth | |||
) | [static] |
Definition at line 2810 of file data.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_DATA_CONTAINER, ast_data::children, data_result_print_cli_node(), and ast_data::type.
Referenced by data_result_print_cli(), and data_result_print_cli_node().
02811 { 02812 struct ao2_iterator iter; 02813 struct ast_data *node; 02814 02815 if (root->type == AST_DATA_CONTAINER) { 02816 iter = ao2_iterator_init(root->children, 0); 02817 while ((node = ao2_iterator_next(&iter))) { 02818 data_result_print_cli_node(fd, node, depth + 1); 02819 ao2_ref(node, -1); 02820 } 02821 ao2_iterator_destroy(&iter); 02822 } else { 02823 data_result_print_cli_node(fd, root, depth); 02824 } 02825 }
struct ast_data* ast_data_add_bool | ( | struct ast_data * | root, | |
const char * | childname, | |||
unsigned int | boolean | |||
) |
Add a boolean node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | boolean | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2338 of file data.c.
References __ast_data_add(), and AST_DATA_BOOLEAN.
Referenced by __ast_data_add_structure(), agents_data_provider_get(), ast_channel_data_add_structure(), channel_data_add_flags(), dahdi_status_data_provider_get(), data_channeltypes_provider_handler(), data_odbc_provider_handler(), peers_data_provider_get(), and users_data_provider_get().
02340 { 02341 return __ast_data_add(root, childname, AST_DATA_BOOLEAN, &boolean); 02342 }
Add a char node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | value | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2321 of file data.c.
References __ast_data_add(), and AST_DATA_CHARACTER.
Referenced by __ast_data_add_structure().
02322 { 02323 return __ast_data_add(root, name, AST_DATA_CHARACTER, &value); 02324 }
Add the list of codecs in the root node based on the capability parameter.
[in] | root | The astdata root node where to add the codecs node. |
[in] | node_name | The name of the node where we are going to add the list of codecs. |
[in] | capability | The codecs allowed. |
0 on success.
Definition at line 3103 of file data.c.
References ast_data_add_int(), ast_data_add_node(), ast_data_add_str(), ast_get_format_list(), ast_format_list::bits, desc, ast_format_list::fr_len, name, and ast_format_list::samplespersecond.
Referenced by ast_channel_data_add_structure(), data_channeltypes_provider_handler(), peers_data_provider_get(), and users_data_provider_get().
03104 { 03105 struct ast_data *codecs, *codec; 03106 size_t fmlist_size; 03107 const struct ast_format_list *fmlist; 03108 int x; 03109 03110 codecs = ast_data_add_node(root, node_name); 03111 if (!codecs) { 03112 return -1; 03113 } 03114 fmlist = ast_get_format_list(&fmlist_size); 03115 for (x = 0; x < fmlist_size; x++) { 03116 if (fmlist[x].bits & capability) { 03117 codec = ast_data_add_node(codecs, "codec"); 03118 if (!codec) { 03119 return -1; 03120 } 03121 ast_data_add_str(codec, "name", fmlist[x].name); 03122 ast_data_add_int(codec, "samplespersecond", fmlist[x].samplespersecond); 03123 ast_data_add_str(codec, "description", fmlist[x].desc); 03124 ast_data_add_int(codec, "frame_length", fmlist[x].fr_len); 03125 } 03126 } 03127 03128 return 0; 03129 }
Add a floating point node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | dbl | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2332 of file data.c.
References __ast_data_add(), and AST_DATA_DOUBLE.
Referenced by __ast_data_add_structure().
02334 { 02335 return __ast_data_add(root, childname, AST_DATA_DOUBLE, &dbl); 02336 }
Add an integer node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | value | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2316 of file data.c.
References __ast_data_add(), and AST_DATA_INTEGER.
Referenced by __ast_data_add_structure(), ast_cdr_data_add_structure(), ast_channel_data_add_structure(), ast_data_add_codecs(), dahdi_status_data_provider_get(), data_odbc_provider_handler(), hints_data_provider_get(), peers_data_provider_get(), queues_data_provider_get_helper(), user_add_provider_cb(), users_data_provider_get(), and vm_users_data_provider_get_helper().
02317 { 02318 return __ast_data_add(root, name, AST_DATA_INTEGER, &value); 02319 }
struct ast_data* ast_data_add_ipaddr | ( | struct ast_data * | root, | |
const char * | childname, | |||
struct in_addr | addr | |||
) |
Add a ipv4 address type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | addr | The ipv4 address value. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2344 of file data.c.
References __ast_data_add(), and AST_DATA_IPADDR.
Referenced by __ast_data_add_structure().
02346 { 02347 return __ast_data_add(root, childname, AST_DATA_IPADDR, &addr); 02348 }
struct ast_data* ast_data_add_milliseconds | ( | struct ast_data * | root, | |
const char * | childname, | |||
unsigned int | milliseconds | |||
) |
Add a milliseconds node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | milliseconds | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2368 of file data.c.
References __ast_data_add(), and AST_DATA_MILLISECONDS.
Referenced by __ast_data_add_structure().
02370 { 02371 return __ast_data_add(root, childname, AST_DATA_MILLISECONDS, &milliseconds); 02372 }
Add a container child.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2311 of file data.c.
References __ast_data_add(), and AST_DATA_CONTAINER.
Referenced by agents_data_provider_get(), ast_cdr_data_add_structure(), ast_channel_data_add_structure(), ast_data_add_codecs(), ast_tone_zone_data_add_structure(), dahdi_channels_data_provider_get(), dahdi_status_data_provider_get(), data_channels_provider_handler(), data_channeltypes_provider_handler(), data_odbc_provider_handler(), hints_data_provider_get(), meetme_data_provider_get(), peers_data_provider_get(), queues_data_provider_get_helper(), user_add_provider_cb(), users_data_provider_get(), and vm_users_data_provider_get_helper().
02312 { 02313 return __ast_data_add(root, name, AST_DATA_CONTAINER, NULL); 02314 }
struct ast_data* ast_data_add_password | ( | struct ast_data * | root, | |
const char * | childname, | |||
const char * | string | |||
) |
Add a password node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | string | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2374 of file data.c.
References __ast_data_add(), AST_DATA_PASSWORD, ast_free, ast_malloc, ast_strlen_zero(), and name.
Referenced by __ast_data_add_structure(), and users_data_provider_get().
02376 { 02377 char *name; 02378 size_t namelen = 1 + (ast_strlen_zero(value) ? 0 : strlen(value)); 02379 struct ast_data *res; 02380 02381 if (!(name = ast_malloc(namelen))) { 02382 return NULL; 02383 } 02384 02385 strcpy(name, (ast_strlen_zero(value) ? "" : value)); 02386 02387 res = __ast_data_add(root, childname, AST_DATA_PASSWORD, name); 02388 if (!res) { 02389 ast_free(name); 02390 } 02391 02392 return res; 02393 }
Add a ptr node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | ptr | The pointer value to add. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2350 of file data.c.
References __ast_data_add(), and AST_DATA_POINTER.
Referenced by __ast_data_add_structure().
02352 { 02353 return __ast_data_add(root, childname, AST_DATA_POINTER, ptr); 02354 }
struct ast_data* ast_data_add_seconds | ( | struct ast_data * | root, | |
const char * | childname, | |||
unsigned int | seconds | |||
) |
Add a seconds node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | seconds | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2362 of file data.c.
References __ast_data_add(), and AST_DATA_SECONDS.
Referenced by __ast_data_add_structure().
02364 { 02365 return __ast_data_add(root, childname, AST_DATA_SECONDS, &seconds); 02366 }
struct ast_data* ast_data_add_str | ( | struct ast_data * | root, | |
const char * | childname, | |||
const char * | string | |||
) |
Add a string node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | string | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2395 of file data.c.
References __ast_data_add(), AST_DATA_STRING, ast_free, ast_malloc, ast_strlen_zero(), and name.
Referenced by __ast_data_add_structure(), agents_data_provider_get(), ast_cdr_data_add_structure(), ast_channel_data_add_structure(), ast_data_add_codecs(), dahdi_status_data_provider_get(), dahdi_version_data_provider_get(), data_channeltypes_provider_handler(), data_odbc_provider_handler(), hints_data_provider_get(), peers_data_provider_get(), queues_data_provider_get_helper(), and users_data_provider_get().
02397 { 02398 char *name; 02399 size_t namelen = 1 + (ast_strlen_zero(value) ? 0 : strlen(value)); 02400 struct ast_data *res; 02401 02402 if (!(name = ast_malloc(namelen))) { 02403 return NULL; 02404 } 02405 02406 strcpy(name, (ast_strlen_zero(value) ? "" : value)); 02407 02408 res = __ast_data_add(root, childname, AST_DATA_STRING, name); 02409 if (!res) { 02410 ast_free(name); 02411 } 02412 02413 return res; 02414 }
struct ast_data* ast_data_add_timestamp | ( | struct ast_data * | root, | |
const char * | childname, | |||
unsigned int | timestamp | |||
) |
Add a timestamp node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | timestamp | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2356 of file data.c.
References __ast_data_add(), and AST_DATA_TIMESTAMP.
Referenced by __ast_data_add_structure().
02358 { 02359 return __ast_data_add(root, childname, AST_DATA_TIMESTAMP, ×tamp); 02360 }
struct ast_data* ast_data_add_uint | ( | struct ast_data * | root, | |
const char * | childname, | |||
unsigned int | value | |||
) |
Add an unsigned integer node type.
[in] | root | The root of the ast_data to insert into. |
[in] | childname | The name of the child element to be added. |
[in] | value | The value for the new node. |
NULL | on error (memory exhaustion only). | |
non-NULL | a newly allocated node. |
Definition at line 2326 of file data.c.
References __ast_data_add(), and AST_DATA_UNSIGNED_INTEGER.
Referenced by __ast_data_add_structure(), and ast_channel_data_add_structure().
02328 { 02329 return __ast_data_add(root, name, AST_DATA_UNSIGNED_INTEGER, &value); 02330 }
void ast_data_free | ( | struct ast_data * | root | ) |
Release the allocated memory of a tree.
[in] | root | The sub-tree pointer returned by a call to ast_data_get. |
Definition at line 2485 of file data.c.
References ao2_ref.
Referenced by ast_data_get_xml(), handle_cli_data_get(), and manager_data_get().
02486 { 02487 /* destroy it, this will destroy all the internal nodes. */ 02488 ao2_ref(root, -1); 02489 }
struct ast_data* ast_data_get | ( | const struct ast_data_query * | query | ) |
Retrieve a subtree from the asterisk data API.
[in] | query | The query structure specifying what nodes to retrieve. |
NULL | on error. | |
non-NULL | The dynamically allocated requested sub-tree (it needs to be released using ast_data_free. |
Definition at line 2060 of file data.c.
References ast_log(), data_read_lock, data_result_generate(), data_structure_compatible(), data_unlock, LOG_ERROR, ast_data_query::path, and ast_data_query::version.
Referenced by ast_data_get_xml(), handle_cli_data_get(), and manager_data_get().
02061 { 02062 struct ast_data *res; 02063 02064 /* check compatibility */ 02065 if (!data_structure_compatible(query->version, latest_query_compatible_version, 02066 current_query_version)) { 02067 return NULL; 02068 } 02069 02070 data_read_lock(); 02071 res = data_result_generate(query, query->path); 02072 data_unlock(); 02073 02074 if (!res) { 02075 ast_log(LOG_ERROR, "Unable to get data from %s\n", query->path); 02076 return NULL; 02077 } 02078 02079 return res; 02080 }
struct ast_xml_doc* ast_data_get_xml | ( | const struct ast_data_query * | query | ) |
Retrieve a subtree from the asterisk data API in XML format..
[in] | query | The query structure specifying what nodes to retrieve. |
NULL | on error. | |
non-NULL | The dynamically allocated requested sub-tree (it needs to be released using ast_data_free. |
Definition at line 2176 of file data.c.
References ast_data_free(), ast_data_get(), ast_xml_close(), ast_xml_new(), ast_xml_new_node(), ast_xml_set_root(), data_get_xml_add_child(), and ast_data::name.
02177 { 02178 struct ast_xml_doc *doc; 02179 struct ast_xml_node *root; 02180 struct ast_data *res; 02181 02182 res = ast_data_get(query); 02183 if (!res) { 02184 return NULL; 02185 } 02186 02187 doc = ast_xml_new(); 02188 if (!doc) { 02189 return NULL; 02190 } 02191 02192 root = ast_xml_new_node(res->name); 02193 if (!root) { 02194 ast_xml_close(doc); 02195 } 02196 02197 ast_xml_set_root(doc, root); 02198 02199 data_get_xml_add_child(res, root); 02200 02201 ast_data_free(res); 02202 02203 return doc; 02204 }
int ast_data_init | ( | void | ) |
Provided by data.c
Definition at line 3277 of file data.c.
References ao2_container_alloc, ARRAY_LEN, ast_cli_register_multiple(), ast_manager_register_xml, ast_rwlock_init, AST_TEST_REGISTER, cli_data, data_provider_cmp(), data_provider_hash(), manager_data_get(), NUM_DATA_NODE_BUCKETS, and root_data.
Referenced by main().
03278 { 03279 int res = 0; 03280 03281 ast_rwlock_init(&root_data.lock); 03282 03283 if (!(root_data.container = ao2_container_alloc(NUM_DATA_NODE_BUCKETS, 03284 data_provider_hash, data_provider_cmp))) { 03285 return -1; 03286 } 03287 03288 res |= ast_cli_register_multiple(cli_data, ARRAY_LEN(cli_data)); 03289 03290 res |= ast_manager_register_xml("DataGet", 0, manager_data_get); 03291 03292 #ifdef TEST_FRAMEWORK 03293 AST_TEST_REGISTER(test_data_get); 03294 #endif 03295 03296 return res; 03297 }
void ast_data_iterator_end | ( | struct ast_data_iterator * | iterator | ) |
Release (stop using) an iterator.
[in] | iterator | The iterator created by ast_data_iterator_start. |
Definition at line 2534 of file data.c.
References ao2_iterator_destroy(), ao2_ref, ast_free, ast_data_iterator::internal_iterator, ast_data_iterator::is_pattern, ast_data_iterator::last, and ast_data_iterator::regex_pattern.
02535 { 02536 /* decrement the reference counter. */ 02537 if (iterator->last) { 02538 ao2_ref(iterator->last, -1); 02539 } 02540 02541 /* release the generated pattern. */ 02542 if (iterator->is_pattern) { 02543 regfree(&(iterator->regex_pattern)); 02544 } 02545 02546 ao2_iterator_destroy(&(iterator->internal_iterator)); 02547 02548 ast_free(iterator); 02549 iterator = NULL; 02550 }
struct ast_data_iterator* ast_data_iterator_init | ( | struct ast_data * | tree, | |
const char * | elements | |||
) |
Initialize an iterator.
[in] | tree | The returned tree by a call to ast_data_get. |
[in] | elements | Which elements to iterate through. |
NULL | on error. | |
non-NULL | A dinamically allocated iterator structure. |
Definition at line 2491 of file data.c.
References ao2_iterator_init(), ast_calloc, ast_strdupa, ast_data::children, data_result_get_node(), and ast_data::ptr.
02493 { 02494 struct ast_data_iterator *iterator; 02495 struct ao2_iterator i; 02496 struct ast_data *internal = tree; 02497 char *path, *ptr = NULL; 02498 02499 /* tree is the node we want to use to iterate? or we are going 02500 * to iterate thow an internal node? */ 02501 if (elements) { 02502 path = ast_strdupa(elements); 02503 02504 ptr = strrchr(path, '/'); 02505 if (ptr) { 02506 *ptr = '\0'; 02507 internal = data_result_get_node(tree, path); 02508 if (!internal) { 02509 return NULL; 02510 } 02511 } 02512 } 02513 02514 iterator = ast_calloc(1, sizeof(*iterator)); 02515 if (!iterator) { 02516 return NULL; 02517 } 02518 02519 i = ao2_iterator_init(internal->children, 0); 02520 02521 iterator->pattern = (ptr ? strrchr(elements, '/') + 1 : elements); 02522 02523 /* is the last node a regular expression?, compile it! */ 02524 if (!regcomp(&(iterator->regex_pattern), iterator->pattern, 02525 REG_EXTENDED | REG_NOSUB | REG_ICASE)) { 02526 iterator->is_pattern = 1; 02527 } 02528 02529 iterator->internal_iterator = i; 02530 02531 return iterator; 02532 }
struct ast_data* ast_data_iterator_next | ( | struct ast_data_iterator * | iterator | ) |
Get the next node of the tree.
[in] | iterator | The iterator structure returned by ast_data_iterator_start. |
NULL | when no more nodes to return. | |
non-NULL | A node of the ast_data tree. |
Definition at line 2552 of file data.c.
References ao2_iterator_next, ao2_ref, ast_data_iterator::internal_iterator, ast_data_iterator::is_pattern, ast_data_iterator::last, ast_data::name, ast_data_iterator::pattern, and ast_data_iterator::regex_pattern.
02553 { 02554 struct ast_data *res; 02555 02556 if (iterator->last) { 02557 /* release the last retrieved node reference. */ 02558 ao2_ref(iterator->last, -1); 02559 } 02560 02561 while ((res = ao2_iterator_next(&iterator->internal_iterator))) { 02562 /* if there is no node name pattern specified, return 02563 * the next node. */ 02564 if (!iterator->pattern) { 02565 break; 02566 } 02567 02568 /* if the pattern is a regular expression, check if this node 02569 * matches. */ 02570 if (iterator->is_pattern && !regexec(&(iterator->regex_pattern), 02571 res->name, 0, NULL, 0)) { 02572 break; 02573 } 02574 02575 /* if there is a pattern specified, check if this node matches 02576 * the wanted node names. */ 02577 if (!iterator->is_pattern && (iterator->pattern && 02578 !strcasecmp(res->name, iterator->pattern))) { 02579 break; 02580 } 02581 02582 ao2_ref(res, -1); 02583 } 02584 02585 iterator->last = res; 02586 02587 return res; 02588 }
Remove a node that was added using ast_data_add_.
[in] | root | The root node of the node to be removed. |
[in] | child | The node pointer to remove. |
Definition at line 2480 of file data.c.
References ao2_unlink, and ast_data::children.
Referenced by agents_data_provider_get(), dahdi_channels_data_provider_get(), dahdi_status_data_provider_get(), data_channels_provider_handler(), data_channeltypes_provider_handler(), data_odbc_provider_handler(), hints_data_provider_get(), meetme_data_provider_get(), peers_data_provider_get(), queues_data_provider_get_helper(), users_data_provider_get(), and vm_users_data_provider_get_helper().
02481 { 02482 ao2_unlink(root->children, child); 02483 }
int ast_data_retrieve | ( | struct ast_data * | tree, | |
const char * | path, | |||
struct ast_data_retrieve * | content | |||
) |
Retrieve a value from a node in the tree.
[in] | tree | The structure returned by a call to ast_data_get. |
[in] | path | The path to the node. |
[out] | content | The node content. |
0 | on success. | |
<0 | on error. |
Definition at line 2590 of file data.c.
References ast_data_retrieve::AST_DATA_BOOLEAN, AST_DATA_BOOLEAN, ast_data_retrieve::AST_DATA_CHARACTER, AST_DATA_CHARACTER, AST_DATA_CONTAINER, ast_data_retrieve::AST_DATA_DOUBLE, AST_DATA_DOUBLE, ast_data_retrieve::AST_DATA_INTEGER, AST_DATA_INTEGER, ast_data_retrieve::AST_DATA_IPADDR, AST_DATA_IPADDR, ast_data_retrieve::AST_DATA_MILLISECONDS, AST_DATA_MILLISECONDS, ast_data_retrieve::AST_DATA_PASSWORD, AST_DATA_PASSWORD, ast_data_retrieve::AST_DATA_POINTER, AST_DATA_POINTER, ast_data_retrieve::AST_DATA_SECONDS, AST_DATA_SECONDS, ast_data_retrieve::AST_DATA_STRING, AST_DATA_STRING, ast_data_retrieve::AST_DATA_TIMESTAMP, AST_DATA_TIMESTAMP, ast_data_retrieve::AST_DATA_UNSIGNED_INTEGER, AST_DATA_UNSIGNED_INTEGER, ast_log(), ast_data::boolean, ast_data::character, data_result_get_node(), ast_data::dbl, ast_data::ipaddr, LOG_ERROR, ast_data::payload, ast_data::ptr, ast_data::sint, ast_data::str, ast_data::type, ast_data_retrieve::type, ast_data::uint, and ast_data_retrieve::value.
Referenced by ast_data_retrieve_bool(), ast_data_retrieve_char(), ast_data_retrieve_dbl(), ast_data_retrieve_int(), ast_data_retrieve_ipaddr(), ast_data_retrieve_password(), ast_data_retrieve_ptr(), ast_data_retrieve_string(), and ast_data_retrieve_uint().
02592 { 02593 struct ast_data *node; 02594 02595 if (!content) { 02596 return -1; 02597 } 02598 02599 node = data_result_get_node(tree, path); 02600 if (!node) { 02601 ast_log(LOG_ERROR, "Invalid internal node %s\n", path); 02602 return -1; 02603 } 02604 02605 content->type = node->type; 02606 switch (node->type) { 02607 case AST_DATA_STRING: 02608 content->value.AST_DATA_STRING = node->payload.str; 02609 break; 02610 case AST_DATA_PASSWORD: 02611 content->value.AST_DATA_PASSWORD = node->payload.str; 02612 break; 02613 case AST_DATA_TIMESTAMP: 02614 content->value.AST_DATA_TIMESTAMP = node->payload.uint; 02615 break; 02616 case AST_DATA_SECONDS: 02617 content->value.AST_DATA_SECONDS = node->payload.uint; 02618 break; 02619 case AST_DATA_MILLISECONDS: 02620 content->value.AST_DATA_MILLISECONDS = node->payload.uint; 02621 break; 02622 case AST_DATA_CHARACTER: 02623 content->value.AST_DATA_CHARACTER = node->payload.character; 02624 break; 02625 case AST_DATA_INTEGER: 02626 content->value.AST_DATA_INTEGER = node->payload.sint; 02627 break; 02628 case AST_DATA_UNSIGNED_INTEGER: 02629 content->value.AST_DATA_UNSIGNED_INTEGER = node->payload.uint; 02630 break; 02631 case AST_DATA_BOOLEAN: 02632 content->value.AST_DATA_BOOLEAN = node->payload.boolean; 02633 break; 02634 case AST_DATA_IPADDR: 02635 content->value.AST_DATA_IPADDR = node->payload.ipaddr; 02636 break; 02637 case AST_DATA_DOUBLE: 02638 content->value.AST_DATA_DOUBLE = node->payload.dbl; 02639 break; 02640 case AST_DATA_CONTAINER: 02641 break; 02642 case AST_DATA_POINTER: 02643 content->value.AST_DATA_POINTER = node->payload.ptr; 02644 break; 02645 } 02646 02647 return 0; 02648 }
char* ast_data_retrieve_name | ( | struct ast_data * | node | ) |
Get the node name.
[in] | node | The node pointer. |
Definition at line 2219 of file data.c.
References ast_data::name.
02220 { 02221 return node->name; 02222 }
enum ast_data_type ast_data_retrieve_type | ( | struct ast_data * | res, | |
const char * | path | |||
) |
Get a node type.
[in] | res | A pointer to the ast_data result set. |
[in] | path | A path to the node to get the type. |
Definition at line 2207 of file data.c.
References data_result_get_node(), and ast_data::type.
02208 { 02209 struct ast_data *internal; 02210 02211 internal = data_result_get_node(node, path); 02212 if (!internal) { 02213 return -1; 02214 } 02215 02216 return internal->type; 02217 }
int ast_data_search_match | ( | const struct ast_data_search * | search, | |
struct ast_data * | data | |||
) |
Check the current generated node to know if it matches the search condition.
[in] | search | The search condition. |
[in] | data | The AstData node generated. |
0 If the "data" node does not matches the search condition.
Definition at line 1453 of file data.c.
References ao2_container_count(), ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_DATA_BOOLEAN, AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, AST_DATA_INTEGER, AST_DATA_IPADDR, AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, AST_DATA_POINTER, ast_data_search_match(), AST_DATA_SECONDS, AST_DATA_STRING, AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_data::boolean, ast_data::character, ast_data::children, ast_data_search::children, data_result_find_child(), data_search_cmp_bool(), data_search_cmp_char(), data_search_cmp_int(), data_search_cmp_ipaddr(), data_search_cmp_ptr(), data_search_cmp_string(), data_search_cmp_uint(), data_search_find(), ast_data::dbl, ast_data::ipaddr, ast_data_search::name, ast_data::name, ast_data::payload, ast_data::ptr, ast_data::sint, ast_data::str, ast_data::type, and ast_data::uint.
Referenced by agents_data_provider_get(), ast_data_search_match(), dahdi_channels_data_provider_get(), dahdi_status_data_provider_get(), data_channels_provider_handler(), data_channeltypes_provider_handler(), data_odbc_provider_handler(), hints_data_provider_get(), meetme_data_provider_get(), peers_data_provider_get(), queues_data_provider_get_helper(), users_data_provider_get(), and vm_users_data_provider_get_helper().
01454 { 01455 struct ao2_iterator i, ii; 01456 struct ast_data_search *s, *s_child; 01457 struct ast_data *d_child; 01458 int notmatch = 1; 01459 01460 if (!search) { 01461 return 1; 01462 } 01463 01464 s_child = data_search_find(search->children, data->name); 01465 if (!s_child) { 01466 /* nothing to compare */ 01467 ao2_ref(s_child, -1); 01468 return 1; 01469 } 01470 01471 i = ao2_iterator_init(s_child->children, 0); 01472 while ((s = ao2_iterator_next(&i))) { 01473 if (!ao2_container_count(s->children)) { 01474 /* compare this search node with every data node */ 01475 d_child = data_result_find_child(data, s->name); 01476 if (!d_child) { 01477 ao2_ref(s, -1); 01478 notmatch = 1; 01479 continue; 01480 } 01481 01482 switch (d_child->type) { 01483 case AST_DATA_PASSWORD: 01484 case AST_DATA_STRING: 01485 notmatch = data_search_cmp_string(s_child, d_child->name, 01486 d_child->payload.str); 01487 break; 01488 case AST_DATA_CHARACTER: 01489 notmatch = data_search_cmp_char(s_child, d_child->name, 01490 d_child->payload.character); 01491 break; 01492 case AST_DATA_INTEGER: 01493 notmatch = data_search_cmp_int(s_child, d_child->name, 01494 d_child->payload.sint); 01495 break; 01496 case AST_DATA_BOOLEAN: 01497 notmatch = data_search_cmp_bool(s_child, d_child->name, 01498 d_child->payload.boolean); 01499 break; 01500 case AST_DATA_UNSIGNED_INTEGER: 01501 notmatch = data_search_cmp_uint(s_child, d_child->name, 01502 d_child->payload.uint); 01503 break; 01504 case AST_DATA_TIMESTAMP: 01505 case AST_DATA_SECONDS: 01506 case AST_DATA_MILLISECONDS: 01507 case AST_DATA_DOUBLE: 01508 notmatch = data_search_cmp_uint(s_child, d_child->name, 01509 d_child->payload.dbl); 01510 break; 01511 case AST_DATA_IPADDR: 01512 notmatch = data_search_cmp_ipaddr(s_child, d_child->name, 01513 d_child->payload.ipaddr); 01514 break; 01515 case AST_DATA_POINTER: 01516 notmatch = data_search_cmp_ptr(s_child, d_child->name, 01517 d_child->payload.ptr); 01518 break; 01519 case AST_DATA_CONTAINER: 01520 break; 01521 } 01522 ao2_ref(d_child, -1); 01523 } else { 01524 ii = ao2_iterator_init(data->children, 0); 01525 while ((d_child = ao2_iterator_next(&ii))) { 01526 if (strcmp(d_child->name, s->name)) { 01527 ao2_ref(d_child, -1); 01528 continue; 01529 } 01530 if (!(notmatch = !ast_data_search_match(s_child, d_child))) { 01531 /* do not continue if we have a match. */ 01532 ao2_ref(d_child, -1); 01533 break; 01534 } 01535 ao2_ref(d_child, -1); 01536 } 01537 ao2_iterator_destroy(&ii); 01538 } 01539 ao2_ref(s, -1); 01540 if (notmatch) { 01541 /* do not continue if we don't have a match. */ 01542 break; 01543 } 01544 } 01545 ao2_iterator_destroy(&i); 01546 01547 ao2_ref(s_child, -1); 01548 01549 return !notmatch; 01550 }
static struct data_filter* data_filter_add_child | ( | struct ao2_container * | root, | |
char * | name | |||
) | [static] |
Definition at line 1775 of file data.c.
References ao2_link, data_filter_alloc(), and data_filter_find().
Referenced by data_filter_add_nodes().
01777 { 01778 struct data_filter *node; 01779 01780 node = data_filter_find(root, name); 01781 if (node) { 01782 return node; 01783 } 01784 01785 node = data_filter_alloc(name); 01786 if (!node) { 01787 return NULL; 01788 } 01789 01790 ao2_link(root, node); 01791 01792 return node; 01793 }
static int data_filter_add_nodes | ( | struct ao2_container * | root, | |
char * | path | |||
) | [static] |
Definition at line 1803 of file data.c.
References ao2_ref, ast_strdupa, data_filter::children, data_filter_add_child(), and next_node_name().
Referenced by data_filter_generate().
01804 { 01805 struct data_filter *node; 01806 char *savepath, *saveptr, *token, *node_name; 01807 int ret = 0; 01808 01809 if (!path) { 01810 return 0; 01811 } 01812 01813 savepath = ast_strdupa(path); 01814 01815 node_name = next_node_name(&savepath); 01816 01817 if (!node_name) { 01818 return 0; 01819 } 01820 01821 for (token = strtok_r(node_name, "|", &saveptr); 01822 token; token = strtok_r(NULL, "|", &saveptr)) { 01823 node = data_filter_add_child(root, token); 01824 if (!node) { 01825 continue; 01826 } 01827 data_filter_add_nodes(node->children, savepath); 01828 ret = 1; 01829 ao2_ref(node, -1); 01830 } 01831 01832 return ret; 01833 }
static struct data_filter* data_filter_alloc | ( | const char * | name | ) | [static] |
Definition at line 1642 of file data.c.
References ao2_alloc, ao2_container_alloc, ao2_ref, AST_LIST_INSERT_TAIL, ast_strdupa, data_filter_cmp(), data_filter_destructor(), data_filter_hash(), data_filter::list, NUM_DATA_FILTER_BUCKETS, and strsep().
Referenced by data_filter_add_child(), data_filter_find(), and data_filter_generate().
01643 { 01644 char *globname, *token; 01645 struct data_filter *res, *globfilter; 01646 size_t name_len = strlen(name) + 1; 01647 01648 res = ao2_alloc(sizeof(*res) + name_len, data_filter_destructor); 01649 if (!res) { 01650 return NULL; 01651 } 01652 01653 res->children = ao2_container_alloc(NUM_DATA_FILTER_BUCKETS, data_filter_hash, 01654 data_filter_cmp); 01655 01656 if (!res) { 01657 ao2_ref(res, -1); 01658 return NULL; 01659 } 01660 01661 strcpy(res->name, name); 01662 01663 if (strchr(res->name, '*')) { 01664 globname = ast_strdupa(res->name); 01665 01666 while ((token = strsep(&globname, "*"))) { 01667 globfilter = data_filter_alloc(token); 01668 AST_LIST_INSERT_TAIL(&(res->glob_list), globfilter, list); 01669 } 01670 } 01671 01672 return res; 01673 }
static int data_filter_cmp | ( | void * | obj, | |
void * | arg, | |||
int | flags | |||
) | [static] |
Definition at line 1614 of file data.c.
References CMP_MATCH, and data_filter::name.
Referenced by data_filter_alloc().
01615 { 01616 struct data_filter *node1 = obj, *node2 = arg; 01617 return strcasecmp(node1->name, node2->name) ? 0 : CMP_MATCH; 01618 }
static void data_filter_destructor | ( | void * | obj | ) | [static] |
Definition at line 1625 of file data.c.
References ao2_ref, AST_LIST_TRAVERSE, filter(), and data_filter::list.
Referenced by data_filter_alloc().
01626 { 01627 struct data_filter *filter = obj, *globres; 01628 01629 AST_LIST_TRAVERSE(&(filter->glob_list), globres, list) { 01630 ao2_ref(globres, -1); 01631 } 01632 01633 ao2_ref(filter->children, -1); 01634 }
static struct data_filter* data_filter_find | ( | struct ao2_container * | parent, | |
const char * | name | |||
) | [static] |
Definition at line 1694 of file data.c.
References ao2_find, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_LIST_EMPTY, AST_LIST_FIRST, AST_LIST_LAST, AST_LIST_TRAVERSE, ast_strlen_zero(), data_filter_alloc(), data_filter::glob_list, data_filter::list, data_filter::name, and OBJ_POINTER.
Referenced by __ast_data_add(), data_filter_add_child(), data_result_generate(), and data_result_generate_node().
01696 { 01697 int i, olend, orend, globfound; 01698 size_t name_len = strlen(name), glob_len; 01699 struct ao2_iterator iter; 01700 struct data_filter *find_node, *found, *globres; 01701 01702 find_node = data_filter_alloc(name); 01703 if (!find_node) { 01704 return NULL; 01705 } 01706 01707 found = ao2_find(parent, find_node, OBJ_POINTER); 01708 01709 /* free the created node used for searching. */ 01710 ao2_ref(find_node, -1); 01711 01712 if (found) { 01713 return found; 01714 } 01715 01716 iter = ao2_iterator_init(parent, 0); 01717 while ((found = ao2_iterator_next(&iter))) { 01718 if (!AST_LIST_EMPTY(&(found->glob_list))) { 01719 i = 0; 01720 globfound = 1; 01721 01722 olend = ast_strlen_zero(AST_LIST_FIRST(&(found->glob_list))->name); 01723 orend = ast_strlen_zero(AST_LIST_LAST(&(found->glob_list))->name); 01724 01725 AST_LIST_TRAVERSE(&(found->glob_list), globres, list) { 01726 if (!*globres->name) { 01727 continue; 01728 } 01729 01730 glob_len = strlen(globres->name); 01731 01732 if (!i && !olend) { 01733 if (strncasecmp(name, globres->name, glob_len)) { 01734 globfound = 0; 01735 break; 01736 } 01737 01738 i += glob_len; 01739 continue; 01740 } 01741 01742 for (globfound = 0; name_len - i >= glob_len; ++i) { 01743 if (!strncasecmp(name + i, globres->name, glob_len)) { 01744 globfound = 1; 01745 i += glob_len; 01746 break; 01747 } 01748 } 01749 01750 if (!globfound) { 01751 break; 01752 } 01753 } 01754 01755 if (globfound && (i == name_len || orend)) { 01756 ao2_iterator_destroy(&iter); 01757 return found; 01758 } 01759 } 01760 01761 ao2_ref(found, -1); 01762 } 01763 ao2_iterator_destroy(&iter); 01764 01765 return NULL; 01766 }
static struct data_filter* data_filter_generate | ( | const char * | constfilter | ) | [static] |
Definition at line 1840 of file data.c.
References ao2_ref, ast_strdupa, data_filter_add_nodes(), data_filter_alloc(), and filter().
Referenced by data_result_generate().
01841 { 01842 struct data_filter *filter = NULL; 01843 char *strfilter, *token, *saveptr; 01844 int node_added = 0; 01845 01846 if (!constfilter) { 01847 return NULL; 01848 } 01849 01850 strfilter = ast_strdupa(constfilter); 01851 01852 filter = data_filter_alloc("/"); 01853 if (!filter) { 01854 return NULL; 01855 } 01856 01857 for (token = strtok_r(strfilter, ",", &saveptr); token; 01858 token = strtok_r(NULL, ",", &saveptr)) { 01859 node_added = data_filter_add_nodes(filter->children, token); 01860 } 01861 01862 if (!node_added) { 01863 ao2_ref(filter, -1); 01864 return NULL; 01865 } 01866 01867 return filter; 01868 }
static int data_filter_hash | ( | const void * | obj, | |
const int | flags | |||
) | [static] |
Definition at line 1604 of file data.c.
References ast_str_hash(), and data_filter::name.
Referenced by data_filter_alloc().
01605 { 01606 const struct data_filter *node = obj; 01607 return ast_str_hash(node->name); 01608 }
static void data_filter_release | ( | struct data_filter * | filter | ) | [static] |
static void data_get_xml_add_child | ( | struct ast_data * | parent_data, | |
struct ast_xml_node * | parent_xml | |||
) | [static] |
Definition at line 2089 of file data.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_DATA_BOOLEAN, AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, AST_DATA_INTEGER, AST_DATA_IPADDR, AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, AST_DATA_POINTER, AST_DATA_SECONDS, AST_DATA_STRING, AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_inet_ntoa(), ast_xml_add_child(), ast_xml_new_node(), ast_xml_set_text(), ast_data::boolean, ast_data::character, ast_data::children, ast_data::dbl, ast_data::ipaddr, ast_data::name, ast_data::payload, ast_data::ptr, ast_data::sint, ast_data::str, ast_data::type, and ast_data::uint.
Referenced by ast_data_get_xml().
02091 { 02092 struct ao2_iterator i; 02093 struct ast_data *node; 02094 struct ast_xml_node *child_xml; 02095 char node_content[256]; 02096 02097 i = ao2_iterator_init(parent_data->children, 0); 02098 while ((node = ao2_iterator_next(&i))) { 02099 child_xml = ast_xml_new_node(node->name); 02100 if (!child_xml) { 02101 ao2_ref(node, -1); 02102 continue; 02103 } 02104 02105 switch (node->type) { 02106 case AST_DATA_CONTAINER: 02107 data_get_xml_add_child(node, child_xml); 02108 break; 02109 case AST_DATA_PASSWORD: 02110 ast_xml_set_text(child_xml, node->payload.str); 02111 break; 02112 case AST_DATA_TIMESTAMP: 02113 snprintf(node_content, sizeof(node_content), "%d", 02114 node->payload.uint); 02115 ast_xml_set_text(child_xml, node_content); 02116 break; 02117 case AST_DATA_SECONDS: 02118 snprintf(node_content, sizeof(node_content), "%d", 02119 node->payload.uint); 02120 ast_xml_set_text(child_xml, node_content); 02121 break; 02122 case AST_DATA_MILLISECONDS: 02123 snprintf(node_content, sizeof(node_content), "%d", 02124 node->payload.uint); 02125 ast_xml_set_text(child_xml, node_content); 02126 break; 02127 case AST_DATA_STRING: 02128 ast_xml_set_text(child_xml, node->payload.str); 02129 break; 02130 case AST_DATA_CHARACTER: 02131 snprintf(node_content, sizeof(node_content), "%c", 02132 node->payload.character); 02133 ast_xml_set_text(child_xml, node_content); 02134 break; 02135 case AST_DATA_INTEGER: 02136 snprintf(node_content, sizeof(node_content), "%d", 02137 node->payload.sint); 02138 ast_xml_set_text(child_xml, node_content); 02139 break; 02140 case AST_DATA_UNSIGNED_INTEGER: 02141 snprintf(node_content, sizeof(node_content), "%u", 02142 node->payload.uint); 02143 ast_xml_set_text(child_xml, node_content); 02144 break; 02145 case AST_DATA_DOUBLE: 02146 snprintf(node_content, sizeof(node_content), "%f", 02147 node->payload.dbl); 02148 ast_xml_set_text(child_xml, node_content); 02149 break; 02150 case AST_DATA_BOOLEAN: 02151 if (node->payload.boolean) { 02152 ast_xml_set_text(child_xml, "true"); 02153 } else { 02154 ast_xml_set_text(child_xml, "false"); 02155 } 02156 break; 02157 case AST_DATA_POINTER: 02158 snprintf(node_content, sizeof(node_content), "%p", 02159 node->payload.ptr); 02160 ast_xml_set_text(child_xml, node_content); 02161 break; 02162 case AST_DATA_IPADDR: 02163 snprintf(node_content, sizeof(node_content), "%s", 02164 ast_inet_ntoa(node->payload.ipaddr)); 02165 ast_xml_set_text(child_xml, node_content); 02166 break; 02167 } 02168 ast_xml_add_child(parent_xml, child_xml); 02169 02170 ao2_ref(node, -1); 02171 } 02172 ao2_iterator_destroy(&i); 02173 02174 }
static struct data_provider* data_provider_add_child | ( | struct ao2_container * | parent, | |
const char * | name, | |||
const struct ast_data_handler * | handler, | |||
const char * | registrar | |||
) | [static] |
Definition at line 340 of file data.c.
References ao2_link, data_provider_new(), and data_provider::handler.
Referenced by data_provider_create().
00342 { 00343 struct data_provider *child; 00344 00345 child = data_provider_new(name, handler, registrar); 00346 if (!child) { 00347 return NULL; 00348 } 00349 00350 ao2_link(parent, child); 00351 00352 return child; 00353 }
static int data_provider_cmp | ( | void * | obj1, | |
void * | obj2, | |||
int | flags | |||
) | [static] |
Definition at line 196 of file data.c.
References CMP_MATCH, and data_provider::name.
Referenced by ast_data_init(), and data_provider_new().
00197 { 00198 struct data_provider *node1 = obj1, *node2 = obj2; 00199 return strcasecmp(node1->name, node2->name) ? 0 : CMP_MATCH; 00200 }
static struct data_provider* data_provider_create | ( | struct ao2_container * | parent, | |
const char * | path, | |||
const char * | registrar | |||
) | [static] |
Definition at line 483 of file data.c.
References ao2_ref, ast_strdupa, data_provider::children, data_provider_add_child(), data_provider_find(), and next_node_name().
Referenced by __ast_data_register().
00485 { 00486 char *rpath, *node_name; 00487 struct data_provider *child, *ret = NULL; 00488 00489 rpath = ast_strdupa(path); 00490 00491 node_name = next_node_name(&rpath); 00492 if (!node_name) { 00493 /* no more nodes to create. */ 00494 return NULL; 00495 } 00496 00497 child = data_provider_find(parent, node_name, NULL); 00498 00499 if (!child) { 00500 /* nodes without handler are non-terminal nodes. */ 00501 child = data_provider_add_child(parent, node_name, NULL, registrar); 00502 } 00503 00504 if (rpath) { 00505 ret = data_provider_create(child->children, rpath, registrar); 00506 if (ret) { 00507 ao2_ref(child, -1); 00508 } 00509 } 00510 00511 return ret ? ret : child; 00512 }
static void data_provider_destructor | ( | void * | obj | ) | [static] |
Definition at line 287 of file data.c.
References ao2_ref, and data_provider::children.
Referenced by data_provider_new().
00288 { 00289 struct data_provider *provider = obj; 00290 00291 ao2_ref(provider->children, -1); 00292 }
static struct data_provider* data_provider_find | ( | struct ao2_container * | parent, | |
const char * | name, | |||
const char * | registrar | |||
) | [static] |
Definition at line 365 of file data.c.
References ao2_find, ao2_ref, ast_debug, data_provider_new(), OBJ_POINTER, and data_provider::registrar.
Referenced by data_provider_create(), data_provider_release(), and data_result_generate().
00367 { 00368 struct data_provider *find_node, *found; 00369 00370 /* XXX avoid allocating a new data node for searching... */ 00371 find_node = data_provider_new(name, NULL, NULL); 00372 if (!find_node) { 00373 return NULL; 00374 } 00375 00376 found = ao2_find(parent, find_node, OBJ_POINTER); 00377 00378 /* free the created node used for searching. */ 00379 ao2_ref(find_node, -1); 00380 00381 if (found && found->registrar && registrar) { 00382 if (strcmp(found->registrar, registrar)) { 00383 /* if the name doesn't match, do not return this node. */ 00384 ast_debug(1, "Registrar doesn't match, node was registered" 00385 " by '%s' and we are searching for '%s'\n", 00386 found->registrar, registrar); 00387 ao2_ref(found, -1); 00388 return NULL; 00389 } 00390 } 00391 00392 return found; 00393 }
static int data_provider_hash | ( | const void * | obj, | |
const int | flags | |||
) | [static] |
Definition at line 185 of file data.c.
References ast_str_case_hash(), and data_provider::name.
Referenced by ast_data_init(), and data_provider_new().
00186 { 00187 const struct data_provider *node = obj; 00188 return ast_str_case_hash(node->name); 00189 }
static struct data_provider* data_provider_new | ( | const char * | name, | |
const struct ast_data_handler * | handler, | |||
const char * | registrar | |||
) | [static] |
Definition at line 303 of file data.c.
References ao2_alloc, ao2_container_alloc, ao2_ref, data_provider_cmp(), data_provider_destructor(), data_provider_hash(), data_provider::handler, and NUM_DATA_NODE_BUCKETS.
Referenced by data_provider_add_child(), and data_provider_find().
00305 { 00306 struct data_provider *node; 00307 size_t namelen; 00308 00309 namelen = strlen(name) + 1; 00310 00311 node = ao2_alloc(sizeof(*node) + namelen, data_provider_destructor); 00312 if (!node) { 00313 return NULL; 00314 } 00315 00316 node->handler = handler; 00317 node->registrar = registrar; 00318 strcpy(node->name, name); 00319 00320 /* initialize the childrens container. */ 00321 if (!(node->children = ao2_container_alloc(NUM_DATA_NODE_BUCKETS, 00322 data_provider_hash, data_provider_cmp))) { 00323 ao2_ref(node, -1); 00324 return NULL; 00325 } 00326 00327 return node; 00328 }
static void data_provider_print_cli | ( | int | fd, | |
const char * | name, | |||
struct ao2_container * | container, | |||
struct ast_str * | path | |||
) | [static] |
Definition at line 2911 of file data.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_cli(), ast_free, ast_str_buffer(), ast_str_create(), ast_str_reset(), ast_str_set(), data_provider::children, container, ast_data_handler::get, data_provider::handler, data_provider::name, and data_provider::registrar.
Referenced by handle_cli_data_show_providers().
02913 { 02914 struct ao2_iterator i; 02915 struct ast_str *current_path; 02916 struct data_provider *provider; 02917 02918 current_path = ast_str_create(60); 02919 if (!current_path) { 02920 return; 02921 } 02922 02923 ast_str_reset(current_path); 02924 if (path) { 02925 ast_str_set(¤t_path, 0, "%s/%s", ast_str_buffer(path), name); 02926 } else { 02927 ast_str_set(¤t_path, 0, "%s", name); 02928 } 02929 02930 i = ao2_iterator_init(container, 0); 02931 while ((provider = ao2_iterator_next(&i))) { 02932 if (provider->handler) { 02933 /* terminal node, print it. */ 02934 ast_cli(fd, "%s/%s (", ast_str_buffer(current_path), 02935 provider->name); 02936 if (provider->handler->get) { 02937 ast_cli(fd, "get"); 02938 } 02939 ast_cli(fd, ") [%s]\n", provider->registrar); 02940 } 02941 data_provider_print_cli(fd, provider->name, provider->children, 02942 current_path); 02943 ao2_ref(provider, -1); 02944 } 02945 ao2_iterator_destroy(&i); 02946 02947 ast_free(current_path); 02948 }
static int data_provider_release | ( | struct ao2_container * | parent, | |
const char * | path, | |||
const char * | registrar | |||
) | [static] |
Definition at line 405 of file data.c.
References ao2_container_count(), ao2_ref, ao2_unlink, ast_strdupa, data_provider::children, data_provider_find(), data_provider::handler, and next_node_name().
Referenced by __ast_data_unregister().
00407 { 00408 char *node_name, *rpath; 00409 struct data_provider *child; 00410 int ret = 0; 00411 00412 rpath = ast_strdupa(path); 00413 00414 node_name = next_node_name(&rpath); 00415 if (!node_name) { 00416 return -1; 00417 } 00418 00419 child = data_provider_find(parent, node_name, registrar); 00420 if (!child) { 00421 return -1; 00422 } 00423 00424 /* if this is not a terminal node. */ 00425 if (!child->handler && rpath) { 00426 ret = data_provider_release(child->children, rpath, registrar); 00427 } 00428 00429 /* if this node is empty, unlink it. */ 00430 if (!ret && !ao2_container_count(child->children)) { 00431 ao2_unlink(parent, child); 00432 } 00433 00434 ao2_ref(child, -1); 00435 00436 return ret; 00437 }
static void data_provider_release_all | ( | struct ao2_container * | parent, | |
const char * | registrar | |||
) | [static] |
Definition at line 446 of file data.c.
References ao2_container_count(), ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ao2_unlink, data_provider::children, data_provider::handler, and data_provider::registrar.
Referenced by __ast_data_unregister().
00448 { 00449 struct ao2_iterator i; 00450 struct data_provider *node; 00451 00452 i = ao2_iterator_init(parent, 0); 00453 while ((node = ao2_iterator_next(&i))) { 00454 if (!node->handler) { 00455 /* this is a non-terminal node, go inside it. */ 00456 data_provider_release_all(node->children, registrar); 00457 if (!ao2_container_count(node->children)) { 00458 /* if this node was left empty, unlink it. */ 00459 ao2_unlink(parent, node); 00460 } 00461 } else { 00462 if (!strcmp(node->registrar, registrar)) { 00463 /* if the registrars match, release it! */ 00464 ao2_unlink(parent, node); 00465 } 00466 } 00467 ao2_ref(node, -1); 00468 } 00469 ao2_iterator_destroy(&i); 00470 00471 }
Definition at line 1595 of file data.c.
References ao2_link, and ast_data::children.
Referenced by __ast_data_add(), and data_result_generate_node().
static int data_result_cmp | ( | void * | obj, | |
void * | arg, | |||
int | flags | |||
) | [static] |
Definition at line 216 of file data.c.
References CMP_MATCH, and ast_data::name.
Referenced by data_result_create().
00217 { 00218 struct ast_data *node1 = obj, *node2 = arg; 00219 return strcasecmp(node1->name, node2->name) ? 0 : CMP_MATCH; 00220 }
static struct ast_data* data_result_create | ( | const char * | name | ) | [static] |
Definition at line 1400 of file data.c.
References ao2_alloc, ao2_container_alloc, ao2_ref, AST_DATA_CONTAINER, ast_strlen_zero(), data_result_cmp(), data_result_destructor(), data_result_hash(), and NUM_DATA_RESULT_BUCKETS.
Referenced by __ast_data_add(), data_result_find_child(), and data_result_generate_node().
01401 { 01402 struct ast_data *res; 01403 size_t namelen; 01404 01405 namelen = ast_strlen_zero(name) ? 1 : strlen(name) + 1; 01406 01407 res = ao2_alloc(sizeof(*res) + namelen, data_result_destructor); 01408 if (!res) { 01409 return NULL; 01410 } 01411 01412 strcpy(res->name, namelen ? name : ""); 01413 01414 /* initialize the children container */ 01415 res->children = ao2_container_alloc(NUM_DATA_RESULT_BUCKETS, data_result_hash, 01416 data_result_cmp); 01417 if (!res->children) { 01418 ao2_ref(res, -1); 01419 return NULL; 01420 } 01421 01422 /* set this node as a container. */ 01423 res->type = AST_DATA_CONTAINER; 01424 01425 return res; 01426 }
static void data_result_destructor | ( | void * | obj | ) | [static] |
Definition at line 1374 of file data.c.
References ao2_ref, AST_DATA_BOOLEAN, AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, AST_DATA_INTEGER, AST_DATA_IPADDR, AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, AST_DATA_POINTER, AST_DATA_SECONDS, AST_DATA_STRING, AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_free, ast_data::children, ast_data::payload, ast_data::str, and ast_data::type.
Referenced by data_result_create().
01375 { 01376 struct ast_data *root = obj; 01377 01378 switch (root->type) { 01379 case AST_DATA_PASSWORD: 01380 case AST_DATA_STRING: 01381 ast_free(root->payload.str); 01382 ao2_ref(root->children, -1); 01383 break; 01384 case AST_DATA_POINTER: 01385 case AST_DATA_CHARACTER: 01386 case AST_DATA_CONTAINER: 01387 case AST_DATA_INTEGER: 01388 case AST_DATA_TIMESTAMP: 01389 case AST_DATA_SECONDS: 01390 case AST_DATA_MILLISECONDS: 01391 case AST_DATA_UNSIGNED_INTEGER: 01392 case AST_DATA_DOUBLE: 01393 case AST_DATA_BOOLEAN: 01394 case AST_DATA_IPADDR: 01395 ao2_ref(root->children, -1); 01396 break; 01397 } 01398 }
static struct ast_data* data_result_find_child | ( | struct ast_data * | root, | |
const char * | name | |||
) | [static] |
Definition at line 1436 of file data.c.
References ao2_find, ao2_ref, ast_data::children, data_result_create(), and OBJ_POINTER.
Referenced by ast_data_search_match(), and data_result_get_node().
01437 { 01438 struct ast_data *found, *find_node; 01439 01440 find_node = data_result_create(name); 01441 if (!find_node) { 01442 return NULL; 01443 } 01444 01445 found = ao2_find(root->children, find_node, OBJ_POINTER); 01446 01447 /* release the temporary created node used for searching. */ 01448 ao2_ref(find_node, -1); 01449 01450 return found; 01451 }
static struct ast_data* data_result_generate | ( | const struct ast_data_query * | query, | |
const char * | search_path | |||
) | [static] |
Definition at line 1968 of file data.c.
References ao2_ref, ast_log(), ast_strdupa, ast_data_search::children, data_provider::children, data_filter_find(), data_filter_generate(), data_filter_release(), data_provider_find(), data_result_generate_node(), data_search_find(), data_search_generate(), data_search_release(), ast_data_query::filter, filter(), LOG_ERROR, data_provider::name, next_node_name(), root_data, and ast_data_query::search.
Referenced by ast_data_get().
01970 { 01971 char *node_name, *tmp_path; 01972 struct data_provider *provider_child, *tmp_provider_child; 01973 struct ast_data *result, *result_filtered; 01974 struct ast_data_search *search = NULL, *search_child = NULL; 01975 struct data_filter *filter = NULL, *filter_child = NULL; 01976 01977 if (!search_path) { 01978 /* generate all the trees?. */ 01979 return NULL; 01980 } 01981 01982 tmp_path = ast_strdupa(search_path); 01983 01984 /* start searching the root node name */ 01985 node_name = next_node_name(&tmp_path); 01986 if (!node_name) { 01987 return NULL; 01988 } 01989 provider_child = data_provider_find(root_data.container, node_name, NULL); 01990 01991 /* continue with the rest of the path. */ 01992 while (provider_child) { 01993 node_name = next_node_name(&tmp_path); 01994 if (!node_name) { 01995 break; 01996 } 01997 01998 tmp_provider_child = data_provider_find(provider_child->children, 01999 node_name, NULL); 02000 02001 /* release the reference from this child */ 02002 ao2_ref(provider_child, -1); 02003 02004 provider_child = tmp_provider_child; 02005 } 02006 02007 if (!provider_child) { 02008 ast_log(LOG_ERROR, "Invalid path '%s', '%s' not found.\n", 02009 tmp_path, node_name); 02010 return NULL; 02011 } 02012 02013 /* generate the search tree. */ 02014 if (query->search) { 02015 search = data_search_generate(query->search); 02016 if (search) { 02017 search_child = data_search_find(search->children, 02018 provider_child->name); 02019 } 02020 } 02021 02022 /* generate the filter tree. */ 02023 if (query->filter) { 02024 filter = data_filter_generate(query->filter); 02025 if (filter) { 02026 filter_child = data_filter_find(filter->children, 02027 provider_child->name); 02028 } 02029 } 02030 02031 result = data_result_generate_node(query, provider_child, provider_child->name, 02032 search_child, filter_child); 02033 02034 /* release the requested provider. */ 02035 ao2_ref(provider_child, -1); 02036 02037 /* release the generated search tree. */ 02038 if (search_child) { 02039 ao2_ref(search_child, -1); 02040 } 02041 02042 if (filter_child) { 02043 ao2_ref(filter_child, -1); 02044 } 02045 02046 if (search) { 02047 data_search_release(search); 02048 } 02049 02050 result_filtered = result; 02051 02052 /* release the generated filter tree. */ 02053 if (filter) { 02054 data_filter_release(filter); 02055 } 02056 02057 return result_filtered; 02058 }
static struct ast_data* data_result_generate_node | ( | const struct ast_data_query * | query, | |
const struct data_provider * | root_provider, | |||
const char * | parent_node_name, | |||
const struct ast_data_search * | search, | |||
const struct data_filter * | filter | |||
) | [static] |
Definition at line 1879 of file data.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_log(), ast_module_ref(), ast_module_unref(), ast_data_search::children, data_provider::children, data_filter_find(), data_result_add_child(), data_result_create(), data_search_find(), filter(), ast_data::filter, ast_data_handler::get, data_provider::handler, LOG_ERROR, data_provider::module, and data_provider::name.
Referenced by data_result_generate().
01884 { 01885 struct ast_data *generated, *node; 01886 struct ao2_iterator i; 01887 struct data_provider *provider; 01888 struct ast_data_search *search_child = NULL; 01889 struct data_filter *filter_child; 01890 01891 node = data_result_create(parent_node_name); 01892 if (!node) { 01893 ast_log(LOG_ERROR, "Unable to allocate '%s' node\n", parent_node_name); 01894 return NULL; 01895 } 01896 01897 if (root_provider->module) { 01898 ast_module_ref(root_provider->module); 01899 } 01900 01901 /* if this is a terminal node, just run the callback function. */ 01902 if (root_provider->handler && root_provider->handler->get) { 01903 node->filter = filter; 01904 root_provider->handler->get(search, node); 01905 if (root_provider->module) { 01906 ast_module_unref(root_provider->module); 01907 } 01908 return node; 01909 } 01910 01911 if (root_provider->module) { 01912 ast_module_unref(root_provider->module); 01913 } 01914 01915 /* if this is not a terminal node, generate every child node. */ 01916 i = ao2_iterator_init(root_provider->children, 0); 01917 while ((provider = ao2_iterator_next(&i))) { 01918 filter_child = NULL; 01919 generated = NULL; 01920 01921 /* get the internal search node. */ 01922 if (search) { 01923 search_child = data_search_find(search->children, provider->name); 01924 } 01925 /* get the internal filter node. */ 01926 if (filter) { 01927 filter_child = data_filter_find(filter->children, provider->name); 01928 } 01929 01930 if (!filter || filter_child) { 01931 /* only generate the internal node, if we have something to 01932 * generate based on the filtering string. */ 01933 generated = data_result_generate_node(query, provider, 01934 provider->name, 01935 search_child, filter_child); 01936 } 01937 01938 /* decrement the refcount of the internal search node. */ 01939 if (search_child) { 01940 ao2_ref(search_child, -1); 01941 } 01942 01943 /* decrement the refcount of the internal filter node. */ 01944 if (filter_child) { 01945 ao2_ref(filter_child, -1); 01946 } 01947 01948 if (generated) { 01949 data_result_add_child(node, generated); 01950 ao2_ref(generated, -1); 01951 } 01952 01953 ao2_ref(provider, -1); 01954 } 01955 ao2_iterator_destroy(&i); 01956 01957 return node; 01958 }
static int data_result_get_color | ( | enum ast_data_type | type | ) | [static] |
Definition at line 2679 of file data.c.
References ARRAY_LEN, COLOR_BLUE, and data_result_color.
Referenced by data_result_print_cli(), and data_result_print_cli_node().
02680 { 02681 int i; 02682 for (i = 0; i < ARRAY_LEN(data_result_color); i++) { 02683 if (data_result_color[i].type == type) { 02684 return data_result_color[i].color; 02685 } 02686 } 02687 02688 return COLOR_BLUE; 02689 }
Definition at line 1560 of file data.c.
References ao2_ref, ast_strdupa, data_result_find_child(), and next_node_name().
Referenced by ast_data_iterator_init(), ast_data_retrieve(), and ast_data_retrieve_type().
01562 { 01563 char *savepath, *node_name; 01564 struct ast_data *child, *current = node; 01565 01566 savepath = ast_strdupa(path); 01567 node_name = next_node_name(&savepath); 01568 01569 while (node_name) { 01570 child = data_result_find_child(current, node_name); 01571 if (current != node) { 01572 ao2_ref(current, -1); 01573 } 01574 if (!child) { 01575 return NULL; 01576 } 01577 current = child; 01578 node_name = next_node_name(&savepath); 01579 } 01580 01581 /* do not increment the refcount of the returned object. */ 01582 if (current != node) { 01583 ao2_ref(current, -1); 01584 } 01585 01586 return current; 01587 }
static int data_result_hash | ( | const void * | obj, | |
const int | flags | |||
) | [static] |
Definition at line 206 of file data.c.
References ast_str_hash(), and ast_data::name.
Referenced by data_result_create().
00207 { 00208 const struct ast_data *node = obj; 00209 return ast_str_hash(node->name); 00210 }
static void data_result_manager_output | ( | struct mansession * | s, | |
const char * | name, | |||
struct ao2_container * | container, | |||
struct ast_str * | path, | |||
int | id | |||
) | [static] |
Definition at line 2992 of file data.c.
References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_DATA_BOOLEAN, AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, AST_DATA_INTEGER, AST_DATA_IPADDR, AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, AST_DATA_POINTER, AST_DATA_SECONDS, AST_DATA_STRING, AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_free, ast_inet_ntoa(), ast_str_buffer(), ast_str_create(), ast_str_reset(), ast_str_set(), astman_append(), ast_data::boolean, ast_data::character, ast_data::children, container, ast_data::dbl, ast_data::ipaddr, ast_data::name, ast_data::payload, ast_data::sint, ast_data::str, ast_data::type, and ast_data::uint.
Referenced by manager_data_get().
02994 { 02995 struct ao2_iterator i; 02996 struct ast_str *current_path; 02997 struct ast_data *node; 02998 int current_id = id; 02999 03000 current_path = ast_str_create(60); 03001 if (!current_path) { 03002 return; 03003 } 03004 03005 ast_str_reset(current_path); 03006 if (path) { 03007 ast_str_set(¤t_path, 0, "%s.%s", ast_str_buffer(path), name); 03008 } else { 03009 ast_str_set(¤t_path, 0, "%s", name); 03010 } 03011 03012 i = ao2_iterator_init(container, 0); 03013 while ((node = ao2_iterator_next(&i))) { 03014 /* terminal node, print it. */ 03015 if (node->type != AST_DATA_CONTAINER) { 03016 astman_append(s, "%d-%s.%s", id, ast_str_buffer(current_path), 03017 node->name); 03018 } 03019 switch (node->type) { 03020 case AST_DATA_CONTAINER: 03021 data_result_manager_output(s, node->name, node->children, current_path, ++current_id); 03022 break; 03023 case AST_DATA_INTEGER: 03024 astman_append(s, ": %d\r\n", node->payload.sint); 03025 break; 03026 case AST_DATA_TIMESTAMP: 03027 case AST_DATA_SECONDS: 03028 case AST_DATA_MILLISECONDS: 03029 case AST_DATA_UNSIGNED_INTEGER: 03030 astman_append(s, ": %u\r\n", node->payload.uint); 03031 break; 03032 case AST_DATA_PASSWORD: 03033 astman_append(s, ": %s\r\n", node->payload.str); 03034 break; 03035 case AST_DATA_STRING: 03036 astman_append(s, ": %s\r\n", node->payload.str); 03037 break; 03038 case AST_DATA_CHARACTER: 03039 astman_append(s, ": %c\r\n", node->payload.character); 03040 break; 03041 case AST_DATA_IPADDR: 03042 astman_append(s, ": %s\r\n", ast_inet_ntoa(node->payload.ipaddr)); 03043 break; 03044 case AST_DATA_POINTER: 03045 break; 03046 case AST_DATA_DOUBLE: 03047 astman_append(s, ": %f\r\n", node->payload.dbl); 03048 break; 03049 case AST_DATA_BOOLEAN: 03050 astman_append(s, ": %s\r\n", 03051 (node->payload.boolean ? "True" : "False")); 03052 break; 03053 } 03054 03055 ao2_ref(node, -1); 03056 } 03057 ao2_iterator_destroy(&i); 03058 03059 ast_free(current_path); 03060 }
static void data_result_print_cli | ( | int | fd, | |
const struct ast_data * | root | |||
) | [static] |
Definition at line 2833 of file data.c.
References __data_result_print_cli(), ast_cli(), ast_free, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_term_color_code(), COLOR_WHITE, data_result_get_color(), ast_data::name, and ast_data::type.
Referenced by handle_cli_data_get().
02834 { 02835 struct ast_str *output; 02836 02837 /* print the initial node. */ 02838 output = ast_str_create(30); 02839 if (!output) { 02840 return; 02841 } 02842 02843 ast_term_color_code(&output, data_result_get_color(root->type), 0); 02844 ast_str_append(&output, 0, "%s\n", root->name); 02845 ast_term_color_code(&output, COLOR_WHITE, 0); 02846 ast_cli(fd, "%s", ast_str_buffer(output)); 02847 ast_free(output); 02848 02849 __data_result_print_cli(fd, root, 0); 02850 02851 ast_cli(fd, "\n"); 02852 }
static void data_result_print_cli_node | ( | int | fd, | |
const struct ast_data * | node, | |||
uint32_t | depth | |||
) | [static] |
Definition at line 2698 of file data.c.
References __data_result_print_cli(), ast_cli(), AST_DATA_BOOLEAN, AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, AST_DATA_INTEGER, AST_DATA_IPADDR, AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, AST_DATA_POINTER, AST_DATA_SECONDS, AST_DATA_STRING, AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_free, ast_inet_ntoa(), ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_reset(), ast_term_color_code(), ast_data::boolean, ast_data::character, COLOR_WHITE, data_result_get_color(), ast_data::dbl, ast_data::ipaddr, ast_data::name, ast_data::payload, ast_data::ptr, ast_data::sint, ast_data::str, ast_data::type, and ast_data::uint.
Referenced by __data_result_print_cli().
02699 { 02700 int i; 02701 struct ast_str *tabs, *output; 02702 02703 tabs = ast_str_create(depth * 10 + 1); 02704 if (!tabs) { 02705 return; 02706 } 02707 ast_str_reset(tabs); 02708 for (i = 0; i < depth; i++) { 02709 ast_str_append(&tabs, 0, " "); 02710 } 02711 02712 output = ast_str_create(20); 02713 if (!output) { 02714 ast_free(tabs); 02715 return; 02716 } 02717 02718 ast_str_reset(output); 02719 ast_term_color_code(&output, data_result_get_color(node->type), 0); 02720 02721 switch (node->type) { 02722 case AST_DATA_POINTER: 02723 ast_str_append(&output, 0, "%s%s: %p\n", ast_str_buffer(tabs), 02724 node->name, node->payload.ptr); 02725 break; 02726 case AST_DATA_PASSWORD: 02727 ast_str_append(&output, 0, "%s%s: \"%s\"\n", 02728 ast_str_buffer(tabs), 02729 node->name, 02730 node->payload.str); 02731 break; 02732 case AST_DATA_STRING: 02733 ast_str_append(&output, 0, "%s%s: \"%s\"\n", 02734 ast_str_buffer(tabs), 02735 node->name, 02736 node->payload.str); 02737 break; 02738 case AST_DATA_CHARACTER: 02739 ast_str_append(&output, 0, "%s%s: \'%c\'\n", 02740 ast_str_buffer(tabs), 02741 node->name, 02742 node->payload.character); 02743 break; 02744 case AST_DATA_CONTAINER: 02745 ast_str_append(&output, 0, "%s%s\n", ast_str_buffer(tabs), 02746 node->name); 02747 break; 02748 case AST_DATA_TIMESTAMP: 02749 ast_str_append(&output, 0, "%s%s: %d\n", ast_str_buffer(tabs), 02750 node->name, 02751 node->payload.uint); 02752 break; 02753 case AST_DATA_SECONDS: 02754 ast_str_append(&output, 0, "%s%s: %d\n", ast_str_buffer(tabs), 02755 node->name, 02756 node->payload.uint); 02757 break; 02758 case AST_DATA_MILLISECONDS: 02759 ast_str_append(&output, 0, "%s%s: %d\n", ast_str_buffer(tabs), 02760 node->name, 02761 node->payload.uint); 02762 break; 02763 case AST_DATA_INTEGER: 02764 ast_str_append(&output, 0, "%s%s: %d\n", ast_str_buffer(tabs), 02765 node->name, 02766 node->payload.sint); 02767 break; 02768 case AST_DATA_UNSIGNED_INTEGER: 02769 ast_str_append(&output, 0, "%s%s: %u\n", ast_str_buffer(tabs), 02770 node->name, 02771 node->payload.uint); 02772 break; 02773 case AST_DATA_DOUBLE: 02774 ast_str_append(&output, 0, "%s%s: %lf\n", ast_str_buffer(tabs), 02775 node->name, 02776 node->payload.dbl); 02777 break; 02778 case AST_DATA_BOOLEAN: 02779 ast_str_append(&output, 0, "%s%s: %s\n", ast_str_buffer(tabs), 02780 node->name, 02781 ((node->payload.boolean) ? "True" : "False")); 02782 break; 02783 case AST_DATA_IPADDR: 02784 ast_str_append(&output, 0, "%s%s: %s\n", ast_str_buffer(tabs), 02785 node->name, 02786 ast_inet_ntoa(node->payload.ipaddr)); 02787 break; 02788 } 02789 02790 ast_free(tabs); 02791 02792 ast_term_color_code(&output, COLOR_WHITE, 0); 02793 02794 ast_cli(fd, "%s", ast_str_buffer(output)); 02795 02796 ast_free(output); 02797 02798 if (node->type == AST_DATA_CONTAINER) { 02799 __data_result_print_cli(fd, node, depth + 1); 02800 } 02801 }
static struct ast_data_search* data_search_add_child | ( | struct ao2_container * | parent, | |
const char * | name | |||
) | [static] |
Definition at line 744 of file data.c.
References ao2_link, and data_search_alloc().
Referenced by data_search_create().
00746 { 00747 struct ast_data_search *child; 00748 00749 child = data_search_alloc(name); 00750 if (!child) { 00751 return NULL; 00752 } 00753 00754 ao2_link(parent, child); 00755 00756 return child; 00757 }
static struct ast_data_search* data_search_alloc | ( | const char * | name | ) | [static] |
Definition at line 686 of file data.c.
References ao2_alloc, ao2_container_alloc, ao2_ref, data_search_cmp(), data_search_destructor(), data_search_hash(), and NUM_DATA_SEARCH_BUCKETS.
Referenced by data_search_add_child(), data_search_find(), and data_search_generate().
00687 { 00688 struct ast_data_search *res; 00689 size_t name_len = strlen(name) + 1; 00690 00691 res = ao2_alloc(sizeof(*res) + name_len, data_search_destructor); 00692 if (!res) { 00693 return NULL; 00694 } 00695 00696 res->children = ao2_container_alloc(NUM_DATA_SEARCH_BUCKETS, data_search_hash, 00697 data_search_cmp); 00698 00699 if (!res) { 00700 ao2_ref(res, -1); 00701 return NULL; 00702 } 00703 00704 strcpy(res->name, name); 00705 00706 return res; 00707 }
static int data_search_cmp | ( | void * | obj, | |
void * | arg, | |||
int | flags | |||
) | [static] |
Definition at line 659 of file data.c.
References CMP_MATCH, and ast_data_search::name.
Referenced by data_search_alloc().
00660 { 00661 struct ast_data_search *node1 = obj, *node2 = arg; 00662 return strcasecmp(node1->name, node2->name) ? 0 : CMP_MATCH; 00663 }
static int data_search_cmp_bool | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
unsigned int | value | |||
) | [static] |
Definition at line 1097 of file data.c.
References ao2_ref, ast_true(), ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01099 { 01100 struct ast_data_search *child; 01101 unsigned int node_value; 01102 enum data_search_comparison cmp_type; 01103 01104 child = data_search_get_node(root, name); 01105 if (!child) { 01106 return 0; 01107 } 01108 01109 node_value = abs(ast_true(child->value)); 01110 cmp_type = child->cmp_type; 01111 01112 ao2_ref(child, -1); 01113 01114 return data_search_comparison_result(value - node_value, cmp_type); 01115 }
static int data_search_cmp_char | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
char | value | |||
) | [static] |
Definition at line 1225 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01227 { 01228 struct ast_data_search *child; 01229 char node_value; 01230 enum data_search_comparison cmp_type; 01231 01232 child = data_search_get_node(root, name); 01233 if (!child) { 01234 return 0; 01235 } 01236 01237 node_value = *(child->value); 01238 cmp_type = child->cmp_type; 01239 01240 ao2_ref(child, -1); 01241 01242 return data_search_comparison_result(value - node_value, cmp_type); 01243 }
static int data_search_cmp_dbl | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
double | value | |||
) | [static] |
Definition at line 1129 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure().
01131 { 01132 struct ast_data_search *child; 01133 double node_value; 01134 enum data_search_comparison cmp_type; 01135 01136 child = data_search_get_node(root, name); 01137 if (!child) { 01138 return 0; 01139 } 01140 01141 node_value = strtod(child->value, NULL); 01142 cmp_type = child->cmp_type; 01143 01144 ao2_ref(child, -1); 01145 01146 return data_search_comparison_result(value - node_value, cmp_type); 01147 }
static int data_search_cmp_int | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
int | value | |||
) | [static] |
Definition at line 1193 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01195 { 01196 struct ast_data_search *child; 01197 int node_value; 01198 enum data_search_comparison cmp_type; 01199 01200 child = data_search_get_node(root, name); 01201 if (!child) { 01202 return 0; 01203 } 01204 01205 node_value = atoi(child->value); 01206 cmp_type = child->cmp_type; 01207 01208 ao2_ref(child, -1); 01209 01210 return data_search_comparison_result(value - node_value, cmp_type); 01211 }
static int data_search_cmp_ipaddr | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
struct in_addr | addr | |||
) | [static] |
Definition at line 1065 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and inet_aton().
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01067 { 01068 struct ast_data_search *child; 01069 enum data_search_comparison cmp_type; 01070 struct in_addr node_addr; 01071 01072 child = data_search_get_node(root, name); 01073 if (!child) { 01074 return 0; 01075 } 01076 cmp_type = child->cmp_type; 01077 01078 inet_aton(child->value, &node_addr); 01079 01080 ao2_ref(child, -1); 01081 01082 return data_search_comparison_result((node_addr.s_addr - addr.s_addr), cmp_type); 01083 }
static int data_search_cmp_ptr | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
void * | ptr | |||
) | [static] |
Definition at line 1030 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01032 { 01033 struct ast_data_search *child; 01034 enum data_search_comparison cmp_type; 01035 void *node_ptr; 01036 01037 child = data_search_get_node(root, name); 01038 if (!child) { 01039 return 0; 01040 } 01041 01042 cmp_type = child->cmp_type; 01043 01044 if (sscanf(child->value, "%p", &node_ptr) <= 0) { 01045 return 1; 01046 } 01047 01048 ao2_ref(child, -1); 01049 01050 return data_search_comparison_result((node_ptr - ptr), cmp_type); 01051 }
static int data_search_cmp_string | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
char * | value | |||
) | [static] |
Definition at line 998 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01000 { 01001 struct ast_data_search *child; 01002 enum data_search_comparison cmp_type; 01003 int ret; 01004 01005 child = data_search_get_node(root, name); 01006 if (!child) { 01007 return 0; 01008 } 01009 01010 ret = strcmp(value, child->value); 01011 cmp_type = child->cmp_type; 01012 01013 ao2_ref(child, -1); 01014 01015 return data_search_comparison_result(ret, cmp_type); 01016 }
static int data_search_cmp_uint | ( | const struct ast_data_search * | root, | |
const char * | name, | |||
unsigned int | value | |||
) | [static] |
Definition at line 1161 of file data.c.
References ao2_ref, ast_data_search::cmp_type, data_search_comparison_result(), data_search_get_node(), and ast_data_search::value.
Referenced by __ast_data_search_cmp_structure(), and ast_data_search_match().
01163 { 01164 struct ast_data_search *child; 01165 unsigned int node_value; 01166 enum data_search_comparison cmp_type; 01167 01168 child = data_search_get_node(root, name); 01169 if (!child) { 01170 return 0; 01171 } 01172 01173 node_value = atoi(child->value); 01174 cmp_type = child->cmp_type; 01175 01176 ao2_ref(child, -1); 01177 01178 return data_search_comparison_result(value - node_value, cmp_type); 01179 }
static int data_search_comparison_char | ( | char | a | ) | [static] |
Definition at line 609 of file data.c.
Referenced by data_search_generate().
00610 { 00611 switch (a) { 00612 case '!': 00613 case '=': 00614 case '<': 00615 case '>': 00616 return 1; 00617 } 00618 00619 return 0; 00620 }
static int data_search_comparison_result | ( | int | cmpval, | |
enum data_search_comparison | comparison_type | |||
) | [inline, static] |
Definition at line 910 of file data.c.
References DATA_CMP_EQ, DATA_CMP_GE, DATA_CMP_GT, DATA_CMP_LT, DATA_CMP_NEQ, and DATA_CMP_UNKNOWN.
Referenced by data_search_cmp_bool(), data_search_cmp_char(), data_search_cmp_dbl(), data_search_cmp_int(), data_search_cmp_ipaddr(), data_search_cmp_ptr(), data_search_cmp_string(), and data_search_cmp_uint().
00912 { 00913 switch (comparison_type) { 00914 case DATA_CMP_GE: 00915 if (cmpval >= 0) { 00916 return 0; 00917 } 00918 break; 00919 case DATA_CMP_LE: 00920 if (cmpval <= 0) { 00921 return 0; 00922 } 00923 break; 00924 case DATA_CMP_EQ: 00925 if (cmpval == 0) { 00926 return 0; 00927 } 00928 break; 00929 case DATA_CMP_NEQ: 00930 if (cmpval != 0) { 00931 return 0; 00932 } 00933 break; 00934 case DATA_CMP_LT: 00935 if (cmpval < 0) { 00936 return 0; 00937 } 00938 break; 00939 case DATA_CMP_GT: 00940 if (cmpval > 0) { 00941 return 0; 00942 } 00943 break; 00944 case DATA_CMP_UNKNOWN: 00945 break; 00946 } 00947 return 1; 00948 }
static enum data_search_comparison data_search_comparison_type | ( | const char * | comparison | ) | [static] |
Definition at line 626 of file data.c.
References DATA_CMP_EQ, DATA_CMP_GE, DATA_CMP_GT, DATA_CMP_LT, DATA_CMP_NEQ, and DATA_CMP_UNKNOWN.
Referenced by data_search_generate().
00627 { 00628 if (!strcmp(comparison, "=")) { 00629 return DATA_CMP_EQ; 00630 } else if (!strcmp(comparison, "!=")) { 00631 return DATA_CMP_NEQ; 00632 } else if (!strcmp(comparison, "<")) { 00633 return DATA_CMP_LT; 00634 } else if (!strcmp(comparison, ">")) { 00635 return DATA_CMP_GT; 00636 } else if (!strcmp(comparison, "<=")) { 00637 return DATA_CMP_LE; 00638 } else if (!strcmp(comparison, ">=")) { 00639 return DATA_CMP_GE; 00640 } 00641 00642 return DATA_CMP_UNKNOWN; 00643 }
static struct ast_data_search* data_search_create | ( | struct ao2_container * | parent, | |
const char * | path | |||
) | [static] |
Definition at line 767 of file data.c.
References ao2_ref, ast_strdupa, ast_data_search::children, data_search_add_child(), data_search_find(), and next_node_name().
Referenced by data_search_generate().
00769 { 00770 char *rpath, *node_name; 00771 struct ast_data_search *child = NULL; 00772 struct ao2_container *current = parent; 00773 00774 rpath = ast_strdupa(path); 00775 00776 node_name = next_node_name(&rpath); 00777 while (node_name) { 00778 child = data_search_find(current, node_name); 00779 if (!child) { 00780 child = data_search_add_child(current, node_name); 00781 } 00782 ao2_ref(child, -1); 00783 current = child->children; 00784 node_name = next_node_name(&rpath); 00785 } 00786 00787 return child; 00788 }
static void data_search_destructor | ( | void * | obj | ) | [static] |
Definition at line 669 of file data.c.
References ao2_ref, ast_free, ast_data_search::children, and ast_data_search::value.
Referenced by data_search_alloc().
00670 { 00671 struct ast_data_search *node = obj; 00672 00673 if (node->value) { 00674 ast_free(node->value); 00675 } 00676 00677 ao2_ref(node->children, -1); 00678 }
static struct ast_data_search* data_search_find | ( | struct ao2_container * | parent, | |
const char * | name | |||
) | [static] |
Definition at line 718 of file data.c.
References ao2_find, ao2_ref, data_search_alloc(), and OBJ_POINTER.
Referenced by ast_data_search_match(), data_result_generate(), data_result_generate_node(), data_search_create(), and data_search_get_node().
00720 { 00721 struct ast_data_search *find_node, *found; 00722 00723 find_node = data_search_alloc(name); 00724 if (!find_node) { 00725 return NULL; 00726 } 00727 00728 found = ao2_find(parent, find_node, OBJ_POINTER); 00729 00730 /* free the created node used for searching. */ 00731 ao2_ref(find_node, -1); 00732 00733 return found; 00734 }
static struct ast_data_search* data_search_generate | ( | const char * | search_string | ) | [static] |
Definition at line 797 of file data.c.
References ast_free, ast_log(), ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_reset(), ast_strdup, ast_strdupa, ast_data_search::children, ast_data_search::cmp_type, DATA_CMP_UNKNOWN, data_search_alloc(), data_search_comparison_char(), data_search_comparison_type(), data_search_create(), LOG_ERROR, data_filter::name, ast_data_search::value, and value.
Referenced by data_result_generate().
00798 { 00799 struct ast_str *name, *value, *comparison; 00800 char *elements, *search_string_dup, *saveptr; 00801 int i; 00802 struct ast_data_search *root, *child; 00803 enum data_search_comparison cmp_type; 00804 size_t search_string_len; 00805 00806 if (!search_string) { 00807 ast_log(LOG_ERROR, "You must pass a valid search string.\n"); 00808 return NULL; 00809 } 00810 00811 search_string_len = strlen(search_string); 00812 00813 name = ast_str_create(search_string_len); 00814 if (!name) { 00815 return NULL; 00816 } 00817 value = ast_str_create(search_string_len); 00818 if (!value) { 00819 ast_free(name); 00820 return NULL; 00821 } 00822 comparison = ast_str_create(search_string_len); 00823 if (!comparison) { 00824 ast_free(name); 00825 ast_free(value); 00826 return NULL; 00827 } 00828 00829 search_string_dup = ast_strdupa(search_string); 00830 00831 /* Create the root node (just used as a container) */ 00832 root = data_search_alloc("/"); 00833 if (!root) { 00834 ast_free(name); 00835 ast_free(value); 00836 ast_free(comparison); 00837 return NULL; 00838 } 00839 00840 for (elements = strtok_r(search_string_dup, ",", &saveptr); elements; 00841 elements = strtok_r(NULL, ",", &saveptr)) { 00842 /* Parse the name */ 00843 ast_str_reset(name); 00844 for (i = 0; !data_search_comparison_char(elements[i]) && 00845 elements[i]; i++) { 00846 ast_str_append(&name, 0, "%c", elements[i]); 00847 } 00848 00849 /* check if the syntax is ok. */ 00850 if (!data_search_comparison_char(elements[i])) { 00851 /* if this is the end of the string, then this is 00852 * an error! */ 00853 ast_log(LOG_ERROR, "Invalid search string!\n"); 00854 continue; 00855 } 00856 00857 /* parse the comparison string. */ 00858 ast_str_reset(comparison); 00859 for (; data_search_comparison_char(elements[i]) && elements[i]; i++) { 00860 ast_str_append(&comparison, 0, "%c", elements[i]); 00861 } 00862 00863 /* parse the value string. */ 00864 ast_str_reset(value); 00865 for (; elements[i]; i++) { 00866 ast_str_append(&value, 0, "%c", elements[i]); 00867 } 00868 00869 cmp_type = data_search_comparison_type(ast_str_buffer(comparison)); 00870 if (cmp_type == DATA_CMP_UNKNOWN) { 00871 ast_log(LOG_ERROR, "Invalid comparison '%s'\n", 00872 ast_str_buffer(comparison)); 00873 continue; 00874 } 00875 00876 /* add this node to the tree. */ 00877 child = data_search_create(root->children, ast_str_buffer(name)); 00878 if (child) { 00879 child->cmp_type = cmp_type; 00880 child->value = ast_strdup(ast_str_buffer(value)); 00881 } 00882 } 00883 00884 ast_free(name); 00885 ast_free(value); 00886 ast_free(comparison); 00887 00888 return root; 00889 }
static struct ast_data_search* data_search_get_node | ( | const struct ast_data_search * | node, | |
const char * | path | |||
) | [static] |
Definition at line 958 of file data.c.
References ao2_ref, ast_strdupa, ast_data_search::children, data_search_find(), and next_node_name().
Referenced by __ast_data_search_cmp_structure(), data_search_cmp_bool(), data_search_cmp_char(), data_search_cmp_dbl(), data_search_cmp_int(), data_search_cmp_ipaddr(), data_search_cmp_ptr(), data_search_cmp_string(), and data_search_cmp_uint().
00960 { 00961 char *savepath, *node_name; 00962 struct ast_data_search *child, *current = (struct ast_data_search *) node; 00963 00964 if (!node) { 00965 return NULL; 00966 } 00967 00968 savepath = ast_strdupa(path); 00969 node_name = next_node_name(&savepath); 00970 00971 while (node_name) { 00972 child = data_search_find(current->children, node_name); 00973 if (current != node) { 00974 ao2_ref(current, -1); 00975 } 00976 if (!child) { 00977 return NULL; 00978 }; 00979 current = child; 00980 node_name = next_node_name(&savepath); 00981 } 00982 00983 return current; 00984 }
static int data_search_hash | ( | const void * | obj, | |
const int | flags | |||
) | [static] |
Definition at line 649 of file data.c.
References ast_str_hash(), and ast_data_search::name.
Referenced by data_search_alloc().
00650 { 00651 const struct ast_data_search *node = obj; 00652 return ast_str_hash(node->name); 00653 }
static int data_search_mapping_find | ( | const struct ast_data_mapping_structure * | map, | |
size_t | mapping_len, | |||
const char * | member_name | |||
) | [inline, static] |
Definition at line 1252 of file data.c.
References map, and data_filter::name.
Referenced by __ast_data_search_cmp_structure().
01255 { 01256 int i; 01257 01258 for (i = 0; i < mapping_len; i++) { 01259 if (!strcmp(map[i].name, member_name)) { 01260 return i; 01261 } 01262 } 01263 01264 return -1; 01265 }
static void data_search_release | ( | struct ast_data_search * | search | ) | [static] |
Definition at line 896 of file data.c.
References ao2_ref.
Referenced by data_result_generate().
00897 { 00898 ao2_ref(search, -1); 00899 }
static int data_structure_compatible | ( | int | structure_version, | |
uint32_t | latest_compatible, | |||
uint32_t | current | |||
) | [static] |
Definition at line 251 of file data.c.
References ast_log(), and LOG_ERROR.
Referenced by __ast_data_register(), and ast_data_get().
00253 { 00254 if (structure_version >= latest_compatible && structure_version <= current) { 00255 return 1; 00256 } 00257 00258 ast_log(LOG_ERROR, "A module is not compatible with the" 00259 "current data api version\n"); 00260 00261 return 0; 00262 }
static char* handle_cli_data_get | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 2858 of file data.c.
References ast_cli_args::argc, ast_cli_entry::args, ast_cli_args::argv, ast_data_free(), ast_data_get(), AST_DATA_QUERY_VERSION, CLI_FAILURE, CLI_GENERATE, CLI_INIT, CLI_SHOWUSAGE, CLI_SUCCESS, ast_cli_entry::command, data_result_print_cli(), ast_cli_args::fd, ast_data_query::filter, ast_data_query::path, ast_data_query::search, ast_cli_entry::usage, and ast_data_query::version.
02860 { 02861 struct ast_data_query query = { 02862 .version = AST_DATA_QUERY_VERSION 02863 }; 02864 struct ast_data *tree; 02865 02866 switch (cmd) { 02867 case CLI_INIT: 02868 e->command = "data get"; 02869 e->usage = "" 02870 "Usage: data get <path> [<search> [<filter>]]\n" 02871 " Get the tree based on a path.\n"; 02872 return NULL; 02873 case CLI_GENERATE: 02874 return NULL; 02875 } 02876 02877 if (a->argc < e->args + 1) { 02878 return CLI_SHOWUSAGE; 02879 } 02880 02881 query.path = (char *) a->argv[e->args]; 02882 02883 if (a->argc > e->args + 1) { 02884 query.search = (char *) a->argv[e->args + 1]; 02885 } 02886 02887 if (a->argc > e->args + 2) { 02888 query.filter = (char *) a->argv[e->args + 2]; 02889 } 02890 02891 tree = ast_data_get(&query); 02892 if (!tree) { 02893 return CLI_FAILURE; 02894 } 02895 02896 data_result_print_cli(a->fd, tree); 02897 02898 ast_data_free(tree); 02899 02900 return CLI_SUCCESS; 02901 }
static char* handle_cli_data_show_providers | ( | struct ast_cli_entry * | e, | |
int | cmd, | |||
struct ast_cli_args * | a | |||
) | [static] |
Definition at line 2954 of file data.c.
References CLI_GENERATE, CLI_INIT, CLI_SUCCESS, ast_cli_entry::command, data_provider_print_cli(), data_read_lock, data_unlock, ast_cli_args::fd, root_data, and ast_cli_entry::usage.
02956 { 02957 switch (cmd) { 02958 case CLI_INIT: 02959 e->command = "data show providers"; 02960 e->usage = "" 02961 "Usage: data show providers\n" 02962 " Show the list of registered providers\n"; 02963 return NULL; 02964 case CLI_GENERATE: 02965 return NULL; 02966 } 02967 02968 data_read_lock(); 02969 data_provider_print_cli(a->fd, "", root_data.container, NULL); 02970 data_unlock(); 02971 02972 return CLI_SUCCESS; 02973 }
static int manager_data_get | ( | struct mansession * | s, | |
const struct message * | m | |||
) | [static] |
Definition at line 3066 of file data.c.
References ast_data_free(), ast_data_get(), AST_DATA_QUERY_VERSION, ast_strlen_zero(), astman_append(), astman_get_header(), astman_send_error(), ast_data::children, data_result_manager_output(), filter(), ast_data::name, RESULT_SUCCESS, and ast_data_query::version.
Referenced by ast_data_init().
03067 { 03068 const char *path = astman_get_header(m, "Path"); 03069 const char *search = astman_get_header(m, "Search"); 03070 const char *filter = astman_get_header(m, "Filter"); 03071 const char *id = astman_get_header(m, "ActionID"); 03072 struct ast_data *res; 03073 struct ast_data_query query = { 03074 .version = AST_DATA_QUERY_VERSION, 03075 .path = (char *) path, 03076 .search = (char *) search, 03077 .filter = (char *) filter, 03078 }; 03079 03080 if (ast_strlen_zero(path)) { 03081 astman_send_error(s, m, "'Path' parameter not specified"); 03082 return 0; 03083 } 03084 03085 res = ast_data_get(&query); 03086 if (!res) { 03087 astman_send_error(s, m, "No data returned"); 03088 return 0; 03089 } 03090 03091 astman_append(s, "Event: DataGet Tree\r\n"); 03092 if (!ast_strlen_zero(id)) { 03093 astman_append(s, "ActionID: %s\r\n", id); 03094 } 03095 data_result_manager_output(s, res->name, res->children, NULL, 0); 03096 astman_append(s, "\r\n"); 03097 03098 ast_data_free(res); 03099 03100 return RESULT_SUCCESS; 03101 }
static char* next_node_name | ( | char ** | path | ) | [static] |
Definition at line 272 of file data.c.
References ast_strlen_zero(), and strsep().
Referenced by data_filter_add_nodes(), data_provider_create(), data_provider_release(), data_result_generate(), data_result_get_node(), data_search_create(), and data_search_get_node().
00273 { 00274 char *res; 00275 00276 do { 00277 res = strsep(path, "/"); 00278 } while (res && ast_strlen_zero(res)); 00279 00280 return res; 00281 }
struct ast_cli_entry cli_data[] [static] |
Initial value:
{ { .handler = handle_cli_data_get , .summary = "Data API get" ,__VA_ARGS__ }, { .handler = handle_cli_data_show_providers , .summary = "Show data providers" ,__VA_ARGS__ } }
Definition at line 2979 of file data.c.
Referenced by ast_data_init().
struct ao2_container* container |
The asterisk data main content structure.
Definition at line 173 of file data.c.
Referenced by ast_event_dup_and_cache(), ast_event_get_cached(), ast_event_init(), ast_event_queue_and_cache(), data_provider_print_cli(), data_result_manager_output(), and event_dump_cache().
const uint32_t current_handler_version = AST_DATA_HANDLER_VERSION [static] |
const uint32_t current_query_version = AST_DATA_QUERY_VERSION [static] |
struct { ... } data_result_color[] [static] |
Referenced by data_result_get_color().
const uint32_t latest_handler_compatible_version = 0 [static] |
const uint32_t latest_query_compatible_version = 0 [static] |
struct { ... } root_data |
enum ast_data_type type |