/** Generate MRCP message (excluding message body) */ MRCP_DECLARE(apt_bool_t) mrcp_message_generate(const mrcp_resource_factory_t *resource_factory, mrcp_message_t *message, apt_text_stream_t *stream) { /* validate message */ if(mrcp_message_validate(message) == FALSE) { return FALSE; } /* generate start-line */ if(mrcp_start_line_generate(&message->start_line,stream) == FALSE) { return FALSE; } if(message->start_line.version == MRCP_VERSION_2) { mrcp_channel_id_generate(&message->channel_id,stream); } /* generate header section */ if(apt_header_section_generate(&message->header.header_section,stream) == FALSE) { return FALSE; } /* finalize start-line generation */ if(mrcp_start_line_finalize(&message->start_line,message->body.length,stream) == FALSE) { return FALSE; } return TRUE; }
/** Generate message */ APT_DECLARE(apt_message_status_e) apt_message_generator_run(apt_message_generator_t *generator, void *message, apt_text_stream_t *stream) { if(!message) { return APT_MESSAGE_STATUS_INVALID; } if(message != generator->context.message) { generator->stage = APT_MESSAGE_STAGE_START_LINE; generator->context.message = message; generator->context.header = NULL; generator->context.body = NULL; } if(generator->stage == APT_MESSAGE_STAGE_START_LINE) { /* generate start-line */ if(generator->vtable->on_start(generator,&generator->context,stream) == FALSE) { return apt_message_generator_break(generator,stream); } if(!generator->context.header || !generator->context.body) { return APT_MESSAGE_STATUS_INVALID; } /* generate header */ if(apt_header_section_generate(generator->context.header,stream) == FALSE) { return apt_message_generator_break(generator,stream); } if(generator->vtable->on_header_complete) { generator->vtable->on_header_complete(generator,&generator->context,stream); } if(generator->verbose == TRUE) { apr_size_t length = stream->pos - stream->text.buf; apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Generated Message Header [%"APR_SIZE_T_FMT" bytes]\n%.*s", length, length, stream->text.buf); } generator->stage = APT_MESSAGE_STAGE_START_LINE; generator->content_length = generator->context.body->length; if(generator->content_length) { generator->context.body->length = 0; generator->stage = APT_MESSAGE_STAGE_BODY; } } if(generator->stage == APT_MESSAGE_STAGE_BODY) { if(apt_message_body_write(generator,stream) == FALSE) { return apt_message_generator_break(generator,stream); } generator->stage = APT_MESSAGE_STAGE_START_LINE; } return APT_MESSAGE_STATUS_COMPLETE; }
/** Add content part to multipart content */ APT_DECLARE(apt_bool_t) apt_multipart_content_add(apt_multipart_content_t *multipart_content, const apt_content_part_t *content_part) { if(!content_part) { return FALSE; } /* insert preceding eol, hyppens and boudnary */ if(apt_multipart_content_initialize(multipart_content) == FALSE) { return FALSE; } /* insert header fields */ if(apt_header_section_generate(&content_part->header,&multipart_content->stream) == FALSE) { return FALSE; } /* insert body */ return apt_text_string_insert(&multipart_content->stream,&content_part->body); }