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