From b2f22455c4a145984b8ba9fa6691b0dc2be3a414 Mon Sep 17 00:00:00 2001 From: lsq Date: Sat, 30 Jul 2022 11:30:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lsq Change-Id: Ia945d60fab37359d746d87571b4ffca2beeace7b Signed-off-by: lsq --- services/accesstokenmanager/access_token.cfg | 1 + .../soft_bus_device_connection_listener.h | 4 ++ .../soft_bus_device_connection_listener.cpp | 71 +++++++++++++------ services/tokensyncmanager/token_sync.cfg | 1 + 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/services/accesstokenmanager/access_token.cfg b/services/accesstokenmanager/access_token.cfg index fc617a465..3b139195f 100644 --- a/services/accesstokenmanager/access_token.cfg +++ b/services/accesstokenmanager/access_token.cfg @@ -13,6 +13,7 @@ "importance" : -20, "uid" : "access_token", "gid" : ["access_token"], + "permission" : ["ohos.permission.DISTRIBUTED_DATASYNC"], "secon" : "u:r:accesstoken_service:s0" } ] diff --git a/services/tokensyncmanager/include/remote/soft_bus_device_connection_listener.h b/services/tokensyncmanager/include/remote/soft_bus_device_connection_listener.h index 7d0086efb..c2e13cb18 100644 --- a/services/tokensyncmanager/include/remote/soft_bus_device_connection_listener.h +++ b/services/tokensyncmanager/include/remote/soft_bus_device_connection_listener.h @@ -18,6 +18,7 @@ #include #include +#include #include #include "accesstoken_log.h" @@ -64,6 +65,9 @@ public: * @param deviceInfo node info */ void OnDeviceChanged(const DistributedHardware::DmDeviceInfo &deviceInfo) override; + +private: + std::mutex exitMutex_; }; } // namespace AccessToken } // namespace Security diff --git a/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp b/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp index 1f3e1ea26..68f0ee2ca 100644 --- a/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp +++ b/services/tokensyncmanager/src/remote/soft_bus_device_connection_listener.cpp @@ -14,6 +14,9 @@ */ #include "soft_bus_device_connection_listener.h" + +#include + #include "remote_command_manager.h" #include "soft_bus_manager.h" #include "device_info_manager.h" @@ -21,6 +24,8 @@ #include "constant_common.h" #include "device_manager.h" #include "dm_device_info.h" +#include "token_sync_event_handler.h" +#include "token_sync_manager_service.h" namespace OHOS { namespace Security { @@ -73,36 +78,56 @@ void SoftBusDeviceConnectionListener::OnDeviceOffline(const DmDeviceInfo &info) std::string uuid = DeviceInfoManager::GetInstance().ConvertToUniversallyUniqueIdOrFetch(networkId); std::string udid = DeviceInfoManager::GetInstance().ConvertToUniqueDeviceIdOrFetch(networkId); - ACCESSTOKEN_LOG_INFO(LABEL, - "networkId: %{public}s, uuid: %{public}s, udid: %{public}s", - networkId.c_str(), - uuid.c_str(), - ConstantCommon::EncryptDevId(udid).c_str()); + ACCESSTOKEN_LOG_INFO(LABEL, "networkId: %{public}s, uuid: %{public}s, udid: %{public}s", networkId.c_str(), + uuid.c_str(), ConstantCommon::EncryptDevId(udid).c_str()); - if (uuid != "" && udid != "") { - RemoteCommandManager::GetInstance().NotifyDeviceOffline(uuid); - RemoteCommandManager::GetInstance().NotifyDeviceOffline(udid); - DeviceInfoManager::GetInstance().RemoveRemoteDeviceInfo(networkId, DeviceIdType::NETWORK_ID); + if (uuid == "" || udid == "") { + ACCESSTOKEN_LOG_ERROR(LABEL, "uuid or udid is empty, offline failed."); + return; + } + RemoteCommandManager::GetInstance().NotifyDeviceOffline(uuid); + RemoteCommandManager::GetInstance().NotifyDeviceOffline(udid); + DeviceInfoManager::GetInstance().RemoveRemoteDeviceInfo(networkId, DeviceIdType::NETWORK_ID); - std::string packageName = ACCESSTOKEN_PACKAGE_NAME; - std::string extra = ""; + std::function delayed = ([=]() { + ACCESSTOKEN_LOG_INFO(LABEL, "delayed task entry."); + bool sleeped = false; std::vector deviceList; - - int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetTrustedDeviceList(packageName, - extra, deviceList); - if (ret != Constant::SUCCESS) { - ACCESSTOKEN_LOG_ERROR(LABEL, "GetTrustedDeviceList error, result: %{public}d", ret); - return; - } + std::unique_lock lock(exitMutex_); + + do { + std::string packageName = ACCESSTOKEN_PACKAGE_NAME; + std::string extra = ""; + + int32_t ret = DistributedHardware::DeviceManager::GetInstance().GetTrustedDeviceList(packageName, + extra, deviceList); + if (ret != Constant::SUCCESS) { + ACCESSTOKEN_LOG_ERROR(LABEL, "GetTrustedDeviceList error, result: %{public}d", ret); + return; + } + if (deviceList.empty() && sleeped == false) { + ACCESSTOKEN_LOG_INFO(LABEL, "delayed sleep."); + sleep(1); + sleeped = true; + } else { + sleeped = false; + } + } while (sleeped == true); if (deviceList.empty()) { - ACCESSTOKEN_LOG_INFO(LABEL, "there is no remote decice online, exit tokensync process"); - + ACCESSTOKEN_LOG_INFO(LABEL, "there is no remote device online, exit tokensync process"); + SoftBusManager::GetInstance().Destroy(); + std::shared_ptr handler = + DelayedSingleton::GetInstance()->GetSendEventHandler(); + while ((handler != nullptr) && (!handler->IsIdle())) { + usleep(1000); // sleep 1000us + } + ACCESSTOKEN_LOG_INFO(LABEL, "tokensync exit"); exit(0); } - } else { - ACCESSTOKEN_LOG_ERROR(LABEL, "uuid or udid is empty, offline failed."); - } + }); + + std::thread threadObj(delayed); } void SoftBusDeviceConnectionListener::OnDeviceReady(const DmDeviceInfo &info) diff --git a/services/tokensyncmanager/token_sync.cfg b/services/tokensyncmanager/token_sync.cfg index f8803d419..5c99ca1ca 100644 --- a/services/tokensyncmanager/token_sync.cfg +++ b/services/tokensyncmanager/token_sync.cfg @@ -6,6 +6,7 @@ "start-mode" : "condition", "uid" : "access_token", "gid" : ["access_token"], + "permission" : ["ohos.permission.DISTRIBUTED_DATASYNC"], "secon" : "u:r:token_sync_service:s0" } ] -- Gitee