SpanDSP es una librería para el Procesamiento Digital de Señales (DSP) que necesitaremos para poder transmitir/recibir Fax a través de asterisk. Junto con SpanDSP los autores facilitan dos aplicaciones para enviar fax y recibir fax en asterisk (rx_fax y tx_fax). A pesar de que puedes encontrar buenos manuales para hacerlas funcionar no siempre consigues los resultados esperados.
Y es que si consultamos la ayuda de txFax:
----------------------------------------
TxFAX(filename[|caller][|debug]): Send a given TIFF file to the channel as a FAX.
The “caller” option makes the application behave as a calling machine,
rather than the answering machine. The default behaviour is to behave as
an answering machine.
Uses LOCALSTATIONID to identify itself to the remote end.
LOCALHEADERINFO to generate a header line on each page.
Sets REMOTESTATIONID to the receiver CSID.
Returns -1 when the user hangs up, or if the file does not exist.
Returns 0 otherwise.
—————————————-El retorno (0 y -1) es una practica común en el desarrollo de aplicaciones para c, pero no así en asterisk, donde es mas común devolver algún valor en una variable o saltar a una prioridad +101.
Por lo que se hace muy difícil consultar el estado del envío, si se ha enviado con éxito o no, ya que la manera de actuar de esta aplicación es la siguiente:
- Si el fax llega bien entonces se continúa con el dialplan, pero no hay NINGUNA variable para advertir ese resultado.
- Si el fax llega mal entonces se pasa directamente a la extensión Hangup del contexto, igualmente sin dejar un resultado en una variable.
Aplicando la siguiente linea a la aplicación se consigue modificar el comportamiento de esta:
static void phase_e_handler(t30_state_t *s, void *user_data, int result)
{
struct ast_channel *chan;
char far_ident[21]; chan = (struct ast_channel *) user_data;
if (result == T30_ERR_OK)
{
t30_get_far_ident(s, far_ident);
pbx_builtin_setvar_helper(chan, “REMOTESTATIONID”, far_ident); /******************* LINEA PARA MODIFICAR ******************************/
pbx_builtin_setvar_helper(chan, “RESULTADO”, “ENVIADO”); }
else
{
ast_log(LOG_DEBUG, “==============================================================================n”);
ast_log(LOG_DEBUG, “Fax send not successful - result (%d) %s.n”,result,t30_completion_code_to_str(result));
ast_log(LOG_DEBUG, “==============================================================================n”); /******************* LINEA PARA MODIFICAR ******************************/
pbx_builtin_setvar_helper(chan, “RESULTADO”, “ERROR”);
}
}
/*- End of function ——————————————————–*/
Gracias a esa función se puede dar un valor a una variable de canal, y como ocurre cuando el resultado es correcto se continúa con el dialplan.
Aqui dejamos el parche para que app_txfax devuelva una variable de estado. Su uso es muy facil:
# cd /usr/src/asterisk/apps
# patch app_txfax.c < app_txfax.patch