• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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