sensord: send permission-needed sensor information to client 80/63680/1
authorkibak.yoon <kibak.yoon@samsung.com>
Thu, 24 Mar 2016 16:48:20 +0000 (01:48 +0900)
committerkibak.yoon <kibak.yoon@samsung.com>
Fri, 25 Mar 2016 07:37:39 +0000 (16:37 +0900)
* 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 <kibak.yoon@samsung.com>
src/server/command_worker.cpp
src/server/command_worker.h

index 1f87342..42262ea 100644 (file)
@@ -21,6 +21,7 @@
 #include <command_common.h>
 #include <sensor_loader.h>
 #include <sensor_info.h>
+#include <sensor_log.h>
 #include <thread>
 #include <string>
 #include <vector>
@@ -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_data_t *> &raw_list)
 {
-       const int PERMISSION_COUNT = sizeof(permissions) * 8;
-       vector<raw_data_t *> sensor_raw_vec;
        size_t total_raw_data_size = 0;
+       vector<sensor_base *> sensors;
+       vector<sensor_type_t> 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_data_t *> 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<sensor_base *> sensors;
-       vector<sensor_type_t> types;
-       std::vector<sensor_type_t>::iterator it_type;
-       std::vector<sensor_base *>::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)
index 3e01883..cd5c336 100644 (file)
@@ -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_data_t *> &raw_list);
        static void get_sensor_list(int permissions, cpacket &sensor_list);
 
        static bool working(void *ctx);