merge MODAPP-38

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6029 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2007-10-23 14:45:22 +00:00
parent 95f1060e8b
commit 8767bfbb7c
2 changed files with 229 additions and 80 deletions

View File

@ -29,6 +29,20 @@
<param name="restart-key" value="1"/>
<param name="ff-key" value="6"/>
<param name="rew-key" value="4"/>
<email>
<body><![CDATA[At ${voicemail_time} you were left a message from ${voicemail_caller_id_name} ${voicemail_caller_id_number}
to your account ${voicemail_account}@${voicemail_domain}
]]></body>
<headers><![CDATA[From: FreeSWITCH mod_voicemail <${voicemail_account}@${voicemail_domain}>
To: <${voicemail_email}>
Subject: Voicemail from ${voicemail_caller_id_name} ${voicemail_caller_id_number}
X-Priority: ${voicemail_priority}
X-Mailer: FreeSWITCH
]]></headers>
<!-- this is the format voicemail_time will have -->
<param name="date-fmt" value="%A, %B %d %Y, %I %M %p"/>
<param name="email-from" value="${voicemail_account}@${voicemail_domain}"/>
</email>
<!--<param name="storage-dir" value="/tmp"/>-->
<!--<param name="odbc-dsn" value="dsn:user:pass"/>-->
</profile>

View File

@ -24,7 +24,7 @@
* Contributor(s):
*
* Anthony Minessale II <anthmct@yahoo.com>
*
* Bret McDanel <trixter AT 0xdecafbad.com>
*
* mod_voicemail.c -- Voicemail Module
*
@ -83,6 +83,10 @@ struct vm_profile {
char *storage_dir;
char *callback_dialplan;
char *callback_context;
char *email_body;
char *email_headers;
char *email_from;
char *date_fmt;
uint32_t digit_timeout;
uint32_t max_login_attempts;
uint32_t max_record_len;
@ -229,7 +233,7 @@ static switch_status_t load_config(void)
{
char *cf = "voicemail.conf";
vm_profile_t *profile = NULL;
switch_xml_t cfg, xml, settings, param, x_profile, x_profiles;
switch_xml_t cfg, xml, settings, param, x_profile, x_profiles, x_email;
memset(&globals, 0, sizeof(globals));
switch_core_new_memory_pool(&globals.pool);
@ -285,11 +289,41 @@ static switch_status_t load_config(void)
char *storage_dir = "";
char *callback_dialplan = "XML";
char *callback_context = "default";
char *email_body = "";
char *email_headers = "";
char *email_from = "";
char *date_fmt = "%A, %B %d %Y, %I %M %p";
switch_core_db_t *db;
uint32_t timeout = 10000, max_login_attempts = 3, max_record_len = 300;
db = NULL;
if ((x_email = switch_xml_child(x_profile, "email"))) {
if ((param = switch_xml_child(x_email,"body"))) {
email_body = switch_core_strdup(globals.pool,param->txt);
}
if ((param = switch_xml_child(x_email,"headers"))) {
email_headers = switch_core_strdup(globals.pool,param->txt);
}
for (param = switch_xml_child(x_email, "param"); param; param = param->next) {
char *var, *val;
var = (char *) switch_xml_attr_soft(param, "name");
val = (char *) switch_xml_attr_soft(param, "value");
if (!strcasecmp(var, "date-fmt") && !switch_strlen_zero(val)) {
date_fmt = val;
} else if (!strcasecmp(var, "email-from") && !switch_strlen_zero(val)) {
email_from = val;
}
}
}
for (param = switch_xml_child(x_profile, "param"); param; param = param->next) {
char *var, *val;
@ -430,6 +464,11 @@ static switch_status_t load_config(void)
#ifdef SWITCH_HAVE_ODBC
}
#endif
profile->email_body = email_body;
profile->email_headers = email_headers;
profile->email_from = email_from;
profile->date_fmt = date_fmt;
profile->digit_timeout = timeout;
profile->max_login_attempts = max_login_attempts;
profile->max_record_len = max_record_len;
@ -833,6 +872,55 @@ static int listen_callback(void *pArg, int argc, char **argv, char **columnNames
}
static void message_count(vm_profile_t *profile, char *myid, char *domain_name, char *myfolder,
int *total_new_messages, int *total_saved_messages, int *total_new_urgent_messages, int *total_saved_urgent_messages)
{
char msg_count[80] = "";
callback_t cbt = { 0 };
char sql[256];
cbt.buf = msg_count;
cbt.len = sizeof(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0",
myid,
domain_name,
myfolder);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_new_messages = atoi(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0 and read_flags='%s'",
myid,
domain_name,
myfolder,
URGENT_FLAG_STRING);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_new_urgent_messages = atoi(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0",
myid,
domain_name,
myfolder);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_saved_messages = atoi(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0 and read_flags='%s'",
myid,
domain_name,
myfolder,
URGENT_FLAG_STRING);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_saved_urgent_messages = atoi(msg_count);
}
static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t *profile, listen_callback_t *cbt)
{
switch_channel_t *channel;
@ -900,28 +988,81 @@ static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t
switch_safe_free(sql);
if (!strcmp(input, profile->email_key) && !switch_strlen_zero(cbt->email)) {
switch_event_t *event;
char *from = switch_core_session_sprintf(session, "%s@%s", cbt->user, cbt->domain);
char *from;
char *headers;
char *body;
int priority = 3;
switch_size_t retsize;
switch_time_exp_t tm;
char date[80] = "";
char tmp[50]="";
int total_new_messages = 0;
int total_saved_messages = 0;
int total_new_urgent_messages = 0;
int total_saved_urgent_messages = 0;
if (!strcasecmp(cbt->read_flags, URGENT_FLAG_STRING)) {
priority = 1;
}
headers = switch_core_session_sprintf(session,
"From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d",
cbt->user, cbt->domain, cbt->cid_name, cbt->cid_number, priority);
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail");
switch_event_serialize(event, &body);
switch_event_fire(&event);
message_count(profile, cbt->user, cbt->domain, cbt->in_folder, &total_new_messages, &total_saved_messages,
&total_new_urgent_messages, &total_saved_urgent_messages);
switch_time_exp_lt(&tm, atoi(cbt->created_epoch));
switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm);
snprintf(tmp,sizeof(tmp), "%d", total_new_messages);
switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp);
snprintf(tmp,sizeof(tmp), "%d", total_saved_messages);
switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp);
snprintf(tmp,sizeof(tmp), "%d", total_new_urgent_messages);
switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp);
snprintf(tmp,sizeof(tmp), "%d", total_saved_urgent_messages);
switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp);
switch_channel_set_variable(channel, "voicemail_current_folder", cbt->in_folder);
switch_channel_set_variable(channel, "voicemail_account", cbt->user);
switch_channel_set_variable(channel, "voicemail_domain", cbt->domain);
switch_channel_set_variable(channel, "voicemail_caller_id_number", cbt->cid_number);
switch_channel_set_variable(channel, "voicemail_caller_id_name", cbt->cid_name);
switch_channel_set_variable(channel, "voicemail_file_path", cbt->file_path);
switch_channel_set_variable(channel, "voicemail_read_flags", cbt->read_flags);
switch_channel_set_variable(channel, "voicemail_time", date);
snprintf(tmp,sizeof(tmp), "%d", priority);
switch_channel_set_variable(channel, "voicemail_priority", tmp);
if(switch_strlen_zero(profile->email_headers)) {
from = switch_core_session_sprintf(session, "%s@%s", cbt->user, cbt->domain);
} else {
body = switch_mprintf("Voicemail from %s %s",
cbt->cid_name, cbt->cid_number);
from = switch_channel_expand_variables(channel,profile->email_from);
}
//TBD add better formatting to the body
if(switch_strlen_zero(profile->email_headers)) {
headers = switch_core_session_sprintf(session,
"From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d",
cbt->user, cbt->domain, cbt->cid_name, cbt->cid_number, priority);
} else {
headers = switch_channel_expand_variables(channel,profile->email_headers);
}
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
/* this isnt done? it was in the other place
* switch_channel_event_set_data(channel, event);
*/
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "forwarded-voicemail");
switch_event_fire(&event);
}
if(!switch_strlen_zero(profile->email_headers)) {
body = switch_mprintf("Voicemail from %s %s",
cbt->cid_name, cbt->cid_number);
} else {
body = switch_channel_expand_variables(channel,profile->email_body);
}
//TBD add better formatting to the body -- TRX done :)
switch_simple_email(cbt->email, from, headers, body, cbt->file_path);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", cbt->email);
switch_safe_free(body);
@ -943,55 +1084,6 @@ static switch_status_t listen_file(switch_core_session_t *session, vm_profile_t
return status;
}
static void message_count(vm_profile_t *profile, char *myid, char *domain_name, char *myfolder,
int *total_new_messages, int *total_saved_messages, int *total_new_urgent_messages, int *total_saved_urgent_messages)
{
char msg_count[80] = "";
callback_t cbt = { 0 };
char sql[256];
cbt.buf = msg_count;
cbt.len = sizeof(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0",
myid,
domain_name,
myfolder);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_new_messages = atoi(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch=0 and read_flags='%s'",
myid,
domain_name,
myfolder,
URGENT_FLAG_STRING);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_new_urgent_messages = atoi(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0",
myid,
domain_name,
myfolder);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_saved_messages = atoi(msg_count);
snprintf(sql, sizeof(sql),
"select count(*) from voicemail_data where user='%s' and domain='%s' and in_folder='%s' and read_epoch!=0 and read_flags='%s'",
myid,
domain_name,
myfolder,
URGENT_FLAG_STRING);
vm_execute_sql_callback(profile, profile->mutex, sql, sql2str_callback, &cbt);
*total_saved_urgent_messages = atoi(msg_count);
}
static void voicemail_check_main(switch_core_session_t *session, char *profile_name, char *domain_name, char *id, int auth)
{
vm_check_state_t vm_check_state = VM_CHECK_START;
@ -1313,11 +1405,6 @@ static void voicemail_check_main(switch_core_session_t *session, char *profile_n
if (!x_user) {
char *xtra;
int ok = 1;
/* TRX added destination_number and caller_id_number from the session object
* ideally switch_xml_* would do this for any curl request, but that can get tricky
* since curl & the session object arent always present, I will eventually look at it
* and see what it would take to make it automagically do that
*/
caller_profile = switch_channel_get_caller_profile(channel);
xtra = switch_mprintf("mailbox=%s&destination_number=%s&caller_id_number=%s", myid,caller_profile->destination_number,caller_profile->caller_id_number);
@ -1505,7 +1592,7 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, char
if (!strcasecmp(var, "vm-mailto")) {
email_vm = switch_core_session_strdup(session, val);
} else if (!strcasecmp(var, "vm-email-all-messages")) {
send_mail = switch_true(var);
send_mail = switch_true(val);
}
}
}
@ -1600,32 +1687,80 @@ static switch_status_t voicemail_leave_main(switch_core_session_t *session, char
}
end:
if (send_mail && !switch_strlen_zero(email_vm)) {
switch_event_t *event;
char *from = switch_core_session_sprintf(session, "%s@%s", id, domain_name);
char *from;
char *body;
char *headers;
headers = switch_core_session_sprintf(session, "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d",
id, domain_name,
caller_profile->caller_id_name,
caller_profile->caller_id_number,
priority);
switch_size_t retsize;
switch_time_exp_t tm;
char date[80] = "";
char tmp[50]="";
int total_new_messages = 0;
int total_saved_messages = 0;
int total_new_urgent_messages = 0;
int total_saved_urgent_messages = 0;
message_count(profile, id, domain_name, myfolder, &total_new_messages, &total_saved_messages,
&total_new_urgent_messages, &total_saved_urgent_messages);
switch_time_exp_lt(&tm, switch_time_now());
switch_strftime(date, &retsize, sizeof(date), profile->date_fmt, &tm);
switch_channel_set_variable(channel, "voicemail_current_folder", myfolder);
snprintf(tmp,sizeof(tmp), "%d", total_new_messages);
switch_channel_set_variable(channel, "voicemail_total_new_messages", tmp);
snprintf(tmp,sizeof(tmp), "%d", total_saved_messages);
switch_channel_set_variable(channel, "voicemail_total_saved_messages", tmp);
snprintf(tmp,sizeof(tmp), "%d", total_new_urgent_messages);
switch_channel_set_variable(channel, "voicemail_urgent_new_messages", tmp);
snprintf(tmp,sizeof(tmp), "%d", total_saved_urgent_messages);
switch_channel_set_variable(channel, "voicemail_urgent_saved_messages", tmp);
switch_channel_set_variable(channel, "voicemail_account", id);
switch_channel_set_variable(channel, "voicemail_domain", domain_name);
switch_channel_set_variable(channel, "voicemail_caller_id_number", caller_profile->caller_id_number);
switch_channel_set_variable(channel, "voicemail_caller_id_name", caller_profile->caller_id_name);
switch_channel_set_variable(channel, "voicemail_file_path", file_path);
switch_channel_set_variable(channel, "voicemail_read_flags", read_flags);
switch_channel_set_variable(channel, "voicemail_time", date);
snprintf(tmp,sizeof(tmp), "%d", priority);
switch_channel_set_variable(channel, "voicemail_priority", tmp);
if(switch_strlen_zero(profile->email_from)) {
from = switch_core_session_sprintf(session, "%s@%s", id, domain_name);
} else {
from = switch_channel_expand_variables(channel, profile->email_headers);
}
if(switch_strlen_zero(profile->email_headers)) {
headers = switch_core_session_sprintf(session, "From: FreeSWITCH mod_voicemail <%s@%s>\nSubject: Voicemail from %s %s\nX-Priority: %d",
id, domain_name,
caller_profile->caller_id_name,
caller_profile->caller_id_number,
priority);
} else {
headers = switch_channel_expand_variables(channel,profile->email_headers);
}
if (switch_event_create(&event, SWITCH_EVENT_MESSAGE) == SWITCH_STATUS_SUCCESS) {
switch_channel_event_set_data(channel, event);
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Type", "voicemail");
switch_event_serialize(event, &body);
switch_event_fire(&event);
} else {
}
if(!switch_strlen_zero(profile->email_headers)) {
body = switch_mprintf("Voicemail from %s %s",
caller_profile->caller_id_name, caller_profile->caller_id_number);
} else {
body = switch_channel_expand_variables(channel,profile->email_body);
}
//TBD add better formatting to the body
//TBD add better formatting to the body -- TRX done :)
switch_simple_email(email_vm, from, headers, body, file_path);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending message to %s\n", email_vm);
switch_safe_free(body);