{
char *parse, modems[128] = "";
int channel_alive;
- RAII_VAR(struct ast_fax_session_details *, details, NULL, ao2_cleanup);
RAII_VAR(struct ast_fax_session *, s, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_fax_session_details *, details, NULL, ao2_cleanup);
struct ast_fax_tech_token *token = NULL;
struct ast_fax_document *doc;
AST_DECLARE_APP_ARGS(args,
{
char *parse, *filenames, *c, modems[128] = "";
int channel_alive, file_count;
- RAII_VAR(struct ast_fax_session_details *, details, NULL, ao2_cleanup);
- RAII_VAR(struct ast_fax_session *, s, NULL, ao2_cleanup);
+ struct ast_fax_session_details *details;
+ struct ast_fax_session *s;
struct ast_fax_tech_token *token = NULL;
struct ast_fax_document *doc;
AST_DECLARE_APP_ARGS(args,
ast_string_field_set(details, resultstr, "can't send a fax on a channel with a T.38 gateway");
set_channel_variables(chan, details);
ast_log(LOG_ERROR, "executing SendFAX on a channel with a T.38 Gateway is not supported\n");
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, resultstr, "maxrate is less than minrate");
set_channel_variables(chan, details);
ast_log(LOG_ERROR, "maxrate %d is less than minrate %d\n", details->maxrate, details->minrate);
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, error, "INVALID_ARGUMENTS");
ast_string_field_set(details, resultstr, "incompatible 'modems' and 'minrate' settings");
set_channel_variables(chan, details);
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, error, "INVALID_ARGUMENTS");
ast_string_field_set(details, resultstr, "incompatible 'modems' and 'maxrate' settings");
set_channel_variables(chan, details);
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, resultstr, "invalid arguments");
set_channel_variables(chan, details);
ast_log(LOG_WARNING, "%s requires an argument (filename[&filename[&filename]][,options])\n", app_sendfax);
+ ao2_ref(details, -1);
return -1;
}
parse = ast_strdupa(data);
ast_string_field_set(details, error, "INVALID_ARGUMENTS");
ast_string_field_set(details, resultstr, "invalid arguments");
set_channel_variables(chan, details);
+ ao2_ref(details, -1);
return -1;
}
if (ast_strlen_zero(args.filenames)) {
ast_string_field_set(details, resultstr, "invalid arguments");
set_channel_variables(chan, details);
ast_log(LOG_WARNING, "%s requires an argument (filename[&filename[&filename]],options])\n", app_sendfax);
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, resultstr, "invalid arguments");
set_channel_variables(chan, details);
ast_log(LOG_WARNING, "%s does not support polling\n", app_sendfax);
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, resultstr, "error reading file");
set_channel_variables(chan, details);
ast_log(LOG_ERROR, "access failure. Verify '%s' exists and check permissions.\n", args.filenames);
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, resultstr, "error allocating memory");
set_channel_variables(chan, details);
ast_log(LOG_ERROR, "System cannot provide memory for session requirements.\n");
+ ao2_ref(details, -1);
return -1;
}
ast_string_field_set(details, resultstr, "error reserving fax session");
set_channel_variables(chan, details);
ast_log(LOG_ERROR, "Unable to reserve FAX session.\n");
+ ao2_ref(details, -1);
return -1;
}
set_channel_variables(chan, details);
ast_log(LOG_WARNING, "Channel '%s' failed answer attempt.\n", ast_channel_name(chan));
fax_session_release(s, token);
+ ao2_ref(s, -1);
+ ao2_ref(details, -1);
return -1;
}
}
ast_string_field_set(details, resultstr, "error negotiating T.38");
set_channel_variables(chan, details);
fax_session_release(s, token);
+ ao2_ref(s, -1);
+ ao2_ref(details, -1);
return -1;
}
} else {
ast_string_field_set(details, resultstr, "error negotiating T.38");
set_channel_variables(chan, details);
fax_session_release(s, token);
+ ao2_ref(s, -1);
+ ao2_ref(details, -1);
ast_log(LOG_ERROR, "error initializing channel '%s' in T.38 mode\n", ast_channel_name(chan));
return -1;
}
ast_log(AST_LOG_ERROR, "Error publishing SendFAX status message\n");
}
+ ao2_ref(s, -1);
+ ao2_ref(details, -1);
+
/* If the channel hungup return -1; otherwise, return 0 to continue in the dialplan */
return (!channel_alive) ? -1 : 0;
}
*/
static struct ast_frame *fax_gateway_framehook(struct ast_channel *chan, struct ast_frame *f, enum ast_framehook_event event, void *data) {
struct fax_gateway *gateway = data;
- struct ast_channel *peer, *active;
- struct ast_fax_session_details *details;
+ struct ast_channel *active;
+ RAII_VAR(struct ast_fax_session_details *, details, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_channel *, peer, NULL, ao2_cleanup);
if (gateway->s) {
details = gateway->s->details;
ast_set_read_format(chan, &gateway->chan_read_format);
ast_set_read_format(chan, &gateway->chan_write_format);
- if ((peer = ast_bridged_channel(chan))) {
+ if ((peer = ast_channel_bridge_peer(chan))) {
ast_set_read_format(peer, &gateway->peer_read_format);
ast_set_read_format(peer, &gateway->peer_write_format);
ast_channel_make_compatible(chan, peer);
}
}
-
- ao2_ref(details, -1);
return NULL;
}
if (!f || (event == AST_FRAMEHOOK_EVENT_ATTACHED)) {
- ao2_ref(details, -1);
return NULL;
};
/* this frame was generated by the fax gateway, pass it on */
if (ast_test_flag(f, AST_FAX_FRFLAG_GATEWAY)) {
- ao2_ref(details, -1);
return f;
}
- if (!(peer = ast_bridged_channel(chan))) {
- /* not bridged, don't do anything */
- ao2_ref(details, -1);
+ /* If we aren't bridged or we don't have a peer, don't do anything */
+ if (!(peer = ast_channel_bridge_peer(chan))) {
return f;
}
ast_string_field_set(details, resultstr, "neither channel supports T.38");
ast_string_field_set(details, error, "T38_NEG_ERROR");
set_channel_variables(chan, details);
- ao2_ref(details, -1);
return f;
}
ast_string_field_build(details, resultstr, "no fax activity after %d ms", details->gateway_timeout);
ast_string_field_set(details, error, "TIMEOUT");
set_channel_variables(chan, details);
- ao2_ref(details, -1);
return f;
}
}
case AST_FORMAT_ULAW:
break;
default:
- ao2_ref(details, -1);
return f;
}
break;
if (f->subclass.integer == AST_MODEM_T38) {
break;
}
- ao2_ref(details, -1);
return f;
case AST_FRAME_CONTROL:
if (f->subclass.integer == AST_CONTROL_T38_PARAMETERS) {
break;
}
- ao2_ref(details, -1);
return f;
default:
- ao2_ref(details, -1);
return f;
}
break;
default:
ast_log(LOG_WARNING, "unhandled framehook event %i\n", event);
- ao2_ref(details, -1);
return f;
}
/* handle control frames */
if (f->frametype == AST_FRAME_CONTROL && f->subclass.integer == AST_CONTROL_T38_PARAMETERS) {
- ao2_ref(details, -1);
return fax_gateway_detect_t38(gateway, chan, peer, active, f);
}
if (!gateway->detected_v21 && gateway->t38_state == T38_STATE_UNAVAILABLE && f->frametype == AST_FRAME_VOICE) {
/* not in gateway mode and have not detected v21 yet, listen
* for v21 */
- ao2_ref(details, -1);
return fax_gateway_detect_v21(gateway, chan, peer, active, f);
}
if ((f->frametype == AST_FRAME_VOICE) && (f->subclass.format.id != AST_FORMAT_SLINEAR)) {
if (ast_channel_readtrans(active) && (f = ast_translate(ast_channel_readtrans(active), f, 1)) == NULL) {
f = &ast_null_frame;
- ao2_ref(details, -1);
return f;
}
}
ast_frfree(f);
}
f = &ast_null_frame;
- ao2_ref(details, -1);
return f;
}
};
ast_format_set(&silence_frame.subclass.format, AST_FORMAT_SLINEAR, 0);
memset(silence_buf, 0, sizeof(silence_buf));
-
- ao2_ref(details, -1);
return ast_frisolate(&silence_frame);
} else {
- ao2_ref(details, -1);
return &ast_null_frame;
}
}
- ao2_ref(details, -1);
return f;
}
struct fax_detect *faxdetect = data;
struct ast_fax_session_details *details;
struct ast_control_t38_parameters *control_params;
- struct ast_channel *peer;
+ RAII_VAR(struct ast_channel *, peer, NULL, ao2_cleanup);
int result = 0;
details = faxdetect->details;
case AST_FRAMEHOOK_EVENT_DETACHED:
/* restore audio formats when we are detached */
ast_set_read_format(chan, &faxdetect->orig_format);
- if ((peer = ast_bridged_channel(chan))) {
+ if ((peer = ast_channel_bridge_peer(chan))) {
ast_channel_make_compatible(chan, peer);
}
return NULL;