/** Create connection agent */ MRCP_DECLARE(mrcp_connection_agent_t*) mrcp_server_connection_agent_create( const char *id, const char *listen_ip, apr_port_t listen_port, apr_size_t max_connection_count, apt_bool_t force_new_connection, apr_pool_t *pool) { apt_task_t *task; apt_task_vtable_t *vtable; apt_task_msg_pool_t *msg_pool; mrcp_connection_agent_t *agent; if(!listen_ip) { return NULL; } apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Create MRCPv2 Agent [%s] %s:%hu [%"APR_SIZE_T_FMT"]", id,listen_ip,listen_port,max_connection_count); agent = apr_palloc(pool,sizeof(mrcp_connection_agent_t)); agent->pool = pool; agent->sockaddr = NULL; agent->listen_sock = NULL; agent->force_new_connection = force_new_connection; agent->rx_buffer_size = MRCP_STREAM_BUFFER_SIZE; agent->tx_buffer_size = MRCP_STREAM_BUFFER_SIZE; apr_sockaddr_info_get(&agent->sockaddr,listen_ip,APR_INET,listen_port,0,pool); if(!agent->sockaddr) { return NULL; } msg_pool = apt_task_msg_pool_create_dynamic(sizeof(connection_task_msg_t),pool); agent->task = apt_poller_task_create( max_connection_count + 1, mrcp_server_poller_signal_process, agent, msg_pool, pool); if(!agent->task) { return NULL; } task = apt_poller_task_base_get(agent->task); if(task) { apt_task_name_set(task,id); } vtable = apt_poller_task_vtable_get(agent->task); if(vtable) { vtable->destroy = mrcp_server_agent_on_destroy; vtable->process_msg = mrcp_server_agent_msg_process; } APR_RING_INIT(&agent->connection_list, mrcp_connection_t, link); agent->pending_channel_table = apr_hash_make(pool); if(mrcp_server_agent_listening_socket_create(agent) != TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Listening Socket [%s] %s:%hu", id, listen_ip, listen_port); } return agent; }
/** Create connection agent */ MRCP_DECLARE(mrcp_connection_agent_t*) mrcp_server_connection_agent_create( const char *listen_ip, apr_port_t listen_port, apr_size_t max_connection_count, apt_bool_t force_new_connection, apr_pool_t *pool) { apt_task_t *task; apt_task_vtable_t *vtable; apt_task_msg_pool_t *msg_pool; mrcp_connection_agent_t *agent; if(!listen_ip) { return NULL; } apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Create "MRCPV2_CONNECTION_TASK_NAME" %s:%hu [%"APR_SIZE_T_FMT"]", listen_ip,listen_port,max_connection_count); agent = apr_palloc(pool,sizeof(mrcp_connection_agent_t)); agent->pool = pool; agent->sockaddr = NULL; agent->listen_sock = NULL; agent->force_new_connection = force_new_connection; agent->rx_buffer_size = MRCP_STREAM_BUFFER_SIZE; agent->tx_buffer_size = MRCP_STREAM_BUFFER_SIZE; apr_sockaddr_info_get(&agent->sockaddr,listen_ip,APR_INET,listen_port,0,agent->pool); if(!agent->sockaddr) { return NULL; } msg_pool = apt_task_msg_pool_create_dynamic(sizeof(connection_task_msg_t),pool); agent->task = apt_poller_task_create( max_connection_count + 1, mrcp_server_poller_signal_process, agent, msg_pool, pool); if(!agent->task) { return NULL; } task = apt_poller_task_base_get(agent->task); if(task) { apt_task_name_set(task,MRCPV2_CONNECTION_TASK_NAME); } vtable = apt_poller_task_vtable_get(agent->task); if(vtable) { vtable->destroy = mrcp_server_agent_on_destroy; vtable->process_msg = mrcp_server_agent_msg_process; } agent->connection_list = NULL; agent->null_connection = NULL; if(mrcp_server_agent_listening_socket_create(agent) == TRUE) { /* add listening socket to pollset */ apt_pollset_t *pollset = apt_poller_task_pollset_get(agent->task); memset(&agent->listen_sock_pfd,0,sizeof(apr_pollfd_t)); agent->listen_sock_pfd.desc_type = APR_POLL_SOCKET; agent->listen_sock_pfd.reqevents = APR_POLLIN; agent->listen_sock_pfd.desc.s = agent->listen_sock; agent->listen_sock_pfd.client_data = agent->listen_sock; if(apt_pollset_add(pollset, &agent->listen_sock_pfd) != TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Add Listening Socket to Pollset"); mrcp_server_agent_listening_socket_destroy(agent); } } else { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Listening Socket"); } return agent; }