4 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include "sensor_manager.h"
22 #include <sensor_log.h>
23 #include <sensor_info.h>
24 #include <sensor_utils.h>
25 #include <command_types.h>
26 #include <ipc_client.h>
30 #include "sensor_manager_channel_handler.h"
32 using namespace sensor;
34 sensor_manager::sensor_manager()
44 sensor_manager::~sensor_manager()
49 int sensor_manager::get_sensor(const char *uri, sensor_t *sensor)
51 if (!is_supported(uri)) {
56 sensor_info *info = get_info(uri);
57 retv_if(!info, -EACCES);
59 *sensor = (sensor_t)info;
63 int sensor_manager::get_sensors(const char *uri, sensor_t **list, int *count)
65 retv_if(!is_supported(uri), -ENODATA);
67 std::vector<sensor_info *> infos;
70 infos = get_infos(uri);
72 retv_if(size == 0, -EACCES);
74 *list = (sensor_t *)malloc(sizeof(sensor_info *) * size);
75 retvm_if(!*list, -ENOMEM, "Failed to allocate memory");
77 for (int i = 0; i < size; ++i)
78 *(*list + i) = infos[i];
84 bool sensor_manager::is_supported(sensor_t sensor)
86 retvm_if(!sensor, false, "Invalid parameter[%#x]", sensor);
88 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
96 bool sensor_manager::is_supported(const char *uri)
98 if (strncmp(uri, utils::get_uri(ALL_SENSOR), strlen(utils::get_uri(ALL_SENSOR))) == 0)
101 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
102 if ((*it).get_uri() == uri)
105 std::size_t found = (*it).get_uri().find_last_of("/");
106 if (found == std::string::npos)
109 if ((*it).get_uri().substr(0, found) == uri)
116 int sensor_manager::add_sensor(sensor_info &info)
118 retv_if(is_supported(info.get_uri().c_str()), OP_ERROR);
120 m_sensors.push_back(info);
125 int sensor_manager::add_sensor(sensor_provider *provider)
127 retvm_if(!provider, -EINVAL, "Invalid parameter");
128 return add_sensor(*(provider->get_sensor_info()));
131 int sensor_manager::remove_sensor(const char *uri)
133 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
134 if ((*it).get_uri() == uri) {
143 int sensor_manager::remove_sensor(sensor_provider *provider)
145 retvm_if(!provider, -EINVAL, "Invalid parameter");
146 return remove_sensor(provider->get_uri());
149 void sensor_manager::add_sensor_added_cb(sensord_added_cb cb, void *user_data)
151 m_handler->add_sensor_added_cb(cb, user_data);
154 void sensor_manager::remove_sensor_added_cb(sensord_added_cb cb)
156 m_handler->remove_sensor_added_cb(cb);
159 void sensor_manager::add_sensor_removed_cb(sensord_removed_cb cb, void *user_data)
161 m_handler->add_sensor_removed_cb(cb, user_data);
164 void sensor_manager::remove_sensor_removed_cb(sensord_removed_cb cb)
166 m_handler->remove_sensor_removed_cb(cb);
169 bool sensor_manager::init(void)
171 m_client = new(std::nothrow) ipc::ipc_client(SENSOR_CHANNEL_PATH);
172 retvm_if(!m_client, false, "Failed to allocate memory");
174 m_handler = new(std::nothrow) channel_handler(this);
184 void sensor_manager::deinit(void)
195 bool sensor_manager::connect_channel(void)
199 m_cmd_channel = m_client->connect(NULL);
200 retvm_if(!m_cmd_channel, false, "Failed to connect to server");
202 m_mon_channel = m_client->connect(m_handler, &m_loop);
203 retvm_if(!m_mon_channel, false, "Failed to connect to server");
205 msg.set_type(CMD_MANAGER_CONNECT);
206 m_mon_channel->send_sync(&msg);
208 m_connected.store(true);
214 bool sensor_manager::connect(void)
216 retv_if(is_connected(), true);
217 retv_if(!connect_channel(), false);
219 return get_sensors_internal();
222 void sensor_manager::disconnect(void)
224 ret_if(!is_connected());
225 m_connected.store(false);
227 m_mon_channel->disconnect();
228 delete m_mon_channel;
229 m_mon_channel = NULL;
231 m_cmd_channel->disconnect();
232 delete m_cmd_channel;
233 m_cmd_channel = NULL;
238 bool sensor_manager::is_connected(void)
240 return m_connected.load();
243 void sensor_manager::restore(void)
245 ret_if(!is_connected());
247 m_connected.store(false);
248 retm_if(!connect_channel(), "Failed to restore manager");
250 _D("Restored manager");
253 void sensor_manager::decode_sensors(const char *buf, std::vector<sensor_info> &infos)
259 cmd_manager_sensor_list_t *raw;
261 raw = (cmd_manager_sensor_list_t *)buf;
262 count = raw->sensor_cnt;
263 size = (const int32_t *)raw->data;
264 data = (const char *)raw->data + sizeof(int32_t);
266 for (int i = 0; i < count; ++i) {
268 info.deserialize(data, size[0]);
269 infos.push_back(info);
271 size = (const int32_t *)((const char *)data + size[0]);
272 data = (const char *)size + sizeof(int32_t);
275 _D("Sensor count : %d", count);
278 bool sensor_manager::get_sensors_internal(void)
280 retvm_if(!is_connected(), false, "Failed to get sensors");
285 char buf[MAX_BUF_SIZE];
287 msg.set_type(CMD_MANAGER_SENSOR_LIST);
289 ret = m_cmd_channel->send_sync(&msg);
290 retvm_if(!ret, false, "Failed to send message");
292 ret = m_cmd_channel->read_sync(reply);
293 retvm_if(!ret, false, "Failed to receive message");
297 decode_sensors(buf, m_sensors);
302 bool sensor_manager::has_privilege(std::string &uri)
304 retvm_if(!is_connected(), false, "Failed to get sensors");
309 cmd_has_privilege_t buf = {0, };
311 msg.set_type(CMD_HAS_PRIVILEGE);
312 memcpy(buf.sensor, uri.c_str(), uri.size());
313 msg.enclose((const char *)&buf, sizeof(buf));
315 ret = m_cmd_channel->send_sync(&msg);
316 retvm_if(!ret, false, "Failed to send message");
318 ret = m_cmd_channel->read_sync(reply);
319 retvm_if(!ret, false, "Failed to receive message");
321 if (reply.header()->err == OP_SUCCESS)
327 sensor_info *sensor_manager::get_info(const char *uri)
329 if (strncmp(uri, utils::get_uri(ALL_SENSOR), strlen(utils::get_uri(ALL_SENSOR))) == 0)
330 return &m_sensors[0];
332 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
333 if ((*it).get_uri() != uri)
336 if ((*it).get_privilege().empty() || has_privilege((*it).get_uri()))
342 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
343 std::size_t found = (*it).get_uri().find_last_of("/");
344 if (found == std::string::npos)
346 if ((*it).get_uri().substr(0, found) != uri)
349 if ((*it).get_privilege().empty() || has_privilege((*it).get_uri()))
356 std::vector<sensor_info *> sensor_manager::get_infos(const char *uri)
358 std::vector<sensor_info *> infos;
361 if (strncmp(uri, utils::get_uri(ALL_SENSOR), strlen(utils::get_uri(ALL_SENSOR))) == 0)
364 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
365 if ((*it).get_uri() != uri)
368 if ((*it).get_privilege().empty() || has_privilege((*it).get_uri()))
369 infos.push_back(&*it);
374 for (auto it = m_sensors.begin(); it != m_sensors.end(); ++it) {
375 std::size_t found = (*it).get_uri().find_last_of("/");
376 if (!all && found == std::string::npos)
378 if (!all && (*it).get_uri().substr(0, found) != uri)
381 if ((*it).get_privilege().empty() || has_privilege((*it).get_uri()))
382 infos.push_back(&*it);