static apt_bool_t mrcp_server_agent_messsage_send(mrcp_connection_agent_t *agent, mrcp_connection_t *connection, mrcp_message_t *message) { apt_bool_t status = FALSE; if(connection && connection->sock) { char buffer[MRCP_MESSAGE_MAX_SIZE]; apt_text_stream_t text_stream; text_stream.text.buf = buffer; text_stream.text.length = sizeof(buffer)-1; text_stream.pos = text_stream.text.buf; if(mrcp_message_generate(agent->resource_factory,message,&text_stream) == TRUE) { *text_stream.pos = '\0'; apt_log(APT_PRIO_INFO,"Send MRCPv2 Message size=%lu\n%s", text_stream.text.length,text_stream.text.buf); if(apr_socket_send(connection->sock,text_stream.text.buf,&text_stream.text.length) == APR_SUCCESS) { status = TRUE; } else { apt_log(APT_PRIO_WARNING,"Failed to Send MRCPv2 Message"); } } else { apt_log(APT_PRIO_WARNING,"Failed to Generate MRCPv2 Message"); } } else { apt_log(APT_PRIO_WARNING,"No MRCPv2 Connection"); } return status; }
static apt_bool_t mrcp_unirtsp_on_session_control(mrcp_session_t *mrcp_session, mrcp_message_t *mrcp_message) { mrcp_unirtsp_session_t *session = mrcp_session->obj; mrcp_unirtsp_agent_t *agent = mrcp_session->signaling_agent->obj; char buffer[500]; apt_text_stream_t stream; rtsp_message_t *rtsp_message = NULL; apt_str_t *body; apt_text_stream_init(&stream,buffer,sizeof(buffer)); mrcp_message->start_line.version = MRCP_VERSION_1; if(mrcp_message_generate(agent->sig_agent->resource_factory,mrcp_message,&stream) != TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Generate MRCPv1 Message"); return FALSE; } stream.text.length = stream.pos - stream.text.buf; if(mrcp_message->start_line.message_type == MRCP_MESSAGE_TYPE_RESPONSE) { /* send RTSP response (OK) */ const rtsp_message_t *request = rtsp_server_session_request_get(session->rtsp_session); if(request) { rtsp_message = rtsp_response_create(request,RTSP_STATUS_CODE_OK,RTSP_REASON_PHRASE_OK,mrcp_session->pool); } } else if(mrcp_message->start_line.message_type == MRCP_MESSAGE_TYPE_EVENT) { /* send RTSP announce */ rtsp_message = rtsp_request_create(mrcp_session->pool); rtsp_message->start_line.common.request_line.resource_name = rtsp_name_get_by_mrcp_name( agent->config->resource_map, mrcp_message->channel_id.resource_name.buf); rtsp_message->start_line.common.request_line.method_id = RTSP_METHOD_ANNOUNCE; } if(!rtsp_message) { return FALSE; } body = &rtsp_message->body; body->length = mrcp_message->start_line.length; body->buf = apr_palloc(rtsp_message->pool,body->length+1); memcpy(body->buf,stream.text.buf,stream.text.length); if(mrcp_message->body.length) { memcpy(body->buf+stream.text.length,mrcp_message->body.buf,mrcp_message->body.length); } body->buf[body->length] = '\0'; rtsp_message->header.content_type = RTSP_CONTENT_TYPE_MRCP; rtsp_header_property_add(&rtsp_message->header,RTSP_HEADER_FIELD_CONTENT_TYPE,rtsp_message->pool); rtsp_message->header.content_length = body->length; rtsp_header_property_add(&rtsp_message->header,RTSP_HEADER_FIELD_CONTENT_LENGTH,rtsp_message->pool); rtsp_server_session_respond(agent->rtsp_server,session->rtsp_session,rtsp_message); return TRUE; }
static apt_bool_t mrcp_unirtsp_session_control(mrcp_session_t *mrcp_session, mrcp_message_t *mrcp_message) { mrcp_unirtsp_session_t *session = mrcp_session->obj; mrcp_unirtsp_agent_t *agent = mrcp_session->signaling_agent->obj; char buffer[2000]; apt_text_stream_t stream; rtsp_message_t *rtsp_message = NULL; apt_str_t *body; apt_text_stream_init(&stream,buffer,sizeof(buffer)); mrcp_message->start_line.version = MRCP_VERSION_1; if(mrcp_message_generate(agent->sig_agent->resource_factory,mrcp_message,&stream) != TRUE) { apt_log(RTSP_LOG_MARK,APT_PRIO_WARNING,"Failed to Generate MRCPv1 Message"); return FALSE; } stream.text.length = stream.pos - stream.text.buf; rtsp_message = rtsp_request_create(mrcp_session->pool); rtsp_message->start_line.common.request_line.resource_name = rtsp_name_get_by_mrcp_name( session->rtsp_settings->resource_map, mrcp_message->channel_id.resource_name.buf); rtsp_message->start_line.common.request_line.method_id = RTSP_METHOD_ANNOUNCE; body = &rtsp_message->body; body->length = mrcp_message->start_line.length; body->buf = apr_palloc(rtsp_message->pool,body->length+1); memcpy(body->buf,stream.text.buf,stream.text.length); if(mrcp_message->body.length) { memcpy(body->buf+stream.text.length,mrcp_message->body.buf,mrcp_message->body.length); } body->buf[body->length] = '\0'; rtsp_message->header.content_type = RTSP_CONTENT_TYPE_MRCP; rtsp_header_property_add(&rtsp_message->header,RTSP_HEADER_FIELD_CONTENT_TYPE,rtsp_message->pool); rtsp_message->header.content_length = body->length; rtsp_header_property_add(&rtsp_message->header,RTSP_HEADER_FIELD_CONTENT_LENGTH,rtsp_message->pool); session->mrcp_message = mrcp_message; rtsp_client_session_request(agent->rtsp_client,session->rtsp_session,rtsp_message); return TRUE; }
static apt_bool_t mrcp_client_agent_messsage_send(mrcp_connection_agent_t *agent, mrcp_control_channel_t *channel, mrcp_message_t *message) { apt_bool_t status = FALSE; mrcp_connection_t *connection = channel->connection; if(connection && connection->sock) { char buffer[MRCP_MESSAGE_MAX_SIZE]; apt_text_stream_t text_stream; text_stream.text.buf = buffer; text_stream.text.length = sizeof(buffer)-1; text_stream.pos = text_stream.text.buf; if(mrcp_message_generate(agent->resource_factory,message,&text_stream) == TRUE) { *text_stream.pos = '\0'; apt_log(APT_PRIO_INFO,"Send MRCPv2 Message size=%lu\n%s", text_stream.text.length,text_stream.text.buf); if(apr_socket_send(connection->sock,text_stream.text.buf,&text_stream.text.length) == APR_SUCCESS) { status = TRUE; } else { apt_log(APT_PRIO_WARNING,"Failed to Send MRCPv2 Message"); } } else { apt_log(APT_PRIO_WARNING,"Failed to Generate MRCPv2 Message"); } } else { apt_log(APT_PRIO_WARNING,"No MRCPv2 Connection"); } if(status == FALSE) { mrcp_message_t *response = mrcp_response_create(message,message->pool); response->start_line.method_id = message->start_line.method_id; response->start_line.method_name = message->start_line.method_name; response->start_line.status_code = MRCP_STATUS_CODE_METHOD_FAILED; mrcp_connection_message_receive(agent->vtable,channel,response); } return TRUE; }
/** Generate MRCP stream */ MRCP_DECLARE(mrcp_stream_result_e) mrcp_generator_run(mrcp_generator_t *generator, apt_text_stream_t *stream) { mrcp_message_t *message = generator->message; if(!message) { return MRCP_STREAM_MESSAGE_INVALID; } if(message && generator->result == MRCP_STREAM_MESSAGE_TRUNCATED) { /* process continuation data */ generator->result = mrcp_message_body_write(message,stream); return generator->result; } /* generate start-line and header */ if(mrcp_message_generate(generator->resource_factory,message,stream) == FALSE) { return mrcp_generator_break(generator,stream); } /* generate body */ generator->result = mrcp_message_body_generate(message,stream); return generator->result; }