static apt_bool_t mrcp_server_message_dispatch(mrcp_state_machine_t *state_machine, mrcp_message_t *message) { mrcp_channel_t *channel = state_machine->obj; if(message->start_line.message_type == MRCP_MESSAGE_TYPE_REQUEST) { /* send request message to resource engine for actual processing */ if(channel->engine_channel) { mrcp_engine_channel_request_process(channel->engine_channel,message); } } else if(message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { mrcp_server_session_t *session = (mrcp_server_session_t*)channel->session; /* send response message to client */ if(channel->control_channel) { /* MRCPv2 */ mrcp_server_control_message_send(channel->control_channel,message); } else { /* MRCPv1 */ mrcp_session_control_response(channel->session,message); } session->active_request = apt_list_pop_front(session->request_queue); if(session->active_request) { mrcp_server_signaling_message_dispatch(session,session->active_request); } } else { /* send event message to client */ if(channel->control_channel) { /* MRCPv2 */ mrcp_server_control_message_send(channel->control_channel,message); } else { /* MRCPv1 */ mrcp_session_control_response(channel->session,message); } } return TRUE; }
static apt_bool_t mrcp_unirtsp_on_announce_response(mrcp_unirtsp_agent_t *agent, mrcp_unirtsp_session_t *session, rtsp_message_t *message, const char *resource_name) { mrcp_message_t *mrcp_message = NULL; if(!session || !resource_name) { return FALSE; } if(rtsp_header_property_check(&message->header,RTSP_HEADER_FIELD_CONTENT_TYPE) == TRUE && message->header.content_type == RTSP_CONTENT_TYPE_MRCP && rtsp_header_property_check(&message->header,RTSP_HEADER_FIELD_CONTENT_LENGTH) == TRUE && message->header.content_length > 0) { apt_text_stream_t text_stream; mrcp_parser_t *parser; apt_str_t resource_name_str; text_stream.text = message->body; apt_text_stream_reset(&text_stream); apt_string_set(&resource_name_str,resource_name); parser = mrcp_parser_create(agent->sig_agent->resource_factory,session->mrcp_session->pool); mrcp_parser_resource_set(parser,&resource_name_str); if(mrcp_parser_run(parser,&text_stream,&mrcp_message) == APT_MESSAGE_STATUS_COMPLETE) { mrcp_message->channel_id.session_id = message->header.session_id; } else { /* error case */ apt_log(RTSP_LOG_MARK,APT_PRIO_WARNING,"Failed to Parse MRCPv1 Message"); } } else { /* error case */ apt_log(RTSP_LOG_MARK,APT_PRIO_WARNING,"Failed to Determine MRCPv1 Message Content"); } if(!mrcp_message) { if(!session->mrcp_message) { return FALSE; } mrcp_message = mrcp_response_create(session->mrcp_message,session->mrcp_session->pool); mrcp_message->start_line.status_code = MRCP_STATUS_CODE_METHOD_FAILED; } if(session->mrcp_message && mrcp_message->start_line.request_id == session->mrcp_message->start_line.request_id) { session->mrcp_message = NULL; } mrcp_session_control_response(session->mrcp_session,mrcp_message); return TRUE; }