Пример #1
0
/** 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;
}
Пример #2
0
/** 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;
}
Пример #3
0
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;
}
Пример #4
0
/** 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);
	}
}