From f47e523d69bc26b1d85613d9298ef5398f07d33c Mon Sep 17 00:00:00 2001 From: Chris Rienzo Date: Wed, 6 Nov 2013 17:57:31 -0500 Subject: [PATCH] mod_rayo: now supports HTTP(S) --- .../mod_rayo/rayo_receivefax_component.c | 52 ++++++++++--------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/src/mod/event_handlers/mod_rayo/rayo_receivefax_component.c b/src/mod/event_handlers/mod_rayo/rayo_receivefax_component.c index 09cd7a2c19..75528f8b52 100644 --- a/src/mod/event_handlers/mod_rayo/rayo_receivefax_component.c +++ b/src/mod/event_handlers/mod_rayo/rayo_receivefax_component.c @@ -92,14 +92,16 @@ static iks *start_receivefax_component(struct rayo_actor *call, struct rayo_mess file_no = rayo_actor_seq_next(call); receivefax_component->filename = switch_core_sprintf(pool, "%s%s%s-%d", globals.file_prefix, SWITCH_PATH_SEPARATOR, switch_core_session_get_uuid(session), file_no); - if (!strncmp(receivefax_component->filename, "http://", 7) || strncmp(receivefax_component->filename, "https://", 8)) { + if (!strncmp(receivefax_component->filename, "http://", 7) || !strncmp(receivefax_component->filename, "https://", 8)) { /* This is an HTTP URL, need to PUT after fax is received */ receivefax_component->local_filename = switch_core_sprintf(pool, "%s%s%s-%d", SWITCH_GLOBAL_dirs.temp_dir, SWITCH_PATH_SEPARATOR, switch_core_session_get_uuid(session), file_no); receivefax_component->http_put_after_receive = 1; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s save fax to HTTP URL\n", RAYO_JID(receivefax_component)); } else { /* assume file.. */ receivefax_component->local_filename = receivefax_component->filename; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s save fax to local file\n", RAYO_JID(receivefax_component)); } /* add channel variable so that fax component can be located from fax events */ @@ -187,18 +189,6 @@ static void insert_fax_metadata(switch_event_t *event, const char *name, iks *re } } -/** - * Handle rxfax execute event - * @param event received from FreeSWITCH core. It will be destroyed by the core after this function returns. - */ -static void on_execute_event(switch_event_t *event) -{ - const char *application = switch_event_get_header(event, "Application"); - if (!zstr(application) && !strcmp(application, "rxfax")) { - /* TODO */ - } -} - /** * Handle rxfax completion event from FreeSWITCH core * @param event received from FreeSWITCH core. It will be destroyed by the core after this function returns. @@ -215,6 +205,7 @@ static void on_execute_complete_event(switch_event_t *event) iks *result; iks *complete; iks *fax; + int have_fax_document = 1; switch_core_session_t *session; switch_log_printf(SWITCH_CHANNEL_UUID_LOG(uuid), SWITCH_LOG_DEBUG, "Got result for %s\n", fax_jid); @@ -228,10 +219,26 @@ static void on_execute_complete_event(switch_event_t *event) /* flag faxing as done */ rayo_call_set_faxing(RAYO_CALL(RAYO_COMPONENT(component)->parent), 0); + /* transfer HTTP document and delete local copy */ + if (RECEIVEFAX_COMPONENT(component)->http_put_after_receive && switch_file_exists(RECEIVEFAX_COMPONENT(component)->local_filename, RAYO_POOL(component))) { + switch_stream_handle_t stream = { 0 }; + SWITCH_STANDARD_STREAM(stream); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s PUT fax to %s\n", RAYO_JID(component), RECEIVEFAX_COMPONENT(component)->filename); + switch_api_execute("http_put", RECEIVEFAX_COMPONENT(component)->filename, NULL, &stream); + /* check if successful */ + if (!zstr(stream.data) && strncmp(stream.data, "+OK", 3)) { + /* PUT failed */ + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s PUT fax to %s failed: %s\n", RAYO_JID(component), RECEIVEFAX_COMPONENT(component)->filename, (char *)stream.data); + have_fax_document = 0; + } + switch_safe_free(stream.data) + switch_file_remove(RECEIVEFAX_COMPONENT(component)->local_filename, RAYO_POOL(component)); + } + /* successful fax? */ - if (switch_true(switch_event_get_header(event, "variable_fax_success"))) { + if (have_fax_document && switch_true(switch_event_get_header(event, "variable_fax_success"))) { result = rayo_component_create_complete_event(RAYO_COMPONENT(component), RECEIVEFAX_FINISH); - } else if (RECEIVEFAX_COMPONENT(component)->stop) { + } else if (have_fax_document && RECEIVEFAX_COMPONENT(component)->stop) { result = rayo_component_create_complete_event(RAYO_COMPONENT(component), COMPONENT_COMPLETE_STOP); } else { result = rayo_component_create_complete_event(RAYO_COMPONENT(component), COMPONENT_COMPLETE_ERROR); @@ -239,7 +246,7 @@ static void on_execute_complete_event(switch_event_t *event) complete = iks_find(result, "complete"); /* add fax document information */ - { + if (have_fax_document) { const char *pages = switch_event_get_header(event, "variable_fax_document_transferred_pages"); if (!zstr(pages) && switch_is_number(pages) && atoi(pages) > 0) { const char *resolution = switch_event_get_header(event, "variable_fax_file_image_resolution"); @@ -248,12 +255,11 @@ static void on_execute_complete_event(switch_event_t *event) fax = iks_insert(complete, "fax"); iks_insert_attrib(fax, "xmlns", RAYO_FAX_COMPLETE_NS); - if (strlen(url) > strlen(SWITCH_PATH_SEPARATOR) && !strncmp(url, SWITCH_PATH_SEPARATOR, strlen(SWITCH_PATH_SEPARATOR))) { + if (RECEIVEFAX_COMPONENT(component)->http_put_after_receive) { + iks_insert_attrib(fax, "url", url); + } else { /* convert absolute path to file:// URI */ iks_insert_attrib_printf(fax, "url", "file://%s", url); - } else { - /* is already a URI (hopefully) */ - iks_insert_attrib(fax, "url", url); } if (!zstr(resolution)) { @@ -264,8 +270,6 @@ static void on_execute_complete_event(switch_event_t *event) } iks_insert_attrib(fax, "pages", pages); } - - /* TODO transfer HTTP document and delete local copy */ } /* add metadata from event */ @@ -327,6 +331,8 @@ static switch_status_t do_config(switch_memory_pool_t *pool, const char *config_ } } + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "receivefax file-prefix = %s\n", globals.file_prefix); + switch_xml_free(xml); return SWITCH_STATUS_SUCCESS; @@ -346,7 +352,6 @@ switch_status_t rayo_receivefax_component_load(switch_loadable_module_interface_ } switch_event_bind("rayo_receivefax_component", SWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE, NULL, on_execute_complete_event, NULL); - switch_event_bind("rayo_receivefax_component", SWITCH_EVENT_CHANNEL_EXECUTE, NULL, on_execute_event, NULL); rayo_actor_command_handler_add(RAT_CALL, "", "set:"RAYO_FAX_NS":receivefax", start_receivefax_component); rayo_actor_command_handler_add(RAT_CALL_COMPONENT, "receivefax", "set:"RAYO_EXT_NS":stop", stop_receivefax_component); @@ -360,7 +365,6 @@ switch_status_t rayo_receivefax_component_load(switch_loadable_module_interface_ */ switch_status_t rayo_receivefax_component_shutdown(void) { - switch_event_unbind_callback(on_execute_event); switch_event_unbind_callback(on_execute_complete_event); return SWITCH_STATUS_SUCCESS;