From 95177152cc16930f047be131c54a6707fa245473 Mon Sep 17 00:00:00 2001 From: tanliang Date: Fri, 30 Aug 2024 10:41:56 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=80=9A=E8=BF=87pid=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E4=B8=BB=E7=AA=97=E7=8A=B6=E6=80=81=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tanliang --- interfaces/innerkits/wm/wm_common.h | 50 +++++++++++++++++++ .../include/scene_session_manager.h | 1 + .../include/scene_session_manager_lite.h | 1 + .../scene_session_manager_lite_interface.h | 2 + .../zidl/scene_session_manager_lite_proxy.h | 2 + .../zidl/scene_session_manager_lite_stub.h | 1 + .../src/scene_session_manager.cpp | 33 ++++++++++++ .../src/scene_session_manager_lite.cpp | 5 ++ .../zidl/scene_session_manager_lite_proxy.cpp | 28 +++++++++++ .../zidl/scene_session_manager_lite_stub.cpp | 24 +++++++++ .../scene_session_manager_lite_stub_test.cpp | 18 +++++++ .../unittest/scene_session_manager_test.cpp | 13 +++++ 12 files changed, 178 insertions(+) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index ada7db1234..6d0036088c 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -505,6 +505,56 @@ struct MainWindowInfo : public Parcelable { int32_t bundleType_ = 0; }; +/** + * @struct MainWindowState. + * + * @brief main window state info. + */ +struct MainWindowState : public Parcelable { + virtual bool Marshalling(Parcel &parcel) const override + { + if (!parcel.WriteInt32(state_)) { + return false; + } + if (!parcel.WriteBool(isVisible_)) { + return false; + } + if (!parcel.WriteBool(isForegroundInteractive_)) { + return false; + } + if (!parcel.WriteBool(isPcOrPadEnableActivation_)) { + return false; + } + return true; + } + + static MainWindowState* Unmarshalling(Parcel& parcel) + { + MainWindowState* mainWindowState = new (std::nothrow)MainWindowState(); + if (!mainWindowState) { + return nullptr; + } + if (!parcel.ReadInt32(mainWindowState->state_)) { + return nullptr; + } + if (!parcel.ReadBool(mainWindowState->isVisible_)) { + return nullptr; + } + if (!parcel.ReadBool(mainWindowState->isForegroundInteractive_)) { + return nullptr; + } + if (!parcel.ReadBool(mainWindowState->isPcOrPadEnableActivation_)) { + return nullptr; + } + return mainWindowState; + } + + int32_t state_ = 0; + bool isVisible_ = false; + bool isForegroundInteractive_ = false; + bool isPcOrPadEnableActivation_ = false; +}; + namespace { constexpr uint32_t SYSTEM_COLOR_WHITE = 0xE5FFFFFF; constexpr uint32_t SYSTEM_COLOR_BLACK = 0x66000000; diff --git a/window_scene/session_manager/include/scene_session_manager.h b/window_scene/session_manager/include/scene_session_manager.h index 11f4481667..c94e5a1fd3 100644 --- a/window_scene/session_manager/include/scene_session_manager.h +++ b/window_scene/session_manager/include/scene_session_manager.h @@ -229,6 +229,7 @@ public: WSError UnRegisterSessionListener(const sptr& listener) override; WSError GetSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) override; + WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates); WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) override; WSError GetSessionInfoByContinueSessionId(const std::string& continueSessionId, SessionInfoBean& sessionInfo) override; diff --git a/window_scene/session_manager/include/scene_session_manager_lite.h b/window_scene/session_manager/include/scene_session_manager_lite.h index 540d8e968c..188bfbe914 100644 --- a/window_scene/session_manager/include/scene_session_manager_lite.h +++ b/window_scene/session_manager/include/scene_session_manager_lite.h @@ -35,6 +35,7 @@ public: WSError UnRegisterSessionListener(const sptr& listener) override; WSError GetSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) override; + WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) override; WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) override; WSError GetSessionInfoByContinueSessionId(const std::string& continueSessionId, SessionInfoBean& sessionInfo) override; diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h b/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h index 0302cf71ed..934c1954c7 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h @@ -79,6 +79,7 @@ public: TRANS_ID_CLOSE_TARGET_FLOAT_WINDOW, TRANS_ID_CLOSE_TARGET_PIP_WINDOW, TRANS_ID_GET_CURRENT_PIP_WINDOW_INFO, + TRANS_ID_GET_MAIN_WINDOW_STATES_BY_PID, }; virtual WSError SetSessionLabel(const sptr& token, const std::string& label) = 0; @@ -93,6 +94,7 @@ public: virtual WSError GetSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) = 0; virtual WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) = 0; + virtual WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) = 0; virtual WSError GetSessionInfoByContinueSessionId(const std::string& continueSessionId, SessionInfoBean& sessionInfo) = 0; virtual WSError SetSessionContinueState(const sptr& token, const ContinueState& continueState) = 0; diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h b/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h index 8ab5768999..f2ee38027c 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h @@ -38,6 +38,8 @@ public: WSError UnRegisterSessionListener(const sptr& listener) override; WSError GetSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) override; + // Obtains main window state list by pid + WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) override; WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) override; WSError GetSessionInfoByContinueSessionId(const std::string& continueSessionId, SessionInfoBean& sessionInfo) override; diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_lite_stub.h b/window_scene/session_manager/include/zidl/scene_session_manager_lite_stub.h index 7782d5aa01..a1d9558400 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_lite_stub.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_lite_stub.h @@ -42,6 +42,7 @@ private: int HandleRegisterSessionListener(MessageParcel& data, MessageParcel& reply); int HandleUnRegisterSessionListener(MessageParcel& data, MessageParcel& reply); int HandleGetSessionInfos(MessageParcel& data, MessageParcel& reply); + int HandleGetMainWindowStatesByPid(MessageParcel& data, MessageParcel& reply); int HandleGetSessionInfo(MessageParcel& data, MessageParcel& reply); int HandleGetSessionInfoByContinueSessionId(MessageParcel& data, MessageParcel& reply); int HandleSetSessionContinueState(MessageParcel& data, MessageParcel& reply); diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index 1a923062df..a74756c853 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -5966,6 +5966,39 @@ WSError SceneSessionManager::GetSessionInfos(const std::string& deviceId, int32_ return taskScheduler_->PostSyncTask(task, "GetSessionInfos"); } +WSError SceneSessionManager::GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) +{ + TLOGI(WmsLogTag::WMS_LIFE, "pid:%{public}d", pid); + if (!SessionPermission::JudgeCallerIsAllowedToUseSystemAPI()) { + TLOGE(WmsLogTag::WMS_LIFE, "The caller is not system-app, can not use system-api"); + return WSError::WS_ERROR_NOT_SYSTEM_APP; + } + if (pid < 0) { + return WSError::WS_ERROR_INVALID_PARAM; + } + auto task = [this, pid, &windowStates]() { + std::map> sceneSessionMapCopy; + { + std::shared_lock lock(sceneSessionMapMutex_); + sceneSessionMapCopy = sceneSessionMap_; + } + for (const auto& elem : sceneSessionMapCopy) { + auto sceneSession = elem.second; + if (sceneSession != nullptr && sceneSession->GetCallingPid() == pid && + WindowHelper::IsMainWindow(sceneSession->GetWindowType())) { + MainWindowState windowState; + windowState.state_ = static_cast(sceneSession->GetSessionState()); + windowState.isVisible_ = sceneSession->GetRSVisible(); + windowState.isForegroundInteractive_ = sceneSession->GetForegroundInteractiveStatus(); + windowState.isPcOrPadEnableActivation_ = sceneSession->IsPcOrPadEnableActivation(); + windowStates.emplace_back(windowState); + } + } + return WSError::WS_OK; + }; + return taskScheduler_->PostSyncTask(task, "GetMainWindowStatesByPid"); +} + int SceneSessionManager::GetRemoteSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) { diff --git a/window_scene/session_manager/src/scene_session_manager_lite.cpp b/window_scene/session_manager/src/scene_session_manager_lite.cpp index f85b13f778..9334cf2737 100644 --- a/window_scene/session_manager/src/scene_session_manager_lite.cpp +++ b/window_scene/session_manager/src/scene_session_manager_lite.cpp @@ -61,6 +61,11 @@ WSError SceneSessionManagerLite::GetSessionInfos(const std::string& deviceId, in return SceneSessionManager::GetInstance().GetSessionInfos(deviceId, numMax, sessionInfos); } +WSError SceneSessionManagerLite::GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) +{ + return SceneSessionManager::GetInstance().GetMainWindowStatesByPid(pid, windowStates); +} + WSError SceneSessionManagerLite::GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) { diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp index dca79e4fe9..090f9876b5 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp @@ -282,6 +282,34 @@ WSError SceneSessionManagerLiteProxy::GetSessionInfos(const std::string& deviceI return static_cast(reply.ReadInt32()); } +WSError SceneSessionManagerLiteProxy::GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) +{ + TLOGD(WmsLogTag::WMS_LIFE, "run"); + MessageParcel data; + MessageParcel reply; + MessageOption option(MessageOption::TF_SYNC); + if (!data.WriteInterfaceToken(GetDescriptor())) { + TLOGE(WmsLogTag::WMS_LIFE, "WriteInterfaceToken failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + if (!data.WriteInt32(pid)) { + TLOGE(WmsLogTag::WMS_LIFE, "write pid failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + if (Remote()->SendRequest( + static_cast(SceneSessionManagerLiteMessage::TRANS_ID_GET_MAIN_WINDOW_STATES_BY_PID), + data, reply, option) != ERR_NONE) { + TLOGE(WmsLogTag::WMS_LIFE, "SendRequest failed"); + return WSError::WS_ERROR_IPC_FAILED; + } + WSError error = GetParcelableInfos(reply, windowStates); + if (error != WSError::WS_OK) { + TLOGE(WmsLogTag::WMS_LIFE, "GetWindowStates error"); + return error; + } + return static_cast(reply.ReadInt32()); +} + WSError SceneSessionManagerLiteProxy::GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) { diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp index 1f267f329e..337ccd6413 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp @@ -62,6 +62,8 @@ int SceneSessionManagerLiteStub::ProcessRemoteRequest(uint32_t code, MessageParc return HandleUnRegisterSessionListener(data, reply); case static_cast(SceneSessionManagerLiteMessage::TRANS_ID_GET_MISSION_INFOS): return HandleGetSessionInfos(data, reply); + case static_cast(SceneSessionManagerLiteMessage::TRANS_ID_GET_MAIN_WINDOW_STATES_BY_PID): + return HandleGetMainWindowStatesByPid(data, reply); case static_cast(SceneSessionManagerLiteMessage::TRANS_ID_GET_MISSION_INFO_BY_ID): return HandleGetSessionInfo(data, reply); case static_cast(SceneSessionManagerLiteMessage::TRANS_ID_GET_SESSION_INFO_BY_CONTINUE_SESSION_ID): @@ -233,6 +235,28 @@ int SceneSessionManagerLiteStub::HandleGetSessionInfos(MessageParcel& data, Mess return ERR_NONE; } +int SceneSessionManagerLiteStub::HandleGetMainWindowStatesByPid(MessageParcel& data, MessageParcel& reply) +{ + int32_t pid = 0; + if (!data.ReadInt32(pid)) { + TLOGE(WmsLogTag::WMS_LIFE, "read pid fail"); + return ERR_INVALID_DATA; + } + std::vector windowStates; + WSError errCode = GetMainWindowStatesByPid(pid, windowStates); + reply.WriteInt32(windowStates.size()); + for (auto& it : windowStates) { + if (!reply.WriteParcelable(&it)) { + TLOGE(WmsLogTag::WMS_LIFE, "write windowState fail"); + return ERR_INVALID_DATA; + } + } + if (!reply.WriteInt32(static_cast(errCode))) { + return ERR_INVALID_DATA; + } + return ERR_NONE; +} + int SceneSessionManagerLiteStub::HandleGetSessionInfo(MessageParcel& data, MessageParcel& reply) { WLOGFD("run HandleGetSessionInfo!"); diff --git a/window_scene/test/unittest/scene_session_manager_lite_stub_test.cpp b/window_scene/test/unittest/scene_session_manager_lite_stub_test.cpp index 19b6f15c33..fc991d28ed 100644 --- a/window_scene/test/unittest/scene_session_manager_lite_stub_test.cpp +++ b/window_scene/test/unittest/scene_session_manager_lite_stub_test.cpp @@ -65,6 +65,10 @@ class MockSceneSessionManagerLiteStub : public SceneSessionManagerLiteStub { { return WSError::WS_OK; } + WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) override + { + return WSError::WS_OK; + } WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) override { return WSError::WS_OK; @@ -341,6 +345,20 @@ HWTEST_F(SceneSessionManagerLiteStubTest, HandleGetSessionInfos, Function | Smal EXPECT_EQ(ERR_NONE, res); } +/** + * @tc.name: HandleGetMainWindowStatesByPid + * @tc.desc: test function : HandleGetMainWindowStatesByPid + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionManagerLiteStubTest, HandleGetMainWindowStatesByPid, Function | SmallTest | Level1) +{ + MessageParcel data; + MessageParcel reply; + auto res = sceneSessionManagerLiteStub_-> + SceneSessionManagerLiteStub::HandleGetMainWindowStatesByPid(data, reply); + EXPECT_EQ(ERR_NONE, res); +} + /** * @tc.name: HandleGetSessionInfo * @tc.desc: test function : HandleGetSessionInfo diff --git a/window_scene/test/unittest/scene_session_manager_test.cpp b/window_scene/test/unittest/scene_session_manager_test.cpp index 4341f2f706..436cf724c2 100644 --- a/window_scene/test/unittest/scene_session_manager_test.cpp +++ b/window_scene/test/unittest/scene_session_manager_test.cpp @@ -262,6 +262,19 @@ HWTEST_F(SceneSessionManagerTest, GetSessionInfos, Function | SmallTest | Level3 ASSERT_NE(result01, ERR_OK); } +/** + * @tc.name: GetMainWindowStatesByPid + * @tc.desc: SceneSesionManager get main window states + * @tc.type: FUNC +*/ +HWTEST_F(SceneSessionManagerTest, GetMainWindowStatesByPid, Function | SmallTest | Level3) +{ + int32_t pid = 100; + std::vector windowStates{}; + WSError result = ssm_->GetMainWindowStatesByPid(pid, windowStates); + EXPECT_EQ(result, WSError::WS_ERROR_INVALID_PERMISSION); +} + /** * @tc.name: CheckIsRemote * @tc.desc: SceneSesionManager check is remote -- Gitee From 2b4ce9ac1656b4e088a983d3177cacdf6c2f829b Mon Sep 17 00:00:00 2001 From: tanliang Date: Sat, 31 Aug 2024 14:58:19 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tanliang --- interfaces/innerkits/wm/wm_common.h | 4 ++++ .../include/zidl/scene_session_manager_lite_proxy.h | 9 ++++++++- .../src/zidl/scene_session_manager_lite_proxy.cpp | 7 ++++++- .../src/zidl/scene_session_manager_lite_stub.cpp | 5 ++++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index 6d0036088c..ffb1a89d8b 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -535,15 +535,19 @@ struct MainWindowState : public Parcelable { return nullptr; } if (!parcel.ReadInt32(mainWindowState->state_)) { + delete mainWindowState; return nullptr; } if (!parcel.ReadBool(mainWindowState->isVisible_)) { + delete mainWindowState; return nullptr; } if (!parcel.ReadBool(mainWindowState->isForegroundInteractive_)) { + delete mainWindowState; return nullptr; } if (!parcel.ReadBool(mainWindowState->isPcOrPadEnableActivation_)) { + delete mainWindowState; return nullptr; } return mainWindowState; diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h b/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h index f2ee38027c..7ca7699eaa 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_lite_proxy.h @@ -38,7 +38,14 @@ public: WSError UnRegisterSessionListener(const sptr& listener) override; WSError GetSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) override; - // Obtains main window state list by pid + /** + * @brief Obtains main window state list by pid + * @caller SA + * @permission SA permission + * + * @param pid Target pid + * @param windowStates Window state list + */ WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) override; WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) override; WSError GetSessionInfoByContinueSessionId(const std::string& continueSessionId, diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp index 090f9876b5..5eebc75306 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_lite_proxy.cpp @@ -285,6 +285,11 @@ WSError SceneSessionManagerLiteProxy::GetSessionInfos(const std::string& deviceI WSError SceneSessionManagerLiteProxy::GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) { TLOGD(WmsLogTag::WMS_LIFE, "run"); + sptr remote = Remote(); + if (remote == nullptr) { + TLOGE(WmsLogTag::WMS_LIFE, "remote is nullptr"); + return WSError::WS_ERROR_IPC_FAILED; + } MessageParcel data; MessageParcel reply; MessageOption option(MessageOption::TF_SYNC); @@ -296,7 +301,7 @@ WSError SceneSessionManagerLiteProxy::GetMainWindowStatesByPid(int32_t pid, std: TLOGE(WmsLogTag::WMS_LIFE, "write pid failed"); return WSError::WS_ERROR_IPC_FAILED; } - if (Remote()->SendRequest( + if (remote->SendRequest( static_cast(SceneSessionManagerLiteMessage::TRANS_ID_GET_MAIN_WINDOW_STATES_BY_PID), data, reply, option) != ERR_NONE) { TLOGE(WmsLogTag::WMS_LIFE, "SendRequest failed"); diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp index 337ccd6413..c571460a8a 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp @@ -244,7 +244,10 @@ int SceneSessionManagerLiteStub::HandleGetMainWindowStatesByPid(MessageParcel& d } std::vector windowStates; WSError errCode = GetMainWindowStatesByPid(pid, windowStates); - reply.WriteInt32(windowStates.size()); + if (!reply.WriteInt32(windowStates.size())) { + TLOGE(WmsLogTag::WMS_LIFE, "write windowStates size fail"); + return ERR_INVALID_DATA; + } for (auto& it : windowStates) { if (!reply.WriteParcelable(&it)) { TLOGE(WmsLogTag::WMS_LIFE, "write windowState fail"); -- Gitee From 74f715fa0816d49cc9688f712d5bf92a9d30c4bc Mon Sep 17 00:00:00 2001 From: tanliang Date: Sat, 31 Aug 2024 16:46:08 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tanliang --- interfaces/innerkits/wm/wm_common.h | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index ffb1a89d8b..2ccf809fac 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -511,7 +511,7 @@ struct MainWindowInfo : public Parcelable { * @brief main window state info. */ struct MainWindowState : public Parcelable { - virtual bool Marshalling(Parcel &parcel) const override + bool Marshalling(Parcel &parcel) const override { if (!parcel.WriteInt32(state_)) { return false; @@ -530,23 +530,14 @@ struct MainWindowState : public Parcelable { static MainWindowState* Unmarshalling(Parcel& parcel) { - MainWindowState* mainWindowState = new (std::nothrow)MainWindowState(); + MainWindowState* mainWindowState = new MainWindowState(); if (!mainWindowState) { return nullptr; } - if (!parcel.ReadInt32(mainWindowState->state_)) { - delete mainWindowState; - return nullptr; - } - if (!parcel.ReadBool(mainWindowState->isVisible_)) { - delete mainWindowState; - return nullptr; - } - if (!parcel.ReadBool(mainWindowState->isForegroundInteractive_)) { - delete mainWindowState; - return nullptr; - } - if (!parcel.ReadBool(mainWindowState->isPcOrPadEnableActivation_)) { + if (!parcel.ReadInt32(mainWindowState->state_) || + !parcel.ReadBool(mainWindowState->isVisible_) || + !parcel.ReadBool(mainWindowState->isForegroundInteractive_) || + !parcel.ReadBool(mainWindowState->isPcOrPadEnableActivation_)) { delete mainWindowState; return nullptr; } -- Gitee From 89e1e77e86aadfe14ad814683436790251621e54 Mon Sep 17 00:00:00 2001 From: tanliang Date: Sat, 31 Aug 2024 20:18:37 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A3=80=E8=A7=86?= =?UTF-8?q?=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: tanliang --- interfaces/innerkits/wm/wm_common.h | 2 +- .../zidl/scene_session_manager_lite_interface.h | 10 +++++++++- .../src/scene_session_manager.cpp | 17 ++++++----------- .../zidl/scene_session_manager_lite_stub.cpp | 4 ++-- .../unittest/scene_session_manager_test.cpp | 4 ++-- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index 2ccf809fac..eca1281646 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -511,7 +511,7 @@ struct MainWindowInfo : public Parcelable { * @brief main window state info. */ struct MainWindowState : public Parcelable { - bool Marshalling(Parcel &parcel) const override + bool Marshalling(Parcel& parcel) const override { if (!parcel.WriteInt32(state_)) { return false; diff --git a/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h b/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h index 934c1954c7..353851338b 100644 --- a/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h +++ b/window_scene/session_manager/include/zidl/scene_session_manager_lite_interface.h @@ -94,7 +94,6 @@ public: virtual WSError GetSessionInfos(const std::string& deviceId, int32_t numMax, std::vector& sessionInfos) = 0; virtual WSError GetSessionInfo(const std::string& deviceId, int32_t persistentId, SessionInfoBean& sessionInfo) = 0; - virtual WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) = 0; virtual WSError GetSessionInfoByContinueSessionId(const std::string& continueSessionId, SessionInfoBean& sessionInfo) = 0; virtual WSError SetSessionContinueState(const sptr& token, const ContinueState& continueState) = 0; @@ -114,6 +113,15 @@ public: const sptr& impl) = 0; virtual WSError UnregisterIAbilityManagerCollaborator(int32_t type) = 0; virtual WMError GetWindowStyleType(WindowStyleType& windowStyleType) = 0; + /** + * @brief Obtains main window state list by pid + * @caller SA + * @permission SA permission + * + * @param pid Target pid + * @param windowStates Window state list + */ + virtual WSError GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) = 0; }; } // namespace OHOS::Rosen #endif // OHOS_ROSEN_WINDOW_SCENE_SESSION_MANAGER_LITE_INTERFACE_H diff --git a/window_scene/session_manager/src/scene_session_manager.cpp b/window_scene/session_manager/src/scene_session_manager.cpp index a74756c853..70f8e5cbe6 100644 --- a/window_scene/session_manager/src/scene_session_manager.cpp +++ b/window_scene/session_manager/src/scene_session_manager.cpp @@ -5969,21 +5969,16 @@ WSError SceneSessionManager::GetSessionInfos(const std::string& deviceId, int32_ WSError SceneSessionManager::GetMainWindowStatesByPid(int32_t pid, std::vector& windowStates) { TLOGI(WmsLogTag::WMS_LIFE, "pid:%{public}d", pid); - if (!SessionPermission::JudgeCallerIsAllowedToUseSystemAPI()) { - TLOGE(WmsLogTag::WMS_LIFE, "The caller is not system-app, can not use system-api"); - return WSError::WS_ERROR_NOT_SYSTEM_APP; + if (!SessionPermission::IsSACalling() && !SessionPermission::IsShellCall()) { + TLOGE(WmsLogTag::WMS_LIFE, "Get all mainWindow states failed, only support SA calling."); + return WSError::WS_ERROR_INVALID_PERMISSION; } if (pid < 0) { return WSError::WS_ERROR_INVALID_PARAM; } - auto task = [this, pid, &windowStates]() { - std::map> sceneSessionMapCopy; - { - std::shared_lock lock(sceneSessionMapMutex_); - sceneSessionMapCopy = sceneSessionMap_; - } - for (const auto& elem : sceneSessionMapCopy) { - auto sceneSession = elem.second; + auto task = [this, pid, &windowStates] { + std::shared_lock lock(sceneSessionMapMutex_); + for (const auto& [_, sceneSession] : sceneSessionMap_) { if (sceneSession != nullptr && sceneSession->GetCallingPid() == pid && WindowHelper::IsMainWindow(sceneSession->GetWindowType())) { MainWindowState windowState; diff --git a/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp b/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp index c571460a8a..333d10ee5c 100644 --- a/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp +++ b/window_scene/session_manager/src/zidl/scene_session_manager_lite_stub.cpp @@ -248,8 +248,8 @@ int SceneSessionManagerLiteStub::HandleGetMainWindowStatesByPid(MessageParcel& d TLOGE(WmsLogTag::WMS_LIFE, "write windowStates size fail"); return ERR_INVALID_DATA; } - for (auto& it : windowStates) { - if (!reply.WriteParcelable(&it)) { + for (auto& state : windowStates) { + if (!reply.WriteParcelable(&state)) { TLOGE(WmsLogTag::WMS_LIFE, "write windowState fail"); return ERR_INVALID_DATA; } diff --git a/window_scene/test/unittest/scene_session_manager_test.cpp b/window_scene/test/unittest/scene_session_manager_test.cpp index 436cf724c2..eff6b883a5 100644 --- a/window_scene/test/unittest/scene_session_manager_test.cpp +++ b/window_scene/test/unittest/scene_session_manager_test.cpp @@ -266,11 +266,11 @@ HWTEST_F(SceneSessionManagerTest, GetSessionInfos, Function | SmallTest | Level3 * @tc.name: GetMainWindowStatesByPid * @tc.desc: SceneSesionManager get main window states * @tc.type: FUNC -*/ + */ HWTEST_F(SceneSessionManagerTest, GetMainWindowStatesByPid, Function | SmallTest | Level3) { int32_t pid = 100; - std::vector windowStates{}; + std::vector windowStates; WSError result = ssm_->GetMainWindowStatesByPid(pid, windowStates); EXPECT_EQ(result, WSError::WS_ERROR_INVALID_PERMISSION); } -- Gitee