1 /*
2 * Copyright (c) 2021-2025 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 "capability_info_manager.h"
17
18 #include "anonymous_string.h"
19 #include "capability_utils.h"
20 #include "constants.h"
21 #include "dh_context.h"
22 #include "dh_utils_tool.h"
23 #include "distributed_hardware_errno.h"
24 #include "distributed_hardware_log.h"
25 #include "distributed_hardware_manager.h"
26 #include "distributed_hardware_manager_factory.h"
27 #include "task_executor.h"
28 #include "task_factory.h"
29 #include "task_board.h"
30
31 namespace OHOS {
32 namespace DistributedHardware {
33 #undef DH_LOG_TAG
34 #define DH_LOG_TAG "CapabilityInfoManager"
35
CapabilityInfoManager()36 CapabilityInfoManager::CapabilityInfoManager() : dbAdapterPtr_(nullptr)
37 {
38 DHLOGI("CapabilityInfoManager construction!");
39 }
40
~CapabilityInfoManager()41 CapabilityInfoManager::~CapabilityInfoManager()
42 {
43 DHLOGI("CapabilityInfoManager destruction!");
44 }
45
GetInstance()46 std::shared_ptr<CapabilityInfoManager> CapabilityInfoManager::GetInstance()
47 {
48 static std::shared_ptr<CapabilityInfoManager> instance = std::make_shared<CapabilityInfoManager>();
49 return instance;
50 }
51
CapabilityInfoManagerEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> runner,std::shared_ptr<CapabilityInfoManager> capabilityInfoMgrPtr)52 CapabilityInfoManager::CapabilityInfoManagerEventHandler::CapabilityInfoManagerEventHandler(
53 const std::shared_ptr<AppExecFwk::EventRunner> runner,
54 std::shared_ptr<CapabilityInfoManager> capabilityInfoMgrPtr)
55 : AppExecFwk::EventHandler(runner)
56 {
57 DHLOGI("Ctor CapabilityInfoManagerEventHandler");
58 capabilityInfoMgrWPtr_ = capabilityInfoMgrPtr;
59 }
60
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)61 void CapabilityInfoManager::CapabilityInfoManagerEventHandler::ProcessEvent(
62 const AppExecFwk::InnerEvent::Pointer &event)
63 {
64 uint32_t eventId = event->GetInnerEventId();
65 auto selfPtr = capabilityInfoMgrWPtr_.lock();
66 if (!selfPtr) {
67 DHLOGE("Can not get strong self ptr");
68 return;
69 }
70 switch (eventId) {
71 case EVENT_CAPABILITY_INFO_DB_RECOVER:
72 selfPtr->SyncRemoteCapabilityInfos();
73 break;
74 default:
75 DHLOGE("event is undefined, id is %{public}d", eventId);
76 break;
77 }
78 }
79
GetEventHandler()80 std::shared_ptr<CapabilityInfoManager::CapabilityInfoManagerEventHandler> CapabilityInfoManager::GetEventHandler()
81 {
82 return this->eventHandler_;
83 }
84
Init()85 int32_t CapabilityInfoManager::Init()
86 {
87 DHLOGI("CapabilityInfoManager instance init!");
88 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
89 dbAdapterPtr_ = std::make_shared<DBAdapter>(APP_ID, GLOBAL_CAPABILITY_ID, shared_from_this());
90 if (dbAdapterPtr_ == nullptr) {
91 DHLOGE("dbAdapterPtr_ is null");
92 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
93 }
94 if (dbAdapterPtr_->Init(false, DistributedKv::DataType::TYPE_DYNAMICAL) != DH_FWK_SUCCESS) {
95 DHLOGE("Init dbAdapterPtr_ failed");
96 return ERR_DH_FWK_RESOURCE_INIT_DB_FAILED;
97 }
98 std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
99 eventHandler_ = std::make_shared<CapabilityInfoManager::CapabilityInfoManagerEventHandler>(
100 runner, shared_from_this());
101 DHLOGI("CapabilityInfoManager instance init success");
102 return DH_FWK_SUCCESS;
103 }
104
UnInit()105 int32_t CapabilityInfoManager::UnInit()
106 {
107 DHLOGI("CapabilityInfoManager UnInit");
108 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
109 if (dbAdapterPtr_ == nullptr) {
110 DHLOGE("dbAdapterPtr_ is null");
111 return ERR_DH_FWK_RESOURCE_UNINIT_DB_FAILED;
112 }
113 dbAdapterPtr_->UnInit();
114 dbAdapterPtr_.reset();
115 return DH_FWK_SUCCESS;
116 }
117
SyncDeviceInfoFromDB(const std::string & deviceId)118 int32_t CapabilityInfoManager::SyncDeviceInfoFromDB(const std::string &deviceId)
119 {
120 if (!IsIdLengthValid(deviceId)) {
121 return ERR_DH_FWK_PARA_INVALID;
122 }
123 DHLOGI("Sync DeviceInfo from DB, deviceId: %{public}s", GetAnonyString(deviceId).c_str());
124 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
125 if (dbAdapterPtr_ == nullptr) {
126 DHLOGE("dbAdapterPtr_ is null");
127 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
128 }
129 std::vector<std::string> dataVector;
130 if (dbAdapterPtr_->GetDataByKeyPrefix(deviceId, dataVector) != DH_FWK_SUCCESS) {
131 DHLOGE("Query data from DB by deviceId failed, id: %{public}s", GetAnonyString(deviceId).c_str());
132 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
133 }
134 if (dataVector.empty() || dataVector.size() > MAX_DB_RECORD_SIZE) {
135 DHLOGE("dataVector size: %{public}zu is invalid, maybe empty or too large.", dataVector.size());
136 return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
137 }
138 for (const auto &data : dataVector) {
139 std::shared_ptr<CapabilityInfo> capabilityInfo;
140 if (GetCapabilityByValue<CapabilityInfo>(data, capabilityInfo) != DH_FWK_SUCCESS) {
141 DHLOGE("Get capability ptr by value failed");
142 continue;
143 }
144 globalCapInfoMap_[capabilityInfo->GetKey()] = capabilityInfo;
145 }
146 return DH_FWK_SUCCESS;
147 }
148
SyncRemoteCapabilityInfos()149 int32_t CapabilityInfoManager::SyncRemoteCapabilityInfos()
150 {
151 DHLOGI("Sync full remote device info from DB");
152 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
153 if (dbAdapterPtr_ == nullptr) {
154 DHLOGE("dbAdapterPtr_ is null");
155 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
156 }
157 std::vector<std::string> deviceIdVec;
158 DHContext::GetInstance().GetOnlineDeviceDeviceId(deviceIdVec);
159 for (const auto &deviceId : deviceIdVec) {
160 std::vector<std::string> dataVector;
161 if (dbAdapterPtr_->GetDataByKeyPrefix(deviceId, dataVector) != DH_FWK_SUCCESS) {
162 DHLOGE("Query the deviceId: %{public}s data from DB failed", GetAnonyString(deviceId).c_str());
163 continue;
164 }
165 if (dataVector.empty() || dataVector.size() > MAX_DB_RECORD_SIZE) {
166 DHLOGE("dataVector size: %{public}zu is invalid, maybe empty or too large.", dataVector.size());
167 continue;
168 }
169 for (const auto &data : dataVector) {
170 std::shared_ptr<CapabilityInfo> capabilityInfo;
171 if (GetCapabilityByValue<CapabilityInfo>(data, capabilityInfo) != DH_FWK_SUCCESS) {
172 DHLOGE("Get capability ptr by value failed");
173 continue;
174 }
175 const std::string deviceId = capabilityInfo->GetDeviceId();
176 const std::string localDeviceId = DHContext::GetInstance().GetDeviceInfo().deviceId;
177 if (deviceId.compare(localDeviceId) == 0) {
178 DHLOGE("local device info not need sync from db");
179 continue;
180 }
181 globalCapInfoMap_[capabilityInfo->GetKey()] = capabilityInfo;
182 }
183 }
184 return DH_FWK_SUCCESS;
185 }
186
AddCapability(const std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)187 int32_t CapabilityInfoManager::AddCapability(const std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
188 {
189 if (resInfos.empty() || resInfos.size() > MAX_DB_RECORD_SIZE) {
190 DHLOGE("ResInfo is empty or too large!");
191 return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
192 }
193 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
194 if (dbAdapterPtr_ == nullptr) {
195 DHLOGE("dbAdapterPtr_ is null");
196 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
197 }
198 std::vector<std::string> keys;
199 std::vector<std::string> values;
200 std::string key;
201 std::string data;
202 for (auto &resInfo : resInfos) {
203 if (resInfo == nullptr) {
204 continue;
205 }
206 key = resInfo->GetKey();
207 globalCapInfoMap_[key] = resInfo;
208 if (dbAdapterPtr_->GetDataByKey(key, data) == DH_FWK_SUCCESS &&
209 IsCapInfoJsonEqual<CapabilityInfo>(data, resInfo->ToJsonString())) {
210 DHLOGD("this record is exist, Key: %{public}s", resInfo->GetAnonymousKey().c_str());
211 continue;
212 }
213 DHLOGI("AddCapability, Key: %{public}s", resInfo->GetAnonymousKey().c_str());
214 keys.push_back(key);
215 values.push_back(resInfo->ToJsonString());
216 }
217 if (keys.empty() || values.empty()) {
218 DHLOGD("Records are empty, No need add data to db!");
219 return DH_FWK_SUCCESS;
220 }
221 if (dbAdapterPtr_->PutDataBatch(keys, values) != DH_FWK_SUCCESS) {
222 DHLOGE("Fail to storage batch to kv");
223 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
224 }
225 return DH_FWK_SUCCESS;
226 }
227
AddCapabilityInMem(const std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)228 int32_t CapabilityInfoManager::AddCapabilityInMem(const std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
229 {
230 if (resInfos.empty() || resInfos.size() > MAX_DB_RECORD_SIZE) {
231 DHLOGE("ResInfo is empty or too large!");
232 return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
233 }
234 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
235 for (auto &resInfo : resInfos) {
236 if (resInfo == nullptr) {
237 continue;
238 }
239 const std::string key = resInfo->GetKey();
240 DHLOGI("AddCapabilityInMem, Key: %{public}s", resInfo->GetAnonymousKey().c_str());
241 globalCapInfoMap_[key] = resInfo;
242 }
243 return DH_FWK_SUCCESS;
244 }
245
RemoveCapabilityInfoInDB(const std::string & deviceId)246 int32_t CapabilityInfoManager::RemoveCapabilityInfoInDB(const std::string &deviceId)
247 {
248 if (!IsIdLengthValid(deviceId)) {
249 return ERR_DH_FWK_PARA_INVALID;
250 }
251 DHLOGI("Remove capability device info, deviceId: %{public}s", GetAnonyString(deviceId).c_str());
252 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
253 if (dbAdapterPtr_ == nullptr) {
254 DHLOGE("dbAdapterPtr_ is null");
255 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
256 }
257 // 1. Clear the cache in the memory.
258 for (auto iter = globalCapInfoMap_.begin(); iter != globalCapInfoMap_.end();) {
259 if (!IsCapKeyMatchDeviceId(iter->first, deviceId)) {
260 iter++;
261 continue;
262 }
263 DHLOGI("Clear globalCapInfoMap_ iter: %{public}s", GetAnonyString(iter->first).c_str());
264 globalCapInfoMap_.erase(iter++);
265 }
266 // 2. Delete the corresponding record from the database(use UUID).
267 if (dbAdapterPtr_->RemoveDeviceData(deviceId) != DH_FWK_SUCCESS) {
268 DHLOGE("Remove capability Device Data failed, deviceId: %{public}s", GetAnonyString(deviceId).c_str());
269 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
270 }
271 return DH_FWK_SUCCESS;
272 }
273
RemoveCapabilityInfoByKey(const std::string & key)274 int32_t CapabilityInfoManager::RemoveCapabilityInfoByKey(const std::string &key)
275 {
276 if (!IsIdLengthValid(key)) {
277 return ERR_DH_FWK_PARA_INVALID;
278 }
279 DHLOGI("Remove capability device info, key: %{public}s", GetAnonyString(key).c_str());
280 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
281 if (dbAdapterPtr_ == nullptr) {
282 DHLOGE("dbAdapterPtr_ is null");
283 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
284 }
285 // 1. Clear the cache in the memory.
286 globalCapInfoMap_.erase(key);
287
288 // 2. Delete the corresponding record from the database.(use key)
289 if (dbAdapterPtr_->RemoveDataByKey(key) != DH_FWK_SUCCESS) {
290 DHLOGE("Remove capability Device Data failed, key: %{public}s", GetAnonyString(key).c_str());
291 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
292 }
293 return DH_FWK_SUCCESS;
294 }
295
RemoveCapabilityInfoInMem(const std::string & deviceId)296 int32_t CapabilityInfoManager::RemoveCapabilityInfoInMem(const std::string &deviceId)
297 {
298 if (!IsIdLengthValid(deviceId)) {
299 return ERR_DH_FWK_PARA_INVALID;
300 }
301 DHLOGI("remove capability device info in memory, deviceId: %{public}s", GetAnonyString(deviceId).c_str());
302 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
303 for (auto iter = globalCapInfoMap_.begin(); iter != globalCapInfoMap_.end();) {
304 if (!IsCapKeyMatchDeviceId(iter->first, deviceId)) {
305 iter++;
306 continue;
307 }
308 globalCapInfoMap_.erase(iter++);
309 }
310 return DH_FWK_SUCCESS;
311 }
312
OnChange(const DistributedKv::ChangeNotification & changeNotification)313 void CapabilityInfoManager::OnChange(const DistributedKv::ChangeNotification &changeNotification)
314 {
315 DHLOGI("CapabilityInfoManager: DB data OnChange");
316 if (!changeNotification.GetInsertEntries().empty() &&
317 changeNotification.GetInsertEntries().size() <= MAX_DB_RECORD_SIZE) {
318 DHLOGI("Handle capability data add change");
319 HandleCapabilityAddChange(changeNotification.GetInsertEntries());
320 }
321 if (!changeNotification.GetUpdateEntries().empty() &&
322 changeNotification.GetUpdateEntries().size() <= MAX_DB_RECORD_SIZE) {
323 DHLOGI("Handle capability data update change");
324 HandleCapabilityUpdateChange(changeNotification.GetUpdateEntries());
325 }
326 if (!changeNotification.GetDeleteEntries().empty() &&
327 changeNotification.GetDeleteEntries().size() <= MAX_DB_RECORD_SIZE) {
328 DHLOGI("Handle capability data delete change");
329 HandleCapabilityDeleteChange(changeNotification.GetDeleteEntries());
330 }
331 }
332
OnChange(const DistributedKv::DataOrigin & origin,Keys && keys)333 void CapabilityInfoManager::OnChange(const DistributedKv::DataOrigin &origin, Keys &&keys)
334 {
335 DHLOGI("CapabilityInfoManager: Cloud data OnChange.");
336 std::vector<DistributedKv::Entry> insertRecords = GetEntriesByKeys(keys[ChangeOp::OP_INSERT]);
337 if (!insertRecords.empty() && insertRecords.size() <= MAX_DB_RECORD_SIZE) {
338 DHLOGI("Handle capability data add change");
339 HandleCapabilityAddChange(insertRecords);
340 }
341 std::vector<DistributedKv::Entry> updateRecords = GetEntriesByKeys(keys[ChangeOp::OP_UPDATE]);
342 if (!updateRecords.empty() && updateRecords.size() <= MAX_DB_RECORD_SIZE) {
343 DHLOGI("Handle capability data update change");
344 HandleCapabilityUpdateChange(updateRecords);
345 }
346 std::vector<std::string> delKeys = keys[ChangeOp::OP_DELETE];
347 if (!delKeys.empty() && delKeys.size() <= MAX_DB_RECORD_SIZE) {
348 std::vector<DistributedKv::Entry> deleteRecords;
349 for (const auto &key : delKeys) {
350 DistributedKv::Entry entry;
351 DistributedKv::Key kvKey(key);
352 entry.key = kvKey;
353 deleteRecords.emplace_back(entry);
354 }
355 DHLOGI("Handle capability data delete change");
356 HandleCapabilityDeleteChange(deleteRecords);
357 }
358 }
359
HandleCapabilityAddChange(const std::vector<DistributedKv::Entry> & insertRecords)360 void CapabilityInfoManager::HandleCapabilityAddChange(const std::vector<DistributedKv::Entry> &insertRecords)
361 {
362 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
363 for (const auto &item : insertRecords) {
364 const std::string value = item.value.ToString();
365 std::shared_ptr<CapabilityInfo> capPtr;
366 if (GetCapabilityByValue<CapabilityInfo>(value, capPtr) != DH_FWK_SUCCESS) {
367 DHLOGE("Get capability by value failed");
368 continue;
369 }
370 std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
371 if (uuid.empty()) {
372 DHLOGE("Find uuid failed and never enable, deviceId: %{public}s",
373 GetAnonyString(capPtr->GetDeviceId()).c_str());
374 continue;
375 }
376 std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
377 if (networkId.empty()) {
378 DHLOGE("Find network failed and never enable, uuid: %{public}s", GetAnonyString(uuid).c_str());
379 continue;
380 }
381
382 const auto keyString = capPtr->GetKey();
383 DHLOGI("Add capability key: %{public}s", capPtr->GetAnonymousKey().c_str());
384 globalCapInfoMap_[keyString] = capPtr;
385 TaskParam taskParam = {
386 .networkId = networkId,
387 .uuid = uuid,
388 .dhId = capPtr->GetDHId(),
389 .dhType = capPtr->GetDHType()
390 };
391 auto task = TaskFactory::GetInstance().CreateTask(TaskType::ENABLE, taskParam, nullptr);
392 TaskExecutor::GetInstance().PushTask(task);
393 }
394 }
395
HandleCapabilityUpdateChange(const std::vector<DistributedKv::Entry> & updateRecords)396 void CapabilityInfoManager::HandleCapabilityUpdateChange(const std::vector<DistributedKv::Entry> &updateRecords)
397 {
398 if (DistributedHardwareManagerFactory::GetInstance().GetUnInitFlag()) {
399 DHLOGE("no need Update, is in uniniting.");
400 return;
401 }
402 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
403 for (const auto &item : updateRecords) {
404 const std::string value = item.value.ToString();
405 std::shared_ptr<CapabilityInfo> capPtr;
406 if (GetCapabilityByValue<CapabilityInfo>(value, capPtr) != DH_FWK_SUCCESS) {
407 DHLOGE("Get capability by value failed");
408 continue;
409 }
410 std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
411 if (uuid.empty()) {
412 DHLOGE("Find uuid failed and never enable, deviceId: %{public}s",
413 GetAnonyString(capPtr->GetDeviceId()).c_str());
414 continue;
415 }
416 std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
417 if (networkId.empty()) {
418 DHLOGE("Find network failed and never enable, uuid: %{public}s", GetAnonyString(uuid).c_str());
419 continue;
420 }
421 std::string enabledDeviceKey = GetCapabilityKey(capPtr->GetDeviceId(), capPtr->GetDHId());
422 if (TaskBoard::GetInstance().IsEnabledDevice(enabledDeviceKey)) {
423 DHLOGI("The deviceKey: %{public}s is enabled.", GetAnonyString(enabledDeviceKey).c_str());
424 continue;
425 }
426 const auto keyString = capPtr->GetKey();
427 DHLOGI("Update capability key: %{public}s", capPtr->GetAnonymousKey().c_str());
428 globalCapInfoMap_[keyString] = capPtr;
429 TaskParam taskParam = {
430 .networkId = networkId,
431 .uuid = uuid,
432 .dhId = capPtr->GetDHId(),
433 .dhType = capPtr->GetDHType()
434 };
435 auto task = TaskFactory::GetInstance().CreateTask(TaskType::ENABLE, taskParam, nullptr);
436 TaskExecutor::GetInstance().PushTask(task);
437 }
438 }
439
HandleCapabilityDeleteChange(const std::vector<DistributedKv::Entry> & deleteRecords)440 void CapabilityInfoManager::HandleCapabilityDeleteChange(const std::vector<DistributedKv::Entry> &deleteRecords)
441 {
442 if (DistributedHardwareManagerFactory::GetInstance().GetUnInitFlag()) {
443 DHLOGE("no need Update, is in uniniting.");
444 return;
445 }
446 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
447 for (const auto &item : deleteRecords) {
448 const std::string value = item.value.ToString();
449 std::shared_ptr<CapabilityInfo> capPtr;
450 if (GetCapabilityByValue<CapabilityInfo>(value, capPtr) != DH_FWK_SUCCESS) {
451 DHLOGE("Get capability by value failed");
452 continue;
453 }
454 const auto keyString = capPtr->GetKey();
455 std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
456 if (uuid.empty()) {
457 DHLOGI("Find uuid failed and never disable");
458 continue;
459 }
460 std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
461 if (networkId.empty()) {
462 DHLOGI("Find network failed and never disable, uuid: %{public}s", GetAnonyString(uuid).c_str());
463 continue;
464 }
465 TaskParam taskParam = {
466 .networkId = networkId,
467 .uuid = uuid,
468 .dhId = capPtr->GetDHId(),
469 .dhType = capPtr->GetDHType()
470 };
471 auto task = TaskFactory::GetInstance().CreateTask(TaskType::DISABLE, taskParam, nullptr);
472 TaskExecutor::GetInstance().PushTask(task);
473 DHLOGI("Delete capability key: %{public}s", capPtr->GetAnonymousKey().c_str());
474 globalCapInfoMap_.erase(keyString);
475 }
476 }
477
GetCapabilitiesByDeviceId(const std::string & deviceId,std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)478 void CapabilityInfoManager::GetCapabilitiesByDeviceId(const std::string &deviceId,
479 std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
480 {
481 if (!IsIdLengthValid(deviceId)) {
482 return;
483 }
484 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
485 for (auto &capabilityInfo : globalCapInfoMap_) {
486 if (IsCapKeyMatchDeviceId(capabilityInfo.first, deviceId)) {
487 resInfos.emplace_back(capabilityInfo.second);
488 }
489 }
490 }
491
HasCapability(const std::string & deviceId,const std::string & dhId)492 bool CapabilityInfoManager::HasCapability(const std::string &deviceId, const std::string &dhId)
493 {
494 if (!IsIdLengthValid(deviceId) || !IsIdLengthValid(dhId)) {
495 return false;
496 }
497 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
498 std::string kvKey = GetCapabilityKey(deviceId, dhId);
499 if (globalCapInfoMap_.find(kvKey) == globalCapInfoMap_.end()) {
500 return false;
501 }
502 return true;
503 }
504
GetCapability(const std::string & deviceId,const std::string & dhId,std::shared_ptr<CapabilityInfo> & capPtr)505 int32_t CapabilityInfoManager::GetCapability(const std::string &deviceId, const std::string &dhId,
506 std::shared_ptr<CapabilityInfo> &capPtr)
507 {
508 if (!IsIdLengthValid(deviceId) || !IsIdLengthValid(dhId)) {
509 return ERR_DH_FWK_PARA_INVALID;
510 }
511 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
512 std::string key = GetCapabilityKey(deviceId, dhId);
513 if (globalCapInfoMap_.find(key) == globalCapInfoMap_.end()) {
514 DHLOGE("Can not find capability In globalCapInfoMap_: %{public}s", GetAnonyString(deviceId).c_str());
515 return ERR_DH_FWK_RESOURCE_CAPABILITY_MAP_NOT_FOUND;
516 }
517 capPtr = globalCapInfoMap_[key];
518 return DH_FWK_SUCCESS;
519 }
520
GetDataByKey(const std::string & key,std::shared_ptr<CapabilityInfo> & capInfoPtr)521 int32_t CapabilityInfoManager::GetDataByKey(const std::string &key, std::shared_ptr<CapabilityInfo> &capInfoPtr)
522 {
523 if (!IsIdLengthValid(key)) {
524 return ERR_DH_FWK_PARA_INVALID;
525 }
526 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
527 if (dbAdapterPtr_ == nullptr) {
528 DHLOGI("dbAdapterPtr_ is null");
529 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
530 }
531 std::string data;
532 if (dbAdapterPtr_->GetDataByKey(key, data) != DH_FWK_SUCCESS) {
533 DHLOGE("Query capability info from db failed, key: %{public}s", GetAnonyString(key).c_str());
534 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
535 }
536 return GetCapabilityByValue<CapabilityInfo>(data, capInfoPtr);
537 }
538
GetDataByDHType(const DHType dhType,CapabilityInfoMap & capabilityMap)539 int32_t CapabilityInfoManager::GetDataByDHType(const DHType dhType, CapabilityInfoMap &capabilityMap)
540 {
541 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
542 for (const auto &capInfo : globalCapInfoMap_) {
543 if (capInfo.second->GetDHType() != dhType) {
544 continue;
545 }
546 capabilityMap[capInfo.first] = capInfo.second;
547 }
548 return DH_FWK_SUCCESS;
549 }
550
GetDataByKeyPrefix(const std::string & keyPrefix,CapabilityInfoMap & capabilityMap)551 int32_t CapabilityInfoManager::GetDataByKeyPrefix(const std::string &keyPrefix, CapabilityInfoMap &capabilityMap)
552 {
553 if (!IsIdLengthValid(keyPrefix)) {
554 return ERR_DH_FWK_PARA_INVALID;
555 }
556 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
557 if (dbAdapterPtr_ == nullptr) {
558 DHLOGE("dbAdapterPtr is null");
559 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
560 }
561 std::vector<std::string> dataVector;
562 if (dbAdapterPtr_->GetDataByKeyPrefix(keyPrefix, dataVector) != DH_FWK_SUCCESS) {
563 DHLOGE("Query capability info from db failed, key: %{public}s", GetAnonyString(keyPrefix).c_str());
564 return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
565 }
566 if (dataVector.empty() || dataVector.size() > MAX_DB_RECORD_SIZE) {
567 DHLOGE("On dataVector error, maybe empty or too large.");
568 return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
569 }
570 for (const auto &data : dataVector) {
571 std::shared_ptr<CapabilityInfo> capabilityInfo;
572 if (GetCapabilityByValue<CapabilityInfo>(data, capabilityInfo) != DH_FWK_SUCCESS) {
573 DHLOGE("Get capability ptr by value failed");
574 continue;
575 }
576 capabilityMap[capabilityInfo->GetKey()] = capabilityInfo;
577 }
578 return DH_FWK_SUCCESS;
579 }
580
DumpCapabilityInfos(std::vector<CapabilityInfo> & capInfos)581 void CapabilityInfoManager::DumpCapabilityInfos(std::vector<CapabilityInfo> &capInfos)
582 {
583 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
584 for (auto info : globalCapInfoMap_) {
585 CapabilityInfo capInfo = *(info.second);
586 capInfos.emplace_back(capInfo);
587 }
588 }
589
GetEntriesByKeys(const std::vector<std::string> & keys)590 std::vector<DistributedKv::Entry> CapabilityInfoManager::GetEntriesByKeys(const std::vector<std::string> &keys)
591 {
592 if (!IsArrayLengthValid(keys)) {
593 return {};
594 }
595 DHLOGI("call");
596 std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
597 if (dbAdapterPtr_ == nullptr) {
598 DHLOGE("dbAdapterPtr_ is null");
599 return {};
600 }
601 return dbAdapterPtr_->GetEntriesByKeys(keys);
602 }
603 } // namespace DistributedHardware
604 } // namespace OHOS
605