diff --git a/screenhandler/include/dscreen_handler.h b/screenhandler/include/dscreen_handler.h index 5dae8783eab0f8f64f394148d511630e76e177d0..21acd978d3da387734eb107602b3f240c23fa2c4 100644 --- a/screenhandler/include/dscreen_handler.h +++ b/screenhandler/include/dscreen_handler.h @@ -23,25 +23,32 @@ namespace OHOS { namespace DistributedHardware { -class DScreenHandler : public IHardwareHandler, public Rosen::ScreenManager::IScreenListener { -DECLARE_SINGLE_INSTANCE_BASE(DScreenHandler); +class ScreenListener : public Rosen::ScreenManager::IScreenListener { public: void OnConnect(uint64_t screenId) override; void OnDisconnect(uint64_t screenId) override; void OnChange(uint64_t screenId) override {}; +}; + +class DScreenHandler : public IHardwareHandler { +DECLARE_SINGLE_INSTANCE_BASE(DScreenHandler); +public: int32_t Initialize() override; std::vector Query() override; std::map QueryExtraInfo() override; bool IsSupportPlugin() override; void RegisterPluginListener(std::shared_ptr listener) override; + void PluginHardware(const std::string &dhId, const std::string &attr); + void UnPluginHardware(const std::string &dhId); + std::string QueryCodecInfo(); private: DScreenHandler(); ~DScreenHandler(); - std::string QueryCodecInfo(); std::shared_ptr listener_ = nullptr; std::string codecInfoStr_; + sptr screenListener_ = nullptr; }; #ifdef __cplusplus diff --git a/screenhandler/src/dscreen_handler.cpp b/screenhandler/src/dscreen_handler.cpp index 7da13653eaa1f0933c422c70d9866f92c9e55aad..1f6326827344eb9622ea28d9a7d0f95be68b2548 100644 --- a/screenhandler/src/dscreen_handler.cpp +++ b/screenhandler/src/dscreen_handler.cpp @@ -39,26 +39,36 @@ DScreenHandler::DScreenHandler() DScreenHandler::~DScreenHandler() { DHLOGI("~DScreenHandler"); + Rosen::ScreenManager::GetInstance().UnregisterScreenListener(screenListener_); } int32_t DScreenHandler::Initialize() { DHLOGI("DScreenHandler Initialize"); - bool ret = Rosen::ScreenManager::GetInstance().RegisterScreenListener(this); + if (!screenListener_) { + screenListener_ = new ScreenListener(); + } + bool ret = Rosen::ScreenManager::GetInstance().RegisterScreenListener(screenListener_); if (!ret) { DHLOGE("register screen listener failed."); } return DH_SUCCESS; } -void DScreenHandler::OnConnect(uint64_t screenId) +void ScreenListener::OnConnect(uint64_t screenId) { DHLOGI("on screen connect"); if (screenId != SCREEN_ID_DEFAULT) { return; } - std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screenId); sptr screen = Rosen::ScreenManager::GetInstance().GetScreenById(screenId); + if (screen == nullptr) { + DHLOGE("screen not found, screenId: %ulld", screenId); + return; + } + + std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screenId); + uint32_t screenWidth = screen->GetWidth(); uint32_t screenHeight = screen->GetHeight(); @@ -66,17 +76,27 @@ void DScreenHandler::OnConnect(uint64_t screenId) attrJson[KEY_VERSION] = DSCREEN_VERSION; attrJson[KEY_SCREEN_WIDTH] = screenWidth; attrJson[KEY_SCREEN_HEIGHT] = screenHeight; - attrJson[KEY_CODECTYPE] = QueryCodecInfo(); + attrJson[KEY_CODECTYPE] = DScreenHandler::GetInstance().QueryCodecInfo(); - if (listener_ != nullptr) { - listener_->PluginHardware(dhId, attrJson.dump()); - } + DScreenHandler::GetInstance().PluginHardware(dhId, attrJson.dump()); } -void DScreenHandler::OnDisconnect(uint64_t screenId) +void ScreenListener::OnDisconnect(uint64_t screenId) { DHLOGI("on screen disconnect"); std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screenId); + DScreenHandler::GetInstance().UnPluginHardware(dhId); +} + +void DScreenHandler::PluginHardware(const std::string &dhId, const std::string &attr) +{ + if (listener_ != nullptr) { + listener_->PluginHardware(dhId, attr); + } +} + +void DScreenHandler::UnPluginHardware(const std::string &dhId) +{ if (listener_ != nullptr) { listener_->UnPluginHardware(dhId); } diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index a32ec75c76505e79060cd322037e4c8b888c40a3..9af60db09ed7ff1ad2c1cf88c599010a5e2fb329 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h @@ -36,12 +36,14 @@ public: int32_t status, const std::string &data) override; }; -class DScreenManager : public Rosen::ScreenManager::IScreenGroupListener, - public std::enable_shared_from_this { -DECLARE_SINGLE_INSTANCE_BASE(DScreenManager); +class DScreenGroupListener : public Rosen::ScreenManager::IScreenGroupListener { public: void OnChange(const std::vector &screenIds, Rosen::ScreenGroupChangeEvent event) override; +}; +class DScreenManager { +DECLARE_SINGLE_INSTANCE_BASE(DScreenManager); +public: void OnRegResult(const std::shared_ptr &dScreen, const std::string &reqId, int32_t status, const std::string &data); void OnUnregResult(const std::shared_ptr &dScreen, const std::string &reqId, @@ -54,6 +56,8 @@ public: int32_t DisableDistributedScreen(const std::string &devId, const std::string &dhId, const std::string &reqId); void HandleDScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent); void RegisterDScreenCallback(const sptr &callback); + void HandleScreenChange(const std::shared_ptr &changedScreen, Rosen::ScreenGroupChangeEvent event); + std::shared_ptr FindDScreenByScreenId(uint64_t screenId); private: ~DScreenManager(); @@ -63,10 +67,9 @@ private: std::map> mapRelations_; std::map> dScreens_; sptr dScreenSourceCallbackProxy_ = nullptr; + sptr dScreenGroupListener_ = nullptr; std::shared_ptr dScreenCallback_ = nullptr; - void HandleScreenChange(const std::shared_ptr &changedScreen, Rosen::ScreenGroupChangeEvent event); - std::shared_ptr FindDScreenByScreenId(uint64_t screenId); sptr GetDScreenSinkSA(const std::string &devId); int32_t NotifyRemoteScreenService(const std::string &devId, int32_t eventCode, const std::string &eventContent); void NotifyRemoteSinkSetUp(const std::shared_ptr &dScreen); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index 6d7c308b045b1d8150ccbe0a294a31f242d3c40b..1b5ceb49c69904f2db1958330fbeaed9c9132c8c 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -44,7 +44,10 @@ DScreenManager::~DScreenManager() int32_t DScreenManager::Init() { DHLOGI("DScreenManager::Init"); - int32_t ret = ScreenMgrAdapter::GetInstance().RegisterScreenGroupListener(this); + if (dScreenGroupListener_ == nullptr) { + dScreenGroupListener_ = new DScreenGroupListener(); + } + int32_t ret = ScreenMgrAdapter::GetInstance().RegisterScreenGroupListener(dScreenGroupListener_); if (ret != DH_SUCCESS) { DHLOGE("DScreenManager Init failed, err: %d", ret); } @@ -57,11 +60,17 @@ int32_t DScreenManager::Init() int32_t DScreenManager::UnInit() { DHLOGI("DScreenManager::UnInit"); - int32_t ret = ScreenMgrAdapter::GetInstance().UnregisterScreenGroupListener(this); + int32_t ret = DH_SUCCESS; + if (dScreenGroupListener_ != nullptr) { + ret = ScreenMgrAdapter::GetInstance().UnregisterScreenGroupListener(dScreenGroupListener_); + } + if (ret != DH_SUCCESS) { DHLOGE("DScreenManager UnInit failed, err: %d", ret); } dScreenCallback_ = nullptr; + dScreenSourceCallbackProxy_ = nullptr; + dScreenGroupListener_ = nullptr; { std::lock_guard lock(dScreenMapMtx_); @@ -76,17 +85,17 @@ int32_t DScreenManager::UnInit() return ret; } -void DScreenManager::OnChange(const std::vector &screenIds, Rosen::ScreenGroupChangeEvent event) +void DScreenGroupListener::OnChange(const std::vector &screenIds, Rosen::ScreenGroupChangeEvent event) { DHLOGI("On Screen change, screenIds size: %d", screenIds.size()); for (uint64_t screenId : screenIds) { std::shared_ptr changedScreen = nullptr; - changedScreen = FindDScreenByScreenId(screenId); + changedScreen = DScreenManager::GetInstance().FindDScreenByScreenId(screenId); if (!changedScreen) { DHLOGD("screen change not about remote screen, screenId: %ulld", screenId); continue; } - HandleScreenChange(changedScreen, event); + DScreenManager::GetInstance().HandleScreenChange(changedScreen, event); } } diff --git a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h index b2731fb9eacdc5a4f9c2b842a219776d1f72c5e0..d66e185912cca38eeeecc50ea53e3762c69bc8bc 100644 --- a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h +++ b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h @@ -49,7 +49,6 @@ protected: private: bool Init(); - sptr dScreenSourceCallbackProxy_ = nullptr; bool registerToService_ = false; }; } // namespace DistributedHardware diff --git a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp index df6efc3e4bece851a9f5b8cbe98b282034fec72d..e1cb0ef3530824bcaaac58a418cfc7ad6d814d72 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp @@ -50,7 +50,10 @@ void DScreenSourceService::OnStart() void DScreenSourceService::OnStop() { DHLOGI("dscreen source service stop."); - dScreenSourceCallbackProxy_ = nullptr; + int32_t ret = DScreenManager::GetInstance().UnInit(); + if (ret != DH_SUCCESS) { + DHLOGE("UnInit DScreenManager failed. err: %d", ret); + } registerToService_ = false; } @@ -72,7 +75,6 @@ bool DScreenSourceService::Init() int32_t DScreenSourceService::InitSource(const std::string ¶ms, const sptr &callback) { DHLOGI("InitSource"); - dScreenSourceCallbackProxy_ = callback; int32_t ret = DScreenManager::GetInstance().Init(); if (ret != DH_SUCCESS) { DHLOGE("Init DScreenManager failed. err: %d", ret); @@ -86,7 +88,6 @@ int32_t DScreenSourceService::InitSource(const std::string ¶ms, const sptr