/** Generate RTSP header field */ static apr_size_t rtsp_header_field_generate(rtsp_header_t *header, apr_size_t id, apt_text_stream_t *value) { switch(id) { case RTSP_HEADER_FIELD_CSEQ: apt_size_value_generate(header->cseq,value); break; case RTSP_HEADER_FIELD_TRANSPORT: rtsp_transport_generate(&header->transport,value); break; case RTSP_HEADER_FIELD_SESSION_ID: apt_string_value_generate(&header->session_id,value); break; case RTSP_HEADER_FIELD_RTP_INFO: apt_string_value_generate(&header->rtp_info,value); break; case RTSP_HEADER_FIELD_CONTENT_TYPE: { const apt_str_t *name = apt_string_table_str_get(rtsp_content_type_string_table,RTSP_CONTENT_TYPE_COUNT,header->content_type); if(name) { apt_string_value_generate(name,value); } break; } case RTSP_HEADER_FIELD_CONTENT_LENGTH: apt_size_value_generate(header->content_length,value); break; default: break; } return TRUE; }
/** Generate generic-header */ static apt_bool_t mrcp_generic_header_generate(mrcp_header_accessor_t *accessor, size_t id, apt_text_stream_t *value) { mrcp_generic_header_t *generic_header = accessor->data; switch(id) { case GENERIC_HEADER_ACTIVE_REQUEST_ID_LIST: mrcp_request_id_list_generate(&generic_header->active_request_id_list,value); break; case GENERIC_HEADER_PROXY_SYNC_ID: apt_string_value_generate(&generic_header->proxy_sync_id,value); break; case GENERIC_HEADER_ACCEPT_CHARSET: apt_string_value_generate(&generic_header->accept_charset,value); break; case GENERIC_HEADER_CONTENT_TYPE: apt_string_value_generate(&generic_header->content_type,value); break; case GENERIC_HEADER_CONTENT_ID: apt_string_value_generate(&generic_header->content_id,value); break; case GENERIC_HEADER_CONTENT_BASE: apt_string_value_generate(&generic_header->content_base,value); break; case GENERIC_HEADER_CONTENT_ENCODING: apt_string_value_generate(&generic_header->content_encoding,value); break; case GENERIC_HEADER_CONTENT_LOCATION: apt_string_value_generate(&generic_header->content_location,value); break; case GENERIC_HEADER_CONTENT_LENGTH: apt_size_value_generate(generic_header->content_length,value); break; case GENERIC_HEADER_CACHE_CONTROL: apt_string_value_generate(&generic_header->cache_control,value); break; case GENERIC_HEADER_LOGGING_TAG: apt_string_value_generate(&generic_header->logging_tag,value); break; case GENERIC_HEADER_VENDOR_SPECIFIC_PARAMS: apt_pair_array_generate(generic_header->vendor_specific_params,value); break; case GENERIC_HEADER_ACCEPT: apt_string_value_generate(&generic_header->accept,value); break; case GENERIC_HEADER_FETCH_TIMEOUT: apt_size_value_generate(generic_header->fetch_timeout,value); break; case GENERIC_HEADER_SET_COOKIE: apt_string_value_generate(&generic_header->set_cookie,value); break; case GENERIC_HEADER_SET_COOKIE2: apt_string_value_generate(&generic_header->set_cookie2,value); break; default: break; } return TRUE; }
/** Generate RTSP transport port range */ static apt_bool_t rtsp_port_range_generate(rtsp_transport_attrib_e attrib, const rtsp_port_range_t *port_range, apt_text_stream_t *text_stream) { const apt_str_t *str; str = apt_string_table_str_get(rtsp_transport_attrib_string_table,RTSP_TRANSPORT_ATTRIB_COUNT,attrib); if(!str) { return FALSE; } apt_string_value_generate(str,text_stream); apt_text_char_insert(text_stream,'='); apt_size_value_generate(port_range->min,text_stream); if(port_range->max > port_range->min) { apt_text_char_insert(text_stream,'-'); apt_size_value_generate(port_range->max,text_stream); } return TRUE; }
/** Generate MRCP version */ static apt_bool_t mrcp_version_generate(mrcp_version_e version, apt_text_stream_t *stream) { memcpy(stream->pos,MRCP_NAME,MRCP_NAME_LENGTH); stream->pos += MRCP_NAME_LENGTH; *stream->pos++ = MRCP_NAME_VERSION_SEPARATOR; apt_size_value_generate(version,stream); *stream->pos++ = MRCP_VERSION_MAJOR_MINOR_SEPARATOR; *stream->pos++ = '0'; return TRUE; }
/** Generate mrcp request-id list */ static apt_bool_t mrcp_request_id_list_generate(mrcp_request_id_list_t *request_id_list, apt_text_stream_t *stream) { size_t i; for(i=0; i<request_id_list->count; i++) { apt_size_value_generate(request_id_list->ids[i],stream); if(i < request_id_list->count-1) { *stream->pos++ = ','; } } return TRUE; }
/** Generate generic-header */ static apt_bool_t mrcp_generic_header_generate(mrcp_header_accessor_t *accessor, size_t id, apt_text_stream_t *value) { mrcp_generic_header_t *generic_header = accessor->data; switch(id) { case GENERIC_HEADER_ACTIVE_REQUEST_ID_LIST: mrcp_request_id_list_generate(&generic_header->active_request_id_list,value); break; case GENERIC_HEADER_PROXY_SYNC_ID: apt_string_value_generate(&generic_header->proxy_sync_id,value); break; case GENERIC_HEADER_ACCEPT_CHARSET: apt_string_value_generate(&generic_header->accept_charset,value); break; case GENERIC_HEADER_CONTENT_TYPE: apt_string_value_generate(&generic_header->content_type,value); break; case GENERIC_HEADER_CONTENT_ID: apt_string_value_generate(&generic_header->content_id,value); break; case GENERIC_HEADER_CONTENT_BASE: apt_string_value_generate(&generic_header->content_base,value); break; case GENERIC_HEADER_CONTENT_ENCODING: apt_string_value_generate(&generic_header->content_encoding,value); break; case GENERIC_HEADER_CONTENT_LOCATION: apt_string_value_generate(&generic_header->content_location,value); break; case GENERIC_HEADER_CONTENT_LENGTH: apt_size_value_generate(generic_header->content_length,value); break; case GENERIC_HEADER_CACHE_CONTROL: apt_string_value_generate(&generic_header->cache_control,value); break; case GENERIC_HEADER_LOGGING_TAG: apt_string_value_generate(&generic_header->logging_tag,value); break; default: break; } return TRUE; }
/** Add content part to multipart content */ APT_DECLARE(apt_bool_t) apt_multipart_content_add(apt_multipart_content_t *multipart_content, const apt_str_t *content_type, const apt_str_t *content) { if(!content || !content_type) { return FALSE; } if(multipart_content->hyphens.length + multipart_content->boundary.length + multipart_content->content_type_header.length + content_type->length + multipart_content->content_length_header.length + 10 /* max number of digits in content-length */ + content->length + 10 /* 5*2 eol */ + multipart_content->stream.pos > multipart_content->stream.end ) { return FALSE; } /* insert preceding end-of-line */ apt_text_eol_insert(&multipart_content->stream); /* insert hyphens */ apt_string_value_generate(&multipart_content->hyphens,&multipart_content->stream); /* insert boundary */ apt_string_value_generate(&multipart_content->boundary,&multipart_content->stream); apt_text_eol_insert(&multipart_content->stream); /* insert content-type */ apt_text_header_name_generate(&multipart_content->content_type_header,&multipart_content->stream); apt_string_value_generate(content_type,&multipart_content->stream); apt_text_eol_insert(&multipart_content->stream); /* insert content-lebgth */ apt_text_header_name_generate(&multipart_content->content_length_header,&multipart_content->stream); apt_size_value_generate(content->length,&multipart_content->stream); apt_text_eol_insert(&multipart_content->stream); /* insert empty line */ apt_text_eol_insert(&multipart_content->stream); /* insert content */ apt_string_value_generate(content, &multipart_content->stream); return TRUE; }
/** Generate MRCP recognizer header */ static apt_bool_t mrcp_recog_header_generate(const mrcp_recog_header_t *recog_header, apr_size_t id, apt_str_t *value, apr_pool_t *pool) { switch(id) { case RECOGNIZER_HEADER_N_BEST_LIST_LENGTH: apt_size_value_generate(recog_header->n_best_list_length,value,pool); break; case RECOGNIZER_HEADER_NO_INPUT_TIMEOUT: apt_size_value_generate(recog_header->no_input_timeout,value,pool); break; case RECOGNIZER_HEADER_RECOGNITION_TIMEOUT: apt_size_value_generate(recog_header->recognition_timeout,value,pool); break; case RECOGNIZER_HEADER_WAVEFORM_URI: *value = recog_header->waveform_uri; break; case RECOGNIZER_HEADER_RECOGNIZER_CONTEXT_BLOCK: *value = recog_header->recognizer_context_block; break; case RECOGNIZER_HEADER_START_INPUT_TIMERS: apt_boolean_value_generate(recog_header->start_input_timers,value,pool); break; case RECOGNIZER_HEADER_SPEECH_COMPLETE_TIMEOUT: apt_size_value_generate(recog_header->speech_complete_timeout,value,pool); break; case RECOGNIZER_HEADER_SPEECH_INCOMPLETE_TIMEOUT: apt_size_value_generate(recog_header->speech_incomplete_timeout,value,pool); break; case RECOGNIZER_HEADER_DTMF_INTERDIGIT_TIMEOUT: apt_size_value_generate(recog_header->dtmf_interdigit_timeout,value,pool); break; case RECOGNIZER_HEADER_DTMF_TERM_TIMEOUT: apt_size_value_generate(recog_header->dtmf_term_timeout,value,pool); break; case RECOGNIZER_HEADER_DTMF_TERM_CHAR: value->length = 1; value->buf = apr_palloc(pool,value->length); *value->buf = recog_header->dtmf_term_char; break; case RECOGNIZER_HEADER_FAILED_URI: *value = recog_header->failed_uri; break; case RECOGNIZER_HEADER_FAILED_URI_CAUSE: *value = recog_header->failed_uri_cause; break; case RECOGNIZER_HEADER_SAVE_WAVEFORM: apt_boolean_value_generate(recog_header->save_waveform,value,pool); break; case RECOGNIZER_HEADER_NEW_AUDIO_CHANNEL: apt_boolean_value_generate(recog_header->new_audio_channel,value,pool); break; case RECOGNIZER_HEADER_SPEECH_LANGUAGE: *value = recog_header->speech_language; break; case RECOGNIZER_HEADER_INPUT_TYPE: *value = recog_header->input_type; break; case RECOGNIZER_HEADER_INPUT_WAVEFORM_URI: *value = recog_header->input_waveform_uri; break; case RECOGNIZER_HEADER_COMPLETION_REASON: *value = recog_header->completion_reason; break; case RECOGNIZER_HEADER_MEDIA_TYPE: *value = recog_header->media_type; break; case RECOGNIZER_HEADER_VER_BUFFER_UTTERANCE: apt_boolean_value_generate(recog_header->ver_buffer_utterance,value,pool); break; case RECOGNIZER_HEADER_RECOGNITION_MODE: *value = recog_header->recognition_mode; break; case RECOGNIZER_HEADER_CANCEL_IF_QUEUE: apt_boolean_value_generate(recog_header->cancel_if_queue,value,pool); break; case RECOGNIZER_HEADER_HOTWORD_MAX_DURATION: apt_size_value_generate(recog_header->hotword_max_duration,value,pool); break; case RECOGNIZER_HEADER_HOTWORD_MIN_DURATION: apt_size_value_generate(recog_header->hotword_min_duration,value,pool); break; case RECOGNIZER_HEADER_INTERPRET_TEXT: *value = recog_header->interpret_text; break; case RECOGNIZER_HEADER_DTMF_BUFFER_TIME: apt_size_value_generate(recog_header->dtmf_buffer_time,value,pool); break; case RECOGNIZER_HEADER_CLEAR_DTMF_BUFFER: apt_boolean_value_generate(recog_header->clear_dtmf_buffer,value,pool); break; case RECOGNIZER_HEADER_EARLY_NO_MATCH: apt_boolean_value_generate(recog_header->early_no_match,value,pool); break; case RECOGNIZER_HEADER_NUM_MIN_CONSISTENT_PRONUNCIATIONS: apt_size_value_generate(recog_header->num_min_consistent_pronunciations,value,pool); break; case RECOGNIZER_HEADER_CONSISTENCY_THRESHOLD: apt_float_value_generate(recog_header->consistency_threshold,value,pool); break; case RECOGNIZER_HEADER_CLASH_THRESHOLD: apt_float_value_generate(recog_header->clash_threshold,value,pool); break; case RECOGNIZER_HEADER_PERSONAL_GRAMMAR_URI: *value = recog_header->personal_grammar_uri; break; case RECOGNIZER_HEADER_ENROLL_UTTERANCE: apt_boolean_value_generate(recog_header->enroll_utterance,value,pool); break; case RECOGNIZER_HEADER_PHRASE_ID: *value = recog_header->phrase_id; break; case RECOGNIZER_HEADER_PHRASE_NL: *value = recog_header->phrase_nl; break; case RECOGNIZER_HEADER_WEIGHT: apt_float_value_generate(recog_header->weight,value,pool); break; case RECOGNIZER_HEADER_SAVE_BEST_WAVEFORM: apt_boolean_value_generate(recog_header->save_best_waveform,value,pool); break; case RECOGNIZER_HEADER_NEW_PHRASE_ID: *value = recog_header->new_phrase_id; break; case RECOGNIZER_HEADER_CONFUSABLE_PHRASES_URI: *value = recog_header->confusable_phrases_uri; break; case RECOGNIZER_HEADER_ABORT_PHRASE_ENROLLMENT: apt_boolean_value_generate(recog_header->abort_phrase_enrollment,value,pool); break; default: break; } return TRUE; }
static APR_INLINE apt_bool_t apt_size_value_generate_from_float(float value, apt_str_t *str, apr_pool_t *pool) { apr_size_t s = (apr_size_t)((value + 0.001f) * 100); return apt_size_value_generate(s,str,pool); }
/** Generate MRCP recorder header */ static apt_bool_t mrcp_recorder_header_generate(const mrcp_header_accessor_t *accessor, apr_size_t id, apt_str_t *value, apr_pool_t *pool) { mrcp_recorder_header_t *recorder_header = accessor->data; switch(id) { case RECORDER_HEADER_SENSITIVITY_LEVEL: apt_float_value_generate(recorder_header->sensitivity_level,value,pool); break; case RECORDER_HEADER_NO_INPUT_TIMEOUT: apt_size_value_generate(recorder_header->no_input_timeout,value,pool); break; case RECORDER_HEADER_COMPLETION_CAUSE: { apt_completion_cause_generate( completion_cause_string_table, RECORDER_COMPLETION_CAUSE_COUNT, recorder_header->completion_cause, value, pool); break; } case RECORDER_HEADER_COMPLETION_REASON: *value = recorder_header->completion_reason; break; case RECORDER_HEADER_FAILED_URI: *value = recorder_header->failed_uri; break; case RECORDER_HEADER_FAILED_URI_CAUSE: *value = recorder_header->failed_uri_cause; break; case RECORDER_HEADER_RECORD_URI: *value = recorder_header->record_uri; break; case RECORDER_HEADER_MEDIA_TYPE: *value = recorder_header->media_type; break; case RECORDER_HEADER_MAX_TIME: apt_size_value_generate(recorder_header->max_time,value,pool); break; case RECORDER_HEADER_TRIM_LENGTH: apt_size_value_generate(recorder_header->trim_length,value,pool); break; case RECORDER_HEADER_FINAL_SILENCE: apt_size_value_generate(recorder_header->final_silence,value,pool); break; case RECORDER_HEADER_CAPTURE_ON_SPEECH: apt_boolean_value_generate(recorder_header->capture_on_speech,value,pool); break; case RECORDER_HEADER_VER_BUFFER_UTTERANCE: apt_boolean_value_generate(recorder_header->ver_buffer_utterance,value,pool); break; case RECORDER_HEADER_START_INPUT_TIMERS: apt_boolean_value_generate(recorder_header->start_input_timers,value,pool); break; case RECORDER_HEADER_NEW_AUDIO_CHANNEL: apt_boolean_value_generate(recorder_header->new_audio_channel,value,pool); break; default: break; } return TRUE; }
/** Generate MRCP status-code */ static APR_INLINE size_t mrcp_status_code_generate(mrcp_status_code_e status_code, apt_text_stream_t *stream) { return apt_size_value_generate(status_code,stream); }
/** Generate MRCP request-id */ static APR_INLINE apt_bool_t mrcp_request_id_generate(mrcp_request_id request_id, apt_text_stream_t *stream) { return apt_size_value_generate(request_id,stream); }
/** Generate MRCP recognizer header */ static apt_bool_t mrcp_recog_header_generate(mrcp_recog_header_t *recog_header, apr_size_t id, apt_text_stream_t *value) { switch(id) { case RECOGNIZER_HEADER_N_BEST_LIST_LENGTH: apt_size_value_generate(recog_header->n_best_list_length,value); break; case RECOGNIZER_HEADER_NO_INPUT_TIMEOUT: apt_size_value_generate(recog_header->no_input_timeout,value); break; case RECOGNIZER_HEADER_RECOGNITION_TIMEOUT: apt_size_value_generate(recog_header->recognition_timeout,value); break; case RECOGNIZER_HEADER_WAVEFORM_URI: apt_string_value_generate(&recog_header->waveform_uri,value); break; case RECOGNIZER_HEADER_RECOGNIZER_CONTEXT_BLOCK: apt_string_value_generate(&recog_header->recognizer_context_block,value); break; case RECOGNIZER_HEADER_START_INPUT_TIMERS: apt_boolean_value_generate(recog_header->start_input_timers,value); break; case RECOGNIZER_HEADER_SPEECH_COMPLETE_TIMEOUT: apt_size_value_generate(recog_header->speech_complete_timeout,value); break; case RECOGNIZER_HEADER_SPEECH_INCOMPLETE_TIMEOUT: apt_size_value_generate(recog_header->speech_incomplete_timeout,value); break; case RECOGNIZER_HEADER_DTMF_INTERDIGIT_TIMEOUT: apt_size_value_generate(recog_header->dtmf_interdigit_timeout,value); break; case RECOGNIZER_HEADER_DTMF_TERM_TIMEOUT: apt_size_value_generate(recog_header->dtmf_term_timeout,value); break; case RECOGNIZER_HEADER_DTMF_TERM_CHAR: *value->pos++ = recog_header->dtmf_term_char; break; case RECOGNIZER_HEADER_FAILED_URI: apt_string_value_generate(&recog_header->failed_uri,value); break; case RECOGNIZER_HEADER_FAILED_URI_CAUSE: apt_string_value_generate(&recog_header->failed_uri_cause,value); break; case RECOGNIZER_HEADER_SAVE_WAVEFORM: apt_boolean_value_generate(recog_header->save_waveform,value); break; case RECOGNIZER_HEADER_NEW_AUDIO_CHANNEL: apt_boolean_value_generate(recog_header->new_audio_channel,value); break; case RECOGNIZER_HEADER_SPEECH_LANGUAGE: apt_string_value_generate(&recog_header->speech_language,value); break; case RECOGNIZER_HEADER_INPUT_TYPE: apt_string_value_generate(&recog_header->input_type,value); break; case RECOGNIZER_HEADER_INPUT_WAVEFORM_URI: apt_string_value_generate(&recog_header->input_waveform_uri,value); break; case RECOGNIZER_HEADER_COMPLETION_REASON: apt_string_value_generate(&recog_header->completion_reason,value); break; case RECOGNIZER_HEADER_MEDIA_TYPE: apt_string_value_generate(&recog_header->media_type,value); break; case RECOGNIZER_HEADER_VER_BUFFER_UTTERANCE: apt_boolean_value_generate(recog_header->ver_buffer_utterance,value); break; case RECOGNIZER_HEADER_RECOGNITION_MODE: apt_string_value_generate(&recog_header->recognition_mode,value); break; case RECOGNIZER_HEADER_CANCEL_IF_QUEUE: apt_boolean_value_generate(recog_header->cancel_if_queue,value); break; case RECOGNIZER_HEADER_HOTWORD_MAX_DURATION: apt_size_value_generate(recog_header->hotword_max_duration,value); break; case RECOGNIZER_HEADER_HOTWORD_MIN_DURATION: apt_size_value_generate(recog_header->hotword_min_duration,value); break; case RECOGNIZER_HEADER_INTERPRET_TEXT: apt_string_value_generate(&recog_header->interpret_text,value); break; case RECOGNIZER_HEADER_DTMF_BUFFER_TIME: apt_size_value_generate(recog_header->dtmf_buffer_time,value); break; case RECOGNIZER_HEADER_CLEAR_DTMF_BUFFER: apt_boolean_value_generate(recog_header->clear_dtmf_buffer,value); break; case RECOGNIZER_HEADER_EARLY_NO_MATCH: apt_boolean_value_generate(recog_header->early_no_match,value); break; default: break; } return TRUE; }
/** Generate MRCP synthesizer header */ static apt_bool_t mrcp_synth_header_generate(const mrcp_header_accessor_t *accessor, size_t id, apt_str_t *value, apr_pool_t *pool) { mrcp_synth_header_t *synth_header = accessor->data; switch(id) { case SYNTHESIZER_HEADER_JUMP_SIZE: mrcp_speech_length_generate(&synth_header->jump_size,value,pool); break; case SYNTHESIZER_HEADER_KILL_ON_BARGE_IN: apt_boolean_value_generate(synth_header->kill_on_barge_in,value,pool); break; case SYNTHESIZER_HEADER_SPEAKER_PROFILE: *value = synth_header->speaker_profile,value; break; case SYNTHESIZER_HEADER_COMPLETION_CAUSE: apt_completion_cause_generate( completion_cause_string_table, SYNTHESIZER_COMPLETION_CAUSE_COUNT, synth_header->completion_cause, value, pool); break; case SYNTHESIZER_HEADER_COMPLETION_REASON: *value = synth_header->completion_reason; break; case SYNTHESIZER_HEADER_VOICE_GENDER: apt_string_table_value_pgenerate( voice_gender_string_table, VOICE_GENDER_COUNT, synth_header->voice_param.gender, value, pool); break; case SYNTHESIZER_HEADER_VOICE_AGE: apt_size_value_generate(synth_header->voice_param.age,value,pool); break; case SYNTHESIZER_HEADER_VOICE_VARIANT: apt_size_value_generate(synth_header->voice_param.variant,value,pool); break; case SYNTHESIZER_HEADER_VOICE_NAME: *value = synth_header->voice_param.name,value; break; case SYNTHESIZER_HEADER_PROSODY_VOLUME: mrcp_prosody_volume_generate(&synth_header->prosody_param.volume,value,pool); break; case SYNTHESIZER_HEADER_PROSODY_RATE: mrcp_prosody_rate_generate(&synth_header->prosody_param.rate,value,pool); break; case SYNTHESIZER_HEADER_SPEECH_MARKER: *value = synth_header->speech_marker; break; case SYNTHESIZER_HEADER_SPEECH_LANGUAGE: *value = synth_header->speech_language; break; case SYNTHESIZER_HEADER_FETCH_HINT: *value = synth_header->fetch_hint; break; case SYNTHESIZER_HEADER_AUDIO_FETCH_HINT: *value = synth_header->audio_fetch_hint; break; case SYNTHESIZER_HEADER_FAILED_URI: *value = synth_header->failed_uri; break; case SYNTHESIZER_HEADER_FAILED_URI_CAUSE: *value = synth_header->failed_uri_cause; break; case SYNTHESIZER_HEADER_SPEAK_RESTART: apt_boolean_value_generate(synth_header->speak_restart,value,pool); break; case SYNTHESIZER_HEADER_SPEAK_LENGTH: mrcp_speech_length_generate(&synth_header->speak_length,value,pool); break; case SYNTHESIZER_HEADER_LOAD_LEXICON: apt_boolean_value_generate(synth_header->load_lexicon,value,pool); break; case SYNTHESIZER_HEADER_LEXICON_SEARCH_ORDER: *value = synth_header->lexicon_search_order; break; default: break; } return TRUE; }