1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "sensor_service.h"
17
18 #include <cinttypes>
19 #include <string_ex.h>
20 #include <sys/socket.h>
21 #include <unistd.h>
22
23 #include "hisysevent.h"
24 #include "iservice_registry.h"
25 #include "permission_util.h"
26 #include "securec.h"
27 #include "sensor.h"
28 #include "sensor_dump.h"
29 #include "sensors_errors.h"
30 #include "system_ability_definition.h"
31
32 namespace OHOS {
33 namespace Sensors {
34 using namespace OHOS::HiviewDFX;
35
36 namespace {
37 constexpr HiLogLabel LABEL = { LOG_CORE, SENSOR_LOG_DOMAIN, "SensorService" };
38 constexpr uint32_t INVALID_SENSOR_ID = -1;
39 constexpr int32_t INVALID_PID = -1;
40 constexpr int64_t MAX_EVENT_COUNT = 1000;
41 enum {
42 FLUSH = 0,
43 SET_MODE,
44 RESERVED,
45 };
46 } // namespace
47
48 REGISTER_SYSTEM_ABILITY_BY_ID(SensorService, SENSOR_SERVICE_ABILITY_ID, true);
49
SensorService(int32_t systemAbilityId,bool runOnCreate)50 SensorService::SensorService(int32_t systemAbilityId, bool runOnCreate)
51 : SystemAbility(systemAbilityId, runOnCreate), state_(SensorServiceState::STATE_STOPPED)
52 {}
53
OnDump()54 void SensorService::OnDump()
55 {
56 SEN_HILOGI("OnDump");
57 }
58
OnStart()59 void SensorService::OnStart()
60 {
61 CALL_LOG_ENTER;
62 if (state_ == SensorServiceState::STATE_RUNNING) {
63 SEN_HILOGW("SensorService has already started");
64 return;
65 }
66 if (!InitInterface()) {
67 SEN_HILOGE("Init interface error");
68 return;
69 }
70 if (!InitDataCallback()) {
71 SEN_HILOGE("Init data callback error");
72 return;
73 }
74 if (!InitSensorList()) {
75 SEN_HILOGE("Init sensor list error");
76 return;
77 }
78 sensorDataProcesser_ = new (std::nothrow) SensorDataProcesser(sensorMap_);
79 CHKPV(sensorDataProcesser_);
80 if (!InitSensorPolicy()) {
81 SEN_HILOGE("Init sensor policy error");
82 }
83
84 if (!SystemAbility::Publish(this)) {
85 SEN_HILOGE("publish SensorService error");
86 return;
87 }
88 sensorManager_.InitSensorMap(sensorMap_, sensorDataProcesser_, reportDataCallback_);
89 state_ = SensorServiceState::STATE_RUNNING;
90 }
91
InitInterface()92 bool SensorService::InitInterface()
93 {
94 auto ret = sensorHdiConnection_.ConnectHdi();
95 if (ret != ERR_OK) {
96 SEN_HILOGE("connect hdi failed");
97 return false;
98 }
99 return true;
100 }
101
InitDataCallback()102 bool SensorService::InitDataCallback()
103 {
104 reportDataCallback_ = new (std::nothrow) ReportDataCallback();
105 CHKPF(reportDataCallback_);
106 ReportDataCb cb = &ReportDataCallback::ReportEventCallback;
107 auto ret = sensorHdiConnection_.RegisteDataReport(cb, reportDataCallback_);
108 if (ret != ERR_OK) {
109 SEN_HILOGE("RegisterDataReport failed");
110 return false;
111 }
112 return true;
113 }
114
InitSensorList()115 bool SensorService::InitSensorList()
116 {
117 std::lock_guard<std::mutex> sensorLock(sensorsMutex_);
118 int32_t ret = sensorHdiConnection_.GetSensorList(sensors_);
119 if (ret != 0) {
120 SEN_HILOGE("GetSensorList is failed");
121 return false;
122 }
123 {
124 std::lock_guard<std::mutex> sensorMapLock(sensorMapMutex_);
125 for (const auto &it : sensors_) {
126 if (!(sensorMap_.insert(std::make_pair(it.GetSensorId(), it)).second)) {
127 SEN_HILOGW("sensorMap_ Insert failed");
128 }
129 }
130 }
131 return true;
132 }
133
InitSensorPolicy()134 bool SensorService::InitSensorPolicy()
135 {
136 return true;
137 }
138
OnStop()139 void SensorService::OnStop()
140 {
141 CALL_LOG_ENTER;
142 if (state_ == SensorServiceState::STATE_STOPPED) {
143 SEN_HILOGW("already stopped");
144 return;
145 }
146 state_ = SensorServiceState::STATE_STOPPED;
147 int32_t ret = sensorHdiConnection_.DestroyHdiConnection();
148 if (ret != ERR_OK) {
149 SEN_HILOGE("destroy hdi connect fail");
150 }
151 }
152
ReportSensorSysEvent(uint32_t sensorId,bool enable,int32_t pid)153 void SensorService::ReportSensorSysEvent(uint32_t sensorId, bool enable, int32_t pid)
154 {
155 std::string packageName("");
156 AccessTokenID tokenId = clientInfo_.GetTokenIdByPid(pid);
157 sensorManager_.GetPackageName(tokenId, packageName);
158 const int logLevel = 4;
159 int32_t uid = clientInfo_.GetUidByPid(pid);
160 if (enable) {
161 HiSysEvent::Write(HiSysEvent::Domain::SENSOR, "ENABLE_SENSOR", HiSysEvent::EventType::STATISTIC,
162 "LEVEL", logLevel, "UID", uid, "PKG_NAME", packageName, "TYPE", sensorId);
163 } else {
164 HiSysEvent::Write(HiSysEvent::Domain::SENSOR, "DISABLE_SENSOR", HiSysEvent::EventType::STATISTIC,
165 "LEVEL", logLevel, "UID", uid, "PKG_NAME", packageName, "TYPE", sensorId);
166 }
167 }
168
ReportOnChangeData(uint32_t sensorId)169 void SensorService::ReportOnChangeData(uint32_t sensorId)
170 {
171 std::lock_guard<std::mutex> sensorMapLock(sensorMapMutex_);
172 auto it = sensorMap_.find(sensorId);
173 if (it == sensorMap_.end()) {
174 SEN_HILOGE("sensorId is invalid");
175 return;
176 }
177 if ((SENSOR_ON_CHANGE & it->second.GetFlags()) != SENSOR_ON_CHANGE) {
178 SEN_HILOGW("it is not onchange data, no need to report");
179 return;
180 }
181 SensorEvent event;
182 auto ret = clientInfo_.GetStoreEvent(sensorId, event);
183 if (ret != ERR_OK) {
184 SEN_HILOGE("there is no data to be reported");
185 return;
186 }
187 sptr<SensorBasicDataChannel> channel = clientInfo_.GetSensorChannelByPid(GetCallingPid());
188 CHKPV(channel);
189 auto sendRet = channel->SendData(&event, sizeof(event));
190 if (sendRet != ERR_OK) {
191 SEN_HILOGE("send data failed");
192 return;
193 }
194 }
195
SaveSubscriber(uint32_t sensorId,int64_t samplingPeriodNs,int64_t maxReportDelayNs)196 ErrCode SensorService::SaveSubscriber(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs)
197 {
198 auto ret = sensorManager_.SaveSubscriber(sensorId, GetCallingPid(), samplingPeriodNs, maxReportDelayNs);
199 if (ret != ERR_OK) {
200 SEN_HILOGE("SaveSubscriber failed");
201 return ret;
202 }
203 sensorManager_.StartDataReportThread();
204 if (!sensorManager_.SetBestSensorParams(sensorId, samplingPeriodNs, maxReportDelayNs)) {
205 SEN_HILOGE("SetBestSensorParams failed");
206 clientInfo_.RemoveSubscriber(sensorId, GetCallingPid());
207 return ENABLE_SENSOR_ERR;
208 }
209 return ret;
210 }
211
EnableSensor(uint32_t sensorId,int64_t samplingPeriodNs,int64_t maxReportDelayNs)212 ErrCode SensorService::EnableSensor(uint32_t sensorId, int64_t samplingPeriodNs, int64_t maxReportDelayNs)
213 {
214 CALL_LOG_ENTER;
215 if ((sensorId == INVALID_SENSOR_ID) ||
216 ((samplingPeriodNs != 0L) && ((maxReportDelayNs / samplingPeriodNs) > MAX_EVENT_COUNT))) {
217 SEN_HILOGE("sensorId is 0 or maxReportDelayNs exceeded the maximum value");
218 return ERR_NO_INIT;
219 }
220 int32_t pid = GetCallingPid();
221 std::lock_guard<std::mutex> serviceLock(serviceLock_);
222 if (clientInfo_.GetSensorState(sensorId)) {
223 SEN_HILOGW("sensor has been enabled already");
224 auto ret = SaveSubscriber(sensorId, samplingPeriodNs, maxReportDelayNs);
225 if (ret != ERR_OK) {
226 SEN_HILOGE("SaveSubscriber failed");
227 return ret;
228 }
229 ReportSensorSysEvent(sensorId, true, pid);
230 if (ret != ERR_OK) {
231 SEN_HILOGE("ret : %{public}d", ret);
232 }
233 ReportOnChangeData(sensorId);
234 return ERR_OK;
235 }
236 auto ret = SaveSubscriber(sensorId, samplingPeriodNs, maxReportDelayNs);
237 if (ret != ERR_OK) {
238 SEN_HILOGE("SaveSubscriber failed");
239 clientInfo_.RemoveSubscriber(sensorId, GetCallingPid());
240 return ret;
241 }
242 ret = sensorHdiConnection_.EnableSensor(sensorId);
243 if (ret != ERR_OK) {
244 SEN_HILOGE("EnableSensor failed");
245 clientInfo_.RemoveSubscriber(sensorId, GetCallingPid());
246 return ENABLE_SENSOR_ERR;
247 }
248 ReportSensorSysEvent(sensorId, true, pid);
249 return ret;
250 }
251
DisableSensor(uint32_t sensorId,int32_t pid)252 ErrCode SensorService::DisableSensor(uint32_t sensorId, int32_t pid)
253 {
254 CALL_LOG_ENTER;
255 if (sensorId == INVALID_SENSOR_ID) {
256 SEN_HILOGE("sensorId is invalid");
257 return ERR_NO_INIT;
258 }
259 if (pid < 0) {
260 SEN_HILOGE("pid is invalid, pid:%{public}d", pid);
261 return CLIENT_PID_INVALID_ERR;
262 }
263 ReportSensorSysEvent(sensorId, false, pid);
264 std::lock_guard<std::mutex> serviceLock(serviceLock_);
265 if (sensorManager_.IsOtherClientUsingSensor(sensorId, pid)) {
266 SEN_HILOGW("other client is using this sensor now, cannot disable");
267 return ERR_OK;
268 }
269 if (sensorHdiConnection_.DisableSensor(sensorId) != ERR_OK) {
270 SEN_HILOGE("DisableSensor is failed");
271 return DISABLE_SENSOR_ERR;
272 }
273 int32_t uid = clientInfo_.GetUidByPid(pid);
274 clientInfo_.DestroyCmd(uid);
275 clientInfo_.ClearDataQueue(sensorId);
276 return sensorManager_.AfterDisableSensor(sensorId);
277 }
278
DisableSensor(uint32_t sensorId)279 ErrCode SensorService::DisableSensor(uint32_t sensorId)
280 {
281 CALL_LOG_ENTER;
282 return DisableSensor(sensorId, GetCallingPid());
283 }
284
GetSensorList()285 std::vector<Sensor> SensorService::GetSensorList()
286 {
287 std::lock_guard<std::mutex> sensorLock(sensorsMutex_);
288 int32_t ret = sensorHdiConnection_.GetSensorList(sensors_);
289 if (ret != 0) {
290 SEN_HILOGE("GetSensorList is failed");
291 return sensors_;
292 }
293 for (const auto &it : sensors_) {
294 std::lock_guard<std::mutex> sensorMapLock(sensorMapMutex_);
295 sensorMap_.insert(std::make_pair(it.GetSensorId(), it));
296 }
297 return sensors_;
298 }
299
TransferDataChannel(const sptr<SensorBasicDataChannel> & sensorBasicDataChannel,const sptr<IRemoteObject> & sensorClient)300 ErrCode SensorService::TransferDataChannel(const sptr<SensorBasicDataChannel> &sensorBasicDataChannel,
301 const sptr<IRemoteObject> &sensorClient)
302 {
303 CHKPR(sensorBasicDataChannel, ERR_NO_INIT);
304 auto pid = GetCallingPid();
305 auto uid = GetCallingUid();
306 auto callerToken = GetCallingTokenID();
307 if (!clientInfo_.UpdateAppThreadInfo(pid, uid, callerToken)) {
308 SEN_HILOGE("UpdateUid is failed");
309 return UPDATE_UID_ERR;
310 }
311 if (!clientInfo_.UpdateSensorChannel(pid, sensorBasicDataChannel)) {
312 SEN_HILOGE("UpdateSensorChannel is failed");
313 return UPDATE_SENSOR_CHANNEL_ERR;
314 }
315 sensorBasicDataChannel->SetSensorStatus(true);
316 RegisterClientDeathRecipient(sensorClient, pid);
317 return ERR_OK;
318 }
319
DestroySensorChannel(sptr<IRemoteObject> sensorClient)320 ErrCode SensorService::DestroySensorChannel(sptr<IRemoteObject> sensorClient)
321 {
322 CALL_LOG_ENTER;
323 const int32_t clientPid = GetCallingPid();
324 if (clientPid < 0) {
325 SEN_HILOGE("clientPid is invalid, clientPid:%{public}d", clientPid);
326
327 return CLIENT_PID_INVALID_ERR;
328 }
329 std::lock_guard<std::mutex> serviceLock(serviceLock_);
330 bool destoryRet = clientInfo_.DestroySensorChannel(clientPid);
331 if (!destoryRet) {
332 SEN_HILOGE("DestroySensorChannel is failed");
333 return DESTROY_SENSOR_CHANNEL_ERR;
334 }
335 clientInfo_.DestroyCmd(GetCallingUid());
336 UnregisterClientDeathRecipient(sensorClient);
337 return ERR_OK;
338 }
339
ProcessDeathObserver(const wptr<IRemoteObject> & object)340 void SensorService::ProcessDeathObserver(const wptr<IRemoteObject> &object)
341 {
342 CALL_LOG_ENTER;
343 sptr<IRemoteObject> client = object.promote();
344 CHKPV(client);
345 int32_t pid = clientInfo_.FindClientPid(client);
346 if (pid == INVALID_PID) {
347 SEN_HILOGE("pid is -1");
348 return;
349 }
350 SEN_HILOGI("pid is %{pubilc}d", pid);
351 std::vector<uint32_t> activeSensors = clientInfo_.GetSensorIdByPid(pid);
352 for (size_t i = 0; i < activeSensors.size(); ++i) {
353 int32_t ret = DisableSensor(activeSensors[i], pid);
354 if (ret != ERR_OK) {
355 SEN_HILOGE("disablesensor failed, ret:%{pubilc}d", ret);
356 }
357 }
358 clientInfo_.DestroySensorChannel(pid);
359 clientInfo_.DestroyClientPid(client);
360 clientInfo_.DestroyCmd(clientInfo_.GetUidByPid(pid));
361 }
362
RegisterClientDeathRecipient(sptr<IRemoteObject> sensorClient,int32_t pid)363 void SensorService::RegisterClientDeathRecipient(sptr<IRemoteObject> sensorClient, int32_t pid)
364 {
365 CALL_LOG_ENTER;
366 sptr<ISensorClient> client = iface_cast<ISensorClient>(sensorClient);
367 clientDeathObserver_ = new (std::nothrow) DeathRecipientTemplate(*const_cast<SensorService *>(this));
368 CHKPV(clientDeathObserver_);
369 client->AsObject()->AddDeathRecipient(clientDeathObserver_);
370 clientInfo_.SaveClientPid(sensorClient, pid);
371 }
372
UnregisterClientDeathRecipient(sptr<IRemoteObject> sensorClient)373 void SensorService::UnregisterClientDeathRecipient(sptr<IRemoteObject> sensorClient)
374 {
375 CALL_LOG_ENTER;
376 sptr<ISensorClient> client = iface_cast<ISensorClient>(sensorClient);
377 clientDeathObserver_ = new (std::nothrow) DeathRecipientTemplate(*const_cast<SensorService *>(this));
378 CHKPV(clientDeathObserver_);
379 client->AsObject()->RemoveDeathRecipient(clientDeathObserver_);
380 clientInfo_.DestroyClientPid(sensorClient);
381 }
382
Dump(int32_t fd,const std::vector<std::u16string> & args)383 int32_t SensorService::Dump(int32_t fd, const std::vector<std::u16string> &args)
384 {
385 CALL_LOG_ENTER;
386 if (fd < 0) {
387 SEN_HILOGE("Invalid fd");
388 return DUMP_PARAM_ERR;
389 }
390 SensorDump &sensorDump = SensorDump::GetInstance();
391 if (args.empty()) {
392 SEN_HILOGE("param cannot be empty");
393 dprintf(fd, "param cannot be empty\n");
394 sensorDump.DumpHelp(fd);
395 return DUMP_PARAM_ERR;
396 }
397 std::vector<std::string> argList = { "" };
398 std::transform(args.begin(), args.end(), std::back_inserter(argList),
399 [](const std::u16string &arg) {
400 return Str16ToStr8(arg);
401 });
402 sensorDump.ParseCommand(fd, argList, sensors_, clientInfo_);
403 return ERR_OK;
404 }
405 } // namespace Sensors
406 } // namespace OHOS
407