From bc45faf4fdb5a5cfdb4256c96866d1e663aab03b Mon Sep 17 00:00:00 2001 From: "kibak.yoon" Date: Fri, 25 Mar 2016 01:48:20 +0900 Subject: [PATCH] sensord: send permission-needed sensor information to client * client needs to know whether the error is operation_failed or permission_denied. therefore server has to send all of sensor list to client. * if it is previleged sensor, server sends the type information only. Change-Id: I2563d457b0aa039ebbc3f83121aa47b18dfa06bc Signed-off-by: kibak.yoon --- src/server/command_worker.cpp | 97 ++++++++++++++++++++----------------------- src/server/command_worker.h | 2 +- 2 files changed, 46 insertions(+), 53 deletions(-) diff --git a/src/server/command_worker.cpp b/src/server/command_worker.cpp index 1f87342..42262ea 100644 --- a/src/server/command_worker.cpp +++ b/src/server/command_worker.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -50,7 +51,6 @@ command_worker::command_worker(const csocket& socket) if (!init) { init_cmd_handlers(); - make_sensor_raw_data_map(); init = true; } @@ -90,30 +90,57 @@ void command_worker::init_cmd_handlers(void) m_cmd_handlers[CMD_FLUSH] = &command_worker::cmd_flush; } -void command_worker::get_sensor_list(int permissions, cpacket &sensor_list) +int command_worker::create_sensor_raw_list(int client_perms, std::vector &raw_list) { - const int PERMISSION_COUNT = sizeof(permissions) * 8; - vector sensor_raw_vec; size_t total_raw_data_size = 0; + vector sensors; + vector types; + sensor_info info; + int permission; - for (int i = 0; i < PERMISSION_COUNT; ++i) { - int perm = (permissions & (1 << i)); + types = sensor_loader::get_instance().get_sensor_types(); - if (perm) { - auto range = m_sensor_raw_data_map.equal_range(perm); + for (auto it_type = types.begin(); it_type != types.end(); ++it_type) { + sensor_type_t type = *it_type; + sensors = sensor_loader::get_instance().get_sensors(type); - sensor_raw_data_map::iterator it_raw_data; + for (auto it_sensor = sensors.begin(); it_sensor != sensors.end(); ++it_sensor) { + (*it_sensor)->get_sensor_info(info); + permission = (*it_sensor)->get_permission(); + permission = (client_perms & permission); - for (it_raw_data = range.first; it_raw_data != range.second; ++it_raw_data) { - total_raw_data_size += it_raw_data->second.size(); - sensor_raw_vec.push_back(&(it_raw_data->second)); + if (!permission) { + info.clear(); + info.set_id((sensor_id_t)-EACCES); + info.set_type(type); } + + raw_data_t *raw_data = new(std::nothrow) raw_data_t(); + retvm_if(!raw_data, -1, "Failed to allocated memory"); + info.get_raw_data(*raw_data); + + total_raw_data_size += raw_data->size(); + raw_list.push_back(raw_data); + + info.clear(); } } + return total_raw_data_size; +} + +void command_worker::get_sensor_list(int client_perms, cpacket &sensor_list) +{ + size_t total_raw_data_size = 0; + vector raw_list; int sensor_cnt; + int idx = 0; + + total_raw_data_size = create_sensor_raw_list(client_perms, raw_list); + if (total_raw_data_size < 0) + return; - sensor_cnt = sensor_raw_vec.size(); + sensor_cnt = raw_list.size(); sensor_list.set_payload_size(sizeof(cmd_get_sensor_list_done_t) + (sizeof(size_t) * sensor_cnt) + total_raw_data_size); sensor_list.set_cmd(CMD_GET_SENSOR_LIST); @@ -124,52 +151,18 @@ void command_worker::get_sensor_list(int permissions, cpacket &sensor_list) cmd_get_sensor_list_done->sensor_cnt = sensor_cnt; size_t* size_field = (size_t *) cmd_get_sensor_list_done->data; - for (int i = 0; i < sensor_cnt; ++i) - size_field[i] = sensor_raw_vec[i]->size(); + size_field[i] = raw_list[i]->size(); char* raw_data_field = cmd_get_sensor_list_done->data + (sizeof(size_t) * sensor_cnt); - int idx = 0; for (int i = 0; i < sensor_cnt; ++i) { - copy(sensor_raw_vec[i]->begin(), sensor_raw_vec[i]->end(), raw_data_field + idx); - idx += sensor_raw_vec[i]->size(); + copy(raw_list[i]->begin(), raw_list[i]->end(), raw_data_field + idx); + idx += raw_list[i]->size(); } -} - -void command_worker::make_sensor_raw_data_map(void) -{ - vector sensors; - vector types; - std::vector::iterator it_type; - std::vector::iterator it_sensor; - sensor_info info; - int permission; - - types = sensor_loader::get_instance().get_sensor_types(); - - it_type = types.begin(); - while (it_type != types.end()) { - sensor_type_t type; - type = *it_type; - - sensors = sensor_loader::get_instance().get_sensors(type); - it_sensor = sensors.begin(); - - while (it_sensor != sensors.end()) { - (*it_sensor)->get_sensor_info(info); - permission = (*it_sensor)->get_permission(); - - sensor_raw_data_map::iterator it_sensor_raw_data; - it_sensor_raw_data = m_sensor_raw_data_map.insert(std::make_pair(permission, raw_data_t())); - - info.get_raw_data(it_sensor_raw_data->second); - info.clear(); - ++it_sensor; - } - ++it_type; - } + for (auto it = raw_list.begin(); it != raw_list.end(); ++it) + delete *it; } bool command_worker::working(void *ctx) diff --git a/src/server/command_worker.h b/src/server/command_worker.h index 3e01883..cd5c336 100644 --- a/src/server/command_worker.h +++ b/src/server/command_worker.h @@ -45,7 +45,7 @@ private: static sensor_raw_data_map m_sensor_raw_data_map; static void init_cmd_handlers(void); - static void make_sensor_raw_data_map(void); + static int create_sensor_raw_list(int client_perms, std::vector &raw_list); static void get_sensor_list(int permissions, cpacket &sensor_list); static bool working(void *ctx); -- 2.7.4