sensord: add location privilege to location-related sensors
[platform/core/system/sensord.git] / src / shared / sensor_utils.cpp
1 /*
2  * sensord
3  *
4  * Copyright (c) 2017 Samsung Electronics Co., Ltd.
5  *
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
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
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.
17  *
18  */
19
20 #include "sensor_utils.h"
21
22 #include <glib.h>
23 #include <unistd.h>
24 #include <fcntl.h>
25 #include <sys/types.h>
26 #include <sys/stat.h>
27 #include <string.h>
28 #include <stddef.h>
29 #include <map>
30
31 #include <sensor_log.h>
32 #include <sensor_types.h>
33 #include <sensor_types_private.h>
34
35 #ifndef PATH_MAX
36 #define PATH_MAX 256
37 #endif
38
39 /* TODO: move and define string type to sensor_type.h */
40 static std::map<sensor_type_t, const char *> types = {
41         {UNKNOWN_SENSOR,                 "http://tizen.org/sensor/general/unknown"},
42         {ALL_SENSOR,                     "http://tizen.org/sensor/general/all"},
43         {ACCELEROMETER_SENSOR,           "http://tizen.org/sensor/general/accelerometer"},
44         {GRAVITY_SENSOR,                 "http://tizen.org/sensor/general/gravity"},
45         {LINEAR_ACCEL_SENSOR,            "http://tizen.org/sensor/general/linear_acceleration"},
46         {GEOMAGNETIC_SENSOR,             "http://tizen.org/sensor/general/magnetic"},
47         {ROTATION_VECTOR_SENSOR,         "http://tizen.org/sensor/general/rotation_vector"},
48         {ORIENTATION_SENSOR,             "http://tizen.org/sensor/general/orientation"},
49         {GYROSCOPE_SENSOR,               "http://tizen.org/sensor/general/gyroscope"},
50         {LIGHT_SENSOR,                   "http://tizen.org/sensor/general/light"},
51         {PROXIMITY_SENSOR,               "http://tizen.org/sensor/general/proximity"},
52         {PRESSURE_SENSOR,                "http://tizen.org/sensor/general/pressure"},
53         {ULTRAVIOLET_SENSOR,             "http://tizen.org/sensor/general/ultraviolet"},
54         {TEMPERATURE_SENSOR,             "http://tizen.org/sensor/general/temperature"},
55         {HUMIDITY_SENSOR,                "http://tizen.org/sensor/general/humidity"},
56         {HRM_SENSOR,                     "http://tizen.org/sensor/healthinfo/heart_rate_monitor"},
57         {HRM_LED_GREEN_SENSOR,           "http://tizen.org/sensor/healthinfo/heart_rate_monitor.led_green"},
58         {HRM_LED_IR_SENSOR,              "http://tizen.org/sensor/healthinfo/heart_rate_monitor.led_ir"},
59         {HRM_LED_RED_SENSOR,             "http://tizen.org/sensor/healthinfo/heart_rate_monitor.led_red"},
60         {GYROSCOPE_UNCAL_SENSOR,         "http://tizen.org/sensor/general/gyroscope.uncalibrated"},
61         {GEOMAGNETIC_UNCAL_SENSOR,       "http://tizen.org/sensor/general/geomagnetic.uncalibrated"},
62         {GYROSCOPE_RV_SENSOR,            "http://tizen.org/sensor/general/gyroscope_rotation_vector"},
63         {GEOMAGNETIC_RV_SENSOR,          "http://tizen.org/sensor/general/geomagnetic_rotation_vector"},
64
65         {HUMAN_PEDOMETER_SENSOR,         "http://tizen.org/sensor/healthinfo/human_pedometer"},
66         {HUMAN_SLEEP_MONITOR_SENSOR,     "http://tizen.org/sensor/healthinfo/human_sleep_monitor"},
67         {HUMAN_SLEEP_DETECTOR_SENSOR,    "http://tizen.org/sensor/healthinfo/human_sleep_detector"},
68         {HUMAN_STRESS_MONITOR_SENSOR,    "http://tizen.org/sensor/healthinfo/human_stress_monitor"},
69
70         {EXERCISE_WALKING_SENSOR,        "http://tizen.org/sensor/healthinfo/exercise.walking"},
71         {EXERCISE_RUNNING_SENSOR,        "http://tizen.org/sensor/healthinfo/exercise.running"},
72         {EXERCISE_HIKING_SENSOR,         "http://tizen.org/sensor/healthinfo/exercise.hiking"},
73         {EXERCISE_CYCLING_SENSOR,        "http://tizen.org/sensor/healthinfo/exercise.cycling"},
74         {EXERCISE_ELLIPTICAL_SENSOR,     "http://tizen.org/sensor/healthinfo/exercise.elliptical"},
75         {EXERCISE_INDOOR_CYCLING_SENSOR, "http://tizen.org/sensor/healthinfo/exercise.indoor_cycling"},
76         {EXERCISE_ROWING_SENSOR,         "http://tizen.org/sensor/healthinfo/exercise.rowing"},
77         {EXERCISE_STEPPER_SENSOR,        "http://tizen.org/sensor/healthinfo/exercise.stepper"},
78
79         {EXTERNAL_EXERCISE_SENSOR,       "http://tizen.org/sensor/healthinfo/external_exercise"},
80
81         {FUSION_SENSOR,                  "http://tizen.org/sensor/general/fusion"},
82         {AUTO_ROTATION_SENSOR,           "http://tizen.org/sensor/general/auto_rotation"},
83         {AUTO_BRIGHTNESS_SENSOR,         "http://tizen.org/sensor/general/auto_brightness"},
84
85         {GESTURE_MOVEMENT_SENSOR,        "http://tizen.org/sensor/general/gesture_movement"},
86         {GESTURE_WRIST_UP_SENSOR,        "http://tizen.org/sensor/general/gesture_wrist_up"},
87         {GESTURE_WRIST_DOWN_SENSOR,      "http://tizen.org/sensor/general/gesture_wrist_down"},
88         {GESTURE_MOVEMENT_STATE_SENSOR,  "http://tizen.org/sensor/general/gesture_movement_state"},
89         {GESTURE_FACE_DOWN_SENSOR,       "http://tizen.org/sensor/general/gesture_face_down"},
90
91         {ACTIVITY_TRACKER_SENSOR,        "http://tizen.org/sensor/general/activity_tracker"},
92         {ACTIVITY_LEVEL_MONITOR_SENSOR,  "http://tizen.org/sensor/general/activity_level_monitor"},
93         {GPS_BATCH_SENSOR,               "http://tizen.org/sensor/location/gps_batch"},
94
95         {HRM_CTRL_SENSOR,                "http://tizen.org/sensor/general/hrm_ctrl"},
96
97         {WEAR_STATUS_SENSOR,             "http://tizen.org/sensor/general/wear_status"},
98         {WEAR_ON_MONITOR_SENSOR,         "http://tizen.org/sensor/general/wear_on_monitor"},
99         {NO_MOVE_DETECTOR_SENSOR,        "http://tizen.org/sensor/general/no_move_detector"},
100         {RESTING_HR_SENSOR,              "http://tizen.org/sensor/healthinfo/resting_hr"},
101         {STEP_LEVEL_MONITOR_SENSOR,      "http://tizen.org/sensor/healthinfo/step_level_monitor"},
102         {EXERCISE_STANDALONE_SENSOR,     "http://tizen.org/sensor/healthinfo/exercise_standalone"},
103         {EXERCISE_HR_SENSOR,             "http://tizen.org/sensor/healthinfo/exercise_hr"},
104         {WORKOUT_SENSOR,                 "http://tizen.org/sensor/healthinfo/workout"},
105         {CYCLE_MONITOR_SENSOR,           "http://tizen.org/sensor/healthinfo/cycle_monitor"},
106         {STAIR_TRACKER_SENSOR,           "http://tizen.org/sensor/healthinfo/stair_tracker"},
107         {PRESSURE_INDICATOR_SENSOR,      "http://tizen.org/sensor/general/pressure_indicator"},
108         {PRESSURE_ALERT_SENSOR,          "http://tizen.org/sensor/general/pressure_alert"},
109         {HR_CALORIE_SENSOR,              "http://tizen.org/sensor/healthinfo/hr_calorie"},
110
111         {CONTEXT_SENSOR,                 "http://tizen.org/sensor/general/context"},
112         {MOTION_SENSOR,                  "http://tizen.org/sensor/general/motion"},
113         {PIR_SENSOR,                     "http://tizen.org/sensor/general/pir"},
114         {PIR_LONG_SENSOR,                "http://tizen.org/sensor/general/pir_long"},
115         {DUST_SENSOR,                    "http://tizen.org/sensor/general/dust"},
116         {THERMOMETER_SENSOR,             "http://tizen.org/sensor/general/thermometer"},
117         {PEDOMETER_SENSOR,               "http://tizen.org/sensor/healthinfo/pedometer"},
118         {FLAT_SENSOR,                    "http://tizen.org/sensor/general/flat"},
119         {HRM_RAW_SENSOR,                 "http://tizen.org/sensor/healthinfo/hrm_raw"},
120         {TILT_SENSOR,                    "http://tizen.org/sensor/general/tilt"},
121         {RV_RAW_SENSOR,                  "http://tizen.org/sensor/general/rv_raw"},
122         {GSR_SENSOR,                     "http://tizen.org/sensor/healthinfo/gsr"},
123         {SIMSENSE_SENSOR,                "http://tizen.org/sensor/healthinfo/simsense"},
124         {PPG_SENSOR,                     "http://tizen.org/sensor/healthinfo/ppg"},
125 };
126
127 const char *sensor::utils::get_uri(sensor_type_t type)
128 {
129         auto it = types.find(type);
130         if (it == types.end())
131                 return "Unknown Type";
132         return it->second;
133 }
134
135 const char *sensor::utils::get_privilege(std::string uri)
136 {
137         std::size_t start = 0;
138         std::size_t end = uri.length();
139         std::size_t size = uri.size();
140
141         for (int i = 0; i < URI_PRIV_INDEX; ++i) {
142                 retv_if(start >= uri.length(), "");
143                 start = uri.find(URI_DELIMITER, start + 1);
144                 retv_if(start == std::string::npos, "");
145         }
146
147         end = uri.find(URI_DELIMITER, start + 1);
148         retv_if(end == std::string::npos, "");
149
150         size = end - (start + 1);
151
152         if (uri.substr(start + 1, size) == PRIVILEGE_HEALTHINFO_STR)
153                 return PRIVILEGE_HEALTHINFO_URI;
154         else if (uri.substr(start + 1, size) == PRIVILEGE_LOCATION_STR)
155                 return PRIVILEGE_LOCATION_URI;
156
157         return "";
158 }
159
160 static void init_types(std::map<std::string, sensor_type_t> &sensor_types)
161 {
162         ret_if(!sensor_types.empty());
163
164         for (auto it = types.begin(); it != types.end(); ++it) {
165                 std::string uri(it->second);
166                 std::size_t found = uri.find_last_of("/");
167                 std::size_t len = uri.length() - (found + 1);
168
169                 sensor_types.emplace(uri.substr(found + 1, len), it->first);
170         }
171 }
172
173 sensor_type_t sensor::utils::get_type(std::string uri)
174 {
175         static std::map<std::string, sensor_type_t> sensor_types;
176         init_types(sensor_types);
177
178         std::size_t start = 0;
179         std::size_t end = uri.length();
180         std::size_t size = uri.size();
181
182         for (int i = 0; i < URI_SENSOR_TYPE_INDEX; ++i) {
183                 retv_if(start >= uri.length(), UNKNOWN_SENSOR);
184                 start = uri.find(URI_DELIMITER, start + 1);
185                 retv_if(start == std::string::npos, UNKNOWN_SENSOR);
186         }
187
188         end = uri.find(URI_DELIMITER, start + 1);
189         retv_if(end == std::string::npos, UNKNOWN_SENSOR);
190
191         size = end - (start + 1);
192
193         auto it = sensor_types.find(uri.substr(start + 1, size));
194         retv_if(it == sensor_types.end(), UNKNOWN_SENSOR);
195
196         return it->second;
197 }
198
199 unsigned long long sensor::utils::get_timestamp(void)
200 {
201         struct timespec t;
202         clock_gettime(CLOCK_MONOTONIC, &t);
203         return ((unsigned long long)(t.tv_sec)*1000000000LL + t.tv_nsec) / 1000;
204 }
205
206 unsigned long long sensor::utils::get_timestamp(timeval *t)
207 {
208         if (!t)
209                 return 0;
210
211         return ((unsigned long long)(t->tv_sec)*1000000LL +t->tv_usec);
212 }
213
214 #ifdef _DEBUG
215 bool sensor::utils::get_proc_name(pid_t pid, char *process_name)
216 {
217         FILE *fp;
218         char buf[NAME_MAX];
219         char filename[PATH_MAX];
220
221         sprintf(filename, "/proc/%d/stat", pid);
222         fp = fopen(filename, "r");
223
224         if (fp == NULL)
225                 return false;
226
227         if (fscanf(fp, "%*s (%[^)]", buf) < 1) {
228                 fclose(fp);
229                 return false;
230         }
231
232         strncpy(process_name, buf, NAME_MAX-1);
233         process_name[NAME_MAX-1] = '\0';
234         fclose(fp);
235
236         return true;
237 }
238 #else
239 bool sensor::utils::get_proc_name(pid_t pid, char *process_name)
240 {
241         char buf[NAME_MAX];
242
243         if (snprintf(buf, sizeof(buf), "%d process", pid) < 1) {
244                 return false;
245         }
246
247         strncpy(process_name, buf, NAME_MAX-1);
248         process_name[NAME_MAX-1] = '\0';
249
250         return true;
251 }
252 #endif
253
254 const char* sensor::utils::get_client_name(void)
255 {
256         const int pid_string_size = 10;
257         static pid_t pid = -1;
258         static char client_name[NAME_MAX + pid_string_size];
259
260         char proc_name[NAME_MAX];
261
262         if (pid == -1)
263         {
264                 pid = getpid();
265                 get_proc_name(pid, proc_name);
266                 snprintf(client_name, sizeof(client_name), "%s(%d)", proc_name, pid);
267         }
268
269         return client_name;
270 }
271
272 std::vector<std::string> sensor::utils::tokenize(const std::string &in, const char *delim)
273 {
274         std::vector<std::string> tokens;
275         char *input = g_strdup(in.c_str());
276
277         char *save = NULL;
278         char *token = strtok_r(input, delim, &save);
279
280         while (token != NULL) {
281                 tokens.push_back(token);
282                 token = strtok_r(NULL, delim, &save);
283         }
284
285         g_free(input);
286         return tokens;
287 }