Wed Jan 8 2020 09:50:10

Asterisk developer's documentation


data.h File Reference

Data retrieval API. More...

#include "asterisk/frame.h"

Go to the source code of this file.

Data Structures

struct  ast_data_entry
 This entries are for multiple registers. More...
 
struct  ast_data_handler
 The structure of the node handler. More...
 
struct  ast_data_mapping_structure
 Map the members of a structure. More...
 
struct  ast_data_query
 A query to the data API is specified in this structure. More...
 
struct  ast_data_retrieve
 structure retrieved from a node, with the nodes content. More...
 

Macros

#define __AST_DATA_MAPPING_FUNCTION(__structure, __member, __type)   __AST_DATA_MAPPING_FUNCTION_##__type(__structure, __member)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_BOOLEAN(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_BOOLEAN, unsigned int)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_CHARACTER(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_CHARACTER, char)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_CONTAINER(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_CONTAINER, void *)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_DOUBLE(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_DBL, double)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_INTEGER(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_IPADDR(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_IPADDR, struct in_addr)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_MILLISECONDS(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_PASSWORD(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_PASSWORD, char *)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_POINTER(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_POINTER, void *)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_SECONDS(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_STRING(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_STRING, char *)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_TIMESTAMP(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)
 
#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_UNSIGNED_INTEGER(__structure, __member)   __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_UNSIGNED_INTEGER, unsigned int)
 
#define __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, __type, __real_type)
 
#define __AST_DATA_MAPPING_STRUCTURE(__structure, __member, __type)
 
#define ast_data_add_structure(structure_name, root, structure)
 
#define AST_DATA_ENTRY(__path, __handler)   { .path = __path, .handler = __handler }
 
#define AST_DATA_HANDLER_VERSION   1
 The Data API structures version. More...
 
#define AST_DATA_QUERY_VERSION   1
 
#define ast_data_register(path, handler)   __ast_data_register(path, handler, __FILE__, ast_module_info->self)
 
#define ast_data_register_core(path, handler)   __ast_data_register(path, handler, __FILE__, NULL)
 
#define ast_data_register_multiple(data_entries, entries)   __ast_data_register_multiple(data_entries, entries, __FILE__, ast_module_info->self)
 
#define ast_data_register_multiple_core(data_entries, entries)   __ast_data_register_multiple(data_entries, entries, __FILE__, NULL)
 
#define ast_data_search_cmp_structure(search, structure_name, structure, structure_name_cmp)
 
#define AST_DATA_STRUCTURE(__struct, __name)
 
#define ast_data_unregister(path)   __ast_data_unregister(path, __FILE__)
 

Typedefs

typedef int(* ast_data_get_cb )(const struct ast_data_search *search, struct ast_data *root)
 The get callback definition. More...
 

Enumerations

enum  ast_data_type {
  AST_DATA_CONTAINER, AST_DATA_INTEGER, AST_DATA_UNSIGNED_INTEGER, AST_DATA_DOUBLE,
  AST_DATA_BOOLEAN, AST_DATA_STRING, AST_DATA_CHARACTER, AST_DATA_PASSWORD,
  AST_DATA_IPADDR, AST_DATA_TIMESTAMP, AST_DATA_SECONDS, AST_DATA_MILLISECONDS,
  AST_DATA_POINTER
}
 The data type of the data node. More...
 

Functions

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. More...
 
int __ast_data_register (const char *path, const struct ast_data_handler *handler, const char *registrar, struct ast_module *mod)
 Register a data provider. More...
 
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. More...
 
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. More...
 
int __ast_data_unregister (const char *path, const char *registrar)
 Unregister a data provider. More...
 
struct ast_dataast_data_add_bool (struct ast_data *root, const char *childname, unsigned int boolean)
 Add a boolean node type. More...
 
struct ast_dataast_data_add_char (struct ast_data *root, const char *childname, char value)
 Add a char node type. More...
 
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. More...
 
struct ast_dataast_data_add_dbl (struct ast_data *root, const char *childname, double dbl)
 Add a floating point node type. More...
 
struct ast_dataast_data_add_int (struct ast_data *root, const char *childname, int value)
 Add an integer node type. More...
 
struct ast_dataast_data_add_ipaddr (struct ast_data *root, const char *childname, struct in_addr addr)
 Add a ipv4 address type. More...
 
struct ast_dataast_data_add_milliseconds (struct ast_data *root, const char *childname, unsigned int milliseconds)
 Add a milliseconds node type. More...
 
struct ast_dataast_data_add_node (struct ast_data *root, const char *childname)
 Add a container child. More...
 
struct ast_dataast_data_add_password (struct ast_data *root, const char *childname, const char *string)
 Add a password node type. More...
 
struct ast_dataast_data_add_ptr (struct ast_data *root, const char *childname, void *ptr)
 Add a ptr node type. More...
 
struct ast_dataast_data_add_seconds (struct ast_data *root, const char *childname, unsigned int seconds)
 Add a seconds node type. More...
 
struct ast_dataast_data_add_str (struct ast_data *root, const char *childname, const char *string)
 Add a string node type. More...
 
struct ast_dataast_data_add_timestamp (struct ast_data *root, const char *childname, unsigned int timestamp)
 Add a timestamp node type. More...
 
struct ast_dataast_data_add_uint (struct ast_data *root, const char *childname, unsigned int value)
 Add an unsigned integer node type. More...
 
void ast_data_free (struct ast_data *root)
 Release the allocated memory of a tree. More...
 
struct ast_dataast_data_get (const struct ast_data_query *query)
 Retrieve a subtree from the asterisk data API. More...
 
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.. More...
 
void ast_data_iterator_end (struct ast_data_iterator *iterator)
 Release (stop using) an iterator. More...
 
struct ast_data_iteratorast_data_iterator_init (struct ast_data *tree, const char *elements)
 Initialize an iterator. More...
 
struct ast_dataast_data_iterator_next (struct ast_data_iterator *iterator)
 Get the next node of the tree. More...
 
void ast_data_remove_node (struct ast_data *root, struct ast_data *child)
 Remove a node that was added using ast_data_add_. More...
 
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. More...
 
static unsigned int ast_data_retrieve_bool (struct ast_data *tree, const char *path)
 Retrieve the boolean value of a node. More...
 
static char ast_data_retrieve_char (struct ast_data *tree, const char *path)
 Retrieve the character value of a node. More...
 
static double ast_data_retrieve_dbl (struct ast_data *tree, const char *path)
 Retrieve the double value of a node. More...
 
static int ast_data_retrieve_int (struct ast_data *tree, const char *path)
 Retrieve the integer value of a node. More...
 
static struct in_addr ast_data_retrieve_ipaddr (struct ast_data *tree, const char *path)
 Retrieve the ipv4 address value of a node. More...
 
char * ast_data_retrieve_name (struct ast_data *node)
 Get the node name. More...
 
static const char * ast_data_retrieve_password (struct ast_data *tree, const char *path)
 Retrieve the password value of a node. More...
 
static void * ast_data_retrieve_ptr (struct ast_data *tree, const char *path)
 Retrieve the ptr value of a node. More...
 
static const char * ast_data_retrieve_string (struct ast_data *tree, const char *path)
 Retrieve the string value of a node. More...
 
enum ast_data_type ast_data_retrieve_type (struct ast_data *res, const char *path)
 Get a node type. More...
 
static unsigned int ast_data_retrieve_uint (struct ast_data *tree, const char *path)
 Retrieve the unsigned integer value of a node. More...
 
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. More...
 

Detailed Description

Data retrieval API.

Author
Brett Bryant brett.nosp@m.brya.nosp@m.nt@gm.nosp@m.ail..nosp@m.com
Eliel C. Sardanons (LU1ALY) eliel.nosp@m.s@gm.nosp@m.ail.c.nosp@m.om

Definition in file data.h.

Macro Definition Documentation

#define __AST_DATA_MAPPING_FUNCTION (   __structure,
  __member,
  __type 
)    __AST_DATA_MAPPING_FUNCTION_##__type(__structure, __member)

Definition at line 339 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_BOOLEAN (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_BOOLEAN, unsigned int)

Definition at line 328 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_CHARACTER (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_CHARACTER, char)

Definition at line 316 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_CONTAINER (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_CONTAINER, void *)

Definition at line 336 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_DOUBLE (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_DBL, double)

Definition at line 334 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_INTEGER (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)

Definition at line 318 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_IPADDR (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_IPADDR, struct in_addr)

Definition at line 332 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_MILLISECONDS (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)

Definition at line 324 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_PASSWORD (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_PASSWORD, char *)

Definition at line 312 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_POINTER (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_POINTER, void *)

Definition at line 330 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_SECONDS (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)

Definition at line 322 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_STRING (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_STRING, char *)

Definition at line 314 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_TIMESTAMP (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_INTEGER, int)

Definition at line 320 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_AST_DATA_UNSIGNED_INTEGER (   __structure,
  __member 
)    __AST_DATA_MAPPING_FUNCTION_TYPE(__structure, __member, AST_DATA_UNSIGNED_INTEGER, unsigned int)

Definition at line 326 of file data.h.

#define __AST_DATA_MAPPING_FUNCTION_TYPE (   __structure,
  __member,
  __type,
  __real_type 
)
Value:
static __real_type data_mapping_structure_get_##__structure##__member(void *ptr) { \
struct __structure *struct_##__member = (struct __structure *) ptr; \
return (__real_type) struct_##__member->__member; \
}

Definition at line 343 of file data.h.

#define __AST_DATA_MAPPING_STRUCTURE (   __structure,
  __member,
  __type 
)
Value:
{ .name = #__member, .get.__type = data_mapping_structure_get_##__structure##__member, \
.type = __type },

Definition at line 307 of file data.h.

#define ast_data_add_structure (   structure_name,
  root,
  structure 
)
Value:
__ast_data_add_structure(root, __data_mapping_structure_##structure_name, \
ARRAY_LEN(__data_mapping_structure_##structure_name), structure)
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
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.
Definition: data.c:2422

Definition at line 620 of file data.h.

Referenced by agents_data_provider_get(), ast_channel_data_add_structure(), ast_tone_zone_data_add_structure(), dahdi_channels_data_provider_get(), data_odbc_provider_handler(), 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().

#define AST_DATA_ENTRY (   __path,
  __handler 
)    { .path = __path, .handler = __handler }

Definition at line 260 of file data.h.

#define AST_DATA_HANDLER_VERSION   1

The Data API structures version.

Definition at line 204 of file data.h.

#define AST_DATA_QUERY_VERSION   1

Definition at line 205 of file data.h.

Referenced by handle_cli_data_get(), and manager_data_get().

#define ast_data_register (   path,
  handler 
)    __ast_data_register(path, handler, __FILE__, ast_module_info->self)

Definition at line 362 of file data.h.

#define ast_data_register_core (   path,
  handler 
)    __ast_data_register(path, handler, __FILE__, NULL)

Definition at line 363 of file data.h.

#define ast_data_register_multiple (   data_entries,
  entries 
)    __ast_data_register_multiple(data_entries, entries, __FILE__, ast_module_info->self)

Definition at line 377 of file data.h.

Referenced by load_module().

#define ast_data_register_multiple_core (   data_entries,
  entries 
)    __ast_data_register_multiple(data_entries, entries, __FILE__, NULL)

Definition at line 379 of file data.h.

Referenced by ast_channels_init(), and load_pbx().

#define ast_data_search_cmp_structure (   search,
  structure_name,
  structure,
  structure_name_cmp 
)
Value:
__ast_data_search_cmp_structure(search, __data_mapping_structure_##structure_name, \
ARRAY_LEN(__data_mapping_structure_##structure_name), structure, structure_name_cmp)
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
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.
Definition: data.c:1272

Definition at line 420 of file data.h.

Referenced by ast_channel_data_cmp_structure().

#define AST_DATA_STRUCTURE (   __struct,
  __name 
)
Value:
static const struct ast_data_mapping_structure __data_mapping_structure_##__struct[] = { \
}
Map the members of a structure.
Definition: data.h:276
#define __AST_DATA_MAPPING_FUNCTION(__structure, __member, __type)
Definition: data.h:339
#define __AST_DATA_MAPPING_STRUCTURE(__structure, __member, __type)
Definition: data.h:307

Definition at line 300 of file data.h.

#define ast_data_unregister (   path)    __ast_data_unregister(path, __FILE__)

Definition at line 394 of file data.h.

Referenced by __unload_module(), channels_shutdown(), unload_module(), and unload_pbx().

Typedef Documentation

typedef int(* ast_data_get_cb)(const struct ast_data_search *search, struct ast_data *root)

The get callback definition.

Definition at line 241 of file data.h.

Enumeration Type Documentation

The data type of the data node.

Enumerator
AST_DATA_CONTAINER 
AST_DATA_INTEGER 
AST_DATA_UNSIGNED_INTEGER 
AST_DATA_DOUBLE 
AST_DATA_BOOLEAN 
AST_DATA_STRING 
AST_DATA_CHARACTER 
AST_DATA_PASSWORD 
AST_DATA_IPADDR 
AST_DATA_TIMESTAMP 
AST_DATA_SECONDS 
AST_DATA_MILLISECONDS 
AST_DATA_POINTER 

Definition at line 187 of file data.h.

Function Documentation

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.

Parameters
[in]rootWhere to add the structure.
[in]mappingThe structure mapping array.
[in]mapping_lenThe lenght of the mapping array.
[in]structureThe structure pointer.
Return values
0on success.
1on error.

Definition at line 2422 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_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, data_filter::name, and type.

2425 {
2426  int i;
2427 
2428  for (i = 0; i < mapping_len; i++) {
2429  switch (mapping[i].type) {
2430  case AST_DATA_INTEGER:
2431  ast_data_add_int(root, mapping[i].name,
2432  mapping[i].get.AST_DATA_INTEGER(structure));
2433  break;
2435  ast_data_add_uint(root, mapping[i].name,
2436  mapping[i].get.AST_DATA_UNSIGNED_INTEGER(structure));
2437  break;
2438  case AST_DATA_DOUBLE:
2439  ast_data_add_dbl(root, mapping[i].name,
2440  mapping[i].get.AST_DATA_DOUBLE(structure));
2441  break;
2442  case AST_DATA_BOOLEAN:
2443  ast_data_add_bool(root, mapping[i].name,
2444  mapping[i].get.AST_DATA_BOOLEAN(structure));
2445  break;
2446  case AST_DATA_PASSWORD:
2447  ast_data_add_password(root, mapping[i].name,
2448  mapping[i].get.AST_DATA_PASSWORD(structure));
2449  break;
2450  case AST_DATA_TIMESTAMP:
2451  ast_data_add_timestamp(root, mapping[i].name,
2452  mapping[i].get.AST_DATA_TIMESTAMP(structure));
2453  break;
2454  case AST_DATA_SECONDS:
2455  ast_data_add_seconds(root, mapping[i].name,
2456  mapping[i].get.AST_DATA_SECONDS(structure));
2457  break;
2458  case AST_DATA_MILLISECONDS:
2459  ast_data_add_milliseconds(root, mapping[i].name,
2460  mapping[i].get.AST_DATA_MILLISECONDS(structure));
2461  break;
2462  case AST_DATA_STRING:
2463  ast_data_add_str(root, mapping[i].name,
2464  mapping[i].get.AST_DATA_STRING(structure));
2465  break;
2466  case AST_DATA_CHARACTER:
2467  ast_data_add_char(root, mapping[i].name,
2468  mapping[i].get.AST_DATA_CHARACTER(structure));
2469  break;
2470  case AST_DATA_CONTAINER:
2471  break;
2472  case AST_DATA_IPADDR:
2473  ast_data_add_ipaddr(root, mapping[i].name,
2474  mapping[i].get.AST_DATA_IPADDR(structure));
2475  break;
2476  case AST_DATA_POINTER:
2477  ast_data_add_ptr(root, mapping[i].name,
2478  mapping[i].get.AST_DATA_POINTER(structure));
2479  break;
2480  }
2481  }
2482 
2483  return 0;
2484 }
struct ast_data * ast_data_add_milliseconds(struct ast_data *root, const char *childname, unsigned int milliseconds)
Add a milliseconds node type.
Definition: data.c:2374
struct ast_data * ast_data_add_dbl(struct ast_data *root, const char *childname, double dbl)
Add a floating point node type.
Definition: data.c:2338
struct ast_data * ast_data_add_uint(struct ast_data *root, const char *childname, unsigned int value)
Add an unsigned integer node type.
Definition: data.c:2332
struct ast_data * ast_data_add_ipaddr(struct ast_data *root, const char *childname, struct in_addr addr)
Add a ipv4 address type.
Definition: data.c:2350
struct ast_data * ast_data_add_bool(struct ast_data *root, const char *childname, unsigned int boolean)
Add a boolean node type.
Definition: data.c:2344
struct ast_data * ast_data_add_timestamp(struct ast_data *root, const char *childname, unsigned int timestamp)
Add a timestamp node type.
Definition: data.c:2362
struct ast_data * ast_data_add_ptr(struct ast_data *root, const char *childname, void *ptr)
Add a ptr node type.
Definition: data.c:2356
struct ast_data * ast_data_add_seconds(struct ast_data *root, const char *childname, unsigned int seconds)
Add a seconds node type.
Definition: data.c:2368
struct ast_data * ast_data_add_char(struct ast_data *root, const char *childname, char value)
Add a char node type.
Definition: data.c:2327
static const char name[]
static const char type[]
Definition: chan_nbs.c:57
struct ast_data * ast_data_add_str(struct ast_data *root, const char *childname, const char *string)
Add a string node type.
Definition: data.c:2401
struct ast_data * ast_data_add_int(struct ast_data *root, const char *childname, int value)
Add an integer node type.
Definition: data.c:2322
struct ast_data * ast_data_add_password(struct ast_data *root, const char *childname, const char *string)
Add a password node type.
Definition: data.c:2380
int __ast_data_register ( const char *  path,
const struct ast_data_handler handler,
const char *  registrar,
struct ast_module mod 
)

Register a data provider.

Parameters
[in]pathThe path of the node to register.
[in]handlerThe structure defining this node handler.
[in]registrarWho is registering this node.
[in]modThe module registering this handler.
See Also
ast_data_unregister
Return values
<0on error.
0on success.
See Also
__ast_data_unregister, __ast_data_register_multiple

Definition at line 518 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().

520 {
521  struct data_provider *node;
522 
523  if (!path) {
524  return -1;
525  }
526 
527  /* check if the handler structure is compatible. */
528  if (!data_structure_compatible(handler->version,
531  return -1;
532  }
533 
534  /* create the node structure for the registered handler. */
535  data_write_lock();
536 
537  node = data_provider_create(root_data.container, path, registrar);
538  if (!node) {
539  ast_log(LOG_ERROR, "Unable to create the specified path (%s) "
540  "for '%s'.\n", path, registrar);
541  data_unlock();
542  return -1;
543  }
544 
545  if (ao2_container_count(node->children) || node->handler) {
546  ast_log(LOG_ERROR, "The node '%s' was already registered. "
547  "We were unable to register '%s' for registrar '%s'.\n",
548  node->name, path, registrar);
549  ao2_ref(node, -1);
550  data_unlock();
551  return -1;
552  }
553 
554  /* add handler to that node. */
555  node->handler = handler;
556  node->module = mod;
557 
558  ao2_ref(node, -1);
559 
560  data_unlock();
561 
562  return 0;
563 }
#define data_write_lock()
Definition: data.c:231
A data container node pointing to the registered handler.
Definition: data.c:148
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
Definition: astobj2.c:470
static struct data_provider * data_provider_create(struct ao2_container *parent, const char *path, const char *registrar)
Definition: data.c:487
char name[0]
Node name.
Definition: data.c:158
static const uint32_t latest_handler_compatible_version
The last compatible version.
Definition: data.c:72
static int data_structure_compatible(int structure_version, uint32_t latest_compatible, uint32_t current)
Definition: data.c:255
struct ast_module * module
Module providing this handler.
Definition: data.c:152
#define ao2_ref(o, delta)
Definition: astobj2.h:472
struct @244 root_data
static const uint32_t current_handler_version
Current handler structure version.
Definition: data.c:78
#define LOG_ERROR
Definition: logger.h:155
struct ao2_container * children
children nodes.
Definition: data.c:154
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
static char * registrar
Definition: features.c:623
struct ast_data_handler * handler
node content handler.
Definition: data.c:150
#define data_unlock()
Definition: data.c:244
uint32_t version
Structure version.
Definition: data.h:247
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.

Parameters
[in]data_entriesAn array of data_entries structures.
[in]entriesThe number of entries in the data_entries array.
[in]registrarWho is registering this nodes.
[in]modThe module registering this handlers.
Return values
<0on error (none of the nodes are being registered on error).
0on success.
See Also
__ast_data_register, __ast_data_unregister

Definition at line 565 of file data.c.

References __ast_data_register(), __ast_data_unregister(), and data_provider::handler.

567 {
568  int i, res;
569 
570  for (i = 0; i < entries; i++) {
571  res = __ast_data_register(data_entries[i].path, data_entries[i].handler,
572  registrar, mod);
573  if (res) {
574  /* unregister all the already registered nodes, and make
575  * this an atomic action. */
576  while ((--i) >= 0) {
577  __ast_data_unregister(data_entries[i].path, registrar);
578  }
579  return -1;
580  }
581  }
582 
583  return 0;
584 }
static char * registrar
Definition: features.c:623
int __ast_data_register(const char *path, const struct ast_data_handler *handler, const char *registrar, struct ast_module *mod)
Register a data provider.
Definition: data.c:518
int __ast_data_unregister(const char *path, const char *registrar)
Unregister a data provider.
Definition: data.c:586
struct ast_data_handler * handler
node content handler.
Definition: data.c:150
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.

Parameters
[in]searchThe search tree.
[in]mappingThe structure mapping.
[in]mapping_lenThe lenght of the structure mapping.
[in]structureThe structure pointer.
[in]structure_nameThe name of the structure to compare.
Return values
0If the structure matches.
1If the structure doesn't match.

Definition at line 1272 of file data.c.

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, AST_DATA_BOOLEAN, ast_data_mapping_structure::AST_DATA_BOOLEAN, AST_DATA_CHARACTER, ast_data_mapping_structure::AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, ast_data_mapping_structure::AST_DATA_DOUBLE, AST_DATA_INTEGER, ast_data_mapping_structure::AST_DATA_INTEGER, AST_DATA_IPADDR, ast_data_mapping_structure::AST_DATA_IPADDR, AST_DATA_MILLISECONDS, ast_data_mapping_structure::AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, ast_data_mapping_structure::AST_DATA_PASSWORD, AST_DATA_POINTER, ast_data_mapping_structure::AST_DATA_POINTER, AST_DATA_SECONDS, ast_data_mapping_structure::AST_DATA_SECONDS, AST_DATA_STRING, ast_data_mapping_structure::AST_DATA_STRING, AST_DATA_TIMESTAMP, ast_data_mapping_structure::AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_data_mapping_structure::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.

1275 {
1276  struct ao2_iterator i;
1277  struct ast_data_search *node, *struct_children;
1278  int member, notmatch = 0;
1279 
1280  if (!search) {
1281  return 0;
1282  }
1283 
1284  struct_children = data_search_get_node(search, structure_name);
1285  if (!struct_children) {
1286  return 0;
1287  }
1288 
1289  i = ao2_iterator_init(struct_children->children, 0);
1290  while ((node = ao2_iterator_next(&i))) {
1291  member = data_search_mapping_find(mapping, mapping_len, node->name);
1292  if (member < 0) {
1293  /* the structure member name doesn't match! */
1294  ao2_ref(node, -1);
1295  ao2_ref(struct_children, -1);
1297  return 0;
1298  }
1299 
1300  notmatch = 0;
1301  switch (mapping[member].type) {
1302  case AST_DATA_PASSWORD:
1303  notmatch = data_search_cmp_string(struct_children,
1304  node->name,
1305  mapping[member].get.AST_DATA_PASSWORD(structure));
1306  break;
1307  case AST_DATA_TIMESTAMP:
1308  notmatch = data_search_cmp_uint(struct_children,
1309  node->name,
1310  mapping[member].get.AST_DATA_TIMESTAMP(structure));
1311  break;
1312  case AST_DATA_SECONDS:
1313  notmatch = data_search_cmp_uint(struct_children,
1314  node->name,
1315  mapping[member].get.AST_DATA_SECONDS(structure));
1316  break;
1317  case AST_DATA_MILLISECONDS:
1318  notmatch = data_search_cmp_uint(struct_children,
1319  node->name,
1320  mapping[member].get.AST_DATA_MILLISECONDS(structure));
1321  break;
1322  case AST_DATA_STRING:
1323  notmatch = data_search_cmp_string(struct_children,
1324  node->name,
1325  mapping[member].get.AST_DATA_STRING(structure));
1326  break;
1327  case AST_DATA_CHARACTER:
1328  notmatch = data_search_cmp_char(struct_children,
1329  node->name,
1330  mapping[member].get.AST_DATA_CHARACTER(structure));
1331  break;
1332  case AST_DATA_INTEGER:
1333  notmatch = data_search_cmp_int(struct_children,
1334  node->name,
1335  mapping[member].get.AST_DATA_INTEGER(structure));
1336  break;
1337  case AST_DATA_BOOLEAN:
1338  notmatch = data_search_cmp_bool(struct_children,
1339  node->name,
1340  mapping[member].get.AST_DATA_BOOLEAN(structure));
1341  break;
1343  notmatch = data_search_cmp_uint(struct_children,
1344  node->name,
1345  mapping[member].get.AST_DATA_UNSIGNED_INTEGER(structure));
1346  break;
1347  case AST_DATA_DOUBLE:
1348  notmatch = data_search_cmp_dbl(struct_children,
1349  node->name,
1350  mapping[member].get.AST_DATA_DOUBLE(structure));
1351  break;
1352  case AST_DATA_IPADDR:
1353  notmatch = data_search_cmp_ipaddr(struct_children,
1354  node->name,
1355  mapping[member].get.AST_DATA_IPADDR(structure));
1356  break;
1357  case AST_DATA_POINTER:
1358  notmatch = data_search_cmp_ptr(struct_children,
1359  node->name,
1360  mapping[member].get.AST_DATA_POINTER(structure));
1361  break;
1362  case AST_DATA_CONTAINER:
1363  break;
1364  }
1365 
1366  ao2_ref(node, -1);
1367  }
1369 
1370  ao2_ref(struct_children, -1);
1371 
1372  return notmatch;
1373 }
static int data_search_cmp_ptr(const struct ast_data_search *root, const char *name, void *ptr)
Definition: data.c:1034
int(* AST_DATA_INTEGER)(void *ptr)
Definition: data.h:286
static int data_search_cmp_bool(const struct ast_data_search *root, const char *name, unsigned int value)
Definition: data.c:1102
char *(* AST_DATA_STRING)(void *ptr)
Definition: data.h:284
char(* AST_DATA_CHARACTER)(void *ptr)
Definition: data.h:283
#define ao2_iterator_next(arg1)
Definition: astobj2.h:1126
double(* AST_DATA_DOUBLE)(void *ptr)
Definition: data.h:290
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
Create an iterator for a container.
Definition: astobj2.c:818
int(* AST_DATA_MILLISECONDS)(void *ptr)
Definition: data.h:289
char *(* AST_DATA_PASSWORD)(void *ptr)
Definition: data.h:285
int(* AST_DATA_SECONDS)(void *ptr)
Definition: data.h:288
unsigned int(* AST_DATA_UNSIGNED_INTEGER)(void *ptr)
Definition: data.h:291
static struct ast_data_search * data_search_get_node(const struct ast_data_search *node, const char *path)
Definition: data.c:962
static int data_search_mapping_find(const struct ast_data_mapping_structure *map, size_t mapping_len, const char *member_name)
Definition: data.c:1257
#define ao2_ref(o, delta)
Definition: astobj2.h:472
The list of nodes with their search requirement.
Definition: data.c:122
union ast_data_mapping_structure::@162 get
member getter.
struct ao2_container * children
reference another node.
Definition: data.c:128
unsigned int(* AST_DATA_BOOLEAN)(void *ptr)
Definition: data.h:292
static int data_search_cmp_dbl(const struct ast_data_search *root, const char *name, double value)
Definition: data.c:1134
static const char type[]
Definition: chan_nbs.c:57
void ao2_iterator_destroy(struct ao2_iterator *i)
Destroy a container iterator.
Definition: astobj2.c:833
static int data_search_cmp_uint(const struct ast_data_search *root, const char *name, unsigned int value)
Definition: data.c:1166
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1053
static int data_search_cmp_ipaddr(const struct ast_data_search *root, const char *name, struct in_addr addr)
Definition: data.c:1070
void *(* AST_DATA_POINTER)(void *ptr)
Definition: data.h:293
static int data_search_cmp_int(const struct ast_data_search *root, const char *name, int value)
Definition: data.c:1198
int(* AST_DATA_TIMESTAMP)(void *ptr)
Definition: data.h:287
char name[0]
The name of the node we are trying to compare.
Definition: data.c:130
static int data_search_cmp_string(const struct ast_data_search *root, const char *name, char *value)
Definition: data.c:1002
static int data_search_cmp_char(const struct ast_data_search *root, const char *name, char value)
Definition: data.c:1230
struct in_addr(* AST_DATA_IPADDR)(void *ptr)
Definition: data.h:294
int __ast_data_unregister ( const char *  path,
const char *  registrar 
)

Unregister a data provider.

Parameters
[in]pathWhich node to unregister, if path is NULL unregister every node registered by the passed 'registrar'.
[in]registrarWho is trying to unregister this node, only the owner (the one who registered the node) will be able to unregister it.
See Also
ast_data_register
Return values
<0on error.
0on success.
See Also
__ast_data_register, __ast_data_register_multiple

Definition at line 586 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().

587 {
588  int ret = 0;
589 
590  data_write_lock();
591  if (path) {
592  ret = data_provider_release(root_data.container, path, registrar);
593  } else {
595  }
596  data_unlock();
597 
598  if (path && ret) {
599  ast_log(LOG_ERROR, "Unable to unregister '%s' for '%s'\n",
600  path, registrar);
601  }
602 
603  return ret;
604 }
#define data_write_lock()
Definition: data.c:231
static int data_provider_release(struct ao2_container *parent, const char *path, const char *registrar)
Definition: data.c:409
struct @244 root_data
#define LOG_ERROR
Definition: logger.h:155
static void data_provider_release_all(struct ao2_container *parent, const char *registrar)
Definition: data.c:450
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
static char * registrar
Definition: features.c:623
#define data_unlock()
Definition: data.c:244
struct ast_data* ast_data_add_bool ( struct ast_data root,
const char *  childname,
unsigned int  boolean 
)

Add a boolean node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]booleanThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2344 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().

2346 {
2347  return __ast_data_add(root, childname, AST_DATA_BOOLEAN, &boolean);
2348 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
struct ast_data* ast_data_add_char ( struct ast_data root,
const char *  childname,
char  value 
)

Add a char node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]valueThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2327 of file data.c.

References __ast_data_add(), and AST_DATA_CHARACTER.

Referenced by __ast_data_add_structure().

2328 {
2329  return __ast_data_add(root, name, AST_DATA_CHARACTER, &value);
2330 }
int value
Definition: syslog.c:39
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
static const char name[]
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.

Parameters
[in]rootThe astdata root node where to add the codecs node.
[in]node_nameThe name of the node where we are going to add the list of codecs.
[in]capabilityThe codecs allowed.
Returns
< 0 on error.
0 on success.

Definition at line 3112 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, data_filter::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().

3113 {
3114  struct ast_data *codecs, *codec;
3115  size_t fmlist_size;
3116  const struct ast_format_list *fmlist;
3117  int x;
3118 
3119  codecs = ast_data_add_node(root, node_name);
3120  if (!codecs) {
3121  return -1;
3122  }
3123  fmlist = ast_get_format_list(&fmlist_size);
3124  for (x = 0; x < fmlist_size; x++) {
3125  if (fmlist[x].bits & capability) {
3126  codec = ast_data_add_node(codecs, "codec");
3127  if (!codec) {
3128  return -1;
3129  }
3130  ast_data_add_str(codec, "name", fmlist[x].name);
3131  ast_data_add_int(codec, "samplespersecond", fmlist[x].samplespersecond);
3132  ast_data_add_str(codec, "description", fmlist[x].desc);
3133  ast_data_add_int(codec, "frame_length", fmlist[x].fr_len);
3134  }
3135  }
3136 
3137  return 0;
3138 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
int samplespersecond
Definition: frame.h:553
struct ast_format_list * ast_get_format_list(size_t *size)
Definition: frame.c:572
Definition of supported media formats (codecs)
Definition: frame.h:550
struct ast_data * ast_data_add_node(struct ast_data *root, const char *childname)
Add a container child.
Definition: data.c:2317
static const char desc[]
Definition: cdr_radius.c:85
static const char name[]
static format_t capability
Definition: chan_mgcp.c:228
format_t bits
Definition: frame.h:551
struct ast_data * ast_data_add_str(struct ast_data *root, const char *childname, const char *string)
Add a string node type.
Definition: data.c:2401
struct ast_data * ast_data_add_int(struct ast_data *root, const char *childname, int value)
Add an integer node type.
Definition: data.c:2322
struct ast_data* ast_data_add_dbl ( struct ast_data root,
const char *  childname,
double  dbl 
)

Add a floating point node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]dblThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2338 of file data.c.

References __ast_data_add(), and AST_DATA_DOUBLE.

Referenced by __ast_data_add_structure().

2340 {
2341  return __ast_data_add(root, childname, AST_DATA_DOUBLE, &dbl);
2342 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
struct ast_data* ast_data_add_int ( struct ast_data root,
const char *  childname,
int  value 
)

Add an integer node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]valueThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2322 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().

2323 {
2324  return __ast_data_add(root, name, AST_DATA_INTEGER, &value);
2325 }
int value
Definition: syslog.c:39
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
static const char name[]
struct ast_data* ast_data_add_ipaddr ( struct ast_data root,
const char *  childname,
struct in_addr  addr 
)

Add a ipv4 address type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]addrThe ipv4 address value.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2350 of file data.c.

References __ast_data_add(), and AST_DATA_IPADDR.

Referenced by __ast_data_add_structure().

2352 {
2353  return __ast_data_add(root, childname, AST_DATA_IPADDR, &addr);
2354 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
struct ast_data* ast_data_add_milliseconds ( struct ast_data root,
const char *  childname,
unsigned int  milliseconds 
)

Add a milliseconds node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]millisecondsThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2374 of file data.c.

References __ast_data_add(), and AST_DATA_MILLISECONDS.

Referenced by __ast_data_add_structure().

2376 {
2377  return __ast_data_add(root, childname, AST_DATA_MILLISECONDS, &milliseconds);
2378 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
struct ast_data* ast_data_add_node ( struct ast_data root,
const char *  childname 
)

Add a container child.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2317 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().

2318 {
2319  return __ast_data_add(root, name, AST_DATA_CONTAINER, NULL);
2320 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
static const char name[]
struct ast_data* ast_data_add_password ( struct ast_data root,
const char *  childname,
const char *  string 
)

Add a password node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]stringThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2380 of file data.c.

References __ast_data_add(), AST_DATA_PASSWORD, ast_free, ast_malloc, ast_strlen_zero(), and data_filter::name.

Referenced by __ast_data_add_structure(), and users_data_provider_get().

2382 {
2383  char *name;
2384  size_t namelen = 1 + (ast_strlen_zero(value) ? 0 : strlen(value));
2385  struct ast_data *res;
2386 
2387  if (!(name = ast_malloc(namelen))) {
2388  return NULL;
2389  }
2390 
2391  strcpy(name, (ast_strlen_zero(value) ? "" : value));
2392 
2393  res = __ast_data_add(root, childname, AST_DATA_PASSWORD, name);
2394  if (!res) {
2395  ast_free(name);
2396  }
2397 
2398  return res;
2399 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
int value
Definition: syslog.c:39
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
static const char name[]
#define ast_free(a)
Definition: astmm.h:97
#define ast_malloc(a)
Definition: astmm.h:91
struct ast_data* ast_data_add_ptr ( struct ast_data root,
const char *  childname,
void *  ptr 
)

Add a ptr node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]ptrThe pointer value to add.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2356 of file data.c.

References __ast_data_add(), and AST_DATA_POINTER.

Referenced by __ast_data_add_structure().

2358 {
2359  return __ast_data_add(root, childname, AST_DATA_POINTER, ptr);
2360 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
void * ptr
Definition: data.c:97
struct ast_data* ast_data_add_seconds ( struct ast_data root,
const char *  childname,
unsigned int  seconds 
)

Add a seconds node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]secondsThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2368 of file data.c.

References __ast_data_add(), and AST_DATA_SECONDS.

Referenced by __ast_data_add_structure().

2370 {
2371  return __ast_data_add(root, childname, AST_DATA_SECONDS, &seconds);
2372 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
struct ast_data* ast_data_add_str ( struct ast_data root,
const char *  childname,
const char *  string 
)

Add a string node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]stringThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2401 of file data.c.

References __ast_data_add(), AST_DATA_STRING, ast_free, ast_malloc, ast_strlen_zero(), and data_filter::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().

2403 {
2404  char *name;
2405  size_t namelen = 1 + (ast_strlen_zero(value) ? 0 : strlen(value));
2406  struct ast_data *res;
2407 
2408  if (!(name = ast_malloc(namelen))) {
2409  return NULL;
2410  }
2411 
2412  strcpy(name, (ast_strlen_zero(value) ? "" : value));
2413 
2414  res = __ast_data_add(root, childname, AST_DATA_STRING, name);
2415  if (!res) {
2416  ast_free(name);
2417  }
2418 
2419  return res;
2420 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
int value
Definition: syslog.c:39
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:63
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
static const char name[]
#define ast_free(a)
Definition: astmm.h:97
#define ast_malloc(a)
Definition: astmm.h:91
struct ast_data* ast_data_add_timestamp ( struct ast_data root,
const char *  childname,
unsigned int  timestamp 
)

Add a timestamp node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]timestampThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2362 of file data.c.

References __ast_data_add(), and AST_DATA_TIMESTAMP.

Referenced by __ast_data_add_structure().

2364 {
2365  return __ast_data_add(root, childname, AST_DATA_TIMESTAMP, &timestamp);
2366 }
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
struct ast_data* ast_data_add_uint ( struct ast_data root,
const char *  childname,
unsigned int  value 
)

Add an unsigned integer node type.

Parameters
[in]rootThe root of the ast_data to insert into.
[in]childnameThe name of the child element to be added.
[in]valueThe value for the new node.
Return values
NULLon error (memory exhaustion only).
non-NULLa newly allocated node.

Definition at line 2332 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().

2334 {
2336 }
int value
Definition: syslog.c:39
static struct ast_data * __ast_data_add(struct ast_data *root, const char *name, enum ast_data_type type, void *ptr)
Definition: data.c:2240
static const char name[]
void ast_data_free ( struct ast_data root)

Release the allocated memory of a tree.

Parameters
[in]rootThe sub-tree pointer returned by a call to ast_data_get.
See Also
ast_data_get

Definition at line 2491 of file data.c.

References ao2_ref.

Referenced by ast_data_get_xml(), handle_cli_data_get(), and manager_data_get().

2492 {
2493  /* destroy it, this will destroy all the internal nodes. */
2494  ao2_ref(root, -1);
2495 }
#define ao2_ref(o, delta)
Definition: astobj2.h:472
struct ast_data* ast_data_get ( const struct ast_data_query query)

Retrieve a subtree from the asterisk data API.

Parameters
[in]queryThe query structure specifying what nodes to retrieve.
Return values
NULLon error.
non-NULLThe dynamically allocated requested sub-tree (it needs to be released using ast_data_free.
See Also
ast_data_free, ast_data_get_xml

Definition at line 2065 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().

2066 {
2067  struct ast_data *res;
2068 
2069  /* check compatibility */
2072  return NULL;
2073  }
2074 
2075  data_read_lock();
2076  res = data_result_generate(query, query->path);
2077  data_unlock();
2078 
2079  if (!res) {
2080  ast_log(LOG_ERROR, "Unable to get data from %s\n", query->path);
2081  return NULL;
2082  }
2083 
2084  return res;
2085 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
static struct ast_data * data_result_generate(const struct ast_data_query *query, const char *search_path)
Definition: data.c:1973
static const uint32_t current_query_version
Current query structure version.
Definition: data.c:81
uint32_t version
Data query version.
Definition: data.h:265
static int data_structure_compatible(int structure_version, uint32_t latest_compatible, uint32_t current)
Definition: data.c:255
char * path
Path to the node to retrieve.
Definition: data.h:267
#define LOG_ERROR
Definition: logger.h:155
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
static const uint32_t latest_query_compatible_version
The last compatible version.
Definition: data.c:75
#define data_unlock()
Definition: data.c:244
#define data_read_lock()
Definition: data.c:238
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..

Parameters
[in]queryThe query structure specifying what nodes to retrieve.
Return values
NULLon error.
non-NULLThe dynamically allocated requested sub-tree (it needs to be released using ast_data_free.
See Also
ast_data_free, ast_data_get

Definition at line 2181 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.

2182 {
2183  struct ast_xml_doc *doc;
2184  struct ast_xml_node *root;
2185  struct ast_data *res;
2186 
2187  res = ast_data_get(query);
2188  if (!res) {
2189  return NULL;
2190  }
2191 
2192  doc = ast_xml_new();
2193  if (!doc) {
2194  ast_data_free(res);
2195  return NULL;
2196  }
2197 
2198  root = ast_xml_new_node(res->name);
2199  if (!root) {
2200  ast_xml_close(doc);
2201  }
2202 
2203  ast_xml_set_root(doc, root);
2204 
2205  data_get_xml_add_child(res, root);
2206 
2207  ast_data_free(res);
2208 
2209  return doc;
2210 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
void ast_data_free(struct ast_data *root)
Release the allocated memory of a tree.
Definition: data.c:2491
struct ast_xml_doc * ast_xml_new(void)
Create a XML document.
Definition: xml.c:75
struct ast_data * ast_data_get(const struct ast_data_query *query)
Retrieve a subtree from the asterisk data API.
Definition: data.c:2065
struct ast_xml_node * ast_xml_new_node(const char *name)
Create a XML node.
Definition: xml.c:83
static void data_get_xml_add_child(struct ast_data *parent_data, struct ast_xml_node *parent_xml)
Definition: data.c:2094
void ast_xml_set_root(struct ast_xml_doc *doc, struct ast_xml_node *node)
Specify the root node of a XML document.
Definition: xml.c:144
void ast_xml_close(struct ast_xml_doc *doc)
Close an already open document and free the used structure.
Definition: xml.c:134
char name[0]
The name of the node.
Definition: data.c:107
void ast_data_iterator_end ( struct ast_data_iterator iterator)

Release (stop using) an iterator.

Parameters
[in]iteratorThe iterator created by ast_data_iterator_start.
See Also
ast_data_iterator_start

Definition at line 2542 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.

2543 {
2544  /* decrement the reference counter. */
2545  if (iterator->last) {
2546  ao2_ref(iterator->last, -1);
2547  }
2548 
2549  /* release the generated pattern. */
2550  if (iterator->is_pattern) {
2551  regfree(&(iterator->regex_pattern));
2552  }
2553 
2555 
2556  ast_free(iterator);
2557  iterator = NULL;
2558 }
unsigned int is_pattern
is a regular expression.
Definition: data.c:172
regex_t regex_pattern
The compiled patter.
Definition: data.c:170
struct ast_data * last
The last returned node.
Definition: data.c:166
struct ao2_iterator internal_iterator
The internal iterator.
Definition: data.c:164
#define ao2_ref(o, delta)
Definition: astobj2.h:472
#define ast_free(a)
Definition: astmm.h:97
void ao2_iterator_destroy(struct ao2_iterator *i)
Destroy a container iterator.
Definition: astobj2.c:833
struct ast_data_iterator* ast_data_iterator_init ( struct ast_data tree,
const char *  elements 
)

Initialize an iterator.

Parameters
[in]treeThe returned tree by a call to ast_data_get.
[in]elementsWhich elements to iterate through.
Return values
NULLon error.
non-NULLA dinamically allocated iterator structure.

Definition at line 2497 of file data.c.

References ao2_iterator_init(), ast_calloc, ast_strdupa, data_result_get_node(), ast_data_iterator::internal_iterator, ast_data_iterator::is_pattern, ast_data_iterator::pattern, ast_data::ptr, and ast_data_iterator::regex_pattern.

2499 {
2500  struct ast_data_iterator *iterator;
2501  struct ao2_iterator i;
2502  struct ast_data *internal = tree;
2503  char *path, *ptr = NULL;
2504 
2505  if (!elements) {
2506  return NULL;
2507  }
2508 
2509  /* tree is the node we want to use to iterate? or we are going
2510  * to iterate thow an internal node? */
2511  path = ast_strdupa(elements);
2512 
2513  ptr = strrchr(path, '/');
2514  if (ptr) {
2515  *ptr = '\0';
2516  internal = data_result_get_node(tree, path);
2517  if (!internal) {
2518  return NULL;
2519  }
2520  }
2521 
2522  iterator = ast_calloc(1, sizeof(*iterator));
2523  if (!iterator) {
2524  return NULL;
2525  }
2526 
2527  i = ao2_iterator_init(internal->children, 0);
2528 
2529  iterator->pattern = (ptr ? strrchr(elements, '/') + 1 : elements);
2530 
2531  /* is the last node a regular expression?, compile it! */
2532  if (!regcomp(&(iterator->regex_pattern), iterator->pattern,
2533  REG_EXTENDED | REG_NOSUB | REG_ICASE)) {
2534  iterator->is_pattern = 1;
2535  }
2536 
2537  iterator->internal_iterator = i;
2538 
2539  return iterator;
2540 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
unsigned int is_pattern
is a regular expression.
Definition: data.c:172
regex_t regex_pattern
The compiled patter.
Definition: data.c:170
static struct ast_data * data_result_get_node(struct ast_data *node, const char *path)
Definition: data.c:1565
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
Create an iterator for a container.
Definition: astobj2.c:818
struct ao2_iterator internal_iterator
The internal iterator.
Definition: data.c:164
const char * pattern
The iterator pattern.
Definition: data.c:168
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: utils.h:663
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1053
#define ast_calloc(a, b)
Definition: astmm.h:82
void * ptr
Definition: data.c:97
This structure is used by the iterator.
Definition: data.c:162
struct ast_data* ast_data_iterator_next ( struct ast_data_iterator iterator)

Get the next node of the tree.

Parameters
[in]iteratorThe iterator structure returned by ast_data_iterator_start.
Return values
NULLwhen no more nodes to return.
non-NULLA node of the ast_data tree.
See Also
ast_data_iterator_start, ast_data_iterator_stop

Definition at line 2560 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.

2561 {
2562  struct ast_data *res;
2563 
2564  if (iterator->last) {
2565  /* release the last retrieved node reference. */
2566  ao2_ref(iterator->last, -1);
2567  }
2568 
2569  while ((res = ao2_iterator_next(&iterator->internal_iterator))) {
2570  /* if there is no node name pattern specified, return
2571  * the next node. */
2572  if (!iterator->pattern) {
2573  break;
2574  }
2575 
2576  /* if the pattern is a regular expression, check if this node
2577  * matches. */
2578  if (iterator->is_pattern && !regexec(&(iterator->regex_pattern),
2579  res->name, 0, NULL, 0)) {
2580  break;
2581  }
2582 
2583  /* if there is a pattern specified, check if this node matches
2584  * the wanted node names. */
2585  if (!iterator->is_pattern && (iterator->pattern &&
2586  !strcasecmp(res->name, iterator->pattern))) {
2587  break;
2588  }
2589 
2590  ao2_ref(res, -1);
2591  }
2592 
2593  iterator->last = res;
2594 
2595  return res;
2596 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
unsigned int is_pattern
is a regular expression.
Definition: data.c:172
regex_t regex_pattern
The compiled patter.
Definition: data.c:170
#define ao2_iterator_next(arg1)
Definition: astobj2.h:1126
struct ast_data * last
The last returned node.
Definition: data.c:166
struct ao2_iterator internal_iterator
The internal iterator.
Definition: data.c:164
const char * pattern
The iterator pattern.
Definition: data.c:168
#define ao2_ref(o, delta)
Definition: astobj2.h:472
char name[0]
The name of the node.
Definition: data.c:107
void ast_data_remove_node ( struct ast_data root,
struct ast_data child 
)

Remove a node that was added using ast_data_add_.

Parameters
[in]rootThe root node of the node to be removed.
[in]childThe node pointer to remove.

Definition at line 2486 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().

2487 {
2488  ao2_unlink(root->children, child);
2489 }
struct ao2_container * children
The list of nodes inside this node.
Definition: data.c:105
#define ao2_unlink(arg1, arg2)
Definition: astobj2.h:817
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.

Parameters
[in]treeThe structure returned by a call to ast_data_get.
[in]pathThe path to the node.
[out]contentThe node content.
Return values
0on success.
<0on error.

Definition at line 2598 of file data.c.

References AST_DATA_BOOLEAN, ast_data_retrieve::AST_DATA_BOOLEAN, AST_DATA_CHARACTER, ast_data_retrieve::AST_DATA_CHARACTER, AST_DATA_CONTAINER, AST_DATA_DOUBLE, ast_data_retrieve::AST_DATA_DOUBLE, AST_DATA_INTEGER, ast_data_retrieve::AST_DATA_INTEGER, AST_DATA_IPADDR, ast_data_retrieve::AST_DATA_IPADDR, AST_DATA_MILLISECONDS, ast_data_retrieve::AST_DATA_MILLISECONDS, AST_DATA_PASSWORD, ast_data_retrieve::AST_DATA_PASSWORD, AST_DATA_POINTER, ast_data_retrieve::AST_DATA_POINTER, AST_DATA_SECONDS, ast_data_retrieve::AST_DATA_SECONDS, AST_DATA_STRING, ast_data_retrieve::AST_DATA_STRING, AST_DATA_TIMESTAMP, ast_data_retrieve::AST_DATA_TIMESTAMP, AST_DATA_UNSIGNED_INTEGER, ast_data_retrieve::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_retrieve::type, ast_data::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().

2600 {
2601  struct ast_data *node;
2602 
2603  if (!content) {
2604  return -1;
2605  }
2606 
2607  node = data_result_get_node(tree, path);
2608  if (!node) {
2609  ast_log(LOG_ERROR, "Invalid internal node %s\n", path);
2610  return -1;
2611  }
2612 
2613  content->type = node->type;
2614  switch (node->type) {
2615  case AST_DATA_STRING:
2616  content->value.AST_DATA_STRING = node->payload.str;
2617  break;
2618  case AST_DATA_PASSWORD:
2619  content->value.AST_DATA_PASSWORD = node->payload.str;
2620  break;
2621  case AST_DATA_TIMESTAMP:
2622  content->value.AST_DATA_TIMESTAMP = node->payload.uint;
2623  break;
2624  case AST_DATA_SECONDS:
2625  content->value.AST_DATA_SECONDS = node->payload.uint;
2626  break;
2627  case AST_DATA_MILLISECONDS:
2628  content->value.AST_DATA_MILLISECONDS = node->payload.uint;
2629  break;
2630  case AST_DATA_CHARACTER:
2631  content->value.AST_DATA_CHARACTER = node->payload.character;
2632  break;
2633  case AST_DATA_INTEGER:
2634  content->value.AST_DATA_INTEGER = node->payload.sint;
2635  break;
2637  content->value.AST_DATA_UNSIGNED_INTEGER = node->payload.uint;
2638  break;
2639  case AST_DATA_BOOLEAN:
2640  content->value.AST_DATA_BOOLEAN = node->payload.boolean;
2641  break;
2642  case AST_DATA_IPADDR:
2643  content->value.AST_DATA_IPADDR = node->payload.ipaddr;
2644  break;
2645  case AST_DATA_DOUBLE:
2646  content->value.AST_DATA_DOUBLE = node->payload.dbl;
2647  break;
2648  case AST_DATA_CONTAINER:
2649  break;
2650  case AST_DATA_POINTER:
2651  content->value.AST_DATA_POINTER = node->payload.ptr;
2652  break;
2653  }
2654 
2655  return 0;
2656 }
unsigned int AST_DATA_BOOLEAN
Definition: data.h:231
unsigned int boolean
Definition: data.c:93
unsigned int AST_DATA_UNSIGNED_INTEGER
Definition: data.h:230
unsigned int AST_DATA_MILLISECONDS
Definition: data.h:228
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
union ast_data_retrieve::@161 value
uint32_t uint
Definition: data.c:91
static struct ast_data * data_result_get_node(struct ast_data *node, const char *path)
Definition: data.c:1565
int32_t sint
Definition: data.c:90
double dbl
Definition: data.c:92
enum ast_data_type type
Definition: data.c:86
enum ast_data_type type
The type of the node retrieved.
Definition: data.h:219
char * AST_DATA_PASSWORD
Definition: data.h:224
void * AST_DATA_POINTER
Definition: data.h:232
#define LOG_ERROR
Definition: logger.h:155
union ast_data::@246 payload
The node content.
struct in_addr ipaddr
Definition: data.c:96
double AST_DATA_DOUBLE
Definition: data.h:229
void ast_log(int level, const char *file, int line, const char *function, const char *fmt,...)
Used for sending a log message This is the standard logger function. Probably the only way you will i...
Definition: logger.c:1207
char AST_DATA_CHARACTER
Definition: data.h:222
char * AST_DATA_STRING
Definition: data.h:223
char * str
Definition: data.c:94
void * ptr
Definition: data.c:97
int AST_DATA_INTEGER
Definition: data.h:225
char character
Definition: data.c:95
struct in_addr AST_DATA_IPADDR
Definition: data.h:233
unsigned int AST_DATA_TIMESTAMP
Definition: data.h:226
unsigned int AST_DATA_SECONDS
Definition: data.h:227
static unsigned int ast_data_retrieve_bool ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the boolean value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 703 of file data.h.

References ast_data_retrieve::AST_DATA_BOOLEAN, ast_data_retrieve(), and ast_data_retrieve::value.

704 {
705  struct ast_data_retrieve ret;
706 
707  ast_data_retrieve(tree, path, &ret);
708 
709  return ret.value.AST_DATA_BOOLEAN;
710 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
static char ast_data_retrieve_char ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the character value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 688 of file data.h.

References ast_data_retrieve::AST_DATA_CHARACTER, ast_data_retrieve(), and ast_data_retrieve::value.

689 {
690  struct ast_data_retrieve ret;
691 
692  ast_data_retrieve(tree, path, &ret);
693 
694  return ret.value.AST_DATA_CHARACTER;
695 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
static double ast_data_retrieve_dbl ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the double value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 778 of file data.h.

References ast_data_retrieve::AST_DATA_DOUBLE, ast_data_retrieve(), and ast_data_retrieve::value.

779 {
780  struct ast_data_retrieve ret;
781 
782  ast_data_retrieve(tree, path, &ret);
783 
784  return ret.value.AST_DATA_DOUBLE;
785 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
static int ast_data_retrieve_int ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the integer value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 673 of file data.h.

References ast_data_retrieve::AST_DATA_INTEGER, ast_data_retrieve(), and ast_data_retrieve::value.

674 {
675  struct ast_data_retrieve ret;
676 
677  ast_data_retrieve(tree, path, &ret);
678 
679  return ret.value.AST_DATA_INTEGER;
680 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
static struct in_addr ast_data_retrieve_ipaddr ( struct ast_data tree,
const char *  path 
)
static

Retrieve the ipv4 address value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 793 of file data.h.

References ast_data_retrieve::AST_DATA_IPADDR, ast_data_retrieve(), and ast_data_retrieve::value.

794 {
795  struct ast_data_retrieve ret;
796 
797  ast_data_retrieve(tree, path, &ret);
798 
799  return ret.value.AST_DATA_IPADDR;
800 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
char* ast_data_retrieve_name ( struct ast_data node)

Get the node name.

Parameters
[in]nodeThe node pointer.
Returns
The node name.

Definition at line 2225 of file data.c.

References ast_data::name.

2226 {
2227  return node->name;
2228 }
char name[0]
The name of the node.
Definition: data.c:107
static const char* ast_data_retrieve_password ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the password value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 733 of file data.h.

References ast_data_retrieve::AST_DATA_PASSWORD, ast_data_retrieve(), and ast_data_retrieve::value.

734 {
735  struct ast_data_retrieve ret;
736 
737  ast_data_retrieve(tree, path, &ret);
738 
739  return ret.value.AST_DATA_PASSWORD;
740 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
static void* ast_data_retrieve_ptr ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the ptr value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 763 of file data.h.

References ast_data_retrieve::AST_DATA_POINTER, ast_data_retrieve(), and ast_data_retrieve::value.

764 {
765  struct ast_data_retrieve ret;
766 
767  ast_data_retrieve(tree, path, &ret);
768 
769  return ret.value.AST_DATA_POINTER;
770 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
static const char* ast_data_retrieve_string ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the string value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 748 of file data.h.

References ast_data_retrieve(), ast_data_retrieve::AST_DATA_STRING, and ast_data_retrieve::value.

749 {
750  struct ast_data_retrieve ret;
751 
752  ast_data_retrieve(tree, path, &ret);
753 
754  return ret.value.AST_DATA_STRING;
755 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
enum ast_data_type ast_data_retrieve_type ( struct ast_data res,
const char *  path 
)

Get a node type.

Parameters
[in]resA pointer to the ast_data result set.
[in]pathA path to the node to get the type.
Returns
The type of the requested node type.

Definition at line 2213 of file data.c.

References data_result_get_node().

2214 {
2215  struct ast_data *internal;
2216 
2217  internal = data_result_get_node(node, path);
2218  if (!internal) {
2219  return -1;
2220  }
2221 
2222  return internal->type;
2223 }
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
static struct ast_data * data_result_get_node(struct ast_data *node, const char *path)
Definition: data.c:1565
static unsigned int ast_data_retrieve_uint ( struct ast_data tree,
const char *  path 
)
inlinestatic

Retrieve the unsigned integer value of a node.

Parameters
[in]treeThe tree from where to get the value.
[in]pathThe node name or path.
Returns
The value of the node.

Definition at line 718 of file data.h.

References ast_data_retrieve(), ast_data_retrieve::AST_DATA_UNSIGNED_INTEGER, and ast_data_retrieve::value.

719 {
720  struct ast_data_retrieve ret;
721 
722  ast_data_retrieve(tree, path, &ret);
723 
724  return ret.value.AST_DATA_UNSIGNED_INTEGER;
725 }
structure retrieved from a node, with the nodes content.
Definition: data.h:217
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.
Definition: data.c:2598
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.

Parameters
[in]searchThe search condition.
[in]dataThe AstData node generated.
Returns
1 If the "data" node matches the search condition.
0 If the "data" node does not matches the search condition.
See Also
ast_data_remove_node

Definition at line 1458 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::name, ast_data_search::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().

1459 {
1460  struct ao2_iterator i, ii;
1461  struct ast_data_search *s, *s_child;
1462  struct ast_data *d_child;
1463  int notmatch = 1;
1464 
1465  if (!search) {
1466  return 1;
1467  }
1468 
1469  s_child = data_search_find(search->children, data->name);
1470  if (!s_child) {
1471  /* nothing to compare */
1472  ao2_ref(s_child, -1);
1473  return 1;
1474  }
1475 
1476  i = ao2_iterator_init(s_child->children, 0);
1477  while ((s = ao2_iterator_next(&i))) {
1478  if (!ao2_container_count(s->children)) {
1479  /* compare this search node with every data node */
1480  d_child = data_result_find_child(data, s->name);
1481  if (!d_child) {
1482  ao2_ref(s, -1);
1483  notmatch = 1;
1484  continue;
1485  }
1486 
1487  switch (d_child->type) {
1488  case AST_DATA_PASSWORD:
1489  case AST_DATA_STRING:
1490  notmatch = data_search_cmp_string(s_child, d_child->name,
1491  d_child->payload.str);
1492  break;
1493  case AST_DATA_CHARACTER:
1494  notmatch = data_search_cmp_char(s_child, d_child->name,
1495  d_child->payload.character);
1496  break;
1497  case AST_DATA_INTEGER:
1498  notmatch = data_search_cmp_int(s_child, d_child->name,
1499  d_child->payload.sint);
1500  break;
1501  case AST_DATA_BOOLEAN:
1502  notmatch = data_search_cmp_bool(s_child, d_child->name,
1503  d_child->payload.boolean);
1504  break;
1506  notmatch = data_search_cmp_uint(s_child, d_child->name,
1507  d_child->payload.uint);
1508  break;
1509  case AST_DATA_TIMESTAMP:
1510  case AST_DATA_SECONDS:
1511  case AST_DATA_MILLISECONDS:
1512  case AST_DATA_DOUBLE:
1513  notmatch = data_search_cmp_uint(s_child, d_child->name,
1514  d_child->payload.dbl);
1515  break;
1516  case AST_DATA_IPADDR:
1517  notmatch = data_search_cmp_ipaddr(s_child, d_child->name,
1518  d_child->payload.ipaddr);
1519  break;
1520  case AST_DATA_POINTER:
1521  notmatch = data_search_cmp_ptr(s_child, d_child->name,
1522  d_child->payload.ptr);
1523  break;
1524  case AST_DATA_CONTAINER:
1525  break;
1526  }
1527  ao2_ref(d_child, -1);
1528  } else {
1529  ii = ao2_iterator_init(data->children, 0);
1530  while ((d_child = ao2_iterator_next(&ii))) {
1531  if (strcmp(d_child->name, s->name)) {
1532  ao2_ref(d_child, -1);
1533  continue;
1534  }
1535  if (!(notmatch = !ast_data_search_match(s_child, d_child))) {
1536  /* do not continue if we have a match. */
1537  ao2_ref(d_child, -1);
1538  break;
1539  }
1540  ao2_ref(d_child, -1);
1541  }
1542  ao2_iterator_destroy(&ii);
1543  }
1544  ao2_ref(s, -1);
1545  if (notmatch) {
1546  /* do not continue if we don't have a match. */
1547  break;
1548  }
1549  }
1551 
1552  ao2_ref(s_child, -1);
1553 
1554  return !notmatch;
1555 }
static int data_search_cmp_ptr(const struct ast_data_search *root, const char *name, void *ptr)
Definition: data.c:1034
static struct ast_data_search * data_search_find(struct ao2_container *parent, const char *name)
Definition: data.c:722
unsigned int boolean
Definition: data.c:93
struct ao2_container * children
The list of nodes inside this node.
Definition: data.c:105
int ao2_container_count(struct ao2_container *c)
Returns the number of elements in a container.
Definition: astobj2.c:470
The data tree to be returned by the callbacks and managed by functions local to this file...
Definition: data.c:85
static int data_search_cmp_bool(const struct ast_data_search *root, const char *name, unsigned int value)
Definition: data.c:1102
uint32_t uint
Definition: data.c:91
#define ao2_iterator_next(arg1)
Definition: astobj2.h:1126
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags)
Create an iterator for a container.
Definition: astobj2.c:818
int32_t sint
Definition: data.c:90
double dbl
Definition: data.c:92
enum ast_data_type type
Definition: data.c:86
#define ao2_ref(o, delta)
Definition: astobj2.h:472
The list of nodes with their search requirement.
Definition: data.c:122
union ast_data::@246 payload
The node content.
struct in_addr ipaddr
Definition: data.c:96
struct ao2_container * children
reference another node.
Definition: data.c:128
void ao2_iterator_destroy(struct ao2_iterator *i)
Destroy a container iterator.
Definition: astobj2.c:833
static int data_search_cmp_uint(const struct ast_data_search *root, const char *name, unsigned int value)
Definition: data.c:1166
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition: astobj2.h:1053
static int data_search_cmp_ipaddr(const struct ast_data_search *root, const char *name, struct in_addr addr)
Definition: data.c:1070
static struct ast_data * data_result_find_child(struct ast_data *root, const char *name)
Definition: data.c:1441
char name[0]
The name of the node.
Definition: data.c:107
char * str
Definition: data.c:94
void * ptr
Definition: data.c:97
static int data_search_cmp_int(const struct ast_data_search *root, const char *name, int value)
Definition: data.c:1198
char character
Definition: data.c:95
char name[0]
The name of the node we are trying to compare.
Definition: data.c:130
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.
Definition: data.c:1458
static int data_search_cmp_string(const struct ast_data_search *root, const char *name, char *value)
Definition: data.c:1002
static int data_search_cmp_char(const struct ast_data_search *root, const char *name, char value)
Definition: data.c:1230