• 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 "task_executor.h"
28 #include "task_factory.h"
29 
30 namespace OHOS {
31 namespace DistributedHardware {
32 #undef DH_LOG_TAG
33 #define DH_LOG_TAG "CapabilityInfoManager"
34 
CapabilityInfoManager()35 CapabilityInfoManager::CapabilityInfoManager() : dbAdapterPtr_(nullptr)
36 {
37     DHLOGI("CapabilityInfoManager construction!");
38 }
39 
~CapabilityInfoManager()40 CapabilityInfoManager::~CapabilityInfoManager()
41 {
42     DHLOGI("CapabilityInfoManager destruction!");
43 }
44 
GetInstance()45 std::shared_ptr<CapabilityInfoManager> CapabilityInfoManager::GetInstance()
46 {
47     static std::shared_ptr<CapabilityInfoManager> instance(new(std::nothrow) CapabilityInfoManager);
48     if (instance == nullptr) {
49         DHLOGE("instance is nullptr, because applying memory fail!");
50         return nullptr;
51     }
52     return instance;
53 }
54 
CapabilityInfoManagerEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,std::shared_ptr<CapabilityInfoManager> capabilityInfoMgrPtr)55 CapabilityInfoManager::CapabilityInfoManagerEventHandler::CapabilityInfoManagerEventHandler(
56     const std::shared_ptr<AppExecFwk::EventRunner> &runner,
57     std::shared_ptr<CapabilityInfoManager> capabilityInfoMgrPtr)
58     : AppExecFwk::EventHandler(runner)
59 {
60     DHLOGI("Ctor CapabilityInfoManagerEventHandler");
61     capabilityInfoMgrWPtr_ = capabilityInfoMgrPtr;
62 }
63 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)64 void CapabilityInfoManager::CapabilityInfoManagerEventHandler::ProcessEvent(
65     const AppExecFwk::InnerEvent::Pointer &event)
66 {
67     uint32_t eventId = event->GetInnerEventId();
68     auto selfPtr = capabilityInfoMgrWPtr_.lock();
69     if (!selfPtr) {
70         DHLOGE("Can not get strong self ptr");
71         return;
72     }
73     switch (eventId) {
74         case EVENT_CAPABILITY_INFO_DB_RECOVER:
75             selfPtr->SyncRemoteCapabilityInfos();
76             break;
77         default:
78             DHLOGE("event is undefined, id is %d", eventId);
79             break;
80     }
81 }
82 
GetEventHandler()83 std::shared_ptr<CapabilityInfoManager::CapabilityInfoManagerEventHandler> CapabilityInfoManager::GetEventHandler()
84 {
85     return this->eventHandler_;
86 }
87 
Init()88 int32_t CapabilityInfoManager::Init()
89 {
90     DHLOGI("CapabilityInfoManager instance init!");
91     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
92     dbAdapterPtr_ = std::make_shared<DBAdapter>(APP_ID, GLOBAL_CAPABILITY_ID, shared_from_this());
93     if (dbAdapterPtr_ == nullptr) {
94         DHLOGE("dbAdapterPtr_ is null");
95         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
96     }
97     if (dbAdapterPtr_->Init() != DH_FWK_SUCCESS) {
98         DHLOGE("Init dbAdapterPtr_ failed");
99         return ERR_DH_FWK_RESOURCE_INIT_DB_FAILED;
100     }
101     std::shared_ptr<AppExecFwk::EventRunner> runner = AppExecFwk::EventRunner::Create(true);
102     eventHandler_ = std::make_shared<CapabilityInfoManager::CapabilityInfoManagerEventHandler>(
103         runner, shared_from_this());
104     DHLOGI("CapabilityInfoManager instance init success");
105     return DH_FWK_SUCCESS;
106 }
107 
UnInit()108 int32_t CapabilityInfoManager::UnInit()
109 {
110     DHLOGI("CapabilityInfoManager UnInit");
111     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
112     if (dbAdapterPtr_ == nullptr) {
113         DHLOGE("dbAdapterPtr_ is null");
114         return ERR_DH_FWK_RESOURCE_UNINIT_DB_FAILED;
115     }
116     dbAdapterPtr_->UnInit();
117     dbAdapterPtr_.reset();
118     return DH_FWK_SUCCESS;
119 }
120 
SyncDeviceInfoFromDB(const std::string & deviceId)121 int32_t CapabilityInfoManager::SyncDeviceInfoFromDB(const std::string &deviceId)
122 {
123     DHLOGI("Sync DeviceInfo from DB, deviceId: %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: %s", GetAnonyString(deviceId).c_str());
132         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
133     }
134     if (dataVector.size() == 0 || dataVector.size() > MAX_DB_RECORD_SIZE) {
135         DHLOGE("DataVector size is invalid!");
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 (CapabilityUtils::GetCapabilityByValue(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> dataVector;
158     if (dbAdapterPtr_->GetDataByKeyPrefix("", dataVector) != DH_FWK_SUCCESS) {
159         DHLOGE("Query all data from DB failed");
160         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
161     }
162     if (dataVector.size() == 0 || dataVector.size() > MAX_DB_RECORD_SIZE) {
163         DHLOGE("DataVector size is invalid!");
164         return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
165     }
166     for (const auto &data : dataVector) {
167         std::shared_ptr<CapabilityInfo> capabilityInfo;
168         if (CapabilityUtils::GetCapabilityByValue(data, capabilityInfo) != DH_FWK_SUCCESS) {
169             DHLOGE("Get capability ptr by value failed");
170             continue;
171         }
172         const std::string &deviceId = capabilityInfo->GetDeviceId();
173         const std::string &localDeviceId = DHContext::GetInstance().GetDeviceInfo().deviceId;
174         if (deviceId.compare(localDeviceId) == 0) {
175             DHLOGE("local device info not need sync from db");
176             continue;
177         }
178         if (!DHContext::GetInstance().IsDeviceOnline(deviceId)) {
179             DHLOGE("offline device, no need sync to memory, deviceId : %s ", GetAnonyString(deviceId).c_str());
180             continue;
181         }
182         globalCapInfoMap_[capabilityInfo->GetKey()] = capabilityInfo;
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.size() == 0 || resInfos.size() > MAX_DB_RECORD_SIZE) {
190         DHLOGE("ResInfos size is invalid!");
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 && CapabilityUtils::IsCapInfoJsonEqual(data,
209             resInfo->ToJsonString())) {
210             DHLOGD("this record is exist, Key: %s", resInfo->GetAnonymousKey().c_str());
211             continue;
212         }
213         DHLOGI("AddCapability, Key: %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     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
231     for (auto &resInfo : resInfos) {
232         if (resInfo == nullptr) {
233             continue;
234         }
235         const std::string key = resInfo->GetKey();
236         DHLOGI("AddCapabilityInMem, Key: %s", resInfo->GetAnonymousKey().c_str());
237         globalCapInfoMap_[key] = resInfo;
238     }
239     return DH_FWK_SUCCESS;
240 }
241 
RemoveCapabilityInfoInDB(const std::string & deviceId)242 int32_t CapabilityInfoManager::RemoveCapabilityInfoInDB(const std::string &deviceId)
243 {
244     if (deviceId.size() == 0 || deviceId.size() > MAX_ID_LEN) {
245         DHLOGE("DeviceId is invalid!");
246         return ERR_DH_FWK_PARA_INVALID;
247     }
248     DHLOGI("Remove capability device info, deviceId: %s", GetAnonyString(deviceId).c_str());
249     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
250     if (dbAdapterPtr_ == nullptr) {
251         DHLOGE("dbAdapterPtr_ is null");
252         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
253     }
254     // 1. Clear the cache in the memory.
255     for (auto iter = globalCapInfoMap_.begin(); iter != globalCapInfoMap_.end();) {
256         if (!CapabilityUtils::IsCapKeyMatchDeviceId(iter->first, deviceId)) {
257             iter++;
258             continue;
259         }
260         DHLOGI("Clear globalCapInfoMap_ iter: %s", GetAnonyString(iter->first).c_str());
261         globalCapInfoMap_.erase(iter++);
262     }
263     // 2. Delete the corresponding record from the database(use UUID).
264     if (dbAdapterPtr_->RemoveDeviceData(deviceId) != DH_FWK_SUCCESS) {
265         DHLOGE("Remove capability Device Data failed, deviceId: %s", GetAnonyString(deviceId).c_str());
266         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
267     }
268     return DH_FWK_SUCCESS;
269 }
270 
RemoveCapabilityInfoByKey(const std::string & key)271 int32_t CapabilityInfoManager::RemoveCapabilityInfoByKey(const std::string &key)
272 {
273     DHLOGI("Remove capability device info, key: %s", GetAnonyString(key).c_str());
274     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
275     if (dbAdapterPtr_ == nullptr) {
276         DHLOGE("dbAdapterPtr_ is null");
277         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
278     }
279     // 1. Clear the cache in the memory.
280     globalCapInfoMap_.erase(key);
281 
282     // 2. Delete the corresponding record from the database.(use key)
283     if (dbAdapterPtr_->RemoveDataByKey(key) != DH_FWK_SUCCESS) {
284         DHLOGE("Remove capability Device Data failed, key: %s", GetAnonyString(key).c_str());
285         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
286     }
287     return DH_FWK_SUCCESS;
288 }
289 
RemoveCapabilityInfoInMem(const std::string & deviceId)290 int32_t CapabilityInfoManager::RemoveCapabilityInfoInMem(const std::string &deviceId)
291 {
292     DHLOGI("remove capability device info in memory, deviceId: %s", GetAnonyString(deviceId).c_str());
293     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
294     for (auto iter = globalCapInfoMap_.begin(); iter != globalCapInfoMap_.end();) {
295         if (!CapabilityUtils::IsCapKeyMatchDeviceId(iter->first, deviceId)) {
296             iter++;
297             continue;
298         }
299         globalCapInfoMap_.erase(iter++);
300     }
301     return DH_FWK_SUCCESS;
302 }
303 
QueryCapabilityByFilters(const std::map<CapabilityInfoFilter,std::string> & filters)304 std::map<std::string, std::shared_ptr<CapabilityInfo>> CapabilityInfoManager::QueryCapabilityByFilters(
305     const std::map<CapabilityInfoFilter, std::string> &filters)
306 {
307     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
308     std::map<std::string, std::shared_ptr<CapabilityInfo>> capMap;
309     for (auto &info : globalCapInfoMap_) {
310         bool isMatch = true;
311         for (auto &filter : filters) {
312             if (!IsCapabilityMatchFilter(info.second, filter.first, filter.second)) {
313                 isMatch = false;
314                 break;
315             }
316         }
317         if (isMatch) {
318             capMap.emplace(info.first, info.second);
319         }
320     }
321     return capMap;
322 }
323 
OnChange(const DistributedKv::ChangeNotification & changeNotification)324 void CapabilityInfoManager::OnChange(const DistributedKv::ChangeNotification &changeNotification)
325 {
326     DHLOGI("CapabilityInfoManager: DB data OnChange");
327     if (!changeNotification.GetInsertEntries().empty() &&
328         changeNotification.GetInsertEntries().size() <= MAX_DB_RECORD_SIZE) {
329         DHLOGI("Handle capability data add change");
330         HandleCapabilityAddChange(changeNotification.GetInsertEntries());
331     }
332     if (!changeNotification.GetUpdateEntries().empty() &&
333         changeNotification.GetUpdateEntries().size() <= MAX_DB_RECORD_SIZE) {
334         DHLOGI("Handle capability data update change");
335         HandleCapabilityUpdateChange(changeNotification.GetUpdateEntries());
336     }
337     if (!changeNotification.GetDeleteEntries().empty() &&
338         changeNotification.GetDeleteEntries().size() <= MAX_DB_RECORD_SIZE) {
339         DHLOGI("Handle capability data delete change");
340         HandleCapabilityDeleteChange(changeNotification.GetDeleteEntries());
341     }
342 }
343 
HandleCapabilityAddChange(const std::vector<DistributedKv::Entry> & insertRecords)344 void CapabilityInfoManager::HandleCapabilityAddChange(const std::vector<DistributedKv::Entry> &insertRecords)
345 {
346     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
347     for (const auto &item : insertRecords) {
348         const std::string value = item.value.ToString();
349         std::shared_ptr<CapabilityInfo> capPtr;
350         if (CapabilityUtils::GetCapabilityByValue(value, capPtr) != DH_FWK_SUCCESS) {
351             DHLOGE("Get capability by value failed");
352             continue;
353         }
354         const auto keyString = capPtr->GetKey();
355         DHLOGI("Add capability key: %s", capPtr->GetAnonymousKey().c_str());
356         globalCapInfoMap_[keyString] = capPtr;
357         std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
358         if (uuid.empty()) {
359             DHLOGI("Find uuid failed and never enable");
360             continue;
361         }
362         std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
363         if (networkId.empty()) {
364             DHLOGI("Find network failed and never enable, uuid: %s", GetAnonyString(uuid).c_str());
365             continue;
366         }
367         TaskParam taskParam = {
368             .networkId = networkId,
369             .uuid = uuid,
370             .dhId = capPtr->GetDHId(),
371             .dhType = capPtr->GetDHType()
372         };
373         auto task = TaskFactory::GetInstance().CreateTask(TaskType::ENABLE, taskParam, nullptr);
374         TaskExecutor::GetInstance().PushTask(task);
375     }
376 }
377 
HandleCapabilityUpdateChange(const std::vector<DistributedKv::Entry> & updateRecords)378 void CapabilityInfoManager::HandleCapabilityUpdateChange(const std::vector<DistributedKv::Entry> &updateRecords)
379 {
380     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
381     for (const auto &item : updateRecords) {
382         const std::string value = item.value.ToString();
383         std::shared_ptr<CapabilityInfo> capPtr;
384         if (CapabilityUtils::GetCapabilityByValue(value, capPtr) != DH_FWK_SUCCESS) {
385             DHLOGE("Get capability by value failed");
386             continue;
387         }
388         const auto keyString = capPtr->GetKey();
389         DHLOGI("Update capability key: %s", capPtr->GetAnonymousKey().c_str());
390         globalCapInfoMap_[keyString] = capPtr;
391     }
392 }
393 
HandleCapabilityDeleteChange(const std::vector<DistributedKv::Entry> & deleteRecords)394 void CapabilityInfoManager::HandleCapabilityDeleteChange(const std::vector<DistributedKv::Entry> &deleteRecords)
395 {
396     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
397     for (const auto &item : deleteRecords) {
398         const std::string value = item.value.ToString();
399         std::shared_ptr<CapabilityInfo> capPtr;
400         if (CapabilityUtils::GetCapabilityByValue(value, capPtr) != DH_FWK_SUCCESS) {
401             DHLOGE("Get capability by value failed");
402             continue;
403         }
404         const auto keyString = capPtr->GetKey();
405         std::string uuid = DHContext::GetInstance().GetUUIDByDeviceId(capPtr->GetDeviceId());
406         if (uuid.empty()) {
407             DHLOGI("Find uuid failed and never disable");
408             continue;
409         }
410         std::string networkId = DHContext::GetInstance().GetNetworkIdByUUID(uuid);
411         if (networkId.empty()) {
412             DHLOGI("Find network failed and never disable, uuid: %s", GetAnonyString(uuid).c_str());
413             continue;
414         }
415         TaskParam taskParam = {
416             .networkId = networkId,
417             .uuid = uuid,
418             .dhId = capPtr->GetDHId(),
419             .dhType = capPtr->GetDHType()
420         };
421         auto task = TaskFactory::GetInstance().CreateTask(TaskType::DISABLE, taskParam, nullptr);
422         TaskExecutor::GetInstance().PushTask(task);
423         DHLOGI("Delete capability key: %s", capPtr->GetAnonymousKey().c_str());
424         globalCapInfoMap_.erase(keyString);
425     }
426 }
427 
IsCapabilityMatchFilter(const std::shared_ptr<CapabilityInfo> & cap,const CapabilityInfoFilter & filter,const std::string & value)428 bool CapabilityInfoManager::IsCapabilityMatchFilter(const std::shared_ptr<CapabilityInfo> &cap,
429     const CapabilityInfoFilter &filter, const std::string &value)
430 {
431     if (cap == nullptr) {
432         DHLOGE("cap is null");
433         return false;
434     }
435 
436     bool isMatch = false;
437     switch (filter) {
438         case CapabilityInfoFilter::FILTER_DH_ID: {
439             isMatch = cap->GetDHId().compare(value) == 0;
440             break;
441         }
442         case CapabilityInfoFilter::FILTER_DEVICE_ID: {
443             isMatch = cap->GetDeviceId().compare(value) == 0;
444             break;
445         }
446         case CapabilityInfoFilter::FILTER_DEVICE_NAME: {
447             isMatch = cap->GetDeviceName().compare(value) == 0;
448             break;
449         }
450         case CapabilityInfoFilter::FILTER_DEVICE_TYPE: {
451             auto devType = static_cast<uint16_t>(std::stoi(value));
452             isMatch = cap->GetDeviceType() == devType;
453             break;
454         }
455         case CapabilityInfoFilter::FILTER_DH_TYPE: {
456             DHType dhType = (DHType)std::stoi(value);
457             isMatch = cap->GetDHType() == dhType;
458             break;
459         }
460         case CapabilityInfoFilter::FILTER_DH_ATTRS: {
461             isMatch = cap->GetDHAttrs().compare(value) == 0;
462             break;
463         }
464         default: {
465             isMatch = false;
466             break;
467         }
468     }
469     return isMatch;
470 }
471 
GetCapabilitiesByDeviceId(const std::string & deviceId,std::vector<std::shared_ptr<CapabilityInfo>> & resInfos)472 void CapabilityInfoManager::GetCapabilitiesByDeviceId(const std::string &deviceId,
473     std::vector<std::shared_ptr<CapabilityInfo>> &resInfos)
474 {
475     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
476     for (auto &capabilityInfo : globalCapInfoMap_) {
477         if (CapabilityUtils::IsCapKeyMatchDeviceId(capabilityInfo.first, deviceId)) {
478             resInfos.emplace_back(capabilityInfo.second);
479         }
480     }
481 }
482 
HasCapability(const std::string & deviceId,const std::string & dhId)483 bool CapabilityInfoManager::HasCapability(const std::string &deviceId, const std::string &dhId)
484 {
485     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
486     std::string kvKey = CapabilityUtils::GetCapabilityKey(deviceId, dhId);
487     if (globalCapInfoMap_.find(kvKey) == globalCapInfoMap_.end()) {
488         return false;
489     }
490     return true;
491 }
492 
GetCapability(const std::string & deviceId,const std::string & dhId,std::shared_ptr<CapabilityInfo> & capPtr)493 int32_t CapabilityInfoManager::GetCapability(const std::string &deviceId, const std::string &dhId,
494     std::shared_ptr<CapabilityInfo> &capPtr)
495 {
496     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
497     std::string key = CapabilityUtils::GetCapabilityKey(deviceId, dhId);
498     if (globalCapInfoMap_.find(key) == globalCapInfoMap_.end()) {
499         DHLOGE("Can not find capability In globalCapInfoMap_: %s", GetAnonyString(deviceId).c_str());
500         return ERR_DH_FWK_RESOURCE_CAPABILITY_MAP_NOT_FOUND;
501     }
502     capPtr = globalCapInfoMap_[key];
503     return DH_FWK_SUCCESS;
504 }
505 
GetDataByKey(const std::string & key,std::shared_ptr<CapabilityInfo> & capInfoPtr)506 int32_t CapabilityInfoManager::GetDataByKey(const std::string &key, std::shared_ptr<CapabilityInfo> &capInfoPtr)
507 {
508     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
509     if (dbAdapterPtr_ == nullptr) {
510         DHLOGI("dbAdapterPtr_ is null");
511         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
512     }
513     std::string data;
514     if (dbAdapterPtr_->GetDataByKey(key, data) != DH_FWK_SUCCESS) {
515         DHLOGE("Query capability info from db failed, key: %s", GetAnonyString(key).c_str());
516         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
517     }
518     return CapabilityUtils::GetCapabilityByValue(data, capInfoPtr);
519 }
520 
GetDataByDHType(const DHType dhType,CapabilityInfoMap & capabilityMap)521 int32_t CapabilityInfoManager::GetDataByDHType(const DHType dhType, CapabilityInfoMap &capabilityMap)
522 {
523     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
524     for (const auto &capInfo : globalCapInfoMap_) {
525         if (capInfo.second->GetDHType() != dhType) {
526             continue;
527         }
528         capabilityMap[capInfo.first] = capInfo.second;
529     }
530     return DH_FWK_SUCCESS;
531 }
532 
GetDataByKeyPrefix(const std::string & keyPrefix,CapabilityInfoMap & capabilityMap)533 int32_t CapabilityInfoManager::GetDataByKeyPrefix(const std::string &keyPrefix, CapabilityInfoMap &capabilityMap)
534 {
535     std::lock_guard<std::mutex> lock(capInfoMgrMutex_);
536     if (dbAdapterPtr_ == nullptr) {
537         DHLOGE("dbAdapterPtr is null");
538         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_POINTER_NULL;
539     }
540     std::vector<std::string> dataVector;
541     if (dbAdapterPtr_->GetDataByKeyPrefix(keyPrefix, dataVector) != DH_FWK_SUCCESS) {
542         DHLOGE("Query capability info from db failed, key: %s", GetAnonyString(keyPrefix).c_str());
543         return ERR_DH_FWK_RESOURCE_DB_ADAPTER_OPERATION_FAIL;
544     }
545     if (dataVector.size() == 0 || dataVector.size() > MAX_DB_RECORD_SIZE) {
546         DHLOGE("DataVector size is invalid!");
547         return ERR_DH_FWK_RESOURCE_RES_DB_DATA_INVALID;
548     }
549     for (const auto &data : dataVector) {
550         std::shared_ptr<CapabilityInfo> capabilityInfo;
551         if (CapabilityUtils::GetCapabilityByValue(data, capabilityInfo) != DH_FWK_SUCCESS) {
552             DHLOGE("Get capability ptr by value failed");
553             continue;
554         }
555         if (capabilityInfo->FromJsonString(data) != DH_FWK_SUCCESS) {
556             DHLOGE("Wrong data: %s", GetAnonyString(data).c_str());
557             continue;
558         }
559         capabilityMap[capabilityInfo->GetKey()] = capabilityInfo;
560     }
561     return DH_FWK_SUCCESS;
562 }
563 
DumpCapabilityInfos(std::vector<CapabilityInfo> & capInfos)564 void CapabilityInfoManager::DumpCapabilityInfos(std::vector<CapabilityInfo> &capInfos)
565 {
566     for (auto info : globalCapInfoMap_) {
567         CapabilityInfo capInfo = *(info.second);
568         capInfos.emplace_back(capInfo);
569     }
570 }
571 } // namespace DistributedHardware
572 } // namespace OHOS
573