/** Generate MRCP control media by SDP media */ static apt_bool_t mrcp_control_media_generate(mrcp_control_descriptor_t *control_media, const sdp_media_t *sdp_media, const apt_str_t *ip, apr_pool_t *pool) { mrcp_attrib_e id; apt_str_t name; apt_str_t value; sdp_attribute_t *attrib = NULL; apt_string_set(&name,sdp_media->m_proto_name); control_media->proto = mrcp_proto_find(&name); if(control_media->proto != MRCP_PROTO_TCP) { apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Not supported SDP Proto [%s], expected [%s]",sdp_media->m_proto_name,mrcp_proto_get(MRCP_PROTO_TCP)->buf); return FALSE; } for(attrib = sdp_media->m_attributes; attrib; attrib=attrib->a_next) { apt_string_set(&name,attrib->a_name); id = mrcp_attrib_id_find(&name); switch(id) { case MRCP_ATTRIB_SETUP: apt_string_set(&value,attrib->a_value); control_media->setup_type = mrcp_setup_type_find(&value); break; case MRCP_ATTRIB_CONNECTION: apt_string_set(&value,attrib->a_value); control_media->connection_type = mrcp_connection_type_find(&value); break; case MRCP_ATTRIB_RESOURCE: apt_string_assign(&control_media->resource_name,attrib->a_value,pool); break; case MRCP_ATTRIB_CHANNEL: apt_string_set(&value,attrib->a_value); apt_id_resource_parse(&value,'@',&control_media->session_id,&control_media->resource_name,pool); break; case MRCP_ATTRIB_CMID: mrcp_cmid_add(control_media->cmid_arr,atoi(attrib->a_value)); break; default: break; } } if(sdp_media->m_connections) { apt_string_assign(&control_media->ip,sdp_media->m_connections->c_address,pool); } else { control_media->ip = *ip; } control_media->port = (apr_port_t)sdp_media->m_port; return TRUE; }
/** Parse MRCP channel-identifier */ MRCP_DECLARE(apt_bool_t) mrcp_channel_id_parse(mrcp_channel_id *channel_id, mrcp_message_header_t *header, apr_pool_t *pool) { apt_header_field_t *header_field; for(header_field = APR_RING_FIRST(&header->header_section.ring); header_field != APR_RING_SENTINEL(&header->header_section.ring, apt_header_field_t, link); header_field = APR_RING_NEXT(header_field, link)) { if(header_field->value.length && strncasecmp(header_field->name.buf,MRCP_CHANNEL_ID,MRCP_CHANNEL_ID_LENGTH) == 0) { apt_id_resource_parse(&header_field->value,'@',&channel_id->session_id,&channel_id->resource_name,pool); apt_header_section_field_remove(&header->header_section,header_field); return TRUE; } } return FALSE; }
/** Parse MRCP channel-identifier */ MRCP_DECLARE(apt_bool_t) mrcp_channel_id_parse(mrcp_channel_id *channel_id, apt_text_stream_t *text_stream, apr_pool_t *pool) { apt_bool_t match = FALSE; apt_name_value_t pair; do { if(apt_text_header_read(text_stream,&pair) == TRUE) { if(strncasecmp(pair.name.buf,MRCP_CHANNEL_ID,MRCP_CHANNEL_ID_LENGTH) == 0) { match = TRUE; apt_id_resource_parse(&pair.value,'@',&channel_id->session_id,&channel_id->resource_name,pool); break; } /* skip this header, expecting channel identifier first */ } } while(pair.name.length || pair.name.buf); return match; }