2011-12-23 19:45:18 -05:00
|
|
|
/*
|
|
|
|
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
2012-04-18 11:51:48 -05:00
|
|
|
* Copyright (C) 2005-2012, Anthony Minessale II <anthm@freeswitch.org>
|
2011-12-23 19:45:18 -05:00
|
|
|
*
|
|
|
|
* Version: MPL 1.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
|
|
|
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Anthony Minessale II <anthm@freeswitch.org>
|
|
|
|
* Portions created by the Initial Developer are Copyright (C)
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
|
|
|
*
|
|
|
|
* Marc Olivier Chouinard <mochouinard@moctel.com>
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* utils.c -- VoiceMail IVR / Different utility that might need to go into the core (after cleanup)
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#include <switch.h>
|
|
|
|
|
|
|
|
#include "utils.h"
|
|
|
|
|
2011-12-26 11:14:00 -05:00
|
|
|
switch_status_t vmivr_merge_media_files(const char** inputs, const char *output, int rate) {
|
2011-12-23 19:45:18 -05:00
|
|
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
|
|
|
switch_file_handle_t fh_output = { 0 };
|
|
|
|
int channels = 1;
|
|
|
|
int j = 0;
|
|
|
|
|
|
|
|
if (switch_core_file_open(&fh_output, output, channels, rate, SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT, NULL) != SWITCH_STATUS_SUCCESS) {
|
|
|
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open %s\n", output);
|
|
|
|
goto end;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (j = 0; inputs[j] != NULL && j < 128 && status == SWITCH_STATUS_SUCCESS; j++) {
|
|
|
|
switch_file_handle_t fh_input = { 0 };
|
|
|
|
char buf[2048];
|
|
|
|
switch_size_t len = sizeof(buf) / 2;
|
|
|
|
|
|
|
|
if (switch_core_file_open(&fh_input, inputs[j], channels, rate, SWITCH_FILE_FLAG_READ | SWITCH_FILE_DATA_SHORT, NULL) != SWITCH_STATUS_SUCCESS) {
|
|
|
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't open %s\n", inputs[j]);
|
|
|
|
status = SWITCH_STATUS_GENERR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (switch_core_file_read(&fh_input, buf, &len) == SWITCH_STATUS_SUCCESS) {
|
|
|
|
if (switch_core_file_write(&fh_output, buf, &len) != SWITCH_STATUS_SUCCESS) {
|
|
|
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Write error\n");
|
|
|
|
status = SWITCH_STATUS_GENERR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (fh_input.file_interface) {
|
|
|
|
switch_core_file_close(&fh_input);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (fh_output.file_interface) {
|
|
|
|
switch_core_file_close(&fh_output);
|
|
|
|
}
|
|
|
|
end:
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch_event_t *jsonapi2event(switch_core_session_t *session, switch_event_t *apply_event, const char *api, const char *data) {
|
|
|
|
switch_event_t *phrases_event = NULL;
|
|
|
|
switch_stream_handle_t stream = { 0 };
|
|
|
|
SWITCH_STANDARD_STREAM(stream);
|
|
|
|
switch_api_execute(api, data, session, &stream);
|
|
|
|
switch_event_create_json(&phrases_event, (char *) stream.data);
|
|
|
|
switch_safe_free(stream.data);
|
|
|
|
|
|
|
|
if (apply_event) {
|
|
|
|
switch_event_header_t *hp;
|
|
|
|
for (hp = phrases_event->headers; hp; hp = hp->next) {
|
|
|
|
if (!strncasecmp(hp->name, "VM-", 3)) {
|
|
|
|
switch_event_add_header(apply_event, SWITCH_STACK_BOTTOM, hp->name, "%s", hp->value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
switch_event_destroy(&phrases_event);
|
|
|
|
phrases_event = apply_event;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return phrases_event;
|
|
|
|
}
|
|
|
|
|
2011-12-26 11:14:00 -05:00
|
|
|
char *generate_random_file_name(switch_core_session_t *session, const char *mod_name, const char *file_extension) {
|
2011-12-23 19:45:18 -05:00
|
|
|
char rand_uuid[SWITCH_UUID_FORMATTED_LENGTH + 1] = "";
|
|
|
|
switch_uuid_t srand_uuid;
|
|
|
|
|
|
|
|
switch_uuid_get(&srand_uuid);
|
|
|
|
switch_uuid_format(rand_uuid, &srand_uuid);
|
|
|
|
|
|
|
|
return switch_core_session_sprintf(session, "%s%s%s_%s.%s", SWITCH_GLOBAL_dirs.temp_dir, SWITCH_PATH_SEPARATOR, mod_name, rand_uuid, file_extension);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
switch_status_t vmivr_api_execute(switch_core_session_t *session, const char *apiname, const char *arguments) {
|
|
|
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
|
|
|
|
|
|
|
switch_stream_handle_t stream = { 0 };
|
|
|
|
|
|
|
|
SWITCH_STANDARD_STREAM(stream);
|
|
|
|
switch_api_execute(apiname, arguments, session, &stream);
|
|
|
|
if (!strncasecmp(stream.data, "-ERR", 4)) {
|
|
|
|
status = SWITCH_STATUS_GENERR;
|
|
|
|
}
|
|
|
|
switch_safe_free(stream.data);
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
|
|
|
|
void append_event_message(switch_core_session_t *session, vmivr_profile_t *profile, switch_event_t *phrase_params, switch_event_t *msg_list_event, size_t current_msg) {
|
|
|
|
|
|
|
|
char *varname;
|
|
|
|
char *apicmd;
|
|
|
|
char *total_msg = NULL;
|
|
|
|
|
|
|
|
if (!msg_list_event || !(total_msg = switch_event_get_header(msg_list_event, "VM-List-Count")) || current_msg > atoi(total_msg)) {
|
|
|
|
/* TODO Error MSG */
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
varname = switch_mprintf("VM-List-Message-%" SWITCH_SIZE_T_FMT "-UUID", current_msg);
|
|
|
|
apicmd = switch_mprintf("json %s %s %s %s", profile->api_profile, profile->domain, profile->id, switch_event_get_header(msg_list_event, varname));
|
|
|
|
|
|
|
|
switch_safe_free(varname);
|
|
|
|
|
|
|
|
jsonapi2event(session, phrase_params, profile->api_msg_get, apicmd);
|
|
|
|
|
|
|
|
/* TODO Set these 2 header correctly */
|
|
|
|
switch_event_add_header(phrase_params, SWITCH_STACK_BOTTOM, "VM-Message-Type", "%s", "new");
|
|
|
|
switch_event_add_header(phrase_params, SWITCH_STACK_BOTTOM, "VM-Message-Number", "%"SWITCH_SIZE_T_FMT, current_msg);
|
|
|
|
|
|
|
|
switch_event_add_header_string(phrase_params, SWITCH_STACK_BOTTOM, "VM-Message-Private-Local-Copy", "False");
|
|
|
|
|
|
|
|
switch_safe_free(apicmd);
|
|
|
|
}
|
|
|
|
|