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