• 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 "client_info.h"
17 
18 #include <mutex>
19 
20 #include "permission_util.h"
21 #include "securec.h"
22 #include "sensor_errors.h"
23 #include "sensor_manager.h"
24 #ifdef HDF_DRIVERS_INTERFACE_SENSOR
25 #include "sensor_hdi_connection.h"
26 #endif // HDF_DRIVERS_INTERFACE_SENSOR
27 
28 #undef LOG_TAG
29 #define LOG_TAG "ClientInfo"
30 
31 namespace OHOS {
32 namespace Sensors {
33 using namespace OHOS::HiviewDFX;
34 
35 namespace {
36 constexpr int32_t INVALID_SENSOR_ID = -1;
37 constexpr int32_t INVALID_PID = -1;
38 constexpr int32_t INVALID_UID = -1;
39 constexpr int32_t MIN_MAP_SIZE = 0;
40 constexpr uint32_t NO_STORE_EVENT = -2;
41 constexpr uint32_t MAX_SUPPORT_CHANNEL = 200;
42 constexpr uint32_t MAX_DUMP_DATA_SIZE = 10;
43 } // namespace
44 
45 std::unordered_map<std::string, std::set<int32_t>> ClientInfo::userGrantPermMap_ = {
46     { ACTIVITY_MOTION_PERMISSION, { SENSOR_TYPE_ID_PEDOMETER_DETECTION, SENSOR_TYPE_ID_PEDOMETER } },
47     { READ_HEALTH_DATA_PERMISSION, { SENSOR_TYPE_ID_HEART_RATE } }
48 };
49 
GetSensorState(int32_t sensorId)50 bool ClientInfo::GetSensorState(int32_t sensorId)
51 {
52     CALL_LOG_ENTER;
53     if (sensorId == INVALID_SENSOR_ID) {
54         SEN_HILOGE("sensorId is invalid");
55         return false;
56     }
57     std::lock_guard<std::mutex> clientLock(clientMutex_);
58     auto it = clientMap_.find(sensorId);
59     if (it == clientMap_.end()) {
60         SEN_HILOGE("Can't find sensorId:%{public}d", sensorId);
61         return false;
62     }
63     for (const auto &pidIt : it->second) {
64         if (pidIt.second.GetSensorState()) {
65             return true;
66         }
67     }
68     SEN_HILOGE("Can't find sensorInfo, sensorId:%{public}d", sensorId);
69     return false;
70 }
71 
GetBestSensorInfo(int32_t sensorId)72 SensorBasicInfo ClientInfo::GetBestSensorInfo(int32_t sensorId)
73 {
74     int64_t minSamplingPeriodNs = LLONG_MAX;
75     int64_t minReportDelayNs = LLONG_MAX;
76     SensorBasicInfo sensorInfo;
77     sensorInfo.SetSamplingPeriodNs(minSamplingPeriodNs);
78     sensorInfo.SetMaxReportDelayNs(minReportDelayNs);
79     if (sensorId == INVALID_SENSOR_ID) {
80         SEN_HILOGE("sensorId is invalid");
81         return sensorInfo;
82     }
83 
84     std::lock_guard<std::mutex> clientLock(clientMutex_);
85     auto it = clientMap_.find(sensorId);
86     if (it == clientMap_.end()) {
87         SEN_HILOGE("Can't find sensorId:%{public}d", sensorId);
88         return sensorInfo;
89     }
90     for (const auto &pidIt : it->second) {
91         int64_t curSamplingPeriodNs = pidIt.second.GetSamplingPeriodNs();
92         int64_t curReportDelayNs = pidIt.second.GetMaxReportDelayNs();
93         minSamplingPeriodNs = (curSamplingPeriodNs < minSamplingPeriodNs) ? curSamplingPeriodNs : minSamplingPeriodNs;
94         minReportDelayNs = (curReportDelayNs < minReportDelayNs) ? curReportDelayNs : minReportDelayNs;
95     }
96     sensorInfo.SetSamplingPeriodNs(minSamplingPeriodNs);
97     sensorInfo.SetMaxReportDelayNs(minReportDelayNs);
98     return sensorInfo;
99 }
100 
OnlyCurPidSensorEnabled(int32_t sensorId,int32_t pid)101 bool ClientInfo::OnlyCurPidSensorEnabled(int32_t sensorId, int32_t pid)
102 {
103     CALL_LOG_ENTER;
104     if ((sensorId == INVALID_SENSOR_ID) || (pid <= INVALID_PID)) {
105         SEN_HILOGE("sensorId or pid is invalid");
106         return false;
107     }
108     std::lock_guard<std::mutex> clientLock(clientMutex_);
109     auto it = clientMap_.find(sensorId);
110     if (it == clientMap_.end()) {
111         SEN_HILOGE("Can't find sensorId:%{public}d", sensorId);
112         return false;
113     }
114     bool ret = false;
115     for (const auto &pidIt : it->second) {
116         if (!pidIt.second.GetSensorState()) {
117             continue;
118         }
119         if (pidIt.first != pid) {
120             SEN_HILOGE("Current sensor is also used by other pid");
121             return false;
122         }
123         ret = true;
124     }
125     return ret;
126 }
127 
UpdateAppThreadInfo(int32_t pid,int32_t uid,AccessTokenID callerToken)128 bool ClientInfo::UpdateAppThreadInfo(int32_t pid, int32_t uid, AccessTokenID callerToken)
129 {
130     CALL_LOG_ENTER;
131     if ((uid == INVALID_UID) || (pid <= INVALID_PID)) {
132         SEN_HILOGE("uid or pid is invalid");
133         return false;
134     }
135     std::lock_guard<std::mutex> uidLock(uidMutex_);
136     AppThreadInfo appThreadInfo(pid, uid, callerToken);
137     auto appThreadInfoItr = appThreadInfoMap_.find(pid);
138     if (appThreadInfoItr == appThreadInfoMap_.end()) {
139         if (appThreadInfoMap_.size() == MAX_SUPPORT_CHANNEL) {
140             SEN_HILOGE("Max support channel size is %{public}d", MAX_SUPPORT_CHANNEL);
141             return false;
142         }
143         auto ret = appThreadInfoMap_.insert(std::make_pair(pid, appThreadInfo));
144         return ret.second;
145     }
146     appThreadInfoMap_[pid] = appThreadInfo;
147     return true;
148 }
149 
DestroyAppThreadInfo(int32_t pid)150 void ClientInfo::DestroyAppThreadInfo(int32_t pid)
151 {
152     CALL_LOG_ENTER;
153     if (pid == INVALID_PID) {
154         SEN_HILOGE("pid is invalid");
155         return;
156     }
157     std::lock_guard<std::mutex> uidLock(uidMutex_);
158     auto appThreadInfoItr = appThreadInfoMap_.find(pid);
159     if (appThreadInfoItr == appThreadInfoMap_.end()) {
160         SEN_HILOGD("pid not exist, no need to destroy it");
161         return;
162     }
163     appThreadInfoMap_.erase(appThreadInfoItr);
164 }
165 
GetSensorChannelByUid(int32_t uid)166 std::vector<sptr<SensorBasicDataChannel>> ClientInfo::GetSensorChannelByUid(int32_t uid)
167 {
168     CALL_LOG_ENTER;
169     if (uid == INVALID_UID) {
170         SEN_HILOGE("uid is invalid");
171         return {};
172     }
173     std::vector<sptr<SensorBasicDataChannel>> sensorChannel;
174     std::lock_guard<std::mutex> uidLock(uidMutex_);
175     for (const auto &appThreadInfoIt : appThreadInfoMap_) {
176         if (uid != appThreadInfoIt.second.uid) {
177             continue;
178         }
179         std::lock_guard<std::mutex> channelLock(channelMutex_);
180         auto channelIt = channelMap_.find(appThreadInfoIt.first);
181         if (channelIt == channelMap_.end()) {
182             continue;
183         }
184         sensorChannel.push_back(channelIt->second);
185     }
186     return sensorChannel;
187 }
188 
GetSensorChannelByPid(int32_t pid)189 sptr<SensorBasicDataChannel> ClientInfo::GetSensorChannelByPid(int32_t pid)
190 {
191     CALL_LOG_ENTER;
192     if (pid == INVALID_PID) {
193         SEN_HILOGE("pid is invalid");
194         return nullptr;
195     }
196     std::lock_guard<std::mutex> channelLock(channelMutex_);
197     auto channelIt = channelMap_.find(pid);
198     if (channelIt == channelMap_.end()) {
199         SEN_HILOGE("There is no channel belong to the pid");
200         return nullptr;
201     }
202     return channelIt->second;
203 }
204 
GetSensorChannel(int32_t sensorId)205 std::vector<sptr<SensorBasicDataChannel>> ClientInfo::GetSensorChannel(int32_t sensorId)
206 {
207     if (sensorId == INVALID_SENSOR_ID) {
208         SEN_HILOGE("sensorId is invalid");
209         return {};
210     }
211     std::lock_guard<std::mutex> clientLock(clientMutex_);
212     auto clientIt = clientMap_.find(sensorId);
213     if (clientIt == clientMap_.end()) {
214         SEN_HILOGD("There is no channel belong to sensorId:%{public}d", sensorId);
215         return {};
216     }
217     std::vector<sptr<SensorBasicDataChannel>> sensorChannel;
218     for (const auto &sensorInfoIt : clientIt->second) {
219         std::lock_guard<std::mutex> channelLock(channelMutex_);
220         auto channelIt = channelMap_.find(sensorInfoIt.first);
221         if (channelIt == channelMap_.end()) {
222             continue;
223         }
224         if (!sensorInfoIt.second.GetPermState()) {
225             continue;
226         }
227         sensorChannel.push_back(channelIt->second);
228     }
229     return sensorChannel;
230 }
231 
UpdateSensorInfo(int32_t sensorId,int32_t pid,const SensorBasicInfo & sensorInfo)232 bool ClientInfo::UpdateSensorInfo(int32_t sensorId, int32_t pid, const SensorBasicInfo &sensorInfo)
233 {
234     CALL_LOG_ENTER;
235     if ((sensorId == INVALID_SENSOR_ID) || (pid <= INVALID_PID) || (!sensorInfo.GetSensorState())) {
236         SEN_HILOGE("Params are invalid");
237         return false;
238     }
239     std::lock_guard<std::mutex> clientLock(clientMutex_);
240     auto it = clientMap_.find(sensorId);
241     if (it == clientMap_.end()) {
242         std::unordered_map<int32_t, SensorBasicInfo> pidMap;
243         auto pidRet = pidMap.insert(std::make_pair(pid, sensorInfo));
244         auto clientRet = clientMap_.insert(std::make_pair(sensorId, pidMap));
245         return pidRet.second && clientRet.second;
246     }
247     auto pidIt = it->second.find(pid);
248     if (pidIt == it->second.end()) {
249         auto ret = it->second.insert(std::make_pair(pid, sensorInfo));
250         return ret.second;
251     }
252     it->second[pid] = sensorInfo;
253     return true;
254 }
255 
RemoveSubscriber(int32_t sensorId,uint32_t pid)256 void ClientInfo::RemoveSubscriber(int32_t sensorId, uint32_t pid)
257 {
258     std::lock_guard<std::mutex> clientLock(clientMutex_);
259     auto it = clientMap_.find(sensorId);
260     if (it == clientMap_.end()) {
261         SEN_HILOGW("sensorId not exist");
262         return;
263     }
264     auto pidIt = it->second.find(pid);
265     if (pidIt != it->second.end()) {
266         it->second.erase(pidIt);
267     }
268 }
269 
UpdateSensorChannel(int32_t pid,const sptr<SensorBasicDataChannel> & channel)270 bool ClientInfo::UpdateSensorChannel(int32_t pid, const sptr<SensorBasicDataChannel> &channel)
271 {
272     CALL_LOG_ENTER;
273     CHKPR(channel, false);
274     if (pid <= INVALID_PID) {
275         SEN_HILOGE("pid is invalid");
276         return false;
277     }
278     std::lock_guard<std::mutex> channelLock(channelMutex_);
279     auto it = channelMap_.find(pid);
280     if (it == channelMap_.end()) {
281         if (channelMap_.size() == MAX_SUPPORT_CHANNEL) {
282             SEN_HILOGE("Max support channel size:%{public}d", MAX_SUPPORT_CHANNEL);
283             return false;
284         }
285         auto ret = channelMap_.insert(std::make_pair(pid, channel));
286         SEN_HILOGD("ret.second:%{public}d", ret.second);
287         return ret.second;
288     }
289     channelMap_[pid] = channel;
290     return true;
291 }
292 
ClearSensorInfo(int32_t sensorId)293 void ClientInfo::ClearSensorInfo(int32_t sensorId)
294 {
295     CALL_LOG_ENTER;
296     if (sensorId == INVALID_SENSOR_ID) {
297         SEN_HILOGE("sensorId is invalid");
298         return;
299     }
300     std::lock_guard<std::mutex> clientLock(clientMutex_);
301     auto it = clientMap_.find(sensorId);
302     if (it == clientMap_.end()) {
303         SEN_HILOGD("sensorId not exist, no need to clear it");
304         return;
305     }
306     clientMap_.erase(it);
307 }
308 
ClearCurPidSensorInfo(int32_t sensorId,int32_t pid)309 void ClientInfo::ClearCurPidSensorInfo(int32_t sensorId, int32_t pid)
310 {
311     CALL_LOG_ENTER;
312     if ((sensorId == INVALID_SENSOR_ID) || (pid <= INVALID_PID)) {
313         SEN_HILOGE("sensorId or pid is invalid");
314         return;
315     }
316     std::lock_guard<std::mutex> clientLock(clientMutex_);
317     auto it = clientMap_.find(sensorId);
318     if (it == clientMap_.end()) {
319         SEN_HILOGD("sensorId not exist, no need to clear it");
320         return;
321     }
322     auto pidIt = it->second.find(pid);
323     if (pidIt == it->second.end()) {
324         SEN_HILOGD("pid not exist, no need to clear it");
325         return;
326     }
327     pidIt = it->second.erase(pidIt);
328     if (it->second.size() == MIN_MAP_SIZE) {
329         it = clientMap_.erase(it);
330     }
331 }
332 
DestroySensorChannel(int32_t pid)333 bool ClientInfo::DestroySensorChannel(int32_t pid)
334 {
335     CALL_LOG_ENTER;
336     if (pid <= INVALID_PID) {
337         SEN_HILOGE("pid is invalid");
338         return false;
339     }
340     std::lock_guard<std::mutex> clientLock(clientMutex_);
341     for (auto it = clientMap_.begin(); it != clientMap_.end();) {
342         auto pidIt = it->second.find(pid);
343         if (pidIt == it->second.end()) {
344             it++;
345             continue;
346         }
347         pidIt = it->second.erase(pidIt);
348         if (it->second.size() != MIN_MAP_SIZE) {
349             it++;
350             continue;
351         }
352         it = clientMap_.erase(it);
353     }
354     DestroyAppThreadInfo(pid);
355     std::lock_guard<std::mutex> channelLock(channelMutex_);
356     auto it = channelMap_.find(pid);
357     if (it == channelMap_.end()) {
358         SEN_HILOGD("There is no channel belong to pid, no need to destroy");
359         return true;
360     }
361     it = channelMap_.erase(it);
362     return true;
363 }
364 
GetCurPidSensorInfo(int32_t sensorId,int32_t pid)365 SensorBasicInfo ClientInfo::GetCurPidSensorInfo(int32_t sensorId, int32_t pid)
366 {
367     int64_t minSamplingPeriodNs = LLONG_MAX;
368     int64_t minReportDelayNs = LLONG_MAX;
369     SensorBasicInfo sensorInfo;
370     sensorInfo.SetSamplingPeriodNs(minSamplingPeriodNs);
371     sensorInfo.SetMaxReportDelayNs(minReportDelayNs);
372     if ((sensorId == INVALID_SENSOR_ID) || (pid <= INVALID_PID)) {
373         SEN_HILOGE("sensorId or channel is invalid");
374         return sensorInfo;
375     }
376     std::lock_guard<std::mutex> clientLock(clientMutex_);
377     auto it = clientMap_.find(sensorId);
378     if (it == clientMap_.end()) {
379         SEN_HILOGE("Can't find sensorId:%{public}d", sensorId);
380         return sensorInfo;
381     }
382     auto pidIt = it->second.find(pid);
383     if (pidIt == it->second.end()) {
384         SEN_HILOGE("Can't find pid:%{public}d", pid);
385         return sensorInfo;
386     }
387     sensorInfo.SetSamplingPeriodNs(pidIt->second.GetSamplingPeriodNs());
388     sensorInfo.SetMaxReportDelayNs(pidIt->second.GetMaxReportDelayNs());
389     return sensorInfo;
390 }
391 
ComputeBestPeriodCount(int32_t sensorId,sptr<SensorBasicDataChannel> & channel)392 uint64_t ClientInfo::ComputeBestPeriodCount(int32_t sensorId, sptr<SensorBasicDataChannel> &channel)
393 {
394     if (sensorId == INVALID_SENSOR_ID || channel == nullptr) {
395         SEN_HILOGE("sensorId is invalid or channel cannot be null");
396         return 0UL;
397     }
398     int32_t pid = INVALID_PID;
399     {
400         std::lock_guard<std::mutex> channelLock(channelMutex_);
401         for (const auto &channelIt : channelMap_) {
402             if (channelIt.second == channel) {
403                 pid = channelIt.first;
404             }
405         }
406     }
407     int64_t bestSamplingPeriod = GetBestSensorInfo(sensorId).GetSamplingPeriodNs();
408     int64_t curSamplingPeriod = GetCurPidSensorInfo(sensorId, pid).GetSamplingPeriodNs();
409     if (bestSamplingPeriod == 0L) {
410         SEN_HILOGE("Best sensor sampling period is 0");
411         return 0UL;
412     }
413     int64_t ret = curSamplingPeriod / bestSamplingPeriod;
414     return (ret <= 0L) ? 0UL : ret;
415 }
416 
ComputeBestFifoCount(int32_t sensorId,sptr<SensorBasicDataChannel> & channel)417 uint64_t ClientInfo::ComputeBestFifoCount(int32_t sensorId, sptr<SensorBasicDataChannel> &channel)
418 {
419     if (channel == nullptr || sensorId == INVALID_SENSOR_ID) {
420         SEN_HILOGE("sensorId is invalid or channel cannot be null");
421         return 0UL;
422     }
423     int32_t pid = INVALID_PID;
424     {
425         std::lock_guard<std::mutex> channelLock(channelMutex_);
426         for (const auto &channelIt : channelMap_) {
427             if (channelIt.second == channel) {
428                 pid = channelIt.first;
429             }
430         }
431     }
432     int64_t curReportDelay = GetCurPidSensorInfo(sensorId, pid).GetMaxReportDelayNs();
433     int64_t curSamplingPeriod = GetCurPidSensorInfo(sensorId, pid).GetSamplingPeriodNs();
434     if (curSamplingPeriod == 0L) {
435         SEN_HILOGE("Best sensor fifo count is 0");
436         return 0UL;
437     }
438     int64_t ret = curReportDelay / curSamplingPeriod;
439     return (ret <= 0L) ? 0UL : ret;
440 }
441 
GetStoreEvent(int32_t sensorId,SensorData & data)442 int32_t ClientInfo::GetStoreEvent(int32_t sensorId, SensorData &data)
443 {
444     std::lock_guard<std::mutex> lock(eventMutex_);
445     auto storedEvent = storedEvent_.find(sensorId);
446     if (storedEvent != storedEvent_.end()) {
447         errno_t ret = memcpy_s(&data, sizeof(data), &storedEvent->second, sizeof(storedEvent->second));
448         if (ret != EOK) {
449             SEN_HILOGE("memcpy_s failed, sensorId:%{public}d", sensorId);
450             return ret;
451         }
452         return ERR_OK;
453     }
454 
455     SEN_HILOGE("Can't get store event, sensorId:%{public}d", sensorId);
456     return NO_STORE_EVENT;
457 }
458 
StoreEvent(const SensorData & data)459 void ClientInfo::StoreEvent(const SensorData &data)
460 {
461     bool foundSensor = false;
462     SensorData storedEvent;
463     std::vector<Sensor> sensors;
464 #ifdef HDF_DRIVERS_INTERFACE_SENSOR
465     auto sensorHdiConnection = &SensorHdiConnection::GetInstance();
466     if (sensorHdiConnection == nullptr) {
467         SEN_HILOGE("sensorHdiConnection cannot be null");
468         return;
469     }
470     int32_t ret = sensorHdiConnection->GetSensorList(sensors);
471     if (ret != 0) {
472         SEN_HILOGE("GetSensorList is failed");
473         return;
474     }
475 #endif // HDF_DRIVERS_INTERFACE_SENSOR
476     errno_t retVal = memcpy_s(&storedEvent, sizeof(storedEvent), &data, sizeof(data));
477     if (retVal != EOK) {
478         SEN_HILOGE("memcpy_s is failed");
479         return;
480     }
481     for (size_t i = 0; i < sensors.size(); i++) {
482         if (sensors[i].GetSensorId() == storedEvent.sensorTypeId) {
483             foundSensor = true;
484             break;
485         }
486     }
487 
488     if (foundSensor) {
489         std::lock_guard<std::mutex> lock(eventMutex_);
490         storedEvent_[storedEvent.sensorTypeId] = storedEvent;
491     }
492 }
493 
SaveClientPid(const sptr<IRemoteObject> & sensorClient,int32_t pid)494 bool ClientInfo::SaveClientPid(const sptr<IRemoteObject> &sensorClient, int32_t pid)
495 {
496     CALL_LOG_ENTER;
497     CHKPF(sensorClient);
498     std::lock_guard<std::mutex> lock(clientPidMutex_);
499     auto it = clientPidMap_.find(sensorClient);
500     if (it == clientPidMap_.end()) {
501         clientPidMap_.insert(std::make_pair(sensorClient, pid));
502         return true;
503     }
504     clientPidMap_.insert(std::make_pair(sensorClient, pid));
505     return true;
506 }
507 
FindClientPid(const sptr<IRemoteObject> & sensorClient)508 int32_t ClientInfo::FindClientPid(const sptr<IRemoteObject> &sensorClient)
509 {
510     CALL_LOG_ENTER;
511     CHKPR(sensorClient, INVALID_PID);
512     std::lock_guard<std::mutex> lock(clientPidMutex_);
513     auto it = clientPidMap_.find(sensorClient);
514     if (it == clientPidMap_.end()) {
515         SEN_HILOGE("Cannot find client pid");
516         return INVALID_PID;
517     }
518     return it->second;
519 }
520 
DestroyClientPid(const sptr<IRemoteObject> & sensorClient)521 void ClientInfo::DestroyClientPid(const sptr<IRemoteObject> &sensorClient)
522 {
523     CALL_LOG_ENTER;
524     CHKPV(sensorClient);
525     std::lock_guard<std::mutex> lock(clientPidMutex_);
526     auto it = clientPidMap_.find(sensorClient);
527     if (it == clientPidMap_.end()) {
528         SEN_HILOGE("Cannot find client pid");
529         return;
530     }
531     clientPidMap_.erase(it);
532 }
533 
ClearEvent()534 void ClientInfo::ClearEvent()
535 {
536     std::lock_guard<std::mutex> lock(eventMutex_);
537     storedEvent_.clear();
538 }
539 
GetSensorIdByPid(int32_t pid)540 std::vector<int32_t> ClientInfo::GetSensorIdByPid(int32_t pid)
541 {
542     CALL_LOG_ENTER;
543     std::vector<int32_t> sensorIdVec;
544     std::lock_guard<std::mutex> clientLock(clientMutex_);
545     for (const auto &itClientMap : clientMap_) {
546         auto it = itClientMap.second.find(pid);
547         if (it != itClientMap.second.end()) {
548             sensorIdVec.push_back(itClientMap.first);
549         }
550     }
551     return sensorIdVec;
552 }
553 
GetAppInfoByChannel(const sptr<SensorBasicDataChannel> & channel)554 AppThreadInfo ClientInfo::GetAppInfoByChannel(const sptr<SensorBasicDataChannel> &channel)
555 {
556     CALL_LOG_ENTER;
557     AppThreadInfo appThreadInfo;
558     if (channel == nullptr) {
559         SEN_HILOGE("channel is nullptr");
560         return appThreadInfo;
561     }
562     {
563         std::lock_guard<std::mutex> channelLock(channelMutex_);
564         for (auto channelIt = channelMap_.begin(); channelIt != channelMap_.end(); channelIt++) {
565             if (channelIt->second == channel) {
566                 appThreadInfo.pid = channelIt->first;
567             }
568         }
569     }
570     {
571         std::lock_guard<std::mutex> uidLock(uidMutex_);
572         auto it = appThreadInfoMap_.find(appThreadInfo.pid);
573         if (it != appThreadInfoMap_.end()) {
574             appThreadInfo.uid = it->second.uid;
575             appThreadInfo.callerToken = it->second.callerToken;
576         }
577     }
578     return appThreadInfo;
579 }
580 
GetSensorChannelInfo(std::vector<SensorChannelInfo> & channelInfo)581 void ClientInfo::GetSensorChannelInfo(std::vector<SensorChannelInfo> &channelInfo)
582 {
583     CALL_LOG_ENTER;
584     std::lock_guard<std::mutex> clientLock(clientMutex_);
585     for (const auto &sensorIt : clientMap_) {
586         for (const auto &pidIt : sensorIt.second) {
587             int32_t pid = pidIt.first;
588             int32_t uid = GetUidByPid(pid);
589             if (uid == INVALID_UID) {
590                 SEN_HILOGW("uid is invalid, uid:%{public}d", uid);
591                 continue;
592             }
593             SensorChannelInfo channel;
594             channel.SetUid(uid);
595             channel.SetSensorId(sensorIt.first);
596             std::string packageName;
597             SensorManager::GetInstance().GetPackageName(GetTokenIdByPid(pid), packageName);
598             channel.SetPackageName(packageName);
599             int64_t samplingPeriodNs = pidIt.second.GetSamplingPeriodNs();
600             int64_t maxReportDelayNs = pidIt.second.GetMaxReportDelayNs();
601             channel.SetSamplingPeriodNs(samplingPeriodNs);
602             uint32_t fifoCount = (samplingPeriodNs == 0) ? 0 : (uint32_t)(maxReportDelayNs / samplingPeriodNs);
603             channel.SetFifoCount(fifoCount);
604             channel.SetCmdType(GetCmdList(sensorIt.first, uid));
605             channelInfo.push_back(channel);
606         }
607     }
608 }
609 
GetUidByPid(int32_t pid)610 int32_t ClientInfo::GetUidByPid(int32_t pid)
611 {
612     std::lock_guard<std::mutex> uidLock(uidMutex_);
613     auto appThreadInfoIt = appThreadInfoMap_.find(pid);
614     if (appThreadInfoIt == appThreadInfoMap_.end()) {
615         return INVALID_UID;
616     }
617     return appThreadInfoIt->second.uid;
618 }
619 
GetTokenIdByPid(int32_t pid)620 AccessTokenID ClientInfo::GetTokenIdByPid(int32_t pid)
621 {
622     std::lock_guard<std::mutex> uidLock(uidMutex_);
623     auto appThreadInfoIt = appThreadInfoMap_.find(pid);
624     if (appThreadInfoIt == appThreadInfoMap_.end()) {
625         return INVALID_UID;
626     }
627     return appThreadInfoIt->second.callerToken;
628 }
629 
UpdateCmd(int32_t sensorId,int32_t uid,int32_t cmdType)630 void ClientInfo::UpdateCmd(int32_t sensorId, int32_t uid, int32_t cmdType)
631 {
632     std::lock_guard<std::mutex> cmdLock(cmdMutex_);
633     auto cmdIt = cmdMap_.find(sensorId);
634     if (cmdIt == cmdMap_.end()) {
635         std::unordered_map<int32_t, std::vector<int32_t>> cmds;
636         std::vector<int32_t> tmp;
637         tmp.push_back(cmdType);
638         cmds.insert(std::make_pair(uid, tmp));
639         cmdMap_.insert(std::make_pair(sensorId, cmds));
640         return;
641     }
642     auto tmpIt = cmdIt->second.find(uid);
643     if (tmpIt == cmdIt->second.end()) {
644         std::vector<int32_t> tmp;
645         tmp.push_back(cmdType);
646         cmdIt->second.insert(std::make_pair(uid, tmp));
647         return;
648     }
649     auto tmp = tmpIt->second;
650     tmp.push_back(cmdType);
651     cmdIt->second.insert(std::make_pair(uid, tmp));
652 }
653 
DestroyCmd(int32_t uid)654 void ClientInfo::DestroyCmd(int32_t uid)
655 {
656     std::lock_guard<std::mutex> cmdLock(cmdMutex_);
657     cmdMap_.erase(uid);
658 }
659 
GetCmdList(int32_t sensorId,int32_t uid)660 std::vector<int32_t> ClientInfo::GetCmdList(int32_t sensorId, int32_t uid)
661 {
662     std::lock_guard<std::mutex> cmdLock(cmdMutex_);
663     auto cmdIt = cmdMap_.find(sensorId);
664     if (cmdIt == cmdMap_.end()) {
665         return {};
666     }
667     auto uidIt = cmdIt->second.find(uid);
668     if (uidIt == cmdIt->second.end()) {
669         return {};
670     }
671     return uidIt->second;
672 }
673 
UpdateDataQueue(int32_t sensorId,SensorData & data)674 void ClientInfo::UpdateDataQueue(int32_t sensorId, SensorData &data)
675 {
676     if (sensorId == SENSOR_TYPE_ID_HEART_RATE) {
677         return;
678     }
679     std::lock_guard<std::mutex> queueLock(dataQueueMutex_);
680     auto it = dumpQueue_.find(sensorId);
681     if (it == dumpQueue_.end()) {
682         std::queue<SensorData> q;
683         q.push(data);
684         dumpQueue_.insert(std::make_pair(sensorId, q));
685         return;
686     }
687     it->second.push(data);
688     if (it->second.size() > MAX_DUMP_DATA_SIZE) {
689         it->second.pop();
690     }
691 }
692 
GetDumpQueue()693 std::unordered_map<int32_t, std::queue<SensorData>> ClientInfo::GetDumpQueue()
694 {
695     return dumpQueue_;
696 }
697 
ClearDataQueue(int32_t sensorId)698 void ClientInfo::ClearDataQueue(int32_t sensorId)
699 {
700     std::lock_guard<std::mutex> queueLock(dataQueueMutex_);
701     auto it = dumpQueue_.find(sensorId);
702     if (it != dumpQueue_.end()) {
703         dumpQueue_.erase(it);
704     }
705 }
706 
AddActiveInfoCBPid(int32_t pid)707 int32_t ClientInfo::AddActiveInfoCBPid(int32_t pid)
708 {
709     std::lock_guard<std::mutex> activeInfoCBPidLock(activeInfoCBPidMutex_);
710     auto pairRet = activeInfoCBPidSet_.insert(pid);
711     if (!pairRet.second) {
712         SEN_HILOGE("Pid is duplicated");
713         return ERROR;
714     }
715     return ERR_OK;
716 }
717 
DelActiveInfoCBPid(int32_t pid)718 int32_t ClientInfo::DelActiveInfoCBPid(int32_t pid)
719 {
720     std::lock_guard<std::mutex> activeInfoCBPidLock(activeInfoCBPidMutex_);
721     auto it = activeInfoCBPidSet_.find(pid);
722     if (it == activeInfoCBPidSet_.end()) {
723         SEN_HILOGE("Pid is not exists");
724         return ERROR;
725     }
726     activeInfoCBPidSet_.erase(it);
727     return ERR_OK;
728 }
729 
GetActiveInfoCBPid()730 std::vector<int32_t> ClientInfo::GetActiveInfoCBPid()
731 {
732     std::vector<int32_t> activeInfoCBPids;
733     for (auto it = activeInfoCBPidSet_.begin(); it != activeInfoCBPidSet_.end(); ++it) {
734         activeInfoCBPids.push_back(*it);
735     }
736     return activeInfoCBPids;
737 }
738 
CallingService(int32_t pid)739 bool ClientInfo::CallingService(int32_t pid)
740 {
741     std::lock_guard<std::mutex> channelLock(channelMutex_);
742     auto channelIt = channelMap_.find(pid);
743     if (channelIt != channelMap_.end()) {
744         return false;
745     }
746     SEN_HILOGD("Pid is not exists in channelMap");
747     std::lock_guard<std::mutex> activeInfoCBPidLock(activeInfoCBPidMutex_);
748     auto pidIt = activeInfoCBPidSet_.find(pid);
749     if (pidIt != activeInfoCBPidSet_.end()) {
750         return false;
751     }
752     SEN_HILOGD("Pid is not exists in activeInfoCBPidSet");
753     return true;
754 }
755 
756 
GetPidByTokenId(AccessTokenID tokenId)757 int32_t ClientInfo::GetPidByTokenId(AccessTokenID tokenId)
758 {
759     std::lock_guard<std::mutex> uidLock(uidMutex_);
760     int32_t pid = INVALID_PID;
761     auto iter = std::find_if(appThreadInfoMap_.begin(), appThreadInfoMap_.end(), [tokenId] (auto appThreadInfo) {
762             return appThreadInfo.second.callerToken == tokenId;
763         });
764     if (iter != appThreadInfoMap_.end()) {
765         pid = iter->second.pid;
766     }
767     return pid;
768 }
769 
UpdatePermState(int32_t pid,int32_t sensorId,bool state)770 void ClientInfo::UpdatePermState(int32_t pid, int32_t sensorId, bool state)
771 {
772     std::lock_guard<std::mutex> clientLock(clientMutex_);
773     auto it = clientMap_.find(sensorId);
774     if (it == clientMap_.end()) {
775         SEN_HILOGE("Cannot find sensorId:%{public}d", sensorId);
776         return;
777     }
778     auto clientInfo = it->second.find(pid);
779     if (clientInfo != it->second.end()) {
780         clientInfo->second.SetPermState(state);
781     }
782 }
783 
ChangeSensorPerm(AccessTokenID tokenId,const std::string & permName,bool state)784 void ClientInfo::ChangeSensorPerm(AccessTokenID tokenId, const std::string &permName, bool state)
785 {
786     int32_t pid = GetPidByTokenId(tokenId);
787     if (pid <= INVALID_PID) {
788         SEN_HILOGE("Invalid pid:%{public}d", pid);
789         return;
790     }
791     auto it = userGrantPermMap_.find(permName);
792     if (it == userGrantPermMap_.end()) {
793         SEN_HILOGE("Invalid permission name:%{public}s", permName.c_str());
794         return;
795     }
796     for (int32_t sensorId : it->second) {
797         UpdatePermState(pid, sensorId, state);
798     }
799 }
800 } // namespace Sensors
801 } // namespace OHOS
802