/* Receive MRCP message through TCP/MRCPv2 connection */ static apt_bool_t mrcp_server_poller_signal_process(void *obj, const apr_pollfd_t *descriptor) { mrcp_connection_agent_t *agent = obj; mrcp_connection_t *connection = descriptor->client_data; apr_status_t status; apr_size_t offset; apr_size_t length; apt_text_stream_t *stream; mrcp_message_t *message; apt_message_status_e msg_status; if(descriptor->desc.s == agent->listen_sock) { return mrcp_server_agent_connection_accept(agent); } if(!connection || !connection->sock) { return FALSE; } stream = &connection->rx_stream; /* calculate offset remaining from the previous receive / if any */ offset = stream->pos - stream->text.buf; /* calculate available length */ length = connection->rx_buffer_size - offset; status = apr_socket_recv(connection->sock,stream->pos,&length); if(status == APR_EOF || length == 0) { return mrcp_server_agent_connection_close(agent,connection); } /* calculate actual length of the stream */ stream->text.length = offset + length; stream->pos[length] = '\0'; apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Receive MRCPv2 Data %s [%"APR_SIZE_T_FMT" bytes]\n%.*s", connection->id, length, connection->verbose == TRUE ? length : 0, stream->pos); /* reset pos */ apt_text_stream_reset(stream); do { msg_status = mrcp_parser_run(connection->parser,stream,&message); if(mrcp_server_message_handler(connection,message,msg_status) == FALSE) { return FALSE; } } while(apt_text_is_eos(stream) == FALSE); /* scroll remaining stream */ apt_text_stream_scroll(stream); return TRUE; }
static apt_bool_t mrcp_server_agent_task_run(apt_task_t *task) { mrcp_connection_agent_t *agent = apt_task_object_get(task); apt_bool_t running = TRUE; apr_status_t status; apr_int32_t num; const apr_pollfd_t *ret_pfd; int i; if(!agent) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Start MRCPv2 Agent"); return FALSE; } if(mrcp_server_agent_pollset_create(agent) == FALSE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Pollset"); return FALSE; } /* explicitly indicate task is ready to process messages */ apt_task_ready(agent->task); while(running) { status = apt_pollset_poll(agent->pollset, -1, &num, &ret_pfd); if(status != APR_SUCCESS) { continue; } for(i = 0; i < num; i++) { if(ret_pfd[i].desc.s == agent->listen_sock) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Accept MRCPv2 Connection"); mrcp_server_agent_connection_accept(agent); continue; } if(apt_pollset_is_wakeup(agent->pollset,&ret_pfd[i])) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process Control Message"); if(mrcp_server_agent_control_process(agent) == FALSE) { running = FALSE; break; } continue; } apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Process MRCPv2 Message"); mrcp_server_agent_messsage_receive(agent,ret_pfd[i].client_data); } } mrcp_server_agent_pollset_destroy(agent); apt_task_child_terminate(agent->task); return TRUE; }
/* Receive MRCP message through TCP/MRCPv2 connection */ static apt_bool_t mrcp_server_poller_signal_process(void *obj, const apr_pollfd_t *descriptor) { mrcp_connection_agent_t *agent = obj; mrcp_connection_t *connection = descriptor->client_data; apr_status_t status; apr_size_t offset; apr_size_t length; apt_text_stream_t *stream; if(descriptor->desc.s == agent->listen_sock) { apt_log(APT_LOG_MARK,APT_PRIO_DEBUG,"Accept Connection"); return mrcp_server_agent_connection_accept(agent); } if(!connection || !connection->sock) { return FALSE; } stream = &connection->rx_stream; /* init length of the buffer to read */ offset = 0; length = connection->rx_buffer_size; if(stream->pos > stream->text.buf) { /* calculate offset remaining from the previous receive / if any */ offset = stream->pos - stream->text.buf; /* calculate available length */ length -= offset; } status = apr_socket_recv(connection->sock,stream->pos,&length); if(status == APR_EOF || length == 0) { return mrcp_server_agent_connection_close(agent,connection); } /* calculate actual length of the stream */ stream->text.length = offset + length; stream->pos[length] = '\0'; apt_log(APT_LOG_MARK,APT_PRIO_INFO,"Receive MRCPv2 Stream %s [%lu bytes]\n%s", connection->id, length, stream->pos); /* reset pos */ apt_text_stream_reset(stream); /* walk through the stream parsing MRCP messages */ return mrcp_stream_walk(connection->parser,stream,mrcp_server_message_handler,connection); }