diff --git a/services/distributedhardwarefwkserviceimpl/include/localhardwaremanager/local_hardware_manager.h b/services/distributedhardwarefwkserviceimpl/include/localhardwaremanager/local_hardware_manager.h index 1d75f08535abbf7ebecb9d373c1ebbfb55341330..d55077bd655f24ce14e800bec0317e4203ee2312 100644 --- a/services/distributedhardwarefwkserviceimpl/include/localhardwaremanager/local_hardware_manager.h +++ b/services/distributedhardwarefwkserviceimpl/include/localhardwaremanager/local_hardware_manager.h @@ -43,6 +43,7 @@ public: private: void QueryLocalHardware(const DHType dhType, IHardwareHandler *hardwareHandler); void AddLocalCapabilityInfo(const std::vector &dhItems, const DHType dhType); + void RemoveNonExistCapabilityInfo(); private: std::map compToolFuncsMap_; diff --git a/services/distributedhardwarefwkserviceimpl/src/localhardwaremanager/local_hardware_manager.cpp b/services/distributedhardwarefwkserviceimpl/src/localhardwaremanager/local_hardware_manager.cpp index 1eaec6e6b54726478b4dd0a170f2765f5bb06066..a953f02ad426e565a54d6822b72bb80e5070b93f 100644 --- a/services/distributedhardwarefwkserviceimpl/src/localhardwaremanager/local_hardware_manager.cpp +++ b/services/distributedhardwarefwkserviceimpl/src/localhardwaremanager/local_hardware_manager.cpp @@ -64,6 +64,9 @@ void LocalHardwareManager::Init() hardwareHandler->RegisterPluginListener(listener); } } + + // Remove the non-exist data in database when device restart or other exception situation + RemoveNonExistCapabilityInfo(); } void LocalHardwareManager::UnInit() @@ -106,5 +109,31 @@ void LocalHardwareManager::AddLocalCapabilityInfo(const std::vector &dhI } CapabilityInfoManager::GetInstance()->AddCapability(capabilityInfos); } + +void LocalHardwareManager::RemoveNonExistCapabilityInfo() +{ + DHLOGI("start"); + CapabilityInfoMap allCapabilityInfoMap; + CapabilityInfoManager::GetInstance()->GetDataByKeyPrefix("", allCapabilityInfoMap); + if (allCapabilityInfoMap.empty()) { + DHLOGE("allDataMap from DB is empty"); + return; + } + for (auto capabilityInfo : allCapabilityInfoMap) { + std::shared_ptr capabilityValue = capabilityInfo.second; + if (capabilityValue == nullptr) { + DHLOGE("capabilityInfo value is nullptr, key: %s", capabilityValue->GetAnonymousKey().c_str()); + return; + } + DHLOGI("The key in allCapabilityInfoMap is %s", capabilityValue->GetAnonymousKey().c_str()); + if (!CapabilityInfoManager::GetInstance()->HasCapability(capabilityValue->GetDeviceId(), + capabilityValue->GetDHId())) { + DHLOGI("AllCapabilityInfoMap is not found this key, so it is previous data. It should be removed, key: %s", + capabilityValue->GetAnonymousKey().c_str()); + CapabilityInfoManager::GetInstance()->RemoveCapabilityInfoByKey(capabilityValue->GetKey()); + } + } + DHLOGI("end"); +} } // namespace DistributedHardware } // namespace OHOS