Asterisk - The Open Source Telephony Project GIT-master-8f1982c
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
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 = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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:1986
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:1991
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
Definition: manager.c:2018
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition: manager.c:1647
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
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
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
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:2179
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 }
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;
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",
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:1808
#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:2028
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:2064
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
Definition: manager.c:2072
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:1907
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, voicemailpwcheck::mailbox, 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. */
345 astman_send_error(s, m, "Update attempt failed");
346 } else {
347 astman_send_ack(s, m, NULL);
348 }
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(), voicemailpwcheck::mailbox, 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:7697

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 = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .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.