diff --git a/commondependency/include/deviceprofile_connector.h b/commondependency/include/deviceprofile_connector.h index 62adf5cf26960ebae6f49faac59937ec6afc8d89..7b746adc91fd4672e0d2638e6f373600f62952aa 100644 --- a/commondependency/include/deviceprofile_connector.h +++ b/commondependency/include/deviceprofile_connector.h @@ -143,7 +143,8 @@ public: int32_t tokenId, const std::string &localUdid); std::vector GetAllAccessControlProfile(); void DeleteAccessControlById(int64_t accessControlId); - int32_t HandleUserSwitched(const std::string &localUdid, int32_t currentUserId, int32_t beforeUserId); + int32_t HandleUserSwitched(const std::string &localUdid, const std::vector &deviceVec, + int32_t currentUserId, int32_t beforeUserId); void HandleSyncForegroundUserIdEvent(const std::vector &remoteUserIds, const std::string &remoteUdid, const std::vector &localUserIds, std::string &localUdid); std::vector GetOfflineProcessInfo(std::string &localUdid, const std::vector &localUserIds, diff --git a/commondependency/src/deviceprofile_connector.cpp b/commondependency/src/deviceprofile_connector.cpp index 8f1f23779121f9eaca6e6314a79eb14f2e53a7c9..e822d6afed7816fb7a46e62347805e7a057d7d83 100644 --- a/commondependency/src/deviceprofile_connector.cpp +++ b/commondependency/src/deviceprofile_connector.cpp @@ -1114,14 +1114,21 @@ void DeviceProfileConnector::DeleteAccessControlById(int64_t accessControlId) DistributedDeviceProfileClient::GetInstance().DeleteAccessControlProfile(accessControlId); } -int32_t DeviceProfileConnector::HandleUserSwitched(const std::string &localUdid, int32_t currentUserId, - int32_t beforeUserId) +int32_t DeviceProfileConnector::HandleUserSwitched(const std::string &localUdid, + const std::vector &deviceVec, int32_t currentUserId, int32_t beforeUserId) { LOGI("Start."); + if (deviceVec.empty()) { + LOGI("no remote device."); + return DM_OK; + } std::vector profiles = GetAllAccessControlProfile(); std::vector activeProfiles; std::vector inActiveProfiles; for (auto &item : profiles) { + if (std::find(deviceVec.begin(), deviceVec.end(), item.GetTrustDeviceId()) == deviceVec.end()) { + continue; + } if ((item.GetAccesser().GetAccesserDeviceId() == localUdid && item.GetAccesser().GetAccesserUserId() == beforeUserId && item.GetStatus() == ACTIVE) || (item.GetAccessee().GetAccesseeDeviceId() == localUdid && @@ -1410,11 +1417,13 @@ void DeviceProfileConnector::HandleSyncBackgroundUserIdEvent(const std::vector &foregroundUserIds, const std::vector &backgroundUserIds, const std::string &remoteUdid); - void HandleUserSwitched(const std::map &deviceMap, int32_t currentUserId, + void HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, int32_t beforeUserId); std::multimap GetDeviceIdAndUserId(int32_t localUserId); int32_t SaveOnlineDeviceInfo(const std::vector &deviceList); diff --git a/services/implementation/include/device_manager_service_impl_lite.h b/services/implementation/include/device_manager_service_impl_lite.h index 9daf916768f531e2df0a5d9f8cbe84f2a6abb8b5..46bcc11ac7492d6664b79a18a95f4a5bf65ef7d2 100644 --- a/services/implementation/include/device_manager_service_impl_lite.h +++ b/services/implementation/include/device_manager_service_impl_lite.h @@ -136,7 +136,7 @@ public: int32_t peerUserId); void HandleUserRemoved(int32_t preUserId); void HandleDeviceScreenStatusChange(DmDeviceInfo &devInfo); - void HandleUserSwitched(const std::map &deviceMap, int32_t currentUserId, + void HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, int32_t beforeUserId); int32_t StopAuthenticateDevice(const std::string &pkgName); void HandleCredentialAuthStatus(const std::string &deviceList, uint16_t deviceTypeId, int32_t errcode); diff --git a/services/implementation/src/device_manager_service_impl.cpp b/services/implementation/src/device_manager_service_impl.cpp index 6b5de39d721a4123283917f05bf067366aa2caf0..cd01a634429e99561e6b938ca49870cffb54a7d9 100644 --- a/services/implementation/src/device_manager_service_impl.cpp +++ b/services/implementation/src/device_manager_service_impl.cpp @@ -732,7 +732,7 @@ void DeviceManagerServiceImpl::HandleRemoteUserRemoved(int32_t userId, const std hiChainConnector_->DeleteAllGroup(userId); } -void DeviceManagerServiceImpl::HandleUserSwitched(const std::map &deviceMap, +void DeviceManagerServiceImpl::HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, int32_t beforeUserId) { LOGI("currentUserId: %{public}s, beforeUserId: %{public}s", GetAnonyInt32(currentUserId).c_str(), @@ -740,7 +740,7 @@ void DeviceManagerServiceImpl::HandleUserSwitched(const std::map(localDeviceId); - DeviceProfileConnector::GetInstance().HandleUserSwitched(localUdid, currentUserId, beforeUserId); + DeviceProfileConnector::GetInstance().HandleUserSwitched(localUdid, deviceVec, currentUserId, beforeUserId); } void DeviceManagerServiceImpl::ScreenCommonEventCallback(std::string commonEventType) diff --git a/services/implementation/src/device_manager_service_impl_lite.cpp b/services/implementation/src/device_manager_service_impl_lite.cpp index f64d4c03d41edfd4b8f49418117bc288a3944079..f2ed153abbac9ab38948ab771407c542bf058ba8 100644 --- a/services/implementation/src/device_manager_service_impl_lite.cpp +++ b/services/implementation/src/device_manager_service_impl_lite.cpp @@ -513,10 +513,10 @@ void DeviceManagerServiceImpl::HandleDeviceScreenStatusChange(DmDeviceInfo &devI return; } -void DeviceManagerServiceImpl::HandleUserSwitched(const std::map &deviceMap, +void DeviceManagerServiceImpl::HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, int32_t beforeUserId) { - (void)deviceMap; + (void)deviceVec; (void)currentUserId; (void)beforeUserId; return; diff --git a/services/service/include/device_manager_service.h b/services/service/include/device_manager_service.h index 5116372446f8624050aecf1b35a10e0c94f9d7ea..726b52fcf10ddc0687e38bae05baa897720b9bdc 100644 --- a/services/service/include/device_manager_service.h +++ b/services/service/include/device_manager_service.h @@ -32,6 +32,7 @@ #include "hichain_listener.h" #include "i_dm_service_impl_ext.h" #include "dm_single_instance.h" +#include "dm_timer.h" #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE)) #include "dm_account_common_event.h" #include "dm_package_common_event.h" @@ -265,6 +266,14 @@ private: void HandleUserSwitched(int32_t curUserId, int32_t preUserId); void HandleUserIdsBroadCast(const std::vector &remoteUserIdInfos, const std::string &remoteUdid, bool isNeedResponse); + void NotifyRemoteLocalUserSwitch(int32_t curUserId, int32_t preUserId, const std::vector &peerUdids, + const std::vector &foregroundUserIds, const std::vector &backgroundUserIds); + void NotifyRemoteLocalUserSwitchByWifi(int32_t curUserId, int32_t preUserId, + const std::map &wifiDevices, const std::vector &foregroundUserIds, + const std::vector &backgroundUserIds); + int32_t SendUserIdsByWifi(const std::string &networkId, const std::vector &foregroundUserIds, + const std::vector &backgroundUserIds); + void HandleUserSwitchTimeout(int32_t curUserId, int32_t preUserId, const std::string &udid); #if defined(SUPPORT_BLUETOOTH) || defined(SUPPORT_WIFI) void SubscribePublishCommonEvent(); void QueryDependsSwitchState(); @@ -294,6 +303,7 @@ private: #endif // SUPPORT_BLUETOOTH SUPPORT_WIFI #endif std::string localNetWorkId_ = ""; + std::shared_ptr timer_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/service/include/idevice_manager_service_impl.h b/services/service/include/idevice_manager_service_impl.h index 658cbc1001da4fe6e3145fd017776f196ec857b8..0a1ee214a2a3662cf4a108c43d783577d39fdc18 100644 --- a/services/service/include/idevice_manager_service_impl.h +++ b/services/service/include/idevice_manager_service_impl.h @@ -273,7 +273,7 @@ public: const std::string &peerUdid, int32_t peerUserId) = 0; virtual void HandleUserRemoved(int32_t preUserId) = 0; virtual void HandleDeviceScreenStatusChange(DmDeviceInfo &devInfo) = 0; - virtual void HandleUserSwitched(const std::map &deviceMap, int32_t currentUserId, + virtual void HandleUserSwitched(const std::vector &deviceVec, int32_t currentUserId, int32_t beforeUserId) = 0; virtual int32_t StopAuthenticateDevice(const std::string &pkgName) = 0; virtual void HandleCredentialAuthStatus(const std::string &deviceList, uint16_t deviceTypeId, diff --git a/services/service/include/relationshipsyncmgr/dm_comm_tool.h b/services/service/include/relationshipsyncmgr/dm_comm_tool.h index 8eba6a77a5e7e68d16784cdcee481ba85907a364..a06c9a955c46e3fb1fbc613b21b8f7ea2f669461 100644 --- a/services/service/include/relationshipsyncmgr/dm_comm_tool.h +++ b/services/service/include/relationshipsyncmgr/dm_comm_tool.h @@ -41,10 +41,10 @@ public: void Init(); void UnInit(); - void SendUserIds(const std::string rmtNetworkId, const std::vector &foregroundUserIds, + int32_t SendUserIds(const std::string rmtNetworkId, const std::vector &foregroundUserIds, const std::vector &backgroundUserIds); void RspLocalFrontOrBackUserIds(const std::string rmtNetworkId, const std::vector &foregroundUserIds, - const std::vector &backgroundUserIds); + const std::vector &backgroundUserIds, int32_t socketId); class DMCommToolEventHandler : public AppExecFwk::EventHandler { public: diff --git a/services/service/include/relationshipsyncmgr/dm_transport.h b/services/service/include/relationshipsyncmgr/dm_transport.h index cf8eb0890673f1c8b612f3a1b323facb1fd16564..94f1b05f203268f5563f1ed07cb2fed98d4aff6e 100644 --- a/services/service/include/relationshipsyncmgr/dm_transport.h +++ b/services/service/include/relationshipsyncmgr/dm_transport.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include "event_handler.h" @@ -37,10 +38,10 @@ public: int32_t UnInit(); virtual ~DMTransport() = default; // open softbus channel with remote device by networkid. - int32_t StartSocket(const std::string &rmtNetworkId); + int32_t StartSocket(const std::string &rmtNetworkId, int32_t &socketId); // stop softbus channel with remote device by networkid. int32_t StopSocket(const std::string &rmtNetworkId); - int32_t Send(const std::string &rmtNetworkId, const std::string &payload); + int32_t Send(const std::string &rmtNetworkId, const std::string &payload, int32_t socketId); int32_t OnSocketOpened(int32_t socketId, const PeerSocketInfo &info); void OnSocketClosed(int32_t socketId, ShutdownReason reason); void OnBytesReceived(int32_t socketId, const void *data, uint32_t dataLen); @@ -50,13 +51,14 @@ private: int32_t CreateClientSocket(const std::string &remoteDevId); bool IsDeviceSessionOpened(const std::string &remoteDevId, int32_t &socketId); std::string GetRemoteNetworkIdBySocketId(int32_t socketId); - void ClearDeviceSocketOpened(const std::string &remoteDevId); + void ClearDeviceSocketOpened(const std::string &remoteDevId, int32_t socketId); void HandleReceiveMessage(const int32_t socketId, const std::string &payload); private: std::mutex rmtSocketIdMtx_; // record the socket id for the connection with remote devices, - std::map remoteDevSocketIds_; + std::map> remoteDevSocketIds_; + std::set sourceSocketIds_; std::atomic localServerSocket_; std::string localSocketName_; std::atomic isSocketSvrCreateFlag_; diff --git a/services/service/include/relationshipsyncmgr/dm_transport_msg.h b/services/service/include/relationshipsyncmgr/dm_transport_msg.h index bdca9e7916ca23f0771e707882a45e9f8e70ab73..8f1e9e36706c2e8a42675f63b8bc628f28b1956a 100644 --- a/services/service/include/relationshipsyncmgr/dm_transport_msg.h +++ b/services/service/include/relationshipsyncmgr/dm_transport_msg.h @@ -56,8 +56,9 @@ std::string GetCommMsgString(const CommMsg &commMsg); struct InnerCommMsg { std::string remoteNetworkId; std::shared_ptr commMsg; - InnerCommMsg(std::string remoteNetworkId, std::shared_ptr commMsg) - : remoteNetworkId(remoteNetworkId), commMsg(commMsg) {} + int32_t socketId = 0; + InnerCommMsg(std::string remoteNetworkId, std::shared_ptr commMsg, int32_t socketId) + : remoteNetworkId(remoteNetworkId), commMsg(commMsg), socketId(socketId) {} }; struct NotifyUserIds { diff --git a/services/service/src/device_manager_service.cpp b/services/service/src/device_manager_service.cpp index 7dbc1aa7ee05bb388d336502ad003cc012777693..907a799bca89c3d7bd934d7f688593bca1e37d2d 100755 --- a/services/service/src/device_manager_service.cpp +++ b/services/service/src/device_manager_service.cpp @@ -74,8 +74,11 @@ namespace { const std::string USERID_CHECKSUM_NETWORKID_KEY = "networkId"; const std::string USERID_CHECKSUM_DISCOVER_TYPE_KEY = "discoverType"; constexpr uint32_t USERID_CHECKSUM_DISCOVERY_TYPE_WIFI_MASK = 0b0010; + constexpr uint32_t USERID_SYNC_DISCOVERY_TYPE_BLE_MASK = 0b0100; const std::string DHARD_WARE_PKG_NAME = "ohos.dhardware"; const std::string USERID_CHECKSUM_ISCHANGE_KEY = "ischange"; + constexpr const char* USER_SWITCH_BY_WIFI_TIMEOUT_TASK = "deviceManagerTimer:userSwitchByWifi"; + const int32_t USER_SWITCH_BY_WIFI_TIMEOUT_S = 2; } DeviceManagerService::~DeviceManagerService() @@ -1694,20 +1697,19 @@ void DeviceManagerService::HandleUserSwitched(int32_t curUserId, int32_t preUser peerUdids.push_back(item.first); } } - dmServiceImpl_->HandleUserSwitched(preUserDeviceMap, curUserId, preUserId); - if (!peerUdids.empty()) { - std::vector foregroundUserVec; - int32_t retFront = MultipleUserConnector::GetForegroundUserIds(foregroundUserVec); - std::vector backgroundUserVec; - int32_t retBack = MultipleUserConnector::GetBackgroundUserIds(backgroundUserVec); - if (retFront != DM_OK || retBack != DM_OK || foregroundUserVec.empty()) { - LOGE("Get userids failed, retFront: %{public}d, retBack: %{public}d, foreground user num: %{public}d", - retFront, retBack, static_cast(foregroundUserVec.size())); - } else { - LOGE("Send local foreground and background userids"); - SendUserIdsBroadCast(peerUdids, foregroundUserVec, backgroundUserVec, true); - } + if (peerUdids.empty()) { + return; + } + std::vector foregroundUserVec; + int32_t retFront = MultipleUserConnector::GetForegroundUserIds(foregroundUserVec); + std::vector backgroundUserVec; + int32_t retBack = MultipleUserConnector::GetBackgroundUserIds(backgroundUserVec); + if (retFront != DM_OK || retBack != DM_OK || foregroundUserVec.empty()) { + LOGE("Get userids failed, retFront: %{public}d, retBack: %{public}d, foreground user num: %{public}d", + retFront, retBack, static_cast(foregroundUserVec.size())); + return; } + NotifyRemoteLocalUserSwitch(curUserId, preUserId, peerUdids, foregroundUserVec, backgroundUserVec); } void DeviceManagerService::HandleUserRemoved(int32_t removedUserId) @@ -1839,7 +1841,9 @@ void DeviceManagerService::ProcessSyncUserIds(const std::vector &foreg if (softbusListener_ != nullptr) { softbusListener_->SetForegroundUserIdsToDSoftBus(remoteUdid, foregroundUserIds); } - + if (timer_ != nullptr) { + timer_->DeleteTimer(std::string(USER_SWITCH_BY_WIFI_TIMEOUT_TASK) + Crypto::Sha256(remoteUdid)); + } if (IsDMServiceImplReady()) { dmServiceImpl_->HandleSyncUserIdEvent(foregroundUserIds, backgroundUserIds, remoteUdid); } @@ -2351,5 +2355,99 @@ void DeviceManagerService::HandleDeviceUnBind(const char *peerUdid, const GroupI } return; } + +#if !(defined(__LITEOS_M__) || defined(LITE_DEVICE)) +void DeviceManagerService::NotifyRemoteLocalUserSwitch(int32_t curUserId, int32_t preUserId, + const std::vector &peerUdids, const std::vector &foregroundUserIds, + const std::vector &backgroundUserIds) +{ + LOGI("Send local foreground and background userids"); + if (peerUdids.empty()) { + return; + } + if (softbusListener_ == nullptr) { + dmServiceImpl_->HandleUserSwitched(peerUdids, curUserId, preUserId); + LOGE("softbusListener_ is null"); + return; + } + std::vector bleUdids; + std::map wifiDevices; + for (const auto &udid : peerUdids) { + std::string netWorkId = ""; + SoftbusCache::GetInstance().GetNetworkIdFromCache(udid, netWorkId); + if (netWorkId.empty()) { + LOGI("netWorkId is empty: %{public}s", GetAnonyString(udid).c_str()); + bleUdids.push_back(udid); + continue; + } + int32_t networkType = 0; + int32_t ret = softbusListener_->GetNetworkTypeByNetworkId(netWorkId.c_str(), networkType); + if (ret != DM_OK || networkType <= 0) { + LOGI("get networkType failed: %{public}s", GetAnonyString(udid).c_str()); + bleUdids.push_back(udid); + continue; + } + if ((static_cast(networkType) & USERID_SYNC_DISCOVERY_TYPE_BLE_MASK) != 0x0) { + bleUdids.push_back(udid); + } else { + wifiDevices.insert(std::pair(udid, netWorkId)); + } + } + if (!bleUdids.empty()) { + dmServiceImpl_->HandleUserSwitched(bleUdids, curUserId, preUserId); + SendUserIdsBroadCast(bleUdids, foregroundUserIds, backgroundUserIds, true); + } + if (!wifiDevices.empty()) { + NotifyRemoteLocalUserSwitchByWifi(curUserId, preUserId, wifiDevices, foregroundUserIds, backgroundUserIds); + } +} + +void DeviceManagerService::NotifyRemoteLocalUserSwitchByWifi(int32_t curUserId, int32_t preUserId, + const std::map &wifiDevices, const std::vector &foregroundUserIds, + const std::vector &backgroundUserIds) +{ + for (const auto &it : wifiDevices) { + int32_t result = SendUserIdsByWifi(it.second, foregroundUserIds, backgroundUserIds); + if (result != DM_OK) { + LOGE("by wifi failed: %{public}s", GetAnonyString(it.first).c_str()); + std::vector updateUdids; + updateUdids.push_back(it.first); + dmServiceImpl_->HandleUserSwitched(updateUdids, curUserId, preUserId); + continue; + } + if (timer_ == nullptr) { + timer_ = std::make_shared(); + } + std::string udid = it.first; + timer_->StartTimer(std::string(USER_SWITCH_BY_WIFI_TIMEOUT_TASK) + Crypto::Sha256(udid), + USER_SWITCH_BY_WIFI_TIMEOUT_S, [this, curUserId, preUserId, udid] (std::string name) { + DeviceManagerService::HandleUserSwitchTimeout(curUserId, preUserId, udid); + }); + } +} + +int32_t DeviceManagerService::SendUserIdsByWifi(const std::string &networkId, + const std::vector &foregroundUserIds, const std::vector &backgroundUserIds) +{ + LOGI("Try open softbus session to exchange foreground/background userid"); + std::vector foregroundUserIdsUInt; + for (auto const &u : foregroundUserIds) { + foregroundUserIdsUInt.push_back(static_cast(u)); + } + std::vector backgroundUserIdsUInt; + for (auto const &u : backgroundUserIds) { + backgroundUserIdsUInt.push_back(static_cast(u)); + } + return DMCommTool::GetInstance()->SendUserIds(networkId, foregroundUserIdsUInt, backgroundUserIdsUInt); +} + +void DeviceManagerService::HandleUserSwitchTimeout(int32_t curUserId, int32_t preUserId, const std::string &udid) +{ + LOGI("start udid: %{public}s", GetAnonyString(udid).c_str()); + std::vector updateUdids; + updateUdids.push_back(udid); + dmServiceImpl_->HandleUserSwitched(updateUdids, curUserId, preUserId); +} +#endif } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/service/src/relationshipsyncmgr/dm_comm_tool.cpp b/services/service/src/relationshipsyncmgr/dm_comm_tool.cpp index d735c57f9e42664b807152e289e719849cf3b4a4..981da97f80f91d681e9bd9baf156aa3077cab81d 100644 --- a/services/service/src/relationshipsyncmgr/dm_comm_tool.cpp +++ b/services/service/src/relationshipsyncmgr/dm_comm_tool.cpp @@ -58,47 +58,48 @@ std::shared_ptr DMCommTool::GetInstance() return instance; } -void DMCommTool::SendUserIds(const std::string rmtNetworkId, +int32_t DMCommTool::SendUserIds(const std::string rmtNetworkId, const std::vector &foregroundUserIds, const std::vector &backgroundUserIds) { if (!IsIdLengthValid(rmtNetworkId) || foregroundUserIds.empty() || dmTransportPtr_ == nullptr) { LOGE("param invalid, networkId: %{public}s, foreground userids size: %{public}d", GetAnonyString(rmtNetworkId).c_str(), static_cast(foregroundUserIds.size())); - return; + return ERR_DM_INPUT_PARA_INVALID; } - - if (dmTransportPtr_->StartSocket(rmtNetworkId) != DM_OK) { + int32_t socketId; + if (dmTransportPtr_->StartSocket(rmtNetworkId, socketId) != DM_OK || socketId <= 0) { LOGE("Start socket error"); - return; + return ERR_DM_FAILED; } UserIdsMsg userIdsMsg(foregroundUserIds, backgroundUserIds); cJSON *root = cJSON_CreateObject(); if (root == nullptr) { LOGE("Create cJSON object failed."); - return; + return ERR_DM_FAILED; } ToJson(root, userIdsMsg); char *msg = cJSON_PrintUnformatted(root); if (msg == nullptr) { cJSON_Delete(root); - return; + return ERR_DM_FAILED; } std::string msgStr(msg); cJSON_Delete(root); CommMsg commMsg(DM_COMM_SEND_LOCAL_USERIDS, msgStr); std::string payload = GetCommMsgString(commMsg); - int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload); + int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId); if (ret != DM_OK) { LOGE("Send local foreground userids failed, ret: %{public}d", ret); - return; + return ERR_DM_FAILED; } LOGI("Send local foreground userids success"); + return DM_OK; } void DMCommTool::RspLocalFrontOrBackUserIds(const std::string rmtNetworkId, - const std::vector &foregroundUserIds, const std::vector &backgroundUserIds) + const std::vector &foregroundUserIds, const std::vector &backgroundUserIds, int32_t socketId) { UserIdsMsg userIdsMsg(foregroundUserIds, backgroundUserIds); cJSON *root = cJSON_CreateObject(); @@ -117,7 +118,7 @@ void DMCommTool::RspLocalFrontOrBackUserIds(const std::string rmtNetworkId, CommMsg commMsg(DM_COMM_RSP_LOCAL_USERIDS, msgStr); std::string payload = GetCommMsgString(commMsg); - int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload); + int32_t ret = dmTransportPtr_->Send(rmtNetworkId, payload, socketId); if (ret != DM_OK) { LOGE("Response local foreground userids failed, ret: %{public}d", ret); return; @@ -208,7 +209,8 @@ void DMCommTool::ProcessReceiveUserIdsEvent(const std::shared_ptr for (auto const &u : backgroundUserIds) { backgroundUserIdsU32.push_back(static_cast(u)); } - RspLocalFrontOrBackUserIds(commMsg->remoteNetworkId, foregroundUserIdsU32, backgroundUserIdsU32); + RspLocalFrontOrBackUserIds(commMsg->remoteNetworkId, foregroundUserIdsU32, backgroundUserIdsU32, + commMsg->socketId); } void DMCommTool::ProcessResponseUserIdsEvent(const std::shared_ptr commMsg) diff --git a/services/service/src/relationshipsyncmgr/dm_transport.cpp b/services/service/src/relationshipsyncmgr/dm_transport.cpp index 6b51103803f7fc9bc9afc9251b92b88f6f93b7b2..7ab189a7da552280e449dd7ae6a09f0f269e15b4 100644 --- a/services/service/src/relationshipsyncmgr/dm_transport.cpp +++ b/services/service/src/relationshipsyncmgr/dm_transport.cpp @@ -54,7 +54,13 @@ int32_t DMTransport::OnSocketOpened(int32_t socketId, const PeerSocketInfo &info LOGI("OnSocketOpened, socket: %{public}d, peerSocketName: %{public}s, peerNetworkId: %{public}s, " "peerPkgName: %{public}s", socketId, info.name, GetAnonyString(info.networkId).c_str(), info.pkgName); std::lock_guard lock(rmtSocketIdMtx_); - remoteDevSocketIds_[info.networkId] = socketId; + if (remoteDevSocketIds_.find(info.networkId) == remoteDevSocketIds_.end()) { + std::set socketSet; + socketSet.insert(socketId); + remoteDevSocketIds_[info.networkId] = socketSet; + return DM_OK; + } + remoteDevSocketIds_.at(info.networkId).insert(socketId); return DM_OK; } @@ -62,12 +68,15 @@ void DMTransport::OnSocketClosed(int32_t socketId, ShutdownReason reason) { LOGI("OnSocketClosed, socket: %{public}d, reason: %{public}d", socketId, (int32_t)reason); std::lock_guard lock(rmtSocketIdMtx_); - for (auto iter = remoteDevSocketIds_.begin(); iter != remoteDevSocketIds_.end(); ++iter) { - if (iter->second == socketId) { - remoteDevSocketIds_.erase(iter); - break; + for (auto iter = remoteDevSocketIds_.begin(); iter != remoteDevSocketIds_.end();) { + iter->second.erase(socketId); + if (iter->second.empty()) { + iter = remoteDevSocketIds_.erase(iter); + } else { + ++iter; } } + sourceSocketIds_.erase(socketId); } void DMTransport::OnBytesReceived(int32_t socketId, const void *data, uint32_t dataLen) @@ -123,7 +132,7 @@ void DMTransport::HandleReceiveMessage(const int32_t socketId, const std::string FromJson(root, *commMsg); cJSON_Delete(root); - std::shared_ptr innerMsg = std::make_shared(rmtNetworkId, commMsg); + std::shared_ptr innerMsg = std::make_shared(rmtNetworkId, commMsg, socketId); LOGI("Receive DM msg, code: %{public}d, msg: %{public}s", commMsg->code, GetAnonyString(commMsg->msg).c_str()); AppExecFwk::InnerEvent::Pointer msgEvent = AppExecFwk::InnerEvent::Get(commMsg->code, innerMsg); @@ -298,11 +307,14 @@ int32_t DMTransport::UnInit() { std::lock_guard lock(rmtSocketIdMtx_); for (auto iter = remoteDevSocketIds_.begin(); iter != remoteDevSocketIds_.end(); ++iter) { - LOGI("Shutdown client socket: %{public}d to remote dev: %{public}s", iter->second, - GetAnonyString(iter->first).c_str()); - Shutdown(iter->second); + for (auto iter1 = iter->second.begin(); iter1 != iter->second.end(); ++iter1) { + LOGI("Shutdown client socket: %{public}d to remote dev: %{public}s", *iter1, + GetAnonyString(iter->first).c_str()); + Shutdown(*iter1); + } } remoteDevSocketIds_.clear(); + sourceSocketIds_.clear(); } if (!isSocketSvrCreateFlag_.load()) { @@ -322,13 +334,17 @@ bool DMTransport::IsDeviceSessionOpened(const std::string &rmtNetworkId, int32_t return false; } std::lock_guard lock(rmtSocketIdMtx_); - if (remoteDevSocketIds_.find(rmtNetworkId) == remoteDevSocketIds_.end()) { + auto iter = remoteDevSocketIds_.find(rmtNetworkId); + if (iter == remoteDevSocketIds_.end()) { return false; } - socketId = remoteDevSocketIds_.at(rmtNetworkId); - LOGI("DeviceSession has opened, rmtNetworkId: %{public}s, socketId: %{public}d", - GetAnonyString(rmtNetworkId).c_str(), socketId); - return true; + for (auto iter1 = iter->second.begin(); iter1 != iter->second.end(); ++iter1) { + if (sourceSocketIds_.find(*iter1) != sourceSocketIds_.end()) { + socketId = *iter1; + return true; + } + } + return false; } std::string DMTransport::GetRemoteNetworkIdBySocketId(int32_t socketId) @@ -336,7 +352,7 @@ std::string DMTransport::GetRemoteNetworkIdBySocketId(int32_t socketId) std::lock_guard lock(rmtSocketIdMtx_); std::string networkId = ""; for (auto const &item : remoteDevSocketIds_) { - if (item.second == socketId) { + if (item.second.find(socketId) != item.second.end()) { networkId = item.first; break; } @@ -344,21 +360,28 @@ std::string DMTransport::GetRemoteNetworkIdBySocketId(int32_t socketId) return networkId; } -void DMTransport::ClearDeviceSocketOpened(const std::string &remoteDevId) +void DMTransport::ClearDeviceSocketOpened(const std::string &remoteDevId, int32_t socketId) { if (!IsIdLengthValid(remoteDevId)) { return; } std::lock_guard lock(rmtSocketIdMtx_); - remoteDevSocketIds_.erase(remoteDevId); + auto iter = remoteDevSocketIds_.find(remoteDevId); + if (iter == remoteDevSocketIds_.end()) { + return; + } + iter->second.erase(socketId); + if (iter->second.empty()) { + remoteDevSocketIds_.erase(iter); + } + sourceSocketIds_.erase(socketId); } -int32_t DMTransport::StartSocket(const std::string &rmtNetworkId) +int32_t DMTransport::StartSocket(const std::string &rmtNetworkId, int32_t &socketId) { if (!IsIdLengthValid(rmtNetworkId)) { return ERR_DM_INPUT_PARA_INVALID; } - int32_t socketId = -1; if (IsDeviceSessionOpened(rmtNetworkId, socketId)) { LOGE("Softbus session has already opened, deviceId: %{public}s", GetAnonyString(rmtNetworkId).c_str()); return DM_OK; @@ -389,6 +412,8 @@ int32_t DMTransport::StartSocket(const std::string &rmtNetworkId) .dataType = DATA_TYPE_BYTES }; OnSocketOpened(socket, peerSocketInfo); + sourceSocketIds_.insert(socket); + socketId = socket; return DM_OK; } @@ -406,17 +431,16 @@ int32_t DMTransport::StopSocket(const std::string &rmtNetworkId) LOGI("StopSocket rmtNetworkId: %{public}s, socketId: %{public}d", GetAnonyString(rmtNetworkId).c_str(), socketId); Shutdown(socketId); - ClearDeviceSocketOpened(rmtNetworkId); + ClearDeviceSocketOpened(rmtNetworkId, socketId); return DM_OK; } -int32_t DMTransport::Send(const std::string &rmtNetworkId, const std::string &payload) +int32_t DMTransport::Send(const std::string &rmtNetworkId, const std::string &payload, int32_t socketId) { if (!IsIdLengthValid(rmtNetworkId) || !IsMessageLengthValid(payload)) { return ERR_DM_INPUT_PARA_INVALID; } - int32_t socketId = -1; - if (!IsDeviceSessionOpened(rmtNetworkId, socketId)) { + if (socketId <= 0) { LOGI("The session is not open, target networkId: %{public}s", GetAnonyString(rmtNetworkId).c_str()); return ERR_DM_FAILED; } diff --git a/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp b/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp index 5473b3f7ac9155f43dce27bec5f7e35462a12c76..102080141537b1e14ba52d6ca339a221072fef47 100644 --- a/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp +++ b/test/commonunittest/UTTest_dm_deviceprofile_connector.cpp @@ -1610,12 +1610,14 @@ HWTEST_F(DeviceProfileConnectorTest, HandleUserSwitched_001, testing::ext::TestS int32_t currentUserId = 0; std::string localUdid = "deviceId"; int32_t beforeUserId = 123456; - int32_t ret = DeviceProfileConnector::GetInstance().HandleUserSwitched(localUdid, currentUserId, beforeUserId); + std::vector deviceVec; + int32_t ret = DeviceProfileConnector::GetInstance().HandleUserSwitched(localUdid, deviceVec, currentUserId, + beforeUserId); EXPECT_EQ(ret, DM_OK); beforeUserId = 1234; currentUserId = 123456; - ret = DeviceProfileConnector::GetInstance().HandleUserSwitched(localUdid, currentUserId, beforeUserId); + ret = DeviceProfileConnector::GetInstance().HandleUserSwitched(localUdid, deviceVec, currentUserId, beforeUserId); EXPECT_EQ(ret, DM_OK); std::vector remoteUserIds; diff --git a/test/unittest/UTTest_device_manager_service_impl.cpp b/test/unittest/UTTest_device_manager_service_impl.cpp index cf632b2c4420cce1c753f1c949675a5e503975a6..4fde56ab45fe4e87c92a22d280e9661a2e38b2c2 100644 --- a/test/unittest/UTTest_device_manager_service_impl.cpp +++ b/test/unittest/UTTest_device_manager_service_impl.cpp @@ -1859,10 +1859,10 @@ HWTEST_F(DeviceManagerServiceImplTest, GetDeviceIdAndUserId_001, testing::ext::T std::string remoteUdid = "deviceId"; deviceManagerServiceImpl_->HandleSyncUserIdEvent(foregroundUserIds, backgroundUserIds, remoteUdid); - std::map deviceMap; + std::vector deviceVec; int32_t currentUserId = 1; int32_t beforeUserId = 0; - deviceManagerServiceImpl_->HandleUserSwitched(deviceMap, currentUserId, beforeUserId); + deviceManagerServiceImpl_->HandleUserSwitched(deviceVec, currentUserId, beforeUserId); } HWTEST_F(DeviceManagerServiceImplTest, SaveOnlineDeviceInfo_001, testing::ext::TestSize.Level0) diff --git a/test/unittest/UTTest_dm_transport.cpp b/test/unittest/UTTest_dm_transport.cpp index e9b239dd384a2e437c7ec997bdf0a8e14d3a734e..534d17d7f46e95db009f0972ca2c518e45a4265c 100644 --- a/test/unittest/UTTest_dm_transport.cpp +++ b/test/unittest/UTTest_dm_transport.cpp @@ -65,12 +65,11 @@ HWTEST_F(DMTransportTest, Init_AlreadyInitialized, testing::ext::TestSize.Level0 */ HWTEST_F(DMTransportTest, UnInit_ShouldShutdownAllSockets, testing::ext::TestSize.Level0) { - dmTransport.StartSocket("device1"); - dmTransport.StartSocket("device2"); + int32_t socketId; + dmTransport.StartSocket("device1", socketId); + dmTransport.StartSocket("device2", socketId); EXPECT_EQ(dmTransport.UnInit(), DM_OK); - - int32_t socketId; EXPECT_FALSE(dmTransport.IsDeviceSessionOpened("device1", socketId)); EXPECT_FALSE(dmTransport.IsDeviceSessionOpened("device2", socketId)); } @@ -109,9 +108,9 @@ HWTEST_F(DMTransportTest, GetRemoteNetworkIdBySocketIdReturnEmptyString, testing */ HWTEST_F(DMTransportTest, ClearDeviceSocketOpened_ShouldRemoveSocket, testing::ext::TestSize.Level0) { - dmTransport.StartSocket("device1"); - dmTransport.ClearDeviceSocketOpened("device1"); - int32_t socketId; + int32_t socketId = 1; + dmTransport.StartSocket("device1", socketId); + dmTransport.ClearDeviceSocketOpened("device1", socketId); EXPECT_FALSE(dmTransport.IsDeviceSessionOpened("device1", socketId)); } @@ -121,9 +120,9 @@ HWTEST_F(DMTransportTest, ClearDeviceSocketOpened_ShouldRemoveSocket, testing::e */ HWTEST_F(DMTransportTest, ClearDeviceSocketOpened_ShouldDoNothingForInvalidId, testing::ext::TestSize.Level0) { - dmTransport.StartSocket("device1"); - dmTransport.ClearDeviceSocketOpened("invalid_device"); - int32_t socketId; + int32_t socketId = 1; + dmTransport.StartSocket("device1", socketId); + dmTransport.ClearDeviceSocketOpened("invalid_device", socketId); EXPECT_FALSE(dmTransport.IsDeviceSessionOpened("device1", socketId)); } @@ -133,8 +132,8 @@ HWTEST_F(DMTransportTest, ClearDeviceSocketOpened_ShouldDoNothingForInvalidId, t */ HWTEST_F(DMTransportTest, StartSocket_ShouldCreateSocket, testing::ext::TestSize.Level0) { - EXPECT_EQ(dmTransport.StartSocket("device1"), ERR_DM_FAILED); int32_t socketId; + EXPECT_EQ(dmTransport.StartSocket("device1", socketId), ERR_DM_FAILED); EXPECT_FALSE(dmTransport.IsDeviceSessionOpened("device1", socketId)); } @@ -144,7 +143,8 @@ HWTEST_F(DMTransportTest, StartSocket_ShouldCreateSocket, testing::ext::TestSize */ HWTEST_F(DMTransportTest, StartSocket_ShouldReturnErrorForInvalidId, testing::ext::TestSize.Level0) { - EXPECT_EQ(dmTransport.StartSocket(""), ERR_DM_INPUT_PARA_INVALID); + int32_t socketId; + EXPECT_EQ(dmTransport.StartSocket("", socketId), ERR_DM_INPUT_PARA_INVALID); } /** @@ -153,8 +153,9 @@ HWTEST_F(DMTransportTest, StartSocket_ShouldReturnErrorForInvalidId, testing::ex */ HWTEST_F(DMTransportTest, StartSocket_ShouldReturnErrorIfAlreadyOpened, testing::ext::TestSize.Level0) { - dmTransport.StartSocket("device1"); - EXPECT_EQ(dmTransport.StartSocket("device1"), ERR_DM_FAILED); + int32_t socketId; + dmTransport.StartSocket("device1", socketId); + EXPECT_EQ(dmTransport.StartSocket("device1", socketId), ERR_DM_FAILED); } /** @@ -187,7 +188,7 @@ HWTEST_F(DMTransportTest, Send_InvalidId_Failure, testing::ext::TestSize.Level0) { std::string invalidId = "invalidId"; std::string payload = "Hello, World!"; - int32_t result = dmTransport.Send(invalidId, payload); + int32_t result = dmTransport.Send(invalidId, payload, 0); EXPECT_EQ(result, ERR_DM_FAILED); } @@ -199,7 +200,7 @@ HWTEST_F(DMTransportTest, Send_SessionNotOpened_Failure, testing::ext::TestSize. { std::string notOpenedId = "notOpenedId"; std::string payload = "Hello, World!"; - int32_t result = dmTransport.Send(notOpenedId, payload); + int32_t result = dmTransport.Send(notOpenedId, payload, 0); EXPECT_EQ(result, ERR_DM_FAILED); } } // DistributedHardware