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