Asterisk - The Open Source Telephony Project GIT-master-b023714
Loading...
Searching...
No Matches
Functions | Variables
res_mwi_external_ami.c File Reference

AMI wrapper for external MWI. More...

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/res_mwi_external.h"
#include "asterisk/manager.h"
Include dependency graph for res_mwi_external_ami.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int load_module (void)
 
static int mwi_mailbox_delete (struct mansession *s, const struct message *m)
 
static int mwi_mailbox_get (struct mansession *s, const struct message *m)
 
static int mwi_mailbox_update (struct mansession *s, const struct message *m)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "AMI support for external MWI" , .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 - 5, .requires = "res_mwi_external", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 

Detailed Description

AMI wrapper for external MWI.

Author
Richard Mudgett rmudg.nosp@m.ett@.nosp@m.digiu.nosp@m.m.co.nosp@m.m

See Also:

Definition in file res_mwi_external_ami.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 385 of file res_mwi_external_ami.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 385 of file res_mwi_external_ami.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 385 of file res_mwi_external_ami.c.

◆ load_module()

static int load_module ( void  )
static

Definition at line 363 of file res_mwi_external_ami.c.

364{
365 int res;
366
367 res = 0;
371 if (res) {
374 }
375
377}
#define EVENT_FLAG_REPORTING
Definition manager.h:84
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Definition manager.h:192
#define EVENT_FLAG_CALL
Definition manager.h:76
@ 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 int mwi_mailbox_get(struct mansession *s, const struct message *m)
static int unload_module(void)
static int mwi_mailbox_delete(struct mansession *s, const struct message *m)
static int mwi_mailbox_update(struct mansession *s, const struct message *m)

References ast_manager_register_xml, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, EVENT_FLAG_CALL, EVENT_FLAG_REPORTING, mwi_mailbox_delete(), mwi_mailbox_get(), mwi_mailbox_update(), and unload_module().

◆ mwi_mailbox_delete()

static int mwi_mailbox_delete ( struct mansession s,
const struct message m 
)
static

Definition at line 259 of file res_mwi_external_ami.c.

260{
261 const char *mailbox_id = astman_get_header(m, "Mailbox");
262
263 if (ast_strlen_zero(mailbox_id)) {
264 astman_send_error(s, m, "Missing mailbox parameter in request");
265 return 0;
266 }
267
268 if (*mailbox_id == '/') {
269 struct ast_str *regex_string;
270
271 regex_string = ast_str_create(strlen(mailbox_id) + 1);
272 if (!regex_string) {
273 astman_send_error(s, m, "Memory Allocation Failure");
274 return 0;
275 }
276
277 /* Make "/regex/" into "regex" */
278 if (ast_regex_string_to_regex_pattern(mailbox_id, &regex_string) != 0) {
279 astman_send_error_va(s, m, "Mailbox regex format invalid in: %s", mailbox_id);
280 ast_free(regex_string);
281 return 0;
282 }
283
285 ast_free(regex_string);
286 } else {
287 ast_mwi_mailbox_delete(mailbox_id);
288 }
289
290 astman_send_ack(s, m, NULL);
291 return 0;
292}
#define ast_free(a)
Definition astmm.h:180
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Definition manager.c:1982
void astman_send_error_va(struct mansession *s, const struct message *m, const char *fmt,...)
Send error in manager transaction (with va_args support)
Definition manager.c:1987
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
Definition manager.c:2014
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition manager.c:1643
int ast_mwi_mailbox_delete_by_regex(const char *regex)
Delete all external MWI objects selected by the regular expression.
int ast_mwi_mailbox_delete(const char *mailbox_id)
Delete matching external MWI object.
#define NULL
Definition resample.c:96
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition strings.h:65
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
int ast_regex_string_to_regex_pattern(const char *regex_string, struct ast_str **regex_pattern)
Given a string regex_string in the form of "/regex/", convert it into the form of "regex".
Definition utils.c:2215
Support for dynamic strings.
Definition strings.h:623

References ast_free, ast_mwi_mailbox_delete(), ast_mwi_mailbox_delete_by_regex(), ast_regex_string_to_regex_pattern(), ast_str_buffer(), ast_str_create, ast_strlen_zero(), astman_get_header(), astman_send_ack(), astman_send_error(), astman_send_error_va(), and NULL.

Referenced by load_module().

◆ mwi_mailbox_get()

static int mwi_mailbox_get ( struct mansession s,
const struct message m 
)
static

Definition at line 162 of file res_mwi_external_ami.c.

163{
164 char id_text[256];
165 const char *id;
166 const char *mailbox_id = astman_get_header(m, "Mailbox");
167 const struct ast_mwi_mailbox_object *mailbox;
168 struct ao2_container *mailboxes;
169 unsigned count;
170 struct ao2_iterator iter;
171
172 if (ast_strlen_zero(mailbox_id)) {
173 astman_send_error(s, m, "Missing mailbox parameter in request");
174 return 0;
175 }
176
177 if (*mailbox_id == '/') {
178 struct ast_str *regex_string;
179
180 regex_string = ast_str_create(strlen(mailbox_id) + 1);
181 if (!regex_string) {
182 astman_send_error(s, m, "Memory Allocation Failure");
183 return 0;
184 }
185
186 /* Make "/regex/" into "regex" */
187 if (ast_regex_string_to_regex_pattern(mailbox_id, &regex_string) != 0) {
188 astman_send_error_va(s, m, "Mailbox regex format invalid in: %s", mailbox_id);
189 ast_free(regex_string);
190 return 0;
191 }
192
194 ast_free(regex_string);
195 } else {
197 if (mailboxes) {
198 mailbox = ast_mwi_mailbox_get(mailbox_id);
199 if (mailbox) {
200 if (!ao2_link(mailboxes, (void *) mailbox)) {
201 ao2_ref(mailboxes, -1);
202 mailboxes = NULL;
203 }
204 ast_mwi_mailbox_unref(mailbox);
205 }
206 }
207 }
208 if (!mailboxes) {
209 astman_send_error(s, m, "Mailbox container creation failure");
210 return 0;
211 }
212
213 astman_send_listack(s, m, "Mailboxes will follow", "start");
214
215 id = astman_get_header(m, "ActionID");
216 if (!ast_strlen_zero(id)) {
217 snprintf(id_text, sizeof(id_text), "ActionID: %s\r\n", id);
218 } else {
219 id_text[0] = '\0';
220 }
221
222 /* Output mailbox list. */
223 count = 0;
225 for (; (mailbox = ao2_iterator_next(&iter)); ast_mwi_mailbox_unref(mailbox)) {
226 ++count;
228 "Event: MWIGet\r\n"
229 "Mailbox: %s\r\n"
230 "OldMessages: %u\r\n"
231 "NewMessages: %u\r\n"
232 "%s"
233 "\r\n",
234 ast_mwi_mailbox_get_id(mailbox),
237 id_text);
238 }
240 ao2_ref(mailboxes, -1);
241
242 astman_send_list_complete_start(s, m, "MWIGetComplete", count);
244
245 return 0;
246}
enum queue_result id
Definition app_queue.c:1767
#define ao2_iterator_next(iter)
Definition astobj2.h:1911
#define ao2_link(container, obj)
Add an object to a container.
Definition astobj2.h:1532
@ AO2_ALLOC_OPT_LOCK_NOLOCK
Definition astobj2.h:367
@ AO2_ITERATOR_UNLINK
Definition astobj2.h:1863
struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags) attribute_warn_unused_result
Create an iterator for a container.
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition astobj2.h:459
void ao2_iterator_destroy(struct ao2_iterator *iter)
Destroy a container iterator.
#define ao2_container_alloc_list(ao2_options, container_options, sort_fn, cmp_fn)
Allocate and initialize a list container.
Definition astobj2.h:1327
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
Definition manager.c:2024
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
Definition manager.c:2060
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
Definition manager.c:2068
void astman_append(struct mansession *s, const char *fmt,...)
Definition manager.c:1903
static struct stasis_rest_handlers mailboxes
REST handler for /api-docs/mailboxes.json.
const struct ast_mwi_mailbox_object * ast_mwi_mailbox_get(const char *mailbox_id)
Get matching external MWI object.
const char * ast_mwi_mailbox_get_id(const struct ast_mwi_mailbox_object *mailbox)
Get mailbox id.
unsigned int ast_mwi_mailbox_get_msgs_old(const struct ast_mwi_mailbox_object *mailbox)
Get the number of old messages.
unsigned int ast_mwi_mailbox_get_msgs_new(const struct ast_mwi_mailbox_object *mailbox)
Get the number of new messages.
#define ast_mwi_mailbox_unref(mailbox)
Convenience unref function for mailbox object.
struct ao2_container * ast_mwi_mailbox_get_by_regex(const char *regex)
Get all external MWI objects selected by the regular expression.
Generic container type.
When we need to walk through a container, we use an ao2_iterator to keep track of the current positio...
Definition astobj2.h:1821

References AO2_ALLOC_OPT_LOCK_NOLOCK, ao2_container_alloc_list, ao2_iterator_destroy(), ao2_iterator_init(), ao2_iterator_next, AO2_ITERATOR_UNLINK, ao2_link, ao2_ref, ast_free, ast_mwi_mailbox_get(), ast_mwi_mailbox_get_by_regex(), ast_mwi_mailbox_get_id(), ast_mwi_mailbox_get_msgs_new(), ast_mwi_mailbox_get_msgs_old(), ast_mwi_mailbox_unref, ast_regex_string_to_regex_pattern(), ast_str_buffer(), ast_str_create, ast_strlen_zero(), astman_append(), astman_get_header(), astman_send_error(), astman_send_error_va(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), id, mailboxes, and NULL.

Referenced by load_module().

◆ mwi_mailbox_update()

static int mwi_mailbox_update ( struct mansession s,
const struct message m 
)
static

Definition at line 305 of file res_mwi_external_ami.c.

306{
307 const char *mailbox_id = astman_get_header(m, "Mailbox");
308 const char *msgs_old = astman_get_header(m, "OldMessages");
309 const char *msgs_new = astman_get_header(m, "NewMessages");
311 unsigned int num_old;
312 unsigned int num_new;
313
314 if (ast_strlen_zero(mailbox_id)) {
315 astman_send_error(s, m, "Missing mailbox parameter in request");
316 return 0;
317 }
318
319 num_old = 0;
321 if (sscanf(msgs_old, "%u", &num_old) != 1) {
322 astman_send_error_va(s, m, "Invalid OldMessages: %s", msgs_old);
323 return 0;
324 }
325 }
326
327 num_new = 0;
329 if (sscanf(msgs_new, "%u", &num_new) != 1) {
330 astman_send_error_va(s, m, "Invalid NewMessages: %s", msgs_new);
331 return 0;
332 }
333 }
334
335 mailbox = ast_mwi_mailbox_alloc(mailbox_id);
336 if (!mailbox) {
337 astman_send_error(s, m, "Mailbox object creation failure");
338 return 0;
339 }
340
341 /* Update external mailbox. */
342 ast_mwi_mailbox_set_msgs_old(mailbox, num_old);
343 ast_mwi_mailbox_set_msgs_new(mailbox, num_new);
344 if (ast_mwi_mailbox_update(mailbox)) {
345 astman_send_error(s, m, "Update attempt failed");
346 } else {
347 astman_send_ack(s, m, NULL);
348 }
349 ast_mwi_mailbox_unref(mailbox);
350
351 return 0;
352}
int ast_mwi_mailbox_update(struct ast_mwi_mailbox_object *mailbox)
Update the external MWI counts with the given object.
struct ast_mwi_mailbox_object * ast_mwi_mailbox_alloc(const char *mailbox_id)
Allocate an external MWI object.
void ast_mwi_mailbox_set_msgs_new(struct ast_mwi_mailbox_object *mailbox, unsigned int num_msgs)
Set the number of new messages.
void ast_mwi_mailbox_set_msgs_old(struct ast_mwi_mailbox_object *mailbox, unsigned int num_msgs)
Set the number of old messages.

References ast_mwi_mailbox_alloc(), ast_mwi_mailbox_set_msgs_new(), ast_mwi_mailbox_set_msgs_old(), ast_mwi_mailbox_unref, ast_mwi_mailbox_update(), ast_strlen_zero(), astman_get_header(), astman_send_ack(), astman_send_error(), astman_send_error_va(), ast_mwi_mailbox_object::msgs_new, ast_mwi_mailbox_object::msgs_old, and NULL.

Referenced by load_module().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 354 of file res_mwi_external_ami.c.

355{
356 ast_manager_unregister("MWIGet");
357 ast_manager_unregister("MWIDelete");
358 ast_manager_unregister("MWIUpdate");
359
360 return 0;
361}
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition manager.c:7698

References ast_manager_unregister().

Referenced by load_module().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "AMI support for external MWI" , .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 - 5, .requires = "res_mwi_external", }
static

Definition at line 385 of file res_mwi_external_ami.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 385 of file res_mwi_external_ami.c.