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