From a1b89a6a50ced1b1c66610d4741b8b1396ca6fc4 Mon Sep 17 00:00:00 2001 From: "Eliel C. Sardanons" Date: Thu, 8 Jul 2010 14:48:42 +0000 Subject: Implement AstData API data providers as part of the GSOC 2010 project, midterm evaluation. Review: https://reviewboard.asterisk.org/r/757/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@274727 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- apps/app_voicemail.c | 107 ++++++++++++--------------------------------------- 1 file changed, 24 insertions(+), 83 deletions(-) (limited to 'apps/app_voicemail.c') 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) -- cgit v1.2.3