|
|
|
@ -626,6 +626,8 @@ static const struct ast_datastore_info fax_datastore = {
|
|
|
|
|
static int fax_gateway_attach(struct ast_channel *chan, struct ast_fax_session_details *details);
|
|
|
|
|
static int fax_detect_attach(struct ast_channel *chan, int timeout, int flags);
|
|
|
|
|
static struct ast_fax_session_details *find_or_create_details(struct ast_channel *chan);
|
|
|
|
|
static struct ast_fax_session *fax_v21_session_new (struct ast_channel *chan);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*! \brief Copies fax detection and gateway framehooks during masquerades
|
|
|
|
|
*
|
|
|
|
@ -2835,6 +2837,23 @@ static void destroy_gateway(void *data)
|
|
|
|
|
ao2_cleanup(gateway->peer_write_format);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static struct ast_fax_session *fax_v21_session_new (struct ast_channel *chan) {
|
|
|
|
|
struct ast_fax_session_details *v21_details;
|
|
|
|
|
struct ast_fax_session *v21_session;
|
|
|
|
|
|
|
|
|
|
if (!chan || !(v21_details = session_details_new())) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
v21_details->caps = AST_FAX_TECH_V21_DETECT;
|
|
|
|
|
if (!(v21_session = fax_session_new(v21_details, chan, NULL, NULL))) {
|
|
|
|
|
ao2_ref(v21_details, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return v21_session;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*! \brief Create a new fax gateway object.
|
|
|
|
|
* \param chan the channel the gateway object will be attached to
|
|
|
|
|
* \param details the fax session details
|
|
|
|
@ -2843,30 +2862,16 @@ static void destroy_gateway(void *data)
|
|
|
|
|
static struct fax_gateway *fax_gateway_new(struct ast_channel *chan, struct ast_fax_session_details *details)
|
|
|
|
|
{
|
|
|
|
|
struct fax_gateway *gateway = ao2_alloc(sizeof(*gateway), destroy_gateway);
|
|
|
|
|
struct ast_fax_session_details *v21_details;
|
|
|
|
|
if (!gateway) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(v21_details = session_details_new())) {
|
|
|
|
|
if (!(gateway->chan_v21_session = fax_v21_session_new(chan))) {
|
|
|
|
|
ast_log(LOG_ERROR, "Can't create V21 session on chan %s for T.38 gateway session\n", ast_channel_name(chan));
|
|
|
|
|
ao2_ref(gateway, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
v21_details->caps = AST_FAX_TECH_V21_DETECT;
|
|
|
|
|
if (!(gateway->chan_v21_session = fax_session_new(v21_details, chan, NULL, NULL))) {
|
|
|
|
|
ao2_ref(v21_details, -1);
|
|
|
|
|
ao2_ref(gateway, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(gateway->peer_v21_session = fax_session_new(v21_details, chan, NULL, NULL))) {
|
|
|
|
|
ao2_ref(v21_details, -1);
|
|
|
|
|
ao2_ref(gateway, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
ao2_ref(v21_details, -1);
|
|
|
|
|
|
|
|
|
|
gateway->framehook = -1;
|
|
|
|
|
|
|
|
|
|
details->caps = AST_FAX_TECH_GATEWAY;
|
|
|
|
@ -3360,6 +3365,11 @@ static struct ast_frame *fax_gateway_framehook(struct ast_channel *chan, struct
|
|
|
|
|
ast_channel_unlock(peer);
|
|
|
|
|
|
|
|
|
|
gateway->bridged = 1;
|
|
|
|
|
if (!(gateway->peer_v21_session = fax_v21_session_new(peer))) {
|
|
|
|
|
ast_log(LOG_ERROR, "Can't create V21 session on chan %s for T.38 gateway session\n", ast_channel_name(peer));
|
|
|
|
|
ast_framehook_detach(chan, gateway->framehook);
|
|
|
|
|
return f;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gateway->bridged && !ast_tvzero(gateway->timeout_start)) {
|
|
|
|
@ -3486,6 +3496,10 @@ static int fax_gateway_attach(struct ast_channel *chan, struct ast_fax_session_d
|
|
|
|
|
.disable_inheritance = 1, /* Masquerade inheritance is handled through the datastore fixup */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (global_fax_debug) {
|
|
|
|
|
details->option.debug = AST_FAX_OPTFLAG_TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ast_string_field_set(details, result, "SUCCESS");
|
|
|
|
|
ast_string_field_set(details, resultstr, "gateway operation started successfully");
|
|
|
|
|
ast_string_field_set(details, error, "NO_ERROR");
|
|
|
|
|