• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "capability_info_manager.h"
17 
18 #include "anonymous_string.h"
19 #include "capability_info_event.h"
20 #include "capability_utils.h"
21 #include "constants.h"
22 #include "dh_context.h"
23 #include "dh_utils_tool.h"
24 #include "distributed_hardware_errno.h"
25 #include "distributed_hardware_log.h"
26 #include "distributed_hardware_manager.h"
27 #include "event_bus.h"
28 #include "task_executor.h"
29 #include "task_factory.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(new(std::nothrow) CapabilityInfoManager);
49     if (instance == nullptr) {
50         DHLOGE("instance is nullptr, because applying memory fail!");
51         return nullptr;
52     }
53     return instance;
54 }
55 
Init()56 int32_t CapabilityInfoManager::Init()
57 {
58     DHLOGI("CapabilityInfoManager instance init!");
59     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
60     dbAdapterPtr_ = std::make_shared<DBAdapter>(APP_ID, GLOBAL_CAPABILITY_ID, shared_from_this());
61     if (dbAdapterPtr_ == nullptr) {
62         DHLOGE("dbAdapterPtr_ is null");
63         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
64     }
65     if (dbAdapterPtr_->Init() != DH_FWK_SUCCESS) {
66         DHLOGE("Init dbAdapterPtr_ failed");
67         return ERR_DH_FWK_RESOURCE_INIT_DB_FAILED;
68     }
69     CapabilityInfoEvent capabilityInfoEvent(*this);
70     DHContext::GetInstance().GetEventBus()->AddHandler<CapabilityInfoEvent>(capabilityInfoEvent.GetType(), *this);
71     DHLOGI("CapabilityInfoManager instance init success");
72     return DH_FWK_SUCCESS;
73 }
74 
UnInit()75 int32_t CapabilityInfoManager::UnInit()
76 {
77     DHLOGI("CapabilityInfoManager UnInit");
78     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
79     if (dbAdapterPtr_ == nullptr) {
80         DHLOGE("dbAdapterPtr_ is null");
81         return ERR_DH_FWK_RESOURCE_UNINIT_DB_FAILED;
82     }
83     dbAdapterPtr_->UnInit();
84     dbAdapterPtr_.reset();
85     return DH_FWK_SUCCESS;
86 }
87 
SyncDeviceInfoFromDB(const std::string & deviceId)88 int32_t CapabilityInfoManager::SyncDeviceInfoFromDB(const std::string &deviceId)
89 {
90     DHLOGI("Sync DeviceInfo from DB, deviceId: %s", GetAnonyString(deviceId).c_str());
91     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
92     if (dbAdapterPtr_ == nullptr) {
93         DHLOGE("dbAdapterPtr_ is null");
94         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
95     }
96     std::vector<std::string> dataVector;
97     if (dbAdapterPtr_->GetDataByKeyPrefix(deviceId, dataVector) != DH_FWK_SUCCESS) {
98         DHLOGE("Query data from DB by deviceId failed, id: %s", GetAnonyString(deviceId).c_str());
99         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
100     }
101     if (dataVector.size() == 0 || dataVector.size() > MAX_DB_RECORD_SIZE) {
102         DHLOGE("DataVector size is invalid!");
103         return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
104     }
105     for (const auto &data : dataVector) {
106         std::shared_ptr<CapabilityInfo> capabilityInfo;
107         if (CapabilityUtils::GetCapabilityByValue(data, capabilityInfo) != DH_FWK_SUCCESS) {
108             DHLOGE("Get capability ptr by value failed");
109             continue;
110         }
111         globalCapInfoMap_[capabilityInfo->GetKey()] = capabilityInfo;
112     }
113     return DH_FWK_SUCCESS;
114 }
115 
SyncRemoteCapabilityInfos()116 int32_t CapabilityInfoManager::SyncRemoteCapabilityInfos()
117 {
118     DHLOGI("Sync full remote device info from DB");
119     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
120     if (dbAdapterPtr_ == nullptr) {
121         DHLOGE("dbAdapterPtr_ is null");
122         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
123     }
124     std::vector<std::string> dataVector;
125     if (dbAdapterPtr_->GetDataByKeyPrefix("", dataVector) != DH_FWK_SUCCESS) {
126         DHLOGE("Query all data from DB failed");
127         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
128     }
129     if (dataVector.size() == 0 || dataVector.size() > MAX_DB_RECORD_SIZE) {
130         DHLOGE("DataVector size is invalid!");
131         return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
132     }
133     for (const auto &data : dataVector) {
134         std::shared_ptr<CapabilityInfo> capabilityInfo;
135         if (CapabilityUtils::GetCapabilityByValue(data, capabilityInfo) != DH_FWK_SUCCESS) {
136             DHLOGE("Get capability ptr by value failed");
137             continue;
138         }
139         const std::string &deviceId = capabilityInfo->GetDeviceId();
140         const std::string &localDeviceId = DHContext::GetInstance().GetDeviceInfo().deviceId;
141         if (deviceId.compare(localDeviceId) == 0) {
142             DHLOGE("local device info not need sync from db");
143             continue;
144         }
145         if (!DHContext::GetInstance().IsDeviceOnline(deviceId)) {
146             DHLOGE("offline device, no need sync to memory, deviceId : %s ", GetAnonyString(deviceId).c_str());
147             continue;
148         }
149         globalCapInfoMap_[capabilityInfo->GetKey()] = capabilityInfo;
150     }
151     return DH_FWK_SUCCESS;
152 }
153 
AddCapability(const std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)154 int32_t CapabilityInfoManager::AddCapability(const std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
155 {
156     if (resInfos.size() == 0 || resInfos.size() > MAX_DB_RECORD_SIZE) {
157         DHLOGE("ResInfos size is invalid!");
158         return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
159     }
160     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
161     if (dbAdapterPtr_ == nullptr) {
162         DHLOGE("dbAdapterPtr_ is null");
163         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
164     }
165     std::vector<std::string> keys;
166     std::vector<std::string> values;
167     std::string key;
168     std::string data;
169     for (auto &resInfo : resInfos) {
170         if (resInfo == nullptr) {
171             continue;
172         }
173         key = resInfo->GetKey();
174         globalCapInfoMap_[key] = resInfo;
175         if (dbAdapterPtr_->GetDataByKey(key, data) == DH_FWK_SUCCESS && CapabilityUtils::IsCapInfoJsonEqual(data,
176             resInfo->ToJsonString())) {
177             DHLOGD("this record is exist, Key: %s", resInfo->GetAnonymousKey().c_str());
178             continue;
179         }
180         DHLOGI("AddCapability, Key: %s", resInfo->GetAnonymousKey().c_str());
181         keys.push_back(key);
182         values.push_back(resInfo->ToJsonString());
183     }
184     if (keys.empty() || values.empty()) {
185         DHLOGD("Records are empty, No need add data to db!");
186         return DH_FWK_SUCCESS;
187     }
188     if (dbAdapterPtr_->PutDataBatch(keys, values) != DH_FWK_SUCCESS) {
189         DHLOGE("Fail to storage batch to kv");
190         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
191     }
192     return DH_FWK_SUCCESS;
193 }
194 
AddCapabilityInMem(const std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)195 int32_t CapabilityInfoManager::AddCapabilityInMem(const std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
196 {
197     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
198     for (auto &resInfo : resInfos) {
199         if (resInfo == nullptr) {
200             continue;
201         }
202         const std::string key = resInfo->GetKey();
203         DHLOGI("AddCapabilityInMem, Key: %s", resInfo->GetAnonymousKey().c_str());
204         globalCapInfoMap_[key] = resInfo;
205     }
206     return DH_FWK_SUCCESS;
207 }
208 
RemoveCapabilityInfoInDB(const std::string & deviceId)209 int32_t CapabilityInfoManager::RemoveCapabilityInfoInDB(const std::string &deviceId)
210 {
211     if (deviceId.size() == 0 || deviceId.size() > MAX_ID_LEN) {
212         DHLOGE("DeviceId is invalid!");
213         return ERR_DH_FWK_PARA_INVALID;
214     }
215     DHLOGI("Remove capability device info, deviceId: %s", GetAnonyString(deviceId).c_str());
216     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
217     if (dbAdapterPtr_ == nullptr) {
218         DHLOGE("dbAdapterPtr_ is null");
219         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
220     }
221     // 1. Clear the cache in the memory.
222     for (auto iter = globalCapInfoMap_.begin(); iter != globalCapInfoMap_.end();) {
223         if (!CapabilityUtils::IsCapKeyMatchDeviceId(iter->first, deviceId)) {
224             iter++;
225             continue;
226         }
227         DHLOGI("Clear globalCapInfoMap_ iter: %s", GetAnonyString(iter->first).c_str());
228         globalCapInfoMap_.erase(iter++);
229     }
230     // 2. Delete the corresponding record from the database(use UUID).
231     if (dbAdapterPtr_->RemoveDeviceData(deviceId) != DH_FWK_SUCCESS) {
232         DHLOGE("Remove capability Device Data failed, deviceId: %s", GetAnonyString(deviceId).c_str());
233         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
234     }
235     return DH_FWK_SUCCESS;
236 }
237 
RemoveCapabilityInfoByKey(const std::string & key)238 int32_t CapabilityInfoManager::RemoveCapabilityInfoByKey(const std::string &key)
239 {
240     DHLOGI("Remove capability device info, key: %s", GetAnonyString(key).c_str());
241     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
242     if (dbAdapterPtr_ == nullptr) {
243         DHLOGE("dbAdapterPtr_ is null");
244         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
245     }
246     // 1. Clear the cache in the memory.
247     globalCapInfoMap_.erase(key);
248 
249     // 2. Delete the corresponding record from the database.(use key)
250     if (dbAdapterPtr_->RemoveDataByKey(key) != DH_FWK_SUCCESS) {
251         DHLOGE("Remove capability Device Data failed, key: %s", GetAnonyString(key).c_str());
252         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
253     }
254     return DH_FWK_SUCCESS;
255 }
256 
RemoveCapabilityInfoInMem(const std::string & deviceId)257 int32_t CapabilityInfoManager::RemoveCapabilityInfoInMem(const std::string &deviceId)
258 {
259     DHLOGI("remove capability device info in memory, deviceId: %s", GetAnonyString(deviceId).c_str());
260     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
261     for (auto iter = globalCapInfoMap_.begin(); iter != globalCapInfoMap_.end();) {
262         if (!CapabilityUtils::IsCapKeyMatchDeviceId(iter->first, deviceId)) {
263             iter++;
264             continue;
265         }
266         globalCapInfoMap_.erase(iter++);
267     }
268     return DH_FWK_SUCCESS;
269 }
270 
QueryCapabilityByFilters(const std::map<CapabilityInfoFilter,std::string> & filters)271 std::map<std::string, std::shared_ptr<CapabilityInfo>> CapabilityInfoManager::QueryCapabilityByFilters(
272     const std::map<CapabilityInfoFilter, std::string> &filters)
273 {
274     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
275     std::map<std::string, std::shared_ptr<CapabilityInfo>> capMap;
276     for (auto &info : globalCapInfoMap_) {
277         bool isMatch = true;
278         for (auto &filter : filters) {
279             if (!IsCapabilityMatchFilter(info.second, filter.first, filter.second)) {
280                 isMatch = false;
281                 break;
282             }
283         }
284         if (isMatch) {
285             capMap.emplace(info.first, info.second);
286         }
287     }
288     return capMap;
289 }
290 
CreateManualSyncCount(const std::string & deviceId)291 void CapabilityInfoManager::CreateManualSyncCount(const std::string &deviceId)
292 {
293     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
294     if (dbAdapterPtr_ == nullptr) {
295         DHLOGE("dbAdapterPtr_ is null");
296         return;
297     }
298     dbAdapterPtr_->CreateManualSyncCount(deviceId);
299 }
300 
RemoveManualSyncCount(const std::string & deviceId)301 void CapabilityInfoManager::RemoveManualSyncCount(const std::string &deviceId)
302 {
303     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
304     if (dbAdapterPtr_ == nullptr) {
305         DHLOGE("dbAdapterPtr_ is null");
306         return;
307     }
308     dbAdapterPtr_->RemoveManualSyncCount(deviceId);
309 }
310 
ManualSync(const std::string & networkId)311 int32_t CapabilityInfoManager::ManualSync(const std::string &networkId)
312 {
313     DHLOGI("ManualSync start, networkId: %s", GetAnonyString(networkId).c_str());
314     std::unique_lock<std::mutex> lock(capInfoMgrMutex_);
315     if (dbAdapterPtr_ == nullptr) {
316         DHLOGE("dbAdapterPtr_ is null");
317         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
318     }
319     if (dbAdapterPtr_->ManualSync(networkId) != DH_FWK_SUCCESS) {
320         DHLOGE("ManualSync failed");
321         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
322     }
323     return DH_FWK_SUCCESS;
324 }
325 
OnChange(const DistributedKv::ChangeNotification & changeNotification)326 void CapabilityInfoManager::OnChange(const DistributedKv::ChangeNotification &changeNotification)
327 {
328     DHLOGI("CapabilityInfoManager: DB data OnChange");
329     if (!changeNotification.GetInsertEntries().empty() &&
330         changeNotification.GetInsertEntries().size() <= MAX_DB_RECORD_SIZE) {
331         DHLOGI("Handle capability data add change");
332         HandleCapabilityAddChange(changeNotification.GetInsertEntries());
333     }
334     if (!changeNotification.GetUpdateEntries().empty() &&
335         changeNotification.GetUpdateEntries().size() <= MAX_DB_RECORD_SIZE) {
336         DHLOGI("Handle capability data update change");
337         HandleCapabilityUpdateChange(changeNotification.GetUpdateEntries());
338     }
339     if (!changeNotification.GetDeleteEntries().empty() &&
340         changeNotification.GetDeleteEntries().size() <= MAX_DB_RECORD_SIZE) {
341         DHLOGI("Handle capability data delete change");
342         HandleCapabilityDeleteChange(changeNotification.GetDeleteEntries());
343     }
344 }
345 
OnEvent(CapabilityInfoEvent & ev)346 void CapabilityInfoManager::OnEvent(CapabilityInfoEvent &ev)
347 {
348     switch (ev.GetAction()) {
349         case CapabilityInfoEvent::EventType::RECOVER:
350             SyncRemoteCapabilityInfos();
351             break;
352         default:
353             DHLOGE("Event is undefined, type is %d", ev.GetAction());
354             break;
355     }
356 }
357 
HandleCapabilityAddChange(const std::vector<DistributedKv::Entry> & insertRecords)358 void CapabilityInfoManager::HandleCapabilityAddChange(const std::vector<DistributedKv::Entry> &insertRecords)
359 {
360     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
361     for (const auto &item : insertRecords) {
362         const std::string value = item.value.ToString();
363         std::shared_ptr<CapabilityInfo> capPtr;
364         if (CapabilityUtils::GetCapabilityByValue(value, capPtr) != DH_FWK_SUCCESS) {
365             DHLOGE("Get capability by value failed");
366             continue;
367         }
368         const auto keyString = capPtr->GetKey();
369         DHLOGI("Add capability key: %s", capPtr->GetAnonymousKey().c_str());
370         globalCapInfoMap_[keyString] = capPtr;
371         std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
372         if (uuid.empty()) {
373             DHLOGI("Find uuid failed and never enable");
374             continue;
375         }
376         std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
377         if (networkId.empty()) {
378             DHLOGI("Find network failed and never enable, uuid: %s", GetAnonyString(uuid).c_str());
379             continue;
380         }
381         TaskParam taskParam = {
382             .networkId = networkId,
383             .uuid = uuid,
384             .dhId = capPtr->GetDHId(),
385             .dhType = capPtr->GetDHType()
386         };
387         auto task = TaskFactory::GetInstance().CreateTask(TaskType::ENABLE, taskParam, nullptr);
388         TaskExecutor::GetInstance().PushTask(task);
389     }
390 }
391 
HandleCapabilityUpdateChange(const std::vector<DistributedKv::Entry> & updateRecords)392 void CapabilityInfoManager::HandleCapabilityUpdateChange(const std::vector<DistributedKv::Entry> &updateRecords)
393 {
394     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
395     for (const auto &item : updateRecords) {
396         const std::string value = item.value.ToString();
397         std::shared_ptr<CapabilityInfo> capPtr;
398         if (CapabilityUtils::GetCapabilityByValue(value, capPtr) != DH_FWK_SUCCESS) {
399             DHLOGE("Get capability by value failed");
400             continue;
401         }
402         const auto keyString = capPtr->GetKey();
403         DHLOGI("Update capability key: %s", capPtr->GetAnonymousKey().c_str());
404         globalCapInfoMap_[keyString] = capPtr;
405     }
406 }
407 
HandleCapabilityDeleteChange(const std::vector<DistributedKv::Entry> & deleteRecords)408 void CapabilityInfoManager::HandleCapabilityDeleteChange(const std::vector<DistributedKv::Entry> &deleteRecords)
409 {
410     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
411     for (const auto &item : deleteRecords) {
412         const std::string value = item.value.ToString();
413         std::shared_ptr<CapabilityInfo> capPtr;
414         if (CapabilityUtils::GetCapabilityByValue(value, capPtr) != DH_FWK_SUCCESS) {
415             DHLOGE("Get capability by value failed");
416             continue;
417         }
418         const auto keyString = capPtr->GetKey();
419         std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
420         if (uuid.empty()) {
421             DHLOGI("Find uuid failed and never disable");
422             continue;
423         }
424         std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
425         if (networkId.empty()) {
426             DHLOGI("Find network failed and never disable, uuid: %s", GetAnonyString(uuid).c_str());
427             continue;
428         }
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::DISABLE, taskParam, nullptr);
436         TaskExecutor::GetInstance().PushTask(task);
437         DHLOGI("Delete capability key: %s", capPtr->GetAnonymousKey().c_str());
438         globalCapInfoMap_.erase(keyString);
439     }
440 }
441 
IsCapabilityMatchFilter(const std::shared_ptr<CapabilityInfo> & cap,const CapabilityInfoFilter & filter,const std::string & value)442 bool CapabilityInfoManager::IsCapabilityMatchFilter(const std::shared_ptr<CapabilityInfo> &cap,
443     const CapabilityInfoFilter &filter, const std::string &value)
444 {
445     if (cap == nullptr) {
446         DHLOGE("cap is null");
447         return false;
448     }
449 
450     bool isMatch = false;
451     switch (filter) {
452         case CapabilityInfoFilter::FILTER_DH_ID: {
453             isMatch = cap->GetDHId().compare(value) == 0;
454             break;
455         }
456         case CapabilityInfoFilter::FILTER_DEVICE_ID: {
457             isMatch = cap->GetDeviceId().compare(value) == 0;
458             break;
459         }
460         case CapabilityInfoFilter::FILTER_DEVICE_NAME: {
461             isMatch = cap->GetDeviceName().compare(value) == 0;
462             break;
463         }
464         case CapabilityInfoFilter::FILTER_DEVICE_TYPE: {
465             auto devType = static_cast<uint16_t>(std::stoi(value));
466             isMatch = cap->GetDeviceType() == devType;
467             break;
468         }
469         case CapabilityInfoFilter::FILTER_DH_TYPE: {
470             DHType dhType = (DHType)std::stoi(value);
471             isMatch = cap->GetDHType() == dhType;
472             break;
473         }
474         case CapabilityInfoFilter::FILTER_DH_ATTRS: {
475             isMatch = cap->GetDHAttrs().compare(value) == 0;
476             break;
477         }
478         default: {
479             isMatch = false;
480             break;
481         }
482     }
483     return isMatch;
484 }
485 
GetCapabilitiesByDeviceId(const std::string & deviceId,std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)486 void CapabilityInfoManager::GetCapabilitiesByDeviceId(const std::string &deviceId,
487     std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
488 {
489     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
490     for (auto &capabilityInfo : globalCapInfoMap_) {
491         if (CapabilityUtils::IsCapKeyMatchDeviceId(capabilityInfo.first, deviceId)) {
492             resInfos.emplace_back(capabilityInfo.second);
493         }
494     }
495 }
496 
HasCapability(const std::string & deviceId,const std::string & dhId)497 bool CapabilityInfoManager::HasCapability(const std::string &deviceId, const std::string &dhId)
498 {
499     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
500     std::string kvKey = CapabilityUtils::GetCapabilityKey(deviceId, dhId);
501     if (globalCapInfoMap_.find(kvKey) == globalCapInfoMap_.end()) {
502         return false;
503     }
504     return true;
505 }
506 
GetCapability(const std::string & deviceId,const std::string & dhId,std::shared_ptr<CapabilityInfo> & capPtr)507 int32_t CapabilityInfoManager::GetCapability(const std::string &deviceId, const std::string &dhId,
508     std::shared_ptr<CapabilityInfo> &capPtr)
509 {
510     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
511     std::string key = CapabilityUtils::GetCapabilityKey(deviceId, dhId);
512     if (globalCapInfoMap_.find(key) == globalCapInfoMap_.end()) {
513         DHLOGE("Can not find capability In globalCapInfoMap_: %s", GetAnonyString(deviceId).c_str());
514         return ERR_DH_FWK_RESOURCE_CAPABILITY_MAP_NOT_FOUND;
515     }
516     capPtr = globalCapInfoMap_[key];
517     return DH_FWK_SUCCESS;
518 }
519 
GetDataByKey(const std::string & key,std::shared_ptr<CapabilityInfo> & capInfoPtr)520 int32_t CapabilityInfoManager::GetDataByKey(const std::string &key, std::shared_ptr<CapabilityInfo> &capInfoPtr)
521 {
522     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
523     if (dbAdapterPtr_ == nullptr) {
524         DHLOGI("dbAdapterPtr_ is null");
525         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
526     }
527     std::string data;
528     if (dbAdapterPtr_->GetDataByKey(key, data) != DH_FWK_SUCCESS) {
529         DHLOGE("Query capability info from db failed, key: %s", GetAnonyString(key).c_str());
530         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
531     }
532     return CapabilityUtils::GetCapabilityByValue(data, capInfoPtr);
533 }
534 
GetDataByDHType(const DHType dhType,CapabilityInfoMap & capabilityMap)535 int32_t CapabilityInfoManager::GetDataByDHType(const DHType dhType, CapabilityInfoMap &capabilityMap)
536 {
537     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
538     for (const auto &capInfo : globalCapInfoMap_) {
539         if (capInfo.second->GetDHType() != dhType) {
540             continue;
541         }
542         capabilityMap[capInfo.first] = capInfo.second;
543     }
544     return DH_FWK_SUCCESS;
545 }
546 
GetDataByKeyPrefix(const std::string & keyPrefix,CapabilityInfoMap & capabilityMap)547 int32_t CapabilityInfoManager::GetDataByKeyPrefix(const std::string &keyPrefix, CapabilityInfoMap &capabilityMap)
548 {
549     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
550     if (dbAdapterPtr_ == nullptr) {
551         DHLOGE("dbAdapterPtr is null");
552         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
553     }
554     std::vector<std::string> dataVector;
555     if (dbAdapterPtr_->GetDataByKeyPrefix(keyPrefix, dataVector) != DH_FWK_SUCCESS) {
556         DHLOGE("Query capability info from db failed, key: %s", GetAnonyString(keyPrefix).c_str());
557         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
558     }
559     if (dataVector.size() == 0 || dataVector.size() > MAX_DB_RECORD_SIZE) {
560         DHLOGE("DataVector size is invalid!");
561         return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
562     }
563     for (const auto &data : dataVector) {
564         std::shared_ptr<CapabilityInfo> capabilityInfo;
565         if (CapabilityUtils::GetCapabilityByValue(data, capabilityInfo) != DH_FWK_SUCCESS) {
566             DHLOGE("Get capability ptr by value failed");
567             continue;
568         }
569         if (capabilityInfo->FromJsonString(data) != DH_FWK_SUCCESS) {
570             DHLOGE("Wrong data: %s", GetAnonyString(data).c_str());
571             continue;
572         }
573         capabilityMap[capabilityInfo->GetKey()] = capabilityInfo;
574     }
575     return DH_FWK_SUCCESS;
576 }
577 
DumpCapabilityInfos(std::vector<CapabilityInfo> & capInfos)578 void CapabilityInfoManager::DumpCapabilityInfos(std::vector<CapabilityInfo> &capInfos)
579 {
580     for (auto info : globalCapInfoMap_) {
581         CapabilityInfo capInfo = *(info.second);
582         capInfos.emplace_back(capInfo);
583     }
584 }
585 } // namespace DistributedHardware
586 } // namespace OHOS
587