2 * \brief VP Stages. Com stage declaration
3 * \author Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
4 * \author Aurelien Morelle <aurelien.morelle@parrot.fr>
5 * \author Thomas Landais <thomas.landais@parrot.fr>
7 * \date first release 16/03/2007
8 * \date modification 19/03/2007
11 #include <VP_Stages/vp_stages_io_com.h>
12 #include <VP_Api/vp_api_error.h>
13 #include <VP_Os/vp_os_print.h>
14 #include <VP_Os/vp_os_malloc.h>
15 #include <VP_Os/vp_os_delay.h>
18 vp_stages_input_com_stage_open(vp_stages_input_com_config_t *cfg)
22 res = vp_com_init(cfg->com);
24 if( VP_SUCCEEDED(res) )
26 vp_com_local_config(cfg->com, cfg->config);
28 if(cfg->connection && !cfg->connection->is_up)
30 res = vp_com_connect(cfg->com, cfg->connection, 1);
34 if( VP_SUCCEEDED(res) )
35 res = vp_com_open(cfg->com, &cfg->socket, &cfg->read, 0);
37 if( VP_SUCCEEDED(res) )
39 if(cfg->socket.type == VP_COM_SERVER)
41 res = vp_com_wait_connections(cfg->com, &cfg->socket, &cfg->socket_client, 1);
45 vp_os_memcpy(&cfg->socket_client, &cfg->socket, sizeof(vp_com_socket_t));
47 vp_com_sockopt(cfg->com, &cfg->socket_client, cfg->sockopt);
56 vp_stages_input_com_stage_transform(vp_stages_input_com_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
58 vp_os_mutex_lock(&out->lock);
60 if(out->status == VP_API_STATUS_INIT)
63 out->size = cfg->buffer_size;
64 out->buffers = (int8_t **) vp_os_malloc (sizeof(int8_t *)+out->size*sizeof(int8_t));
65 out->buffers[0] = (int8_t *)(out->buffers+1);
67 // out->lineSize not used
69 out->status = VP_API_STATUS_PROCESSING;
72 if(out->status == VP_API_STATUS_PROCESSING && cfg->read != NULL)
74 out->size = cfg->buffer_size;
76 if(VP_FAILED(cfg->read(&cfg->socket_client, out->buffers[0], &out->size)))
77 out->status = VP_API_STATUS_ERROR;
80 vp_os_mutex_unlock(&out->lock);
87 vp_stages_input_com_stage_close(vp_stages_input_com_config_t *cfg)
91 // \todo Faire ca dans le transform en detectant la fin d'une connection
92 vp_com_close(cfg->com, &cfg->socket_client);
94 if(cfg->socket.type == VP_COM_SERVER)
95 vp_com_close(cfg->com, &cfg->socket);
97 if(cfg->connection && cfg->connection->is_up)
98 vp_com_disconnect(cfg->com);
100 vp_com_shutdown(cfg->com);
107 vp_stages_output_com_stage_open(vp_stages_output_com_config_t *cfg)
111 res = vp_com_init(cfg->com);
113 if( VP_SUCCEEDED(res) )
115 vp_com_local_config(cfg->com, cfg->config);
117 if(cfg->connection && !cfg->connection->is_up)
119 res = vp_com_connect(cfg->com, cfg->connection, 1);
123 if( VP_SUCCEEDED(res) && VP_FAILED(vp_com_open(cfg->com, &cfg->socket, 0, &cfg->write)))
126 if( VP_SUCCEEDED(res) )
128 if(cfg->socket.type == VP_COM_SERVER)
130 res = vp_com_wait_connections(cfg->com, &cfg->socket, &cfg->socket_client, 1);
134 vp_os_memcpy(&cfg->socket_client, &cfg->socket, sizeof(vp_com_socket_t));
137 vp_com_sockopt(cfg->com, &cfg->socket_client, cfg->sockopt);
146 vp_stages_output_com_stage_transform(vp_stages_output_com_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
148 vp_os_mutex_lock(&out->lock);
150 if(out->status == VP_API_STATUS_INIT)
152 out->status = VP_API_STATUS_PROCESSING;
156 if(out->status != VP_API_STATUS_ERROR)
158 out->size = in->size;
159 if(in->size > 0 && cfg->write != NULL)
161 cfg->write(&cfg->socket_client, &in->buffers[in->indexBuffer][0], &out->size);
164 out->status = in->status;
168 vp_os_mutex_unlock(&out->lock);
175 vp_stages_output_com_stage_close(vp_stages_output_com_config_t *cfg)
177 // \todo Faire ca dans le transform en detectant la fin d'une connection
178 vp_com_close(cfg->com, &cfg->socket_client);
180 if(cfg->socket.type == VP_COM_SERVER)
181 vp_com_close(cfg->com, &cfg->socket);
184 if(cfg->connection && cfg->connection->is_up)
185 vp_com_disconnect(cfg->com);
187 vp_com_shutdown(cfg->com);