From ce79ba6307390b5c7ad87c0ed2119a8264268b46 Mon Sep 17 00:00:00 2001 From: gaoqiang_strong Date: Mon, 16 May 2022 10:01:59 +0800 Subject: [PATCH] screen add hidumper info Signed-off-by: gaoqiang_strong --- common/include/dscreen_errcode.h | 1 + .../include/dscreen_sink_service.h | 1 + .../src/dscreen_sink_service.cpp | 14 +++++ .../screenregionmgr/include/screenregion.h | 2 + .../screenregionmgr/include/screenregionmgr.h | 2 + .../screenregionmgr/src/screenregion.cpp | 10 ++++ .../screenregionmgr/src/screenregionmgr.cpp | 38 +++++++++++++ .../dscreenmgr/include/dscreen_manager.h | 2 + .../dscreenmgr/src/dscreen_manager.cpp | 53 +++++++++++++++++++ .../include/dscreen_source_service.h | 1 + .../src/dscreen_source_service.cpp | 14 +++++ 11 files changed, 138 insertions(+) diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 987e9195..95fd5c3f 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -54,6 +54,7 @@ enum DScreenErrorCode { ERR_DH_SCREEN_SA_UNREGISTER_SCREENLISTENER_FAIL = -500030, ERR_DH_SCREEN_SA_DSCREEN_NEGOTIATE_CODEC_FAIL = -500031, ERR_DH_SCREEN_SA_LOAD_TIMEOUT = -500032, + ERR_DH_SCREEN_SA_HIDUMPER_ERROR = -500033, // Transport component error code ERR_DH_SCREEN_TRANS_ERROR = -51000, ERR_DH_SCREEN_TRANS_TIMEOUT = -51001, diff --git a/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h b/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h index a314bacb..6fe7cd17 100644 --- a/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h +++ b/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h @@ -35,6 +35,7 @@ public: int32_t SubscribeLocalHardware(const std::string &dhId, const std::string ¶m) override; int32_t UnsubscribeLocalHardware(const std::string &dhId) override; void DScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent) override; + int Dump(int32_t fd, const std::vector& args) override; protected: void OnStart() override; diff --git a/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_service.cpp b/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_service.cpp index 020ce954..94aabb65 100644 --- a/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_service.cpp +++ b/services/screenservice/sinkservice/dscreenservice/src/dscreen_sink_service.cpp @@ -100,5 +100,19 @@ void DScreenSinkService::DScreenNotify(const std::string &devId, int32_t eventCo eventCode, eventContent.c_str()); ScreenRegionManager::GetInstance().HandleDScreenNotify(devId, eventCode, eventContent); } + +int DScreenSinkService::Dump(int32_t fd, const std::vector& args) +{ + DHLOGI("DScreenSourceService Dump."); + std::string result; + ScreenRegionManager::GetInstance().GetScreenDumpInfo(result); + int ret = dprintf(fd, "%s\n", result.c_str()); + if (ret < 0) { + DHLOGE("dprintf error"); + return ERR_DH_SCREEN_SA_HIDUMPER_ERROR; + } + + return ERR_OK; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h index 8c400b67..6709424f 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h @@ -45,6 +45,8 @@ public: std::string GetRemoteDevId(); uint64_t GetScreenId(); uint64_t GetDisplayId(); + std::shared_ptr GetVideoParam(); + int32_t GetWindowId(); int32_t SetUp(); int32_t Start(); int32_t Stop(); diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h index 65fcd09a..89912f0a 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h @@ -31,12 +31,14 @@ DECLARE_SINGLE_INSTANCE_BASE(ScreenRegionManager); public: int32_t ReleaseAllRegions(); void HandleDScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent); + void GetScreenDumpInfo(std::string &result); private: ScreenRegionManager(); ~ScreenRegionManager(); std::map> screenRegions_; std::mutex screenRegionsMtx_; + std::string localDevId_; sptr GetDScreenSourceSA(const std::string &devId); int32_t NotifyRemoteScreenService(const std::string &remoteDevId, const std::string &dhId, diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp index 93520843..cc3b4e28 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp @@ -73,6 +73,16 @@ std::string ScreenRegion::GetRemoteDevId() return remoteDevId_; } +std::shared_ptr ScreenRegion::GetVideoParam() +{ + return videoParam_; +} + +int32_t ScreenRegion::GetWindowId() +{ + return windowId_; +} + int32_t ScreenRegion::SetUp() { DHLOGI("ScreenRegion::SetUp, remoteDevId: %s", GetAnonyString(remoteDevId_).c_str()); diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp index 48457eeb..7969d524 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp @@ -74,6 +74,43 @@ void ScreenRegionManager::HandleDScreenNotify(const std::string &remoteDevId, in DHLOGE("invalid event."); } +void ScreenRegionManager::GetScreenDumpInfo(std::string &result) +{ + DHLOGI("GetScreenDumpInfo."); + result.clear(); + result.append("screenRegion OnLine:\n[\n"); + if (screenRegions_.size() == 0) { + result.append("]"); + DHLOGD("no screenRegion"); + return; + } + + for (const auto &iter : screenRegions_) { + result.append(" {\n"); + std::shared_ptr screenRegion = iter.second; + if (!screenRegion) { + continue; + } + uint64_t screenId = screenRegion->GetScreenId(); + std::string remoteDevId = screenRegion->GetRemoteDevId(); + std::shared_ptr videoParam = screenRegion->GetVideoParam(); + if (videoParam == nullptr) { + continue; + } + int32_t screenHeight = videoParam->GetScreenHeight(); + int32_t screenWidth = videoParam->GetScreenWidth(); + int32_t windowId = screenRegion->GetWindowId(); + std::string screenInfo = " \"clientWindowId\" : \"" + std::to_string(windowId) + "\",\n" + + " \"remoteScreenId\" : \"" + std::to_string(screenId) + "\",\n" + + " \"localDevId\" : \"" + GetAnonyString(localDevId_) + "\",\n" + + " \"remoteDevId\" : \"" + GetAnonyString(remoteDevId) + "\",\n" + + " \"screenWidth\" : \"" + std::to_string(screenWidth) + "\",\n" + + " \"screenHeight\" : \"" + std::to_string(screenHeight) + "\"\n"; + result.append(screenInfo); + } + result.append(" }\n]"); +} + void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, const std::string &eventContent) { DHLOGI("HandleNotifySetUp, remoteDevId: %s", GetAnonyString(remoteDevId).c_str()); @@ -169,6 +206,7 @@ int32_t ScreenRegionManager::NotifyRemoteScreenService(const std::string &remote DHLOGE("notify remote screen service failed, cannot get local device id"); return ret; } + localDevId_ = localDevId; remoteSourceSA->DScreenNotify(localDevId, eventCode, eventContent); return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index 9af60db0..3d951763 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h @@ -58,6 +58,7 @@ public: void RegisterDScreenCallback(const sptr &callback); void HandleScreenChange(const std::shared_ptr &changedScreen, Rosen::ScreenGroupChangeEvent event); std::shared_ptr FindDScreenByScreenId(uint64_t screenId); + void GetScreenDumpInfo(std::string &result); private: ~DScreenManager(); @@ -69,6 +70,7 @@ private: sptr dScreenSourceCallbackProxy_ = nullptr; sptr dScreenGroupListener_ = nullptr; std::shared_ptr dScreenCallback_ = nullptr; + std::string localDevId_; sptr GetDScreenSinkSA(const std::string &devId); int32_t NotifyRemoteScreenService(const std::string &devId, int32_t eventCode, const std::string &eventContent); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index 49812b88..b7c93753 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -15,6 +15,8 @@ #include "dscreen_manager.h" +#include + #include "if_system_ability_manager.h" #include "iservice_registry.h" #include "nlohmann/json.hpp" @@ -31,6 +33,17 @@ using json = nlohmann::json; namespace OHOS { namespace DistributedHardware { IMPLEMENT_SINGLE_INSTANCE(DScreenManager); + +const std::map stateMap = { + { DISABLED, "disabled" }, + { ENABLED, "enabled" }, + { DISABLING, "disabling" }, + { ENABLING, "enabling" }, + { CONNECTING, "connecting" }, + { CONNECTED, "connected" }, + { DISCONNECTING, "disconnecting" } +}; + DScreenManager::DScreenManager() { DHLOGI("DScreenMgr construct."); @@ -293,6 +306,45 @@ std::shared_ptr DScreenManager::FindDScreenByScreenId(uint64_t screenId return nullptr; } +void DScreenManager::GetScreenDumpInfo(std::string &result) +{ + DHLOGI("GetScreenDumpInfo."); + result.clear(); + result.append("RemoteScreens OnLine:\n[\n"); + if (dScreens_.size() == 0) { + result.append("]"); + DHLOGD("no virtualscreen"); + return; + } + + for (const auto &iter : dScreens_) { + result.append(" {\n"); + std::shared_ptr dScreen = iter.second; + if (!dScreen) { + continue; + } + uint64_t screenId = dScreen->GetScreenId(); + std::string devId = dScreen->GetDevId(); + std::shared_ptr videoParam = dScreen->GetVideoParam(); + if (videoParam == nullptr) { + continue; + } + int32_t screenHeight = videoParam->GetScreenHeight(); + int32_t screenWidth = videoParam->GetScreenWidth(); + DScreenState state = dScreen->GetState(); + std::string screenState = + stateMap.find(state) == stateMap.end() ? "unknown state" : stateMap.find(state)->second; + std::string screenInfo = " \"virtualScreenId\" : \"" + std::to_string(screenId) + "\",\n" + + " \"localDevId\" : \"" + GetAnonyString(localDevId_) + "\",\n" + + " \"remoteDevId\" : \"" + GetAnonyString(devId) + "\",\n" + + " \"screenWidth\" : \"" + std::to_string(screenWidth) + "\",\n" + + " \"screenHeight\" : \"" + std::to_string(screenHeight) + "\",\n" + + " \"state\" : \"" + screenState + "\"\n"; + result.append(screenInfo); + } + result.append(" }\n]"); +} + void DScreenManager::HandleDScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent) { @@ -321,6 +373,7 @@ int32_t DScreenManager::NotifyRemoteScreenService(const std::string &devId, int3 DHLOGE("notify remote screen service failed, cannot get local device id"); return ret; } + localDevId_ = localDevId; remoteSinkSA->DScreenNotify(localDevId, eventCode, eventContent); return DH_SUCCESS; } diff --git a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h index d66e1859..415673d0 100644 --- a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h +++ b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h @@ -40,6 +40,7 @@ public: int32_t ConfigDistributedHardware(const std::string &devId, const std::string &dhId, const std::string &key, const std::string &value) override; void DScreenNotify(const std::string &devId, const int32_t eventCode, const std::string &eventContent) override; + int Dump(int32_t fd, const std::vector& args) override; protected: void OnStart() override; diff --git a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp index 3a7c561d..5d718237 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp @@ -141,5 +141,19 @@ void DScreenSourceService::DScreenNotify(const std::string &devId, const int32_t DHLOGI("DScreenNotify, devId: %s, eventCode: %d", GetAnonyString(devId).c_str(), eventCode); DScreenManager::GetInstance().HandleDScreenNotify(devId, eventCode, eventContent); } + +int DScreenSourceService::Dump(int32_t fd, const std::vector& args) +{ + DHLOGI("DScreenSourceService Dump."); + std::string result; + DScreenManager::GetInstance().GetScreenDumpInfo(result); + int ret = dprintf(fd, "%s\n", result.c_str()); + if (ret < 0) { + DHLOGE("dprintf error"); + return ERR_DH_SCREEN_SA_HIDUMPER_ERROR; + } + + return ERR_OK; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file -- Gitee