diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c index d01730101b329b253879f4fe583dca5954386c7f..c155186a25a46c3436d37bfb9b31112b21fff10b 100644 --- a/apps/app_voicemail.c +++ b/apps/app_voicemail.c @@ -463,6 +463,23 @@ <description> </description> </manager> + <manager name="VoicemailUserStatus" language="en_US"> + <synopsis> + Show the status of given voicemail user's info. + </synopsis> + <syntax> + <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" /> + <parameter name="Context" required="true"> + <para>The context you want to check.</para> + </parameter> + <parameter name="Mailbox" required="true"> + <para>The mailbox you want to check.</para> + </parameter> + </syntax> + <description> + <para>Retrieves the status of the given voicemail user.</para> + </description> + </manager> <manager name="VoicemailRefresh" language="en_US"> <synopsis> Tell Asterisk to poll mailboxes for a change @@ -1105,6 +1122,8 @@ static int write_password_to_file(const char *secretfn, const char *password); static const char *substitute_escapes(const char *value); static int message_range_and_existence_check(struct vm_state *vms, const char *msg_ids [], size_t num_msgs, int *msg_nums, struct ast_vm_user *vmu); static void notify_new_state(struct ast_vm_user *vmu); +static int append_vmu_info_astman(struct mansession *s, struct ast_vm_user *vmu, const char* event_name, const char* actionid); + /*! * Place a message in the indicated folder @@ -13222,6 +13241,105 @@ static void stop_poll_thread(void) poll_thread = AST_PTHREADT_NULL; } +/*! \brief Append vmu info string into given astman with event_name. */ +static int append_vmu_info_astman( + struct mansession *s, + struct ast_vm_user *vmu, + const char* event_name, + const char* actionid + ) +{ + int new; + int old; + + if((s == NULL) || (vmu == NULL) || (event_name == NULL) || (actionid == NULL)) { + ast_log(LOG_ERROR, "Wrong input parameter."); + return 0; + } + + /* get mailbox count */ + inboxcount(vmu->mailbox, &new, &old); + + astman_append(s, + "Event: %s\r\n" + "%s" + "VMContext: %s\r\n" + "VoiceMailbox: %s\r\n" + "Fullname: %s\r\n" + "Email: %s\r\n" + "Pager: %s\r\n" + "ServerEmail: %s\r\n" + "FromString: %s\r\n" + "MailCommand: %s\r\n" + "Language: %s\r\n" + "TimeZone: %s\r\n" + "Callback: %s\r\n" + "Dialout: %s\r\n" + "UniqueID: %s\r\n" + "ExitContext: %s\r\n" + "SayDurationMinimum: %d\r\n" + "SayEnvelope: %s\r\n" + "SayCID: %s\r\n" + "AttachMessage: %s\r\n" + "AttachmentFormat: %s\r\n" + "DeleteMessage: %s\r\n" + "VolumeGain: %.2f\r\n" + "CanReview: %s\r\n" + "CallOperator: %s\r\n" + "MaxMessageCount: %d\r\n" + "MaxMessageLength: %d\r\n" + "NewMessageCount: %d\r\n" + "OldMessageCount: %d\r\n" +#ifdef IMAP_STORAGE + "IMAPUser: %s\r\n" + "IMAPServer: %s\r\n" + "IMAPPort: %s\r\n" + "IMAPFlags: %s\r\n" +#endif + "\r\n", + + event_name, + actionid, + vmu->context, + vmu->mailbox, + vmu->fullname, + vmu->email, + vmu->pager, + ast_strlen_zero(vmu->serveremail) ? serveremail : vmu->serveremail, + ast_strlen_zero(vmu->fromstring) ? fromstring : vmu->fromstring, + mailcmd, + vmu->language, + vmu->zonetag, + vmu->callback, + vmu->dialout, + vmu->uniqueid, + vmu->exit, + vmu->saydurationm, + ast_test_flag(vmu, VM_ENVELOPE) ? "Yes" : "No", + ast_test_flag(vmu, VM_SAYCID) ? "Yes" : "No", + ast_test_flag(vmu, VM_ATTACH) ? "Yes" : "No", + vmu->attachfmt, + ast_test_flag(vmu, VM_DELETE) ? "Yes" : "No", + vmu->volgain, + ast_test_flag(vmu, VM_REVIEW) ? "Yes" : "No", + ast_test_flag(vmu, VM_OPERATOR) ? "Yes" : "No", + vmu->maxmsg, + vmu->maxsecs, + new, + old +#ifdef IMAP_STORAGE + , + vmu->imapuser, + vmu->imapserver, + vmu->imapport, + vmu->imapflags +#endif + ); + + return 1; + +} + static int manager_voicemail_refresh(struct mansession *s, const struct message *m) { const char *context = astman_get_header(m, "Context"); @@ -13258,6 +13376,51 @@ static int manager_voicemail_refresh(struct mansession *s, const struct message return RESULT_SUCCESS; } +static int manager_status_voicemail_user(struct mansession *s, const struct message *m) +{ + struct ast_vm_user *vmu = NULL; + const char *id = astman_get_header(m, "ActionID"); + char actionid[128]; + struct ast_vm_user svm; + int ret; + + const char *context = astman_get_header(m, "Context"); + const char *mailbox = astman_get_header(m, "Mailbox"); + + if ((ast_strlen_zero(context) || ast_strlen_zero(mailbox))) { + astman_send_error(s, m, "Need 'Context' and 'Mailbox' parameters."); + return RESULT_SUCCESS; + } + + actionid[0] = '\0'; + if (!ast_strlen_zero(id)) { + snprintf(actionid, sizeof(actionid), "ActionID: %s\r\n", id); + } + + /* find user */ + memset(&svm, 0, sizeof(svm)); + vmu = find_user(&svm, context, mailbox); + if (!vmu) { + /* could not find it */ + astman_send_ack(s, m, "There is no voicemail user of the given info."); + return RESULT_SUCCESS; + } + + astman_send_listack(s, m, "Voicemail user detail will follow", "start"); + + /* append vmu info event */ + ret = append_vmu_info_astman(s, vmu, "VoicemailUserDetail", actionid); + free_user(vmu); + if(ret == 0) { + ast_log(LOG_ERROR, "Could not append voicemail user info."); + } + + astman_send_list_complete_start(s, m, "VoicemailUserDetailComplete", 1); + astman_send_list_complete_end(s); + + return RESULT_SUCCESS; +} + /*! \brief Manager list voicemail users command */ static int manager_list_voicemail_users(struct mansession *s, const struct message *m) { @@ -13265,6 +13428,7 @@ static int manager_list_voicemail_users(struct mansession *s, const struct messa const char *id = astman_get_header(m, "ActionID"); char actionid[128]; int num_users = 0; + int ret; actionid[0] = '\0'; if (!ast_strlen_zero(id)) { @@ -13282,86 +13446,14 @@ static int manager_list_voicemail_users(struct mansession *s, const struct messa astman_send_listack(s, m, "Voicemail user list will follow", "start"); AST_LIST_TRAVERSE(&users, vmu, list) { - char dirname[256]; - int new, old; - inboxcount(vmu->mailbox, &new, &old); - - make_dir(dirname, sizeof(dirname), vmu->context, vmu->mailbox, "INBOX"); - astman_append(s, - "Event: VoicemailUserEntry\r\n" - "%s" - "VMContext: %s\r\n" - "VoiceMailbox: %s\r\n" - "Fullname: %s\r\n" - "Email: %s\r\n" - "Pager: %s\r\n" - "ServerEmail: %s\r\n" - "FromString: %s\r\n" - "MailCommand: %s\r\n" - "Language: %s\r\n" - "TimeZone: %s\r\n" - "Callback: %s\r\n" - "Dialout: %s\r\n" - "UniqueID: %s\r\n" - "ExitContext: %s\r\n" - "SayDurationMinimum: %d\r\n" - "SayEnvelope: %s\r\n" - "SayCID: %s\r\n" - "AttachMessage: %s\r\n" - "AttachmentFormat: %s\r\n" - "DeleteMessage: %s\r\n" - "VolumeGain: %.2f\r\n" - "CanReview: %s\r\n" - "CallOperator: %s\r\n" - "MaxMessageCount: %d\r\n" - "MaxMessageLength: %d\r\n" - "NewMessageCount: %d\r\n" - "OldMessageCount: %d\r\n" -#ifdef IMAP_STORAGE - "IMAPUser: %s\r\n" - "IMAPServer: %s\r\n" - "IMAPPort: %s\r\n" - "IMAPFlags: %s\r\n" -#endif - "\r\n", - actionid, - vmu->context, - vmu->mailbox, - vmu->fullname, - vmu->email, - vmu->pager, - ast_strlen_zero(vmu->serveremail) ? serveremail : vmu->serveremail, - ast_strlen_zero(vmu->fromstring) ? fromstring : vmu->fromstring, - mailcmd, - vmu->language, - vmu->zonetag, - vmu->callback, - vmu->dialout, - vmu->uniqueid, - vmu->exit, - vmu->saydurationm, - ast_test_flag(vmu, VM_ENVELOPE) ? "Yes" : "No", - ast_test_flag(vmu, VM_SAYCID) ? "Yes" : "No", - ast_test_flag(vmu, VM_ATTACH) ? "Yes" : "No", - vmu->attachfmt, - ast_test_flag(vmu, VM_DELETE) ? "Yes" : "No", - vmu->volgain, - ast_test_flag(vmu, VM_REVIEW) ? "Yes" : "No", - ast_test_flag(vmu, VM_OPERATOR) ? "Yes" : "No", - vmu->maxmsg, - vmu->maxsecs, - new, - old -#ifdef IMAP_STORAGE - , - vmu->imapuser, - vmu->imapserver, - vmu->imapport, - vmu->imapflags -#endif - ); + /* append vmu info event */ + ret = append_vmu_info_astman(s, vmu, "VoicemailUserEntry", actionid); + if(ret == 0) { + ast_log(LOG_ERROR, "Could not append voicemail user info."); + continue; + } ++num_users; - } + } astman_send_list_complete_start(s, m, "VoicemailUserEntryComplete", num_users); astman_send_list_complete_end(s); @@ -14891,6 +14983,7 @@ static int unload_module(void) res |= ast_custom_function_unregister(&mailbox_exists_acf); res |= ast_custom_function_unregister(&vm_info_acf); res |= ast_manager_unregister("VoicemailUsersList"); + res |= ast_manager_unregister("VoicemailUserStatus"); res |= ast_manager_unregister("VoicemailRefresh"); #ifdef TEST_FRAMEWORK res |= AST_TEST_UNREGISTER(test_voicemail_vmsayname); @@ -14968,6 +15061,7 @@ static int load_module(void) res |= ast_custom_function_register(&mailbox_exists_acf); res |= ast_custom_function_register(&vm_info_acf); res |= ast_manager_register_xml("VoicemailUsersList", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, manager_list_voicemail_users); + res |= ast_manager_register_xml("VoicemailUserStatus", EVENT_FLAG_CALL | EVENT_FLAG_REPORTING, manager_status_voicemail_user); res |= ast_manager_register_xml("VoicemailRefresh", EVENT_FLAG_USER, manager_voicemail_refresh); #ifdef TEST_FRAMEWORK res |= AST_TEST_REGISTER(test_voicemail_vmsayname);