From 808e617c15768aa443180b05437b3b0cfbc0ff36 Mon Sep 17 00:00:00 2001 From: Grady Date: Thu, 24 Feb 2022 09:00:30 +0800 Subject: [PATCH] modify surface nullptr Signed-off-by: Grady Change-Id: I9736a6e48cfde5cb35354a2dcdc9dece1f3212b5 --- dm/test/systemtest/display_test_utils.cpp | 5 +- dm/test/systemtest/screen_manager_test.cpp | 109 ++++++++++++------ dmserver/include/abstract_screen_controller.h | 2 +- dmserver/src/abstract_screen_controller.cpp | 88 ++++++++------ dmserver/src/display_manager_proxy.cpp | 39 +++++-- dmserver/src/display_manager_stub.cpp | 20 +++- 6 files changed, 172 insertions(+), 91 deletions(-) diff --git a/dm/test/systemtest/display_test_utils.cpp b/dm/test/systemtest/display_test_utils.cpp index 92709c18..d962a00e 100644 --- a/dm/test/systemtest/display_test_utils.cpp +++ b/dm/test/systemtest/display_test_utils.cpp @@ -31,6 +31,9 @@ DisplayTestUtils::~DisplayTestUtils() } WLOGFI("prevBuffer_ release success"); } + if (csurface_ != nullptr) { + csurface_->UnregisterConsumerListener(); + } csurface_ = nullptr; psurface_ = nullptr; listener_ = nullptr; @@ -86,7 +89,7 @@ bool DisplayTestUtils::CreateSurface() void DisplayTestUtils::OnVsync() { std::lock_guard lock(mutex_); - WLOGFI("DisplayTestUtils::OnVsyn"); + WLOGFI("DisplayTestUtils::OnVsync"); sptr cbuffer = nullptr; int32_t fence = -1; int64_t timestamp = 0; diff --git a/dm/test/systemtest/screen_manager_test.cpp b/dm/test/systemtest/screen_manager_test.cpp index bc0743ec..237149ab 100644 --- a/dm/test/systemtest/screen_manager_test.cpp +++ b/dm/test/systemtest/screen_manager_test.cpp @@ -38,7 +38,7 @@ public: static uint32_t defaultHeight_; static float defaultDensity_; static int32_t defaultFlags_; - static VirtualScreenOption defaultoption_; + static VirtualScreenOption defaultOption_; static uint32_t waitCount_; const uint32_t sleepUs_ = 10 * 1000; const uint32_t maxWaitCount_ = 2000; @@ -55,7 +55,7 @@ uint32_t ScreenManagerTest::defaultWidth_ = 480; uint32_t ScreenManagerTest::defaultHeight_ = 320; float ScreenManagerTest::defaultDensity_ = 2.0; int32_t ScreenManagerTest::defaultFlags_ = 0; -VirtualScreenOption ScreenManagerTest::defaultoption_ = { +VirtualScreenOption ScreenManagerTest::defaultOption_ = { defaultName_, defaultWidth_, defaultHeight_, defaultDensity_, nullptr, defaultFlags_ }; uint32_t ScreenManagerTest::waitCount_ = 0; @@ -67,8 +67,8 @@ void ScreenManagerTest::SetUpTestCase() defaultScreenId_ = defaultDisplay_->GetScreenId(); defaultWidth_ = defaultDisplay_->GetWidth(); defaultHeight_ = defaultDisplay_->GetHeight(); - defaultoption_.width_ = defaultWidth_; - defaultoption_.height_ = defaultHeight_; + defaultOption_.width_ = defaultWidth_; + defaultOption_.height_ = defaultHeight_; } void ScreenManagerTest::TearDownTestCase() @@ -112,8 +112,8 @@ HWTEST_F(ScreenManagerTest, ScreenManager01, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + defaultOption_.surface_ = utils.psurface_; + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); } @@ -127,8 +127,8 @@ HWTEST_F(ScreenManagerTest, ScreenManager02, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + defaultOption_.surface_ = utils.psurface_; + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); std::vector mirrorIds; mirrorIds.push_back(virtualScreenId); ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds); @@ -145,9 +145,9 @@ HWTEST_F(ScreenManagerTest, ScreenManager03, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; + defaultOption_.surface_ = utils.psurface_; for (uint32_t i = 0; i < execTimes_; i++) { - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); } @@ -162,9 +162,9 @@ HWTEST_F(ScreenManagerTest, ScreenManager04, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; + defaultOption_.surface_ = utils.psurface_; for (uint32_t i = 0; i < execTimes_; i++) { - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); std::vector mirrorIds; mirrorIds.push_back(virtualScreenId); ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds); @@ -183,8 +183,8 @@ HWTEST_F(ScreenManagerTest, ScreenManager05, Function | MediumTest | Level2) DisplayTestUtils utils; utils.SetDefaultWH(defaultDisplay_); ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + defaultOption_.surface_ = utils.psurface_; + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); uint32_t lastCount = -1u; @@ -203,14 +203,51 @@ HWTEST_F(ScreenManagerTest, ScreenManager05, Function | MediumTest | Level2) ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); ASSERT_GT(utils.successCount_, 0); ASSERT_GT(maxWaitCount_, waitCount_); + waitCount_ = 0; } /** * @tc.name: ScreenManager06 - * @tc.desc: Get and set screenMode + * @tc.desc: Compare the length and width for recording screen, set VirtualScreen Surface before make mirror. * @tc.type: FUNC */ HWTEST_F(ScreenManagerTest, ScreenManager06, Function | MediumTest | Level2) +{ + DisplayTestUtils utils; + utils.SetDefaultWH(defaultDisplay_); + defaultOption_.surface_ = nullptr; + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); + + ASSERT_TRUE(utils.CreateSurface()); + ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().SetVirtualScreenSurface(virtualScreenId, utils.psurface_)); + + uint32_t lastCount = -1u; + std::vector mirrorIds; + mirrorIds.push_back(virtualScreenId); + ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds); + + while (utils.successCount_ < acquireFrames_ && waitCount_ <= maxWaitCount_) { + if (lastCount != utils.successCount_) { + lastCount = utils.successCount_; + } + ASSERT_EQ(0, utils.failCount_); + waitCount_++; + usleep(sleepUs_); + } + DMError res = ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId); + ASSERT_EQ(DMError::DM_OK, res); + ASSERT_GT(utils.successCount_, 0); + ASSERT_GT(maxWaitCount_, waitCount_); + waitCount_ = 0; +} + +/** + * @tc.name: ScreenManager07 + * @tc.desc: Get and set screenMode + * @tc.type: FUNC + */ +HWTEST_F(ScreenManagerTest, ScreenManager07, Function | MediumTest | Level2) { sptr screen = ScreenManager::GetInstance().GetScreenById(defaultScreenId_); auto modes = screen->GetSupportedModes(); @@ -218,23 +255,25 @@ HWTEST_F(ScreenManagerTest, ScreenManager06, Function | MediumTest | Level2) ASSERT_GT(modes.size(), 0); for (uint32_t modeIdx = 0; modeIdx < modes.size(); modeIdx++) { ASSERT_EQ(true, screen->SetScreenActiveMode(modeIdx)); + sleep(TEST_SPEEP_S); ASSERT_EQ(modeIdx, screen->GetModeId()); } ASSERT_EQ(true, screen->SetScreenActiveMode(defaultModeId)); + sleep(TEST_SPEEP_S); } /** - * @tc.name: ScreenManager07 + * @tc.name: ScreenManager08 * @tc.desc: Create a virtual screen as expansion of default screen, and destroy virtual screen * @tc.type: FUNC */ -HWTEST_F(ScreenManagerTest, ScreenManager07, Function | MediumTest | Level2) +HWTEST_F(ScreenManagerTest, ScreenManager08, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - defaultoption_.isForShot_ = false; - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); sptr DefaultScreen = screens.front(); std::vector options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}}; @@ -244,18 +283,18 @@ HWTEST_F(ScreenManagerTest, ScreenManager07, Function | MediumTest | Level2) } /** - * @tc.name: ScreenManager08 + * @tc.name: ScreenManager09 * @tc.desc: Create a virtual screen as expansion of default screen, create windowNode on virtual screen, * and destroy virtual screen * @tc.type: FUNC */ -HWTEST_F(ScreenManagerTest, ScreenManager08, Function | MediumTest | Level2) +HWTEST_F(ScreenManagerTest, ScreenManager09, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - defaultoption_.isForShot_ = false; - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); std::vector> screens = ScreenManager::GetInstance().GetAllScreens(); sptr DefaultScreen = screens.front(); DisplayId virtualDisplayId = DISPLAY_ID_INVALD; @@ -279,18 +318,18 @@ HWTEST_F(ScreenManagerTest, ScreenManager08, Function | MediumTest | Level2) } /** - * @tc.name: ScreenManager09 + * @tc.name: ScreenManager10 * @tc.desc: Create a virtual screen and destroy it for 10 times, it's not for shot. * @tc.type: FUNC */ -HWTEST_F(ScreenManagerTest, ScreenManager09, Function | MediumTest | Level2) +HWTEST_F(ScreenManagerTest, ScreenManager10, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - defaultoption_.isForShot_ = false; + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; for (uint32_t i = 0; i < execTimes_; i++) { - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); auto screen = ScreenManager::GetInstance().GetScreenById(virtualScreenId); ASSERT_EQ(virtualScreenId, screen->GetId()); @@ -300,18 +339,18 @@ HWTEST_F(ScreenManagerTest, ScreenManager09, Function | MediumTest | Level2) } /** - * @tc.name: ScreenManager10 + * @tc.name: ScreenManager11 * @tc.desc: Create a virtual screen , mirror and destroy it for 10 times, it's not for shot. * @tc.type: FUNC */ -HWTEST_F(ScreenManagerTest, ScreenManager10, Function | MediumTest | Level2) +HWTEST_F(ScreenManagerTest, ScreenManager11, Function | MediumTest | Level2) { DisplayTestUtils utils; ASSERT_TRUE(utils.CreateSurface()); - defaultoption_.surface_ = utils.psurface_; - defaultoption_.isForShot_ = false; + defaultOption_.surface_ = utils.psurface_; + defaultOption_.isForShot_ = false; for (uint32_t i = 0; i < 10; i++) { - ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); + ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_); std::vector mirrorIds; mirrorIds.push_back(virtualScreenId); ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds); diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index 4de2b39f..83b2c3a9 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -84,7 +84,7 @@ private: bool CheckScreenInScreenGroup(sptr newScreen) const; sptr AddAsFirstScreenLocked(sptr newScreen); sptr AddAsSuccedentScreenLocked(sptr newScreen); - void ProcessScreenModeChanged(ScreenId rsScreenId); + void ProcessScreenModeChanged(ScreenId dmsScreenId); std::recursive_mutex& mutex_; OHOS::Rosen::RSInterfaces& rsInterface_; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index 0c611ef3..1a5c6a6f 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -248,32 +248,6 @@ void AbstractScreenController::ScreenConnectionInDisplayInit(sptrsecond; - auto dmsScreenMapIter = dmsScreenMap_.find(dmsScreenId); - if (dmsScreenMapIter == dmsScreenMap_.end()) { - WLOGE("ProcessScreenModeChanged: no dms screen is found, rsscreenId=%{public}" PRIu64"", rsScreenId); - return; - } - // should be called by OnRsScreenConnectionChange - // if not, the recursive_mutex should be added - std::lock_guard lock(mutex_); - sptr absScreen = dmsScreenMapIter->second; - if (abstractScreenCallback_ != nullptr) { - abstractScreenCallback_->onChange_(absScreen, DisplayChangeEvent::DISPLAY_SIZE_CHANGED); - } - DisplayManagerAgentController::GetInstance().OnScreenChange( - absScreen->ConvertToScreenInfo(), ScreenChangeEvent::CHANGE_MODE); -} - void AbstractScreenController::ProcessScreenDisconnected(ScreenId rsScreenId) { WLOGI("disconnect screen, screenId=%{public}" PRIu64"", rsScreenId); @@ -495,7 +469,11 @@ DMError AbstractScreenController::DestroyVirtualScreen(ScreenId screenId) DMError AbstractScreenController::SetVirtualScreenSurface(ScreenId screenId, sptr surface) { WLOGFI("AbstractScreenController::SetVirtualScreenSurface"); - int32_t res = rsInterface_.SetVirtualScreenSurface(screenId, surface); + int32_t res = -1; + auto iter = dms2RsScreenIdMap_.find(screenId); + if (iter != dms2RsScreenIdMap_.end()) { + res = rsInterface_.SetVirtualScreenSurface(iter->second, surface); + } if (res != 0) { WLOGE("SetVirtualScreenSurface failed in RenderService"); return DMError::DM_ERROR_RENDER_SERVICE_FAILED; @@ -605,18 +583,29 @@ bool AbstractScreenController::IsScreenGroup(ScreenId screenId) const bool AbstractScreenController::SetScreenActiveMode(ScreenId screenId, uint32_t modeId) { - WLOGI("SetScreenActiveMode: screenId: %{public}" PRIu64", modeId: %{public}u", screenId, modeId); - rsInterface_.SetScreenActiveMode(screenId, modeId); - auto screen = GetAbstractScreen(screenId); - if (screen == nullptr) { - WLOGFE("SetScreenActiveMode: Get AbstractScreen failed"); + WLOGI("SetScreenActiveMode: RsScreenId: %{public}" PRIu64", modeId: %{public}u", screenId, modeId); + if (screenId == SCREEN_ID_INVALID) { + WLOGFE("SetScreenActiveMode: invalid screenId"); return false; } - std::lock_guard lock(mutex_); - uint32_t usedModeId = static_cast(screen->activeIdx_); - screen->activeIdx_ = static_cast(modeId); + uint32_t usedModeId = 0; + { + std::lock_guard lock(mutex_); + auto iter = dms2RsScreenIdMap_.find(screenId); + if (iter == dms2RsScreenIdMap_.end()) { + WLOGFE("SetScreenActiveMode: No corresponding rsId"); + return false; + } + rsInterface_.SetScreenActiveMode(iter->second, modeId); + auto screen = GetAbstractScreen(screenId); + if (screen == nullptr) { + WLOGFE("SetScreenActiveMode: Get AbstractScreen failed"); + return false; + } + usedModeId = static_cast(screen->activeIdx_); + screen->activeIdx_ = static_cast(modeId); + } // add thread to process mode change sync event - // should be called by OnRsScreenChange if rs implement corresponding event callback if (usedModeId != modeId) { WLOGI("SetScreenActiveMode: modeId: %{public}u -> %{public}u", usedModeId, modeId); auto func = [=]() { @@ -629,6 +618,33 @@ bool AbstractScreenController::SetScreenActiveMode(ScreenId screenId, uint32_t m return true; } +void AbstractScreenController::ProcessScreenModeChanged(ScreenId dmsScreenId) +{ + WM_SCOPED_TRACE("dms:ProcessScreenModeChanged(%" PRIu64")", dmsScreenId); + sptr absScreen = nullptr; + sptr absScreenCallback = nullptr; + { + std::lock_guard lock(mutex_); + auto dmsScreenMapIter = dmsScreenMap_.find(dmsScreenId); + if (dmsScreenMapIter == dmsScreenMap_.end()) { + WLOGFE("dmsScreenId=%{public}" PRIu64" is not in dmsScreenMap", dmsScreenId); + return; + } + absScreen = GetAbstractScreen(dmsScreenId); + if (absScreen == nullptr) { + WLOGFE("screen is nullptr. dmsScreenId=%{public}" PRIu64"", dmsScreenId); + return; + } + absScreenCallback = abstractScreenCallback_; + } + + if (absScreenCallback != nullptr) { + absScreenCallback->onChange_(absScreen, DisplayChangeEvent::DISPLAY_SIZE_CHANGED); + } + DisplayManagerAgentController::GetInstance().OnScreenChange( + absScreen->ConvertToScreenInfo(), ScreenChangeEvent::CHANGE_MODE); +} + bool AbstractScreenController::MakeMirror(ScreenId screenId, std::vector screens) { WLOGI("AbstractScreenController::MakeMirror, screenId:%{public}" PRIu64"", screenId); diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index d050ca2b..1b961585 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -88,7 +88,7 @@ ScreenId DisplayManagerProxy::CreateVirtualScreen(VirtualScreenOption virtualOpt { sptr remote = Remote(); if (remote == nullptr) { - WLOGFW("DisplayManagerProxy::CreateVirtualScreen: remote is nullptr"); + WLOGFW("CreateVirtualScreen: remote is nullptr"); return SCREEN_ID_INVALID; } @@ -96,24 +96,31 @@ ScreenId DisplayManagerProxy::CreateVirtualScreen(VirtualScreenOption virtualOpt MessageParcel reply; MessageOption option; if (!data.WriteInterfaceToken(GetDescriptor())) { - WLOGFE("DisplayManagerProxy::CreateVirtualScreen: WriteInterfaceToken failed"); + WLOGFE("CreateVirtualScreen: WriteInterfaceToken failed"); return SCREEN_ID_INVALID; } bool res = data.WriteString(virtualOption.name_) && data.WriteUint32(virtualOption.width_) && data.WriteUint32(virtualOption.height_) && data.WriteFloat(virtualOption.density_) && - data.WriteRemoteObject(virtualOption.surface_->GetProducer()->AsObject()) && data.WriteInt32(virtualOption.flags_) && data.WriteBool(virtualOption.isForShot_); + if (virtualOption.surface_ != nullptr && virtualOption.surface_->GetProducer() != nullptr) { + res = res && + data.WriteBool(true) && + data.WriteRemoteObject(virtualOption.surface_->GetProducer()->AsObject()); + } else { + WLOGFW("CreateVirtualScreen: surface is nullptr"); + res = res && data.WriteBool(false); + } if (!res) { - WLOGFE("DisplayManagerProxy::Write data failed"); + WLOGFE("Write data failed"); return SCREEN_ID_INVALID; } if (remote->SendRequest(TRANS_ID_CREATE_VIRTUAL_SCREEN, data, reply, option) != ERR_NONE) { - WLOGFW("DisplayManagerProxy::CreateVirtualScreen: SendRequest failed"); + WLOGFW("CreateVirtualScreen: SendRequest failed"); return SCREEN_ID_INVALID; } ScreenId screenId = static_cast(reply.ReadUint64()); - WLOGFI("DisplayManagerProxy::CreateVirtualScreen %" PRIu64"", screenId); + WLOGFI("CreateVirtualScreen %" PRIu64"", screenId); return screenId; } @@ -121,7 +128,7 @@ DMError DisplayManagerProxy::DestroyVirtualScreen(ScreenId screenId) { sptr remote = Remote(); if (remote == nullptr) { - WLOGFW("DisplayManagerProxy::DestroyVirtualScreen: remote is nullptr"); + WLOGFW("DestroyVirtualScreen: remote is nullptr"); return DMError::DM_ERROR_REMOTE_CREATE_FAILED; } @@ -129,15 +136,15 @@ DMError DisplayManagerProxy::DestroyVirtualScreen(ScreenId screenId) MessageParcel reply; MessageOption option; if (!data.WriteInterfaceToken(GetDescriptor())) { - WLOGFE("DisplayManagerProxy::DestroyVirtualScreen: WriteInterfaceToken failed"); + WLOGFE("DestroyVirtualScreen: WriteInterfaceToken failed"); return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED; } if (!data.WriteUint64(static_cast(screenId))) { - WLOGFW("DisplayManagerProxy::DestroyVirtualScreen: WriteUint64 screenId failed"); + WLOGFW("DestroyVirtualScreen: WriteUint64 screenId failed"); return DMError::DM_ERROR_IPC_FAILED; } if (remote->SendRequest(TRANS_ID_DESTROY_VIRTUAL_SCREEN, data, reply, option) != ERR_NONE) { - WLOGFW("DisplayManagerProxy::DestroyVirtualScreen: SendRequest failed"); + WLOGFW("DestroyVirtualScreen: SendRequest failed"); return DMError::DM_ERROR_IPC_FAILED; } return static_cast(reply.ReadInt32()); @@ -158,8 +165,16 @@ DMError DisplayManagerProxy::SetVirtualScreenSurface(ScreenId screenId, sptr(screenId)) || - !data.WriteRemoteObject(surface->GetProducer()->AsObject())) { + bool res = data.WriteUint64(static_cast(screenId)); + if (surface != nullptr && surface->GetProducer() != nullptr) { + res = res && + data.WriteBool(true) && + data.WriteRemoteObject(surface->GetProducer()->AsObject()); + } else { + WLOGFW("SetVirtualScreenSurface: surface is nullptr"); + res = res && data.WriteBool(false); + } + if (!res) { WLOGFW("SetVirtualScreenSurface: Write screenId/surface failed"); return DMError::DM_ERROR_IPC_FAILED; } diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index ca880198..077c949f 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -53,11 +53,15 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, uint32_t width = data.ReadUint32(); uint32_t height = data.ReadUint32(); float density = data.ReadFloat(); - sptr surfaceObject = data.ReadRemoteObject(); - sptr bp = iface_cast(surfaceObject); - sptr surface = Surface::CreateSurfaceAsProducer(bp); int32_t flags = data.ReadInt32(); bool isForShot = data.ReadBool(); + bool isSurfaceValid = data.ReadBool(); + sptr surface = nullptr; + if (isSurfaceValid) { + sptr surfaceObject = data.ReadRemoteObject(); + sptr bp = iface_cast(surfaceObject); + surface = Surface::CreateSurfaceAsProducer(bp); + } VirtualScreenOption option = { .name_ = name, .width_ = width, @@ -79,9 +83,13 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, } case TRANS_ID_SET_VIRTUAL_SCREEN_SURFACE: { ScreenId screenId = static_cast(data.ReadUint64()); - sptr surfaceObject = data.ReadRemoteObject(); - sptr bp = iface_cast(surfaceObject); - sptr surface = Surface::CreateSurfaceAsProducer(bp); + bool isSurfaceValid = data.ReadBool(); + sptr surface = nullptr; + if (isSurfaceValid) { + sptr surfaceObject = data.ReadRemoteObject(); + sptr bp = iface_cast(surfaceObject); + surface = Surface::CreateSurfaceAsProducer(bp); + } DMError result = SetVirtualScreenSurface(screenId, surface); reply.WriteInt32(static_cast(result)); break;