/** Create listening socket and add it to pollset */ static apt_bool_t mrcp_server_agent_listening_socket_create(mrcp_connection_agent_t *agent) { apr_status_t status; if(!agent->sockaddr) { return FALSE; } /* create listening socket */ status = apr_socket_create(&agent->listen_sock, agent->sockaddr->family, SOCK_STREAM, APR_PROTO_TCP, agent->pool); if(status != APR_SUCCESS) { return FALSE; } apr_socket_opt_set(agent->listen_sock, APR_SO_NONBLOCK, 0); apr_socket_timeout_set(agent->listen_sock, -1); apr_socket_opt_set(agent->listen_sock, APR_SO_REUSEADDR, 1); status = apr_socket_bind(agent->listen_sock, agent->sockaddr); if(status != APR_SUCCESS) { apr_socket_close(agent->listen_sock); agent->listen_sock = NULL; return FALSE; } status = apr_socket_listen(agent->listen_sock, SOMAXCONN); if(status != APR_SUCCESS) { apr_socket_close(agent->listen_sock); agent->listen_sock = NULL; return FALSE; } /* add listening socket to pollset */ 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_poller_task_descriptor_add(agent->task, &agent->listen_sock_pfd) != TRUE) { apt_log(APT_LOG_MARK,APT_PRIO_WARNING,"Failed to Add Listening Socket to Pollset [%s]", apt_task_name_get(apt_poller_task_base_get(agent->task))); apr_socket_close(agent->listen_sock); agent->listen_sock = NULL; return FALSE; } return TRUE; }
/** Create RTSP client */ RTSP_DECLARE(rtsp_client_t*) rtsp_client_create( const char *id, apr_size_t max_connection_count, apr_size_t request_timeout, void *obj, const rtsp_client_vtable_t *handler, apr_pool_t *pool) { apt_task_t *task; apt_task_vtable_t *vtable; apt_task_msg_pool_t *msg_pool; rtsp_client_t *client; apt_log(RTSP_LOG_MARK,APT_PRIO_NOTICE,"Create RTSP Client [%s] [%"APR_SIZE_T_FMT"]", id, max_connection_count); client = apr_palloc(pool,sizeof(rtsp_client_t)); client->pool = pool; client->obj = obj; client->vtable = handler; msg_pool = apt_task_msg_pool_create_dynamic(sizeof(task_msg_data_t),pool); client->task = apt_poller_task_create( max_connection_count, rtsp_client_poller_signal_process, client, msg_pool, pool); if(!client->task) { return NULL; } task = apt_poller_task_base_get(client->task); if(task) { apt_task_name_set(task,id); } vtable = apt_poller_task_vtable_get(client->task); if(vtable) { vtable->process_msg = rtsp_client_task_msg_process; } APR_RING_INIT(&client->connection_list, rtsp_client_connection_t, link); client->request_timeout = (apr_uint32_t)request_timeout; return client; }
/** Create connection agent. */ MRCP_DECLARE(mrcp_connection_agent_t*) mrcp_client_connection_agent_create( const char *id, apr_size_t max_connection_count, apt_bool_t offer_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; apt_log(APT_LOG_MARK,APT_PRIO_NOTICE,"Create MRCPv2 Agent [%s] [%"APR_SIZE_T_FMT"]", id, max_connection_count); agent = apr_palloc(pool,sizeof(mrcp_connection_agent_t)); agent->pool = pool; agent->request_timeout = 0; agent->offer_new_connection = offer_new_connection; agent->rx_buffer_size = MRCP_STREAM_BUFFER_SIZE; agent->tx_buffer_size = MRCP_STREAM_BUFFER_SIZE; msg_pool = apt_task_msg_pool_create_dynamic(sizeof(connection_task_msg_t),pool); agent->task = apt_poller_task_create( max_connection_count, mrcp_client_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->process_msg = mrcp_client_agent_msg_process; } APR_RING_INIT(&agent->connection_list, mrcp_connection_t, link); return agent; }
/** Signal task message */ static apt_bool_t rtsp_server_control_message_signal( task_msg_data_type_e type, rtsp_server_t *server, rtsp_server_session_t *session, rtsp_message_t *message) { apt_task_t *task = apt_poller_task_base_get(server->task); apt_task_msg_t *task_msg = apt_task_msg_get(task); if(task_msg) { task_msg_data_t *data = (task_msg_data_t*)task_msg->data; data->type = type; data->server = server; data->session = session; data->message = message; apt_task_msg_signal(task,task_msg); } return TRUE; }
/** Signal task message */ static apt_bool_t mrcp_client_control_message_signal( connection_task_msg_type_e type, mrcp_connection_agent_t *agent, mrcp_control_channel_t *channel, mrcp_control_descriptor_t *descriptor, mrcp_message_t *message) { apt_task_t *task = apt_poller_task_base_get(agent->task); apt_task_msg_t *task_msg = apt_task_msg_get(task); if(task_msg) { connection_task_msg_t *msg = (connection_task_msg_t*)task_msg->data; msg->type = type; msg->agent = agent; msg->channel = channel; msg->descriptor = descriptor; msg->message = message; apt_task_msg_signal(task,task_msg); } return TRUE; }
/** Get string identifier */ MRCP_DECLARE(const char*) mrcp_client_connection_agent_id_get(const mrcp_connection_agent_t *agent) { apt_task_t *task = apt_poller_task_base_get(agent->task); return apt_task_name_get(task); }
/** Get task */ MRCP_DECLARE(apt_task_t*) mrcp_client_connection_agent_task_get(const mrcp_connection_agent_t *agent) { return apt_poller_task_base_get(agent->task); }
/** Get task */ RTSP_DECLARE(apt_task_t*) rtsp_server_task_get(const rtsp_server_t *server) { return apt_poller_task_base_get(server->task); }
/** Create RTSP server */ RTSP_DECLARE(rtsp_server_t*) rtsp_server_create( const char *id, const char *listen_ip, apr_port_t listen_port, apr_size_t max_connection_count, void *obj, const rtsp_server_vtable_t *handler, apr_pool_t *pool) { apt_task_t *task; apt_task_vtable_t *vtable; apt_task_msg_pool_t *msg_pool; rtsp_server_t *server; if(!listen_ip) { return NULL; } apt_log(RTSP_LOG_MARK,APT_PRIO_NOTICE,"Create RTSP Server [%s] %s:%hu [%"APR_SIZE_T_FMT"]", id, listen_ip, listen_port, max_connection_count); server = apr_palloc(pool,sizeof(rtsp_server_t)); server->pool = pool; server->obj = obj; server->vtable = handler; server->listen_sock = NULL; server->sockaddr = NULL; apr_sockaddr_info_get(&server->sockaddr,listen_ip,APR_INET,listen_port,0,pool); if(!server->sockaddr) { return NULL; } msg_pool = apt_task_msg_pool_create_dynamic(sizeof(task_msg_data_t),pool); server->task = apt_poller_task_create( max_connection_count + 1, rtsp_server_poller_signal_process, server, msg_pool, pool); if(!server->task) { return NULL; } task = apt_poller_task_base_get(server->task); if(task) { apt_task_name_set(task,id); } vtable = apt_poller_task_vtable_get(server->task); if(vtable) { vtable->destroy = rtsp_server_on_destroy; vtable->process_msg = rtsp_server_task_msg_process; } APR_RING_INIT(&server->connection_list, rtsp_server_connection_t, link); if(rtsp_server_listening_socket_create(server) != TRUE) { apt_log(RTSP_LOG_MARK,APT_PRIO_WARNING,"Failed to Create Listening Socket [%s] %s:%hu", id, listen_ip, listen_port); } return server; }
/** Get string identifier */ static const char* rtsp_server_id_get(const rtsp_server_t *server) { apt_task_t *task = apt_poller_task_base_get(server->task); return apt_task_name_get(task); }
/** 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; }
/** Get task */ RTSP_DECLARE(apt_task_t*) rtsp_client_task_get(const rtsp_client_t *client) { return apt_poller_task_base_get(client->task); }
/** Get string identifier */ static const char* rtsp_client_id_get(const rtsp_client_t *client) { apt_task_t *task = apt_poller_task_base_get(client->task); return apt_task_name_get(task); }
/** 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; }