- if the event occurs during sending command, a timing issue will occur.
Change-Id: I8ed5ad2f7c6bcc9ea44641c619458639553822c2
Signed-off-by: kibak.yoon <seseki17@gmail.com>
: m_id(0)
, m_sensor(reinterpret_cast<sensor_info *>(sensor))
, m_client(NULL)
: m_id(0)
, m_sensor(reinterpret_cast<sensor_info *>(sensor))
, m_client(NULL)
+, m_cmd_channel(NULL)
+, m_evt_channel(NULL)
, m_handler(NULL)
, m_evt_handler(NULL)
, m_acc_handler(NULL)
, m_handler(NULL)
, m_evt_handler(NULL)
, m_acc_handler(NULL)
bool sensor_listener::connect(void)
{
bool sensor_listener::connect(void)
{
- m_channel = m_client->connect(m_handler, &m_loop);
- retvm_if(!m_channel, false, "Failed to connect to server");
+ m_cmd_channel = m_client->connect(NULL);
+ retvm_if(!m_cmd_channel, false, "Failed to connect to server");
+
+ m_evt_channel = m_client->connect(m_handler, &m_loop);
+ retvm_if(!m_evt_channel, false, "Failed to connect to server");
ipc::message msg;
ipc::message reply;
ipc::message msg;
ipc::message reply;
memcpy(buf.sensor, m_sensor->get_uri().c_str(), m_sensor->get_uri().size());
msg.set_type(CMD_LISTENER_CONNECT);
msg.enclose((const char *)&buf, sizeof(buf));
memcpy(buf.sensor, m_sensor->get_uri().c_str(), m_sensor->get_uri().size());
msg.set_type(CMD_LISTENER_CONNECT);
msg.enclose((const char *)&buf, sizeof(buf));
- m_channel->send_sync(&msg);
+ m_evt_channel->send_sync(&msg);
- m_channel->read_sync(reply);
+ m_evt_channel->read_sync(reply);
reply.disclose((char *)&buf);
m_id = buf.listener_id;
reply.disclose((char *)&buf);
m_id = buf.listener_id;
ipc::message reply;
msg.set_type(CMD_LISTENER_DISCONNECT);
ipc::message reply;
msg.set_type(CMD_LISTENER_DISCONNECT);
- m_channel->send_sync(&msg);
+ m_evt_channel->send_sync(&msg);
+
+ m_evt_channel->read_sync(reply);
+ m_evt_channel->disconnect();
- m_channel->read_sync(reply);
- m_channel->disconnect();
+ delete m_evt_channel;
+ m_evt_channel = NULL;
- delete m_channel;
- m_channel = NULL;
+ m_cmd_channel->disconnect();
+ delete m_cmd_channel;
+ m_cmd_channel = NULL;
_I("Disconnected[%d]", get_id());
}
_I("Disconnected[%d]", get_id());
}
ipc::message reply;
cmd_listener_start_t buf;
ipc::message reply;
cmd_listener_start_t buf;
- retvm_if(!m_channel, -EINVAL, "Failed to connect to server");
+ retvm_if(!m_cmd_channel, -EINVAL, "Failed to connect to server");
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_START);
msg.enclose((char *)&buf, sizeof(buf));
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_START);
msg.enclose((char *)&buf, sizeof(buf));
- m_channel->send_sync(&msg);
- m_channel->read_sync(reply);
+ m_cmd_channel->send_sync(&msg);
+ m_cmd_channel->read_sync(reply);
if (reply.header()->err < 0)
return reply.header()->err;
if (reply.header()->err < 0)
return reply.header()->err;
ipc::message reply;
cmd_listener_stop_t buf;
ipc::message reply;
cmd_listener_stop_t buf;
- retvm_if(!m_channel, -EINVAL, "Failed to connect to server");
+ retvm_if(!m_cmd_channel, -EINVAL, "Failed to connect to server");
retvm_if(!m_started.load(), -EAGAIN, "Already stopped");
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_STOP);
msg.enclose((char *)&buf, sizeof(buf));
retvm_if(!m_started.load(), -EAGAIN, "Already stopped");
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_STOP);
msg.enclose((char *)&buf, sizeof(buf));
- m_channel->send_sync(&msg);
- m_channel->read_sync(reply);
+ m_cmd_channel->send_sync(&msg);
+ m_cmd_channel->read_sync(reply);
if (reply.header()->err < 0)
return reply.header()->err;
if (reply.header()->err < 0)
return reply.header()->err;
ipc::message reply;
cmd_listener_attr_int_t buf;
ipc::message reply;
cmd_listener_attr_int_t buf;
- retvm_if(!m_channel, false, "Failed to connect to server");
+ retvm_if(!m_cmd_channel, false, "Failed to connect to server");
buf.listener_id = m_id;
buf.attribute = attribute;
buf.listener_id = m_id;
buf.attribute = attribute;
msg.set_type(CMD_LISTENER_ATTR_INT);
msg.enclose((char *)&buf, sizeof(buf));
msg.set_type(CMD_LISTENER_ATTR_INT);
msg.enclose((char *)&buf, sizeof(buf));
- m_channel->send_sync(&msg);
- m_channel->read_sync(reply);
+ m_cmd_channel->send_sync(&msg);
+ m_cmd_channel->read_sync(reply);
if (reply.header()->err < 0)
return reply.header()->err;
if (reply.header()->err < 0)
return reply.header()->err;
ipc::message reply;
cmd_listener_attr_str_t buf;
ipc::message reply;
cmd_listener_attr_str_t buf;
- retvm_if(!m_channel, false, "Failed to connect to server");
+ retvm_if(!m_cmd_channel, false, "Failed to connect to server");
msg.set_type(CMD_LISTENER_ATTR_STR);
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_ATTR_STR);
buf.listener_id = m_id;
msg.enclose((char *)&buf, sizeof(buf) + len);
msg.enclose((char *)&buf, sizeof(buf) + len);
- m_channel->send_sync(&msg);
- m_channel->read_sync(reply);
+ m_cmd_channel->send_sync(&msg);
+ m_cmd_channel->read_sync(reply);
return reply.header()->err;
}
return reply.header()->err;
}
ipc::message reply;
cmd_listener_get_data_t buf;
ipc::message reply;
cmd_listener_get_data_t buf;
- retvm_if(!m_channel, false, "Failed to connect to server");
+ retvm_if(!m_cmd_channel, false, "Failed to connect to server");
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_GET_DATA);
msg.enclose((char *)&buf, sizeof(buf));
buf.listener_id = m_id;
msg.set_type(CMD_LISTENER_GET_DATA);
msg.enclose((char *)&buf, sizeof(buf));
- m_channel->send_sync(&msg);
- m_channel->read_sync(reply);
- /* TODO */
- /*
+ m_cmd_channel->send_sync(&msg);
+ m_cmd_channel->read_sync(reply);
+
reply.disclose((char *)&buf);
reply.disclose((char *)&buf);
- memcpy(data, buf.data, sizeof(buf.len));
- */
+ int size = sizeof(sensor_data_t);
+
+ if (buf.len > size || buf.len < 0) {
+ data->accuracy = -1;
+ data->value_count = 0;
+ /* TODO: it should return OP_ERROR */
+ return OP_SUCCESS;
+ }
+
+ memcpy(data, &buf.data, buf.len);
sensor_info *m_sensor;
ipc::ipc_client *m_client;
sensor_info *m_sensor;
ipc::ipc_client *m_client;
- ipc::channel *m_channel;
+ ipc::channel *m_cmd_channel;
+ ipc::channel *m_evt_channel;
ipc::channel_handler *m_handler;
ipc::channel_handler *m_evt_handler;
ipc::channel_handler *m_acc_handler;
ipc::channel_handler *m_handler;
ipc::channel_handler *m_evt_handler;
ipc::channel_handler *m_acc_handler;
void server_channel_handler::disconnected(channel *ch)
{
void server_channel_handler::disconnected(channel *ch)
{
- auto it = m_listeners.find(ch);
- ret_if(it == m_listeners.end());
+ auto it = m_listener_ids.find(ch);
+ ret_if(it == m_listener_ids.end());
- _I("Disconnected listener[%u]", it->second->get_id());
+ _I("Disconnected listener[%u]", it->second);
- delete it->second;
- m_listeners.erase(ch);
+ delete m_listeners[it->second];
+ m_listeners.erase(it->second);
+ m_listener_ids.erase(ch);
}
void server_channel_handler::read(channel *ch, message &msg)
}
void server_channel_handler::read(channel *ch, message &msg)
retv_if(size < 0, size);
reply.enclose((const char *)bytes, size);
retv_if(size < 0, size);
reply.enclose((const char *)bytes, size);
+ reply.header()->err = OP_SUCCESS;
ch->send_sync(&reply);
delete [] bytes;
ch->send_sync(&reply);
delete [] bytes;
return OP_ERROR;
_I("Connected sensor_listener[fd(%d) -> id(%u)]", ch->get_fd(), listener_id);
return OP_ERROR;
_I("Connected sensor_listener[fd(%d) -> id(%u)]", ch->get_fd(), listener_id);
+ m_listeners[listener_id] = listener;
+ m_listener_ids[ch] = listener_id;
- m_listeners[ch] = listener;
return OP_SUCCESS;
}
int server_channel_handler::listener_disconnect(channel *ch, message &msg)
{
return OP_SUCCESS;
}
int server_channel_handler::listener_disconnect(channel *ch, message &msg)
{
- auto it = m_listeners.find(ch);
- retv_if(it == m_listeners.end(), -EINVAL);
+ auto it = m_listener_ids.find(ch);
+ retv_if(it == m_listener_ids.end(), -EINVAL);
- uint32_t id = m_listeners[ch]->get_id();
+ uint32_t id = it->second;
- retvm_if(!has_privileges(ch->get_fd(), m_listeners[ch]->get_required_privileges()),
+ retvm_if(!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges()),
-EACCES, "Permission denied");
-EACCES, "Permission denied");
- delete m_listeners[ch];
- m_listeners.erase(ch);
+ delete m_listeners[id];
+ m_listeners.erase(id);
+ m_listener_ids.erase(ch);
_D("Disconnected sensor_listener[%u]", id);
_D("Disconnected sensor_listener[%u]", id);
int server_channel_handler::listener_start(channel *ch, message &msg)
{
int server_channel_handler::listener_start(channel *ch, message &msg)
{
- auto it = m_listeners.find(ch);
+ cmd_listener_start_t buf;
+ msg.disclose((char *)&buf);
+ uint32_t id = buf.listener_id;
+
+ auto it = m_listeners.find(id);
retv_if(it == m_listeners.end(), -EINVAL);
retv_if(it == m_listeners.end(), -EINVAL);
- retvm_if(!has_privileges(ch->get_fd(), m_listeners[ch]->get_required_privileges()),
+ retvm_if(!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges()),
-EACCES, "Permission denied");
-EACCES, "Permission denied");
- int ret = m_listeners[ch]->start();
+ int ret = m_listeners[id]->start();
retv_if(ret < 0, ret);
return send_reply(ch, OP_SUCCESS);
retv_if(ret < 0, ret);
return send_reply(ch, OP_SUCCESS);
int server_channel_handler::listener_stop(channel *ch, message &msg)
{
int server_channel_handler::listener_stop(channel *ch, message &msg)
{
- auto it = m_listeners.find(ch);
+ cmd_listener_stop_t buf;
+ msg.disclose((char *)&buf);
+ uint32_t id = buf.listener_id;
+
+ auto it = m_listeners.find(id);
retv_if(it == m_listeners.end(), -EINVAL);
retv_if(it == m_listeners.end(), -EINVAL);
- retvm_if(!has_privileges(ch->get_fd(), m_listeners[ch]->get_required_privileges()),
+ retvm_if(!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges()),
-EACCES, "Permission denied");
-EACCES, "Permission denied");
- int ret = m_listeners[ch]->stop();
+ int ret = m_listeners[id]->stop();
retv_if(ret < 0, ret);
return send_reply(ch, OP_SUCCESS);
retv_if(ret < 0, ret);
return send_reply(ch, OP_SUCCESS);
int server_channel_handler::listener_attr_int(channel *ch, message &msg)
{
int server_channel_handler::listener_attr_int(channel *ch, message &msg)
{
+ cmd_listener_attr_int_t buf;
+ msg.disclose((char *)&buf);
+ uint32_t id = buf.listener_id;
+
- auto it = m_listeners.find(ch);
+ auto it = m_listeners.find(id);
retv_if(it == m_listeners.end(), -EINVAL);
retv_if(it == m_listeners.end(), -EINVAL);
- retvm_if(!has_privileges(ch->get_fd(), m_listeners[ch]->get_required_privileges()),
+ retvm_if(!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges()),
-EACCES, "Permission denied");
-EACCES, "Permission denied");
- cmd_listener_attr_int_t buf;
- msg.disclose((char *)&buf);
-
switch (buf.attribute) {
case SENSORD_ATTRIBUTE_INTERVAL:
switch (buf.attribute) {
case SENSORD_ATTRIBUTE_INTERVAL:
- ret = m_listeners[ch]->set_interval(buf.value); break;
+ ret = m_listeners[id]->set_interval(buf.value); break;
case SENSORD_ATTRIBUTE_MAX_BATCH_LATENCY:
case SENSORD_ATTRIBUTE_MAX_BATCH_LATENCY:
- ret = m_listeners[ch]->set_max_batch_latency(buf.value); break;
+ ret = m_listeners[id]->set_max_batch_latency(buf.value); break;
case SENSORD_ATTRIBUTE_PASSIVE_MODE:
case SENSORD_ATTRIBUTE_PASSIVE_MODE:
- ret = m_listeners[ch]->set_passive_mode(buf.value); break;
+ ret = m_listeners[id]->set_passive_mode(buf.value); break;
case SENSORD_ATTRIBUTE_PAUSE_POLICY:
case SENSORD_ATTRIBUTE_AXIS_ORIENTATION:
default:
case SENSORD_ATTRIBUTE_PAUSE_POLICY:
case SENSORD_ATTRIBUTE_AXIS_ORIENTATION:
default:
- ret = m_listeners[ch]->set_attribute(buf.attribute, buf.value);
+ ret = m_listeners[id]->set_attribute(buf.attribute, buf.value);
+ /* TODO : check return value */
+ if (ret < 0)
+ _W("Return : %d", ret);
return send_reply(ch, OP_SUCCESS);
}
int server_channel_handler::listener_attr_str(channel *ch, message &msg)
{
return send_reply(ch, OP_SUCCESS);
}
int server_channel_handler::listener_attr_str(channel *ch, message &msg)
{
- auto it = m_listeners.find(ch);
- retv_if(it == m_listeners.end(), -EINVAL);
- retvm_if(!has_privileges(ch->get_fd(), m_listeners[ch]->get_required_privileges()),
- -EACCES, "Permission denied");
-
cmd_listener_attr_str_t buf;
msg.disclose((char *)&buf);
cmd_listener_attr_str_t buf;
msg.disclose((char *)&buf);
+ uint32_t id = buf.listener_id;
+
+ auto it = m_listeners.find(id);
+ retv_if(it == m_listeners.end(), -EINVAL);
+ retvm_if(!has_privileges(ch->get_fd(), m_listeners[id]->get_required_privileges()),
+ -EACCES, "Permission denied");
- int ret = m_listeners[ch]->set_attribute(buf.attribute, buf.value, buf.len);
+ int ret = m_listeners[id]->set_attribute(buf.attribute, buf.value, buf.len);
retv_if(ret < 0, ret);
return send_reply(ch, OP_SUCCESS);
retv_if(ret < 0, ret);
return send_reply(ch, OP_SUCCESS);
sensor_manager *m_manager;
sensor_manager *m_manager;
- /* {fd, listener} */
- std::unordered_map<ipc::channel *, sensor_listener_proxy *> m_listeners;
+ /* {id, listener} */
+ std::unordered_map<uint32_t, sensor_listener_proxy *> m_listeners;
+
+ /* {channel, id} */
+ std::unordered_map<ipc::channel *, uint32_t> m_listener_ids;
/* {name, application_sensor_handler} */
/* TODO: move it to sensor_manager */
/* {name, application_sensor_handler} */
/* TODO: move it to sensor_manager */