/** Parse MRCP message (excluding message body) */ MRCP_DECLARE(apt_bool_t) mrcp_message_parse(mrcp_resource_factory_t *resource_factory, mrcp_message_t *message, apt_text_stream_t *stream) { mrcp_resource_t *resource; /* parse start-line */ if(mrcp_start_line_parse(&message->start_line,stream,message->pool) == FALSE) { return FALSE; } if(message->start_line.version == MRCP_VERSION_2) { mrcp_channel_id_parse(&message->channel_id,stream,message->pool); } /* find resource */ resource = mrcp_resource_find(resource_factory,&message->channel_id.resource_name); if(!resource) { return FALSE; } if(mrcp_message_resource_set(message,resource) == FALSE) { return FALSE; } /* parse header */ if(mrcp_message_header_parse(&message->header,stream,message->pool) == FALSE) { return FALSE; } return TRUE; }
/** Header section handler */ static apt_bool_t mrcp_parser_on_header_complete(apt_message_parser_t *parser, apt_message_context_t *context) { mrcp_message_t *mrcp_message = context->message; if(mrcp_message->start_line.version == MRCP_VERSION_2) { mrcp_resource_t *resource; mrcp_parser_t *mrcp_parser; if(mrcp_channel_id_parse(&mrcp_message->channel_id,&mrcp_message->header,mrcp_message->pool) == FALSE) { return FALSE; } mrcp_parser = apt_message_parser_object_get(parser); /* find resource */ resource = mrcp_resource_find(mrcp_parser->resource_factory,&mrcp_message->channel_id.resource_name); if(!resource) { return FALSE; } if(mrcp_message_resource_set(mrcp_message,resource) == FALSE) { return FALSE; } } if(mrcp_header_fields_parse(&mrcp_message->header,mrcp_message->pool) == FALSE) { return FALSE; } if(context->body && mrcp_generic_header_property_check(mrcp_message,GENERIC_HEADER_CONTENT_LENGTH) == TRUE) { mrcp_generic_header_t *generic_header = mrcp_generic_header_get(mrcp_message); if(generic_header && generic_header->content_length) { context->body->length = generic_header->content_length; } } return TRUE; }
static mrcp_channel_t* mrcp_server_channel_create(mrcp_server_session_t *session, const apt_str_t *resource_name, apr_size_t id, apr_array_header_t *cmid_arr) { mrcp_channel_t *channel; apr_pool_t *pool = session->base.pool; channel = apr_palloc(pool,sizeof(mrcp_channel_t)); channel->pool = pool; channel->session = &session->base; channel->resource = NULL; channel->control_channel = NULL; channel->state_machine = NULL; channel->engine_channel = NULL; channel->id = id; channel->cmid_arr = cmid_arr; channel->waiting_for_channel = FALSE; channel->waiting_for_termination = FALSE; if(resource_name && resource_name->buf) { mrcp_resource_t *resource; mrcp_engine_channel_t *engine_channel; resource = mrcp_resource_find(session->profile->resource_factory,resource_name); if(resource) { channel->resource = resource; if(mrcp_session_version_get(session) == MRCP_VERSION_2) { channel->control_channel = mrcp_server_control_channel_create( session->profile->connection_agent, channel, pool); } engine_channel = mrcp_server_engine_channel_create(session,channel,resource_name); if(engine_channel) { engine_channel->id = session->base.id; engine_channel->event_obj = channel; engine_channel->event_vtable = &engine_channel_vtable; channel->engine_channel = engine_channel; } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Engine Channel "APT_NAMESID_FMT" [%s]", MRCP_SESSION_NAMESID(session), resource_name->buf); session->answer->status = MRCP_SESSION_STATUS_UNACCEPTABLE_RESOURCE; } } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"No Such Resource "APT_NAMESID_FMT" [%s]", MRCP_SESSION_NAMESID(session), resource_name->buf); session->answer->status = MRCP_SESSION_STATUS_NO_SUCH_RESOURCE; } } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Invalid Resource Identifier "APT_NAMESID_FMT, MRCP_SESSION_NAMESID(session)); session->answer->status = MRCP_SESSION_STATUS_NO_SUCH_RESOURCE; } return channel; }
/** Set resource by name to be used for parsing of MRCPv1 messages */ MRCP_DECLARE(void) mrcp_parser_resource_set(mrcp_parser_t *parser, const apt_str_t *resource_name) { if(resource_name) { parser->resource = mrcp_resource_find(parser->resource_factory,resource_name); } }