44 #include "asterisk/res_pjsip.h"
70 static int pjsip_aor_function_read(
struct ast_channel *chan,
71 const char *cmd,
char *data,
struct ast_str **buf, ssize_t len)
84 if (ast_strlen_zero(parsed_data)) {
85 ast_log(AST_LOG_ERROR,
"Cannot call %s without arguments\n", cmd);
91 if (ast_strlen_zero(args.aor_name)) {
92 ast_log(AST_LOG_ERROR,
"Cannot call %s without an AOR name to query\n", cmd);
96 if (ast_strlen_zero(args.field_name)) {
97 ast_log(AST_LOG_ERROR,
"Cannot call %s with an empty field name to query\n", cmd);
101 pjsip_sorcery = ast_sip_get_sorcery();
102 if (!pjsip_sorcery) {
103 ast_log(AST_LOG_ERROR,
"Unable to retrieve PJSIP configuration: sorcery object is NULL\n");
109 ast_log(AST_LOG_WARNING,
"Failed to retrieve information for AOR '%s'\n", args.aor_name);
113 if (!strcmp(args.field_name,
"contact")) {
122 contacts = ast_sip_location_retrieve_aor_contacts(aor_obj);
124 ast_log(LOG_WARNING,
"Failed to retrieve contacts for AOR '%s'\n", args.aor_name);
129 while ((contact = ao2_iterator_next(&i))) {
146 ast_log(AST_LOG_WARNING,
"Failed to retrieve information for AOR '%s': change set is NULL\n", args.aor_name);
150 for (it_change_set = change_set; it_change_set; it_change_set = it_change_set->
next) {
151 if (!strcmp(it_change_set->
name, args.field_name)) {
157 if (!it_change_set) {
158 ast_log(AST_LOG_WARNING,
"Unknown property '%s' for PJSIP AOR\n", args.field_name);
171 .read2 = pjsip_aor_function_read,
174 static int unload_module(
void)
179 static int load_module(
void)
184 AST_MODULE_INFO(
ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,
"Get information about a PJSIP AOR",
185 .support_level = AST_MODULE_SUPPORT_CORE,
187 .unload = unload_module,
188 .requires =
"res_pjsip",
struct ast_variable * next
Main Channel structure associated with a channel.
Asterisk main include file. File version handling, generic pbx functions.
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
Structure for variables, used for configurations and for channel variables.
Full structure for sorcery.
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
void * ast_sorcery_retrieve_by_id(const struct ast_sorcery *sorcery, const char *type, const char *id)
Retrieve an object using its unique identifier.
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
#define ast_strdupa(s)
duplicate a string in memory from the stack
Data structure associated with a custom dialplan function.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
const char * ast_sorcery_object_get_id(const void *object)
Get the unique identifier of a sorcery object.
Core PBX routines and definitions.
Support for dynamic strings.
#define ast_sorcery_objectset_create(sorcery, object)
Create an object set (KVP list) for an object.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
#define ASTERISK_GPL_KEY
The text the key() function should return.
Asterisk module definitions.
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
Application convenience functions, designed to give consistent look and feel to Asterisk apps...
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ast_custom_function_register(acf)
Register a custom function.
Sorcery Data Access Layer API.
#define AST_APP_ARG(name)
Define an application argument.