aboutsummaryrefslogtreecommitdiffstats
path: root/apps/app_voicemail.c
diff options
context:
space:
mode:
authoreliel <eliel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 14:48:42 +0000
committereliel <eliel@f38db490-d61c-443f-a65b-d21fe96a405b>2010-07-08 14:48:42 +0000
commit7a61a43adbc1ef91229e7757f6ac88619adff202 (patch)
tree80476efaba3fcc99c7526182d9ad935264c099eb /apps/app_voicemail.c
parentf28601a4b00a7b39fd8d3826b02c98e4b868e476 (diff)
Implement AstData API data providers as part of the GSOC 2010 project,
midterm evaluation. Review: https://reviewboard.asterisk.org/r/757/ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@274727 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps/app_voicemail.c')
-rw-r--r--apps/app_voicemail.c107
1 files changed, 24 insertions, 83 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 892c865a9..4e7a26e79 100644
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -10815,7 +10815,7 @@ static struct ast_cli_entry cli_voicemail[] = {
#define DATA_EXPORT_VM_USERS(USER) \
USER(ast_vm_user, context, AST_DATA_STRING) \
USER(ast_vm_user, mailbox, AST_DATA_STRING) \
- USER(ast_vm_user, password, AST_DATA_STRING) \
+ USER(ast_vm_user, password, AST_DATA_PASSWORD) \
USER(ast_vm_user, fullname, AST_DATA_STRING) \
USER(ast_vm_user, email, AST_DATA_STRING) \
USER(ast_vm_user, emailsubject, AST_DATA_STRING) \
@@ -10843,7 +10843,7 @@ static struct ast_cli_entry cli_voicemail[] = {
#define DATA_EXPORT_VM_USERS(USER) \
USER(ast_vm_user, context, AST_DATA_STRING) \
USER(ast_vm_user, mailbox, AST_DATA_STRING) \
- USER(ast_vm_user, password, AST_DATA_STRING) \
+ USER(ast_vm_user, password, AST_DATA_PASSWORD) \
USER(ast_vm_user, fullname, AST_DATA_STRING) \
USER(ast_vm_user, email, AST_DATA_STRING) \
USER(ast_vm_user, emailsubject, AST_DATA_STRING) \
@@ -10875,50 +10875,6 @@ AST_DATA_STRUCTURE(ast_vm_user, DATA_EXPORT_VM_USERS);
AST_DATA_STRUCTURE(vm_zone, DATA_EXPORT_VM_ZONES);
-#ifdef IMAP_STORAGE
- #define DATA_EXPORT_VM_STATES(STATE) \
- STATE(vm_state, curbox, AST_DATA_STRING) \
- STATE(vm_state, username, AST_DATA_STRING) \
- STATE(vm_state, context, AST_DATA_STRING) \
- STATE(vm_state, curdir, AST_DATA_STRING) \
- STATE(vm_state, vmbox, AST_DATA_STRING) \
- STATE(vm_state, fn, AST_DATA_STRING) \
- STATE(vm_state, intro, AST_DATA_STRING) \
- STATE(vm_state, curmsg, AST_DATA_INTEGER) \
- STATE(vm_state, lastmsg, AST_DATA_INTEGER) \
- STATE(vm_state, newmessages, AST_DATA_INTEGER) \
- STATE(vm_state, oldmessages, AST_DATA_INTEGER) \
- STATE(vm_state, urgentmessages, AST_DATA_INTEGER) \
- STATE(vm_state, starting, AST_DATA_INTEGER) \
- STATE(vm_state, repeats, AST_DATA_INTEGER) \
- STATE(vm_state, updated, AST_DATA_INTEGER) \
- STATE(vm_state, msgArray, AST_DATA_CONTAINER) \
- STATE(vm_state, vmArrayIndex, AST_DATA_INTEGER) \
- STATE(vm_state, imapuser, AST_DATA_STRING) \
- STATE(vm_state, interactive, AST_DATA_INTEGER) \
- STATE(vm_state, introfn, AST_DATA_STRING) \
- STATE(vm_state, quota_limit, AST_DATA_UNSIGNED_INTEGER) \
- STATE(vm_state, quota_usage, AST_DATA_UNSIGNED_INTEGER)
-#else
- #define DATA_EXPORT_VM_STATES(STATE) \
- STATE(vm_state, curbox, AST_DATA_STRING) \
- STATE(vm_state, username, AST_DATA_STRING) \
- STATE(vm_state, context, AST_DATA_STRING) \
- STATE(vm_state, curdir, AST_DATA_STRING) \
- STATE(vm_state, vmbox, AST_DATA_STRING) \
- STATE(vm_state, fn, AST_DATA_STRING) \
- STATE(vm_state, intro, AST_DATA_STRING) \
- STATE(vm_state, curmsg, AST_DATA_INTEGER) \
- STATE(vm_state, lastmsg, AST_DATA_INTEGER) \
- STATE(vm_state, newmessages, AST_DATA_INTEGER) \
- STATE(vm_state, oldmessages, AST_DATA_INTEGER) \
- STATE(vm_state, urgentmessages, AST_DATA_INTEGER) \
- STATE(vm_state, starting, AST_DATA_INTEGER) \
- STATE(vm_state, repeats, AST_DATA_INTEGER)
-#endif
-
-AST_DATA_STRUCTURE(vm_state, DATA_EXPORT_VM_STATES);
-
/*!
* \internal
* \brief Add voicemail user to the data_root.
@@ -10926,32 +10882,22 @@ AST_DATA_STRUCTURE(vm_state, DATA_EXPORT_VM_STATES);
* \param[in] data_root The main result node.
* \param[in] user The voicemail user.
*/
-static void vm_users_data_provider_get_helper(const struct ast_data_search *search,
+static int vm_users_data_provider_get_helper(const struct ast_data_search *search,
struct ast_data *data_root, struct ast_vm_user *user)
{
struct ast_data *data_user, *data_zone;
-#ifdef IMAP_STORAGE
struct ast_data *data_state;
- struct vm_state *state;
-#endif
struct vm_zone *zone = NULL;
-
- /* check the search pattern to make sure it's valid to add it */
- if (ast_data_search_cmp_structure(search, ast_vm_user, user, "user")) {
- return;
- }
+ int urgentmsg = 0, newmsg = 0, oldmsg = 0;
+ char ext_context[256] = "";
data_user = ast_data_add_node(data_root, "user");
if (!data_user) {
- return;
+ return -1;
}
ast_data_add_structure(ast_vm_user, data_user, user);
-#ifdef IMAP_STORAGE
- state = get_vm_state_by_mailbox(user->mailbox, user->context, 0);
-#endif
-
AST_LIST_LOCK(&zones);
AST_LIST_TRAVERSE(&zones, zone, list) {
if (!strcmp(zone->name, user->zonetag)) {
@@ -10960,35 +10906,30 @@ static void vm_users_data_provider_get_helper(const struct ast_data_search *sear
}
AST_LIST_UNLOCK(&zones);
- /* TODO: Should a user's vm state be accessible without compiling in
- * IMAP support? */
-
- if (
-#ifdef IMAP_STORAGE
- !ast_data_search_cmp_structure(search, vm_state, state, "user/state") ||
-#endif
- (zone && !ast_data_search_cmp_structure(search, vm_zone,
- zone, "user/zone"))) {
- ast_data_remove_node(data_root, data_user);
- return;
- }
-
-#ifdef IMAP_STORAGE
+ /* state */
data_state = ast_data_add_node(data_user, "state");
- ast_data_add_structure(vm_state, data_state, state);
- ast_data_add_int(data_state, "deleted", *(state->deleted));
- ast_data_add_int(data_state, "heard", *(state->heard));
-#endif
+ if (!data_state) {
+ return -1;
+ }
+ snprintf(ext_context, sizeof(ext_context), "%s@%s", user->mailbox, user->context);
+ inboxcount2(ext_context, &urgentmsg, &newmsg, &oldmsg);
+ ast_data_add_int(data_state, "urgentmsg", urgentmsg);
+ ast_data_add_int(data_state, "newmsg", newmsg);
+ ast_data_add_int(data_state, "oldmsg", oldmsg);
if (zone) {
data_zone = ast_data_add_node(data_user, "zone");
ast_data_add_structure(vm_zone, data_zone, zone);
}
- return;
+ if (!ast_data_search_match(search, data_user)) {
+ ast_data_remove_node(data_root, data_user);
+ }
+
+ return 0;
}
-static int vm_data_provider_get(const struct ast_data_search *search,
+static int vm_users_data_provider_get(const struct ast_data_search *search,
struct ast_data *data_root)
{
struct ast_vm_user *user;
@@ -11002,13 +10943,13 @@ static int vm_data_provider_get(const struct ast_data_search *search,
return 0;
}
-static const struct ast_data_handler vm_data_provider = {
+static const struct ast_data_handler vm_users_data_provider = {
.version = AST_DATA_HANDLER_VERSION,
- .get = vm_data_provider_get
+ .get = vm_users_data_provider_get
};
static const struct ast_data_entry vm_data_providers[] = {
- AST_DATA_ENTRY("asterisk/application/app_voicemail/voicemail", &vm_data_provider)
+ AST_DATA_ENTRY("asterisk/application/voicemail/list", &vm_users_data_provider)
};
static void poll_subscribed_mailbox(struct mwi_sub *mwi_sub)