Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
res_pjsip_dialog_info_body_generator.c File Reference
#include "asterisk.h"
#include <pjsip.h>
#include <pjsip_simple.h>
#include <pjlib.h>
#include "asterisk/module.h"
#include "asterisk/callerid.h"
#include "asterisk/res_pjsip.h"
#include "asterisk/res_pjsip_pubsub.h"
#include "asterisk/res_pjsip_presence_xml.h"
#include "asterisk/res_pjsip_body_generator_types.h"
Include dependency graph for res_pjsip_dialog_info_body_generator.c:

Go to the source code of this file.

Data Structures

struct  dialog_info_xml_state
 Structure which contains dialog-info+xml state information. More...
 

Macros

#define MAX_STRING_GROWTHS   6
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static void * dialog_info_allocate_body (void *data)
 
static int dialog_info_generate_body_content (void *body, void *data)
 
static void dialog_info_to_string (void *body, struct ast_str **str)
 
static void dialog_info_xml_state_destroy (void *obj)
 Destructor for dialog-info+xml information.
 
static struct ast_channelfind_ringing_channel (struct ao2_container *device_state_info)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP Extension State Dialog Info+XML Provider" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DEPEND, .requires = "res_pjsip,res_pjsip_pubsub", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_sip_pubsub_body_generator dialog_info_body_generator
 
static const struct ast_datastore_info dialog_info_xml_datastore
 Datastore for attaching dialog-info+xml state information.
 

Macro Definition Documentation

◆ MAX_STRING_GROWTHS

#define MAX_STRING_GROWTHS   6

Definition at line 284 of file res_pjsip_dialog_info_body_generator.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 339 of file res_pjsip_dialog_info_body_generator.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 339 of file res_pjsip_dialog_info_body_generator.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 339 of file res_pjsip_dialog_info_body_generator.c.

◆ dialog_info_allocate_body()

static void * dialog_info_allocate_body ( void *  data)
static

Definition at line 57 of file res_pjsip_dialog_info_body_generator.c.

58{
59 struct ast_sip_exten_state_data *state_data = data;
60
61 return ast_sip_presence_xml_create_node(state_data->pool, NULL, "dialog-info");
62}
pj_xml_node * ast_sip_presence_xml_create_node(pj_pool_t *pool, pj_xml_node *parent, const char *name)
Create XML node.
#define NULL
Definition resample.c:96
structure used for presence XML bodies

References ast_sip_presence_xml_create_node(), NULL, and ast_sip_exten_state_data::pool.

◆ dialog_info_generate_body_content()

static int dialog_info_generate_body_content ( void *  body,
void *  data 
)
static

Definition at line 93 of file res_pjsip_dialog_info_body_generator.c.

94{
95 pj_xml_node *dialog_info = body, *dialog, *state;
96 struct ast_datastore *datastore;
97 struct dialog_info_xml_state *datastore_state;
98 struct ast_sip_exten_state_data *state_data = data;
99 char *local = ast_strdupa(state_data->local), *stripped, *statestring = NULL;
100 char *remote = ast_strdupa(state_data->remote);
101 char *pidfstate = NULL, *pidfnote = NULL;
102 enum ast_sip_pidf_state local_state;
103 char version_str[32], sanitized[PJSIP_MAX_URL_SIZE];
104 struct ast_sip_endpoint *endpoint = NULL;
105 unsigned int notify_early_inuse_ringing = 0;
106
107 if (!local || !remote || !state_data->datastores) {
108 return -1;
109 }
110
111 datastore = ast_datastores_find(state_data->datastores, "dialog-info+xml");
112 if (!datastore) {
113 const struct ast_json *version_json = NULL;
114
115 datastore = ast_datastores_alloc_datastore(&dialog_info_xml_datastore, "dialog-info+xml");
116 if (!datastore) {
117 return -1;
118 }
119
120 datastore->data = ast_calloc(1, sizeof(struct dialog_info_xml_state));
121 if (!datastore->data || ast_datastores_add(state_data->datastores, datastore)) {
122 ao2_ref(datastore, -1);
123 return -1;
124 }
125 datastore_state = datastore->data;
126
127 if (state_data->sub) {
128 version_json = ast_sip_subscription_get_persistence_data(state_data->sub);
129 }
130
131 if (version_json) {
132 datastore_state->version = ast_json_integer_get(version_json);
133 datastore_state->version++;
134 } else {
135 datastore_state->version = 0;
136 }
137 } else {
138 datastore_state = datastore->data;
139 datastore_state->version++;
140 }
141
142 stripped = ast_strip_quoted(local, "<", ">");
143 ast_sip_sanitize_xml(stripped, sanitized, sizeof(sanitized));
144
145 if (state_data->sub && (endpoint = ast_sip_subscription_get_endpoint(state_data->sub))) {
146 notify_early_inuse_ringing = endpoint->notify_early_inuse_ringing;
147 ao2_cleanup(endpoint);
148 }
149 ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
150 &pidfstate, &pidfnote, &local_state, notify_early_inuse_ringing);
151
152 ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "xmlns", "urn:ietf:params:xml:ns:dialog-info");
153
154 snprintf(version_str, sizeof(version_str), "%u", datastore_state->version);
155 ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "version", version_str);
156
157 if (state_data->sub) {
159 }
160
161 ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "state", "full");
162 ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "entity", sanitized);
163
164 dialog = ast_sip_presence_xml_create_node(state_data->pool, dialog_info, "dialog");
165 ast_sip_presence_xml_create_attr(state_data->pool, dialog, "id", state_data->exten);
166 if (!ast_strlen_zero(statestring) && !strcmp(statestring, "early")) {
167 struct ast_channel *callee = NULL;
168 char local_target[PJSIP_MAX_URL_SIZE + 32] = "";
169 char *local_cid_name = NULL;
170 pj_xml_node *local_node, *local_identity_node, *local_target_node;
171
172 ast_sip_presence_xml_create_attr(state_data->pool, dialog, "direction", "recipient");
173
174 if (state_data->device_state_info) {
175 callee = find_ringing_channel(state_data->device_state_info);
176 }
177
178 if (callee) {
179 static char *anonymous = "anonymous";
180 static char *invalid = "anonymous.invalid";
181 char *remote_cid_name;
182 char *remote_connected_num;
183 int remote_connected_num_restricted;
184 char *local_caller_num;
185 pjsip_dialog *dlg = ast_sip_subscription_get_dialog(state_data->sub);
186 char remote_target[PJSIP_MAX_URL_SIZE + 32];
187 char dlg_remote_uri[PJSIP_MAX_URL_SIZE];
188 char *from_domain_stripped;
189 char from_domain_sanitized[PJSIP_MAX_URL_SIZE];
190 pj_xml_node *remote_node, *remote_identity_node, *remote_target_node;
191
192 /* We use the local dialog URI to determine the domain to use in the XML itself */
193 ast_copy_pj_str(dlg_remote_uri, ast_sip_pjsip_uri_get_hostname(dlg->local.info->uri), sizeof(dlg_remote_uri));
194 from_domain_stripped = ast_strip_quoted(dlg_remote_uri, "<", ">");
195 ast_sip_sanitize_xml(from_domain_stripped, from_domain_sanitized, sizeof(from_domain_sanitized));
196
197 ast_channel_lock(callee);
198
199 /* The remote node uses the connected line information, so who is calling the
200 * monitored endpoint.
201 */
202 remote_cid_name = S_COR(ast_channel_connected(callee)->id.name.valid,
203 S_COR((ast_channel_connected(callee)->id.name.presentation &
205 ast_channel_connected(callee)->id.name.str), "");
206
207 remote_connected_num_restricted = (ast_channel_connected(callee)->id.number.presentation &
209 remote_connected_num = S_COR(ast_channel_connected(callee)->id.number.valid,
210 S_COR(remote_connected_num_restricted, anonymous,
211 ast_channel_connected(callee)->id.number.str), "invalid");
212
213 snprintf(remote_target, sizeof(remote_target), "sip:%s@%s", remote_connected_num,
214 remote_connected_num_restricted ? invalid : from_domain_sanitized);
215
216 /* The local node uses the callerid information, so what the callerid would be
217 * if the monitored endpoint was calling.
218 */
219 local_cid_name = S_COR(ast_channel_caller(callee)->id.name.valid,
220 ast_channel_caller(callee)->id.name.str, "");
221 local_caller_num = S_COR(ast_channel_caller(callee)->id.number.valid,
222 ast_channel_caller(callee)->id.number.str, "invalid");
223
224 snprintf(local_target, sizeof(local_target), "sip:%s@%s", local_caller_num,
225 from_domain_sanitized);
226
227 ast_channel_unlock(callee);
228 callee = ast_channel_unref(callee);
229
230 remote_node = ast_sip_presence_xml_create_node(state_data->pool, dialog, "remote");
231 remote_identity_node = ast_sip_presence_xml_create_node(state_data->pool, remote_node, "identity");
232 remote_target_node = ast_sip_presence_xml_create_node(state_data->pool, remote_node, "target");
233
234 pj_strdup2(state_data->pool, &remote_identity_node->content, remote_target);
235 if (!ast_strlen_zero(remote_cid_name)) {
236 char display_sanitized[PJSIP_MAX_URL_SIZE];
237
238 ast_sip_sanitize_xml(remote_cid_name, display_sanitized, sizeof(display_sanitized));
239 ast_sip_presence_xml_create_attr(state_data->pool, remote_identity_node, "display", display_sanitized);
240 }
241 ast_sip_presence_xml_create_attr(state_data->pool, remote_target_node, "uri", remote_target);
242 }
243
244 if (state_data->device_state_info) {
245 local_node = ast_sip_presence_xml_create_node(state_data->pool, dialog, "local");
246 local_identity_node = ast_sip_presence_xml_create_node(state_data->pool, local_node, "identity");
247 local_target_node = ast_sip_presence_xml_create_node(state_data->pool, local_node, "target");
248
249 /* If a channel is not available we fall back to the sanitized local URI instead */
250 pj_strdup2(state_data->pool, &local_identity_node->content, S_OR(local_target, sanitized));
251 if (!ast_strlen_zero(local_cid_name)) {
252 char display_sanitized[PJSIP_MAX_URL_SIZE];
253
254 ast_sip_sanitize_xml(local_cid_name, display_sanitized, sizeof(display_sanitized));
255 ast_sip_presence_xml_create_attr(state_data->pool, local_identity_node, "display", display_sanitized);
256 }
257
258 ast_sip_presence_xml_create_attr(state_data->pool, local_target_node, "uri", sanitized);
259 }
260 }
261
262 state = ast_sip_presence_xml_create_node(state_data->pool, dialog, "state");
263 pj_strdup2(state_data->pool, &state->content, statestring);
264
265 if (state_data->exten_state == AST_EXTENSION_ONHOLD) {
266 pj_xml_node *local_node, *target, *param;
267
268 local_node = ast_sip_presence_xml_create_node(state_data->pool, dialog, "local");
269 target = ast_sip_presence_xml_create_node(state_data->pool, local_node, "target");
270 ast_sip_presence_xml_create_attr(state_data->pool, target, "uri", sanitized);
271 param = ast_sip_presence_xml_create_node(state_data->pool, target, "param");
272 ast_sip_presence_xml_create_attr(state_data->pool, param, "pname", "+sip.rendering");
273 ast_sip_presence_xml_create_attr(state_data->pool, param, "pvalue", "no");
274 }
275
276 ao2_ref(datastore, -1);
277
278 return 0;
279}
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition astmm.h:298
#define ast_calloc(num, len)
A wrapper for calloc()
Definition astmm.h:202
#define ao2_cleanup(obj)
Definition astobj2.h:1934
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
#define AST_PRES_RESTRICTED
Definition callerid.h:433
#define AST_PRES_RESTRICTION
Definition callerid.h:431
#define ast_channel_lock(chan)
Definition channel.h:2982
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
#define ast_channel_unref(c)
Decrease channel reference count.
Definition channel.h:3018
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
#define ast_channel_unlock(chan)
Definition channel.h:2983
int ast_datastores_add(struct ao2_container *datastores, struct ast_datastore *datastore)
Add a data store to a container.
Definition datastore.c:105
struct ast_datastore * ast_datastores_find(struct ao2_container *datastores, const char *name)
Find a data store in a container.
Definition datastore.c:123
struct ast_datastore * ast_datastores_alloc_datastore(const struct ast_datastore_info *info, const char *uid)
Allocate a datastore for use with the datastores container.
Definition datastore.c:142
static const char name[]
Definition format_mp3.c:68
struct ast_json * ast_json_integer_create(intmax_t value)
Create a JSON integer.
Definition json.c:327
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
Definition json.c:332
@ AST_EXTENSION_ONHOLD
Definition pbx.h:69
void ast_copy_pj_str(char *dest, const pj_str_t *src, size_t size)
Copy a pj_str_t into a standard character buffer.
Definition res_pjsip.c:2201
const pj_str_t * ast_sip_pjsip_uri_get_hostname(pjsip_uri *uri)
Get the host portion of the pjsip_uri.
Definition res_pjsip.c:3496
static struct ast_channel * find_ringing_channel(struct ao2_container *device_state_info)
static const struct ast_datastore_info dialog_info_xml_datastore
Datastore for attaching dialog-info+xml state information.
void ast_sip_sanitize_xml(const char *input, char *output, size_t len)
Replace offensive XML characters with XML entities.
void ast_sip_presence_exten_state_to_str(int state, char **statestring, char **pidfstate, char **pidfnote, enum ast_sip_pidf_state *local_state, unsigned int notify_early_inuse_ringing)
Convert extension state to relevant PIDF strings.
pj_xml_attr * ast_sip_presence_xml_create_attr(pj_pool_t *pool, pj_xml_node *node, const char *name, const char *value)
Create XML attribute.
struct ast_sip_endpoint * ast_sip_subscription_get_endpoint(struct ast_sip_subscription *sub)
Get the endpoint that is associated with this subscription.
const struct ast_json * ast_sip_subscription_get_persistence_data(const struct ast_sip_subscription *subscription)
Retrieve persistence data for a subscription.
void ast_sip_subscription_set_persistence_data(struct ast_sip_subscription *subscription, struct ast_json *persistence_data)
Set persistence data for a subscription.
pjsip_dialog * ast_sip_subscription_get_dialog(struct ast_sip_subscription *sub)
Get the pjsip dialog that is associated with this subscription.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition strings.h:80
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition strings.h:87
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
char * ast_strip_quoted(char *s, const char *beg_quotes, const char *end_quotes)
Strip leading/trailing whitespace and quotes from a string.
Definition utils.c:1854
Main Channel structure associated with a channel.
Structure for a data store object.
Definition datastore.h:64
void * data
Definition datastore.h:66
Abstract JSON element (object, array, string, int, ...).
struct ast_party_id id
Connected party ID.
Definition channel.h:460
struct ast_party_number number
Subscriber phone number.
Definition channel.h:344
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
Definition channel.h:297
An entity with which Asterisk communicates.
Definition res_pjsip.h:1051
unsigned int notify_early_inuse_ringing
Definition res_pjsip.h:1140
struct ast_sip_subscription * sub
enum ast_extension_states exten_state
Structure which contains dialog-info+xml state information.
unsigned int version
Version to place into the next NOTIFY.
Number structure.

References ao2_cleanup, ao2_ref, ast_calloc, ast_channel_caller(), ast_channel_connected(), ast_channel_lock, ast_channel_unlock, ast_channel_unref, ast_copy_pj_str(), ast_datastores_add(), ast_datastores_alloc_datastore(), ast_datastores_find(), AST_EXTENSION_ONHOLD, ast_json_integer_create(), ast_json_integer_get(), AST_PRES_RESTRICTED, AST_PRES_RESTRICTION, ast_sip_pjsip_uri_get_hostname(), ast_sip_presence_exten_state_to_str(), ast_sip_presence_xml_create_attr(), ast_sip_presence_xml_create_node(), ast_sip_sanitize_xml(), ast_sip_subscription_get_dialog(), ast_sip_subscription_get_endpoint(), ast_sip_subscription_get_persistence_data(), ast_sip_subscription_set_persistence_data(), ast_strdupa, ast_strip_quoted(), ast_strlen_zero(), ast_datastore::data, ast_sip_exten_state_data::datastores, ast_sip_exten_state_data::device_state_info, dialog_info_xml_datastore, ast_sip_exten_state_data::exten, ast_sip_exten_state_data::exten_state, find_ringing_channel(), ast_party_connected_line::id, ast_sip_exten_state_data::local, name, ast_sip_endpoint::notify_early_inuse_ringing, NULL, ast_party_id::number, ast_sip_exten_state_data::pool, ast_party_number::presentation, ast_sip_exten_state_data::remote, S_COR, S_OR, ast_sip_exten_state_data::sub, and dialog_info_xml_state::version.

◆ dialog_info_to_string()

static void dialog_info_to_string ( void *  body,
struct ast_str **  str 
)
static

Definition at line 286 of file res_pjsip_dialog_info_body_generator.c.

287{
288 pj_xml_node *dialog_info = body;
289 int growths = 0;
290 int size;
291
292 do {
293 size = pj_xml_print(dialog_info, ast_str_buffer(*str), ast_str_size(*str) - 1, PJ_TRUE);
294 if (size <= AST_PJSIP_XML_PROLOG_LEN) {
296 ++growths;
297 }
298 } while (size <= AST_PJSIP_XML_PROLOG_LEN && growths < MAX_STRING_GROWTHS);
299 if (size <= AST_PJSIP_XML_PROLOG_LEN) {
300 ast_log(LOG_WARNING, "dialog-info+xml body text too large\n");
301 return;
302 }
303
304 *(ast_str_buffer(*str) + size) = '\0';
306}
const char * str
Definition app_jack.c:150
#define ast_log
Definition astobj2.c:42
#define LOG_WARNING
#define AST_PJSIP_XML_PROLOG_LEN
Length of the XML prolog when printing presence or other XML in PJSIP.
#define ast_str_make_space(buf, new_len)
Definition strings.h:828
void ast_str_update(struct ast_str *buf)
Update the length of the buffer, after using ast_str merely as a buffer.
Definition strings.h:703
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
size_t attribute_pure ast_str_size(const struct ast_str *buf)
Returns the current maximum length (without reallocation) of the current buffer.
Definition strings.h:742

References ast_log, AST_PJSIP_XML_PROLOG_LEN, ast_str_buffer(), ast_str_make_space, ast_str_size(), ast_str_update(), LOG_WARNING, MAX_STRING_GROWTHS, and str.

◆ dialog_info_xml_state_destroy()

static void dialog_info_xml_state_destroy ( void *  obj)
static

Destructor for dialog-info+xml information.

Definition at line 46 of file res_pjsip_dialog_info_body_generator.c.

47{
48 ast_free(obj);
49}
#define ast_free(a)
Definition astmm.h:180

References ast_free.

◆ find_ringing_channel()

static struct ast_channel * find_ringing_channel ( struct ao2_container device_state_info)
static

Definition at line 68 of file res_pjsip_dialog_info_body_generator.c.

69{
70 struct ao2_iterator citer;
72 struct ast_channel *c = NULL;
73 struct timeval tv = {0,};
74
75 /* iterate ringing devices and get the oldest of all causing channels */
76 citer = ao2_iterator_init(device_state_info, 0);
77 for (; (device_state = ao2_iterator_next(&citer)); ao2_ref(device_state, -1)) {
78 if (!device_state->causing_channel || (device_state->device_state != AST_DEVICE_RINGING &&
79 device_state->device_state != AST_DEVICE_RINGINUSE)) {
80 continue;
81 }
82 ast_channel_lock(device_state->causing_channel);
83 if (ast_tvzero(tv) || ast_tvcmp(ast_channel_creationtime(device_state->causing_channel), tv) < 0) {
84 c = device_state->causing_channel;
86 }
88 }
90 return c ? ast_channel_ref(c) : NULL;
91}
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ast_channel_ref(c)
Increase channel reference count.
Definition channel.h:3007
struct timeval ast_channel_creationtime(struct ast_channel *chan)
@ AST_DEVICE_RINGINUSE
Definition devicestate.h:60
@ AST_DEVICE_RINGING
Definition devicestate.h:59
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821
struct ast_channel * causing_channel
Definition pbx.h:98
enum ast_device_state device_state
Definition pbx.h:97
static struct test_val c
int ast_tvzero(const struct timeval t)
Returns true if the argument is 0,0.
Definition time.h:117
int ast_tvcmp(struct timeval _a, struct timeval _b)
Compress two struct timeval instances returning -1, 0, 1 if the first arg is smaller,...
Definition time.h:137

References ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, ao2_ref, ast_channel_creationtime(), ast_channel_lock, ast_channel_ref, ast_channel_unlock, AST_DEVICE_RINGING, AST_DEVICE_RINGINUSE, ast_tvcmp(), ast_tvzero(), c, ast_device_state_info::causing_channel, ast_device_state_info::device_state, and NULL.

Referenced by dialog_info_generate_body_content().

◆ load_module()

static int load_module ( void  )
static

Definition at line 318 of file res_pjsip_dialog_info_body_generator.c.

319{
322 }
323
325}
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
static struct ast_sip_pubsub_body_generator dialog_info_body_generator
int ast_sip_pubsub_register_body_generator(struct ast_sip_pubsub_body_generator *generator)
Register a body generator with the pubsub core.

References AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_sip_pubsub_register_body_generator(), and dialog_info_body_generator.

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 327 of file res_pjsip_dialog_info_body_generator.c.

328{
330 return 0;
331}
void ast_sip_pubsub_unregister_body_generator(struct ast_sip_pubsub_body_generator *generator)
Unregister a body generator with the pubsub core.

References ast_sip_pubsub_unregister_body_generator(), and dialog_info_body_generator.

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "PJSIP Extension State Dialog Info+XML Provider" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_CHANNEL_DEPEND, .requires = "res_pjsip,res_pjsip_pubsub", }
static

Definition at line 339 of file res_pjsip_dialog_info_body_generator.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 339 of file res_pjsip_dialog_info_body_generator.c.

◆ dialog_info_body_generator

struct ast_sip_pubsub_body_generator dialog_info_body_generator
static

Definition at line 308 of file res_pjsip_dialog_info_body_generator.c.

308 {
309 .type = "application",
310 .subtype = "dialog-info+xml",
311 .body_type = AST_SIP_EXTEN_STATE_DATA,
312 .allocate_body = dialog_info_allocate_body,
313 .generate_body_content = dialog_info_generate_body_content,
314 .to_string = dialog_info_to_string,
315 /* No need for a destroy_body callback since we use a pool */
316};
static void dialog_info_to_string(void *body, struct ast_str **str)
static int dialog_info_generate_body_content(void *body, void *data)
static void * dialog_info_allocate_body(void *data)
#define AST_SIP_EXTEN_STATE_DATA

Referenced by load_module(), and unload_module().

◆ dialog_info_xml_datastore

const struct ast_datastore_info dialog_info_xml_datastore
static
Initial value:
= {
.type = "dialog-info+xml",
}
static void dialog_info_xml_state_destroy(void *obj)
Destructor for dialog-info+xml information.

Datastore for attaching dialog-info+xml state information.

Definition at line 52 of file res_pjsip_dialog_info_body_generator.c.

52 {
53 .type = "dialog-info+xml",
55};

Referenced by dialog_info_generate_body_content().