static apt_bool_t mrcp_server_agent_channel_add(mrcp_connection_agent_t *agent, mrcp_control_channel_t *channel, mrcp_control_descriptor_t *offer) { mrcp_control_descriptor_t *answer = mrcp_control_answer_create(offer,channel->pool); apt_id_resource_generate(&offer->session_id,&offer->resource_name,'@',&channel->identifier,channel->pool); if(offer->port) { answer->port = agent->sockaddr->port; } if(offer->connection_type == MRCP_CONNECTION_TYPE_EXISTING) { if(agent->force_new_connection == TRUE) { /* force client to establish new connection */ answer->connection_type = MRCP_CONNECTION_TYPE_NEW; } else { mrcp_connection_t *connection = NULL; /* try to find any existing connection */ connection = mrcp_connection_find(agent,&offer->ip); if(!connection) { /* no existing conection found, force the new one */ answer->connection_type = MRCP_CONNECTION_TYPE_NEW; } } } if(!agent->null_connection) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Create Pending Connection"); agent->null_connection = mrcp_connection_create(); agent->connection_list = apt_list_create(agent->null_connection->pool); } mrcp_connection_channel_add(agent->null_connection,channel); apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Add Control Channel <%s> to Pending Connection [%d]", channel->identifier.buf, apr_hash_count(agent->null_connection->channel_table)); /* send response */ return mrcp_control_channel_add_respond(agent->vtable,channel,answer,TRUE); }
static apt_bool_t mrcp_client_agent_channel_modify(mrcp_connection_agent_t *agent, mrcp_control_channel_t *channel, mrcp_control_descriptor_t *descriptor) { apt_bool_t status = TRUE; if(descriptor->port) { if(!channel->connection) { mrcp_connection_t *connection = NULL; apt_id_resource_generate(&descriptor->session_id,&descriptor->resource_name,'@',&channel->identifier,channel->pool); /* no connection yet */ if(descriptor->connection_type == MRCP_CONNECTION_TYPE_EXISTING) { /* try to find existing connection */ connection = mrcp_client_agent_connection_find(agent,descriptor); if(!connection) { apt_obj_log(APT_LOG_MARK,APT_PRIO_WARNING,channel->log_obj,"Found No Existing TCP/MRCPv2 Connection"); } } if(!connection) { /* create new connection */ connection = mrcp_client_agent_connection_create(agent,descriptor); if(!connection) { apt_obj_log(APT_LOG_MARK,APT_PRIO_WARNING,channel->log_obj,"Failed to Establish TCP/MRCPv2 Connection"); } } if(connection) { mrcp_connection_channel_add(connection,channel); apt_obj_log(APT_LOG_MARK,APT_PRIO_INFO,channel->log_obj,"Add Control Channel <%s> %s [%d]", channel->identifier.buf, connection->id, apr_hash_count(connection->channel_table)); if(descriptor->connection_type == MRCP_CONNECTION_TYPE_NEW) { /* set connection type to existing for the next offers / if any */ descriptor->connection_type = MRCP_CONNECTION_TYPE_EXISTING; } } else { descriptor->port = 0; status = FALSE; } } } /* send response */ return mrcp_control_channel_modify_respond(agent->vtable,channel,descriptor,status); }
static mrcp_control_channel_t* mrcp_connection_channel_associate(mrcp_connection_agent_t *agent, mrcp_connection_t *connection, const mrcp_message_t *message) { apt_str_t identifier; mrcp_control_channel_t *channel; if(!connection || !message) { return NULL; } apt_id_resource_generate(&message->channel_id.session_id,&message->channel_id.resource_name,'@',&identifier,connection->pool); channel = mrcp_connection_channel_find(connection,&identifier); if(!channel) { channel = mrcp_connection_channel_find(agent->null_connection,&identifier); if(channel) { mrcp_connection_channel_remove(agent->null_connection,channel); mrcp_connection_channel_add(connection,channel); apt_log(APT_PRIO_INFO,"Move Control Channel <%s> to Connection [%d]", channel->identifier.buf, apr_hash_count(connection->channel_table)); } } return channel; }
static mrcp_control_channel_t* mrcp_connection_channel_associate(mrcp_connection_agent_t *agent, mrcp_connection_t *connection, const mrcp_message_t *message) { apt_str_t identifier; mrcp_control_channel_t *channel; if(!connection || !message) { return NULL; } apt_id_resource_generate(&message->channel_id.session_id,&message->channel_id.resource_name,'@',&identifier,connection->pool); channel = mrcp_connection_channel_find(connection,&identifier); if(!channel) { channel = apr_hash_get(agent->pending_channel_table,identifier.buf,identifier.length); if(channel) { apr_hash_set(agent->pending_channel_table,identifier.buf,identifier.length,NULL); mrcp_connection_channel_add(connection,channel); apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Assign Control Channel <%s> to Connection %s [%d] -> [%d]", channel->identifier.buf, connection->id, apr_hash_count(agent->pending_channel_table), apr_hash_count(connection->channel_table)); } } return channel; }