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