aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-12-31 01:11:33 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-12-31 01:11:33 +0000
commit7dfc6f87c79220689281ddcb9fd4c0eeb5c2b1ad (patch)
tree996c94f14e56ab2fb996a0e21b214459d2cc7a24 /apps
parent602ef7cb47f7be06f9256f845cad9eecf0255926 (diff)
Make voicemail registration apps register (bug #3034)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4619 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'apps')
-rwxr-xr-xapps/app_voicemail.c132
1 files changed, 129 insertions, 3 deletions
diff --git a/apps/app_voicemail.c b/apps/app_voicemail.c
index 7bd2661f4..c253b3e98 100755
--- a/apps/app_voicemail.c
+++ b/apps/app_voicemail.c
@@ -955,6 +955,7 @@ yuck:
return x;
}
+
static int count_messages(char *dir)
{
return last_message_index(dir) + 1;
@@ -1251,6 +1252,7 @@ yuck:
}
#else
+
static int count_messages(char *dir)
{
/* Find all .txt files - even if they are not in sequence from 0000 */
@@ -1839,6 +1841,124 @@ static char *mbox(int id)
}
}
+static int has_voicemail(const char *mailbox, const char *folder)
+{
+ DIR *dir;
+ struct dirent *de;
+ char fn[256];
+ char tmp[256]="";
+ char *mb, *cur;
+ char *context;
+ int ret;
+ if (!folder)
+ folder = "INBOX";
+ /* If no mailbox, return immediately */
+ if (ast_strlen_zero(mailbox))
+ return 0;
+ if (strchr(mailbox, ',')) {
+ strncpy(tmp, mailbox, sizeof(tmp) - 1);
+ mb = tmp;
+ ret = 0;
+ while((cur = strsep(&mb, ","))) {
+ if (!ast_strlen_zero(cur)) {
+ if (has_voicemail(cur, folder))
+ return 1;
+ }
+ }
+ return 0;
+ }
+ strncpy(tmp, mailbox, sizeof(tmp) - 1);
+ context = strchr(tmp, '@');
+ if (context) {
+ *context = '\0';
+ context++;
+ } else
+ context = "default";
+ snprintf(fn, sizeof(fn), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, tmp, folder);
+ dir = opendir(fn);
+ if (!dir)
+ return 0;
+ while ((de = readdir(dir))) {
+ if (!strncasecmp(de->d_name, "msg", 3))
+ break;
+ }
+ closedir(dir);
+ if (de)
+ return 1;
+ return 0;
+}
+
+static int messagecount(const char *mailbox, int *newmsgs, int *oldmsgs)
+{
+ DIR *dir;
+ struct dirent *de;
+ char fn[256];
+ char tmp[256]="";
+ char *mb, *cur;
+ char *context;
+ int ret;
+ if (newmsgs)
+ *newmsgs = 0;
+ if (oldmsgs)
+ *oldmsgs = 0;
+ /* If no mailbox, return immediately */
+ if (ast_strlen_zero(mailbox))
+ return 0;
+ if (strchr(mailbox, ',')) {
+ int tmpnew, tmpold;
+ strncpy(tmp, mailbox, sizeof(tmp) - 1);
+ mb = tmp;
+ ret = 0;
+ while((cur = strsep(&mb, ", "))) {
+ if (!ast_strlen_zero(cur)) {
+ if (messagecount(cur, newmsgs ? &tmpnew : NULL, oldmsgs ? &tmpold : NULL))
+ return -1;
+ else {
+ if (newmsgs)
+ *newmsgs += tmpnew;
+ if (oldmsgs)
+ *oldmsgs += tmpold;
+ }
+ }
+ }
+ return 0;
+ }
+ strncpy(tmp, mailbox, sizeof(tmp) - 1);
+ context = strchr(tmp, '@');
+ if (context) {
+ *context = '\0';
+ context++;
+ } else
+ context = "default";
+ if (newmsgs) {
+ snprintf(fn, sizeof(fn), "%s/voicemail/%s/%s/INBOX", (char *)ast_config_AST_SPOOL_DIR, context, tmp);
+ dir = opendir(fn);
+ if (dir) {
+ while ((de = readdir(dir))) {
+ if ((strlen(de->d_name) > 3) && !strncasecmp(de->d_name, "msg", 3) &&
+ !strcasecmp(de->d_name + strlen(de->d_name) - 3, "txt"))
+ (*newmsgs)++;
+
+ }
+ closedir(dir);
+ }
+ }
+ if (oldmsgs) {
+ snprintf(fn, sizeof(fn), "%s/voicemail/%s/%s/Old", (char *)ast_config_AST_SPOOL_DIR, context, tmp);
+ dir = opendir(fn);
+ if (dir) {
+ while ((de = readdir(dir))) {
+ if ((strlen(de->d_name) > 3) && !strncasecmp(de->d_name, "msg", 3) &&
+ !strcasecmp(de->d_name + strlen(de->d_name) - 3, "txt"))
+ (*oldmsgs)++;
+
+ }
+ closedir(dir);
+ }
+ }
+ return 0;
+}
+
static int notify_new_message(struct ast_channel *chan, struct ast_vm_user *vmu, int msgnum, long duration, char *fmt, char *cidnum, char *cidname);
static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int imbox, int msgnum, long duration, struct ast_vm_user *recip, char *fmt)
@@ -1885,7 +2005,7 @@ static void run_externnotify(char *context, char *extension)
int newvoicemails = 0, oldvoicemails = 0;
if (!ast_strlen_zero(externnotify)) {
- if (ast_app_messagecount(extension, &newvoicemails, &oldvoicemails)) {
+ if (messagecount(extension, &newvoicemails, &oldvoicemails)) {
ast_log(LOG_ERROR, "Problem in calculating number of voicemail messages available for extension %s\n", extension);
} else {
snprintf(arguments, sizeof(arguments), "%s %s %s %d&", externnotify, context, extension, newvoicemails);
@@ -3037,7 +3157,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
ast_destroy(mif); /* or here */
}
/* Leave voicemail for someone */
- manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, ast_app_has_voicemail(ext_context, NULL));
+ manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, has_voicemail(ext_context, NULL));
run_externnotify(chan->context, ext_context);
saved_messages++;
@@ -4755,7 +4875,7 @@ out:
close_mailbox(&vms, vmu);
if (valid) {
snprintf(ext_context, sizeof(ext_context), "%s@%s", vms.username, vmu->context);
- manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, ast_app_has_voicemail(ext_context, NULL));
+ manager_event(EVENT_FLAG_CALL, "MessageWaiting", "Mailbox: %s\r\nWaiting: %d\r\n", ext_context, has_voicemail(ext_context, NULL));
run_externnotify(chan->context, ext_context);
}
if (vmu)
@@ -5415,6 +5535,7 @@ int unload_module(void)
res |= ast_unregister_application(app4);
ast_cli_unregister(&show_voicemail_users_cli);
ast_cli_unregister(&show_voicemail_zones_cli);
+ ast_uninstall_vm_functions();
return res;
}
@@ -5431,8 +5552,12 @@ int load_module(void)
if ((res=load_config())) {
return(res);
}
+
ast_cli_register(&show_voicemail_users_cli);
ast_cli_register(&show_voicemail_zones_cli);
+
+ ast_install_vm_functions(has_voicemail, messagecount);
+
return res;
}
@@ -5831,3 +5956,4 @@ char *key()
{
return ASTERISK_GPL_KEY;
}
+