diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 987e9195c9054b11cb22a90e67e78cd9c68e9c32..95fd5c3f811b694438d87cee46ed5a2b86a415e5 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 a314bacb659f56489276b189f9871c8fbd7dd874..6fe7cd171b29567f6d3f2c9e256d5e49814eca8e 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 020ce9546d3a440e14ff2841542a8cf841dafe43..94aabb65ba6e093e31fe10d1a4c997e7699a59f4 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 8c400b67e56c8d38cd093383d6ba5b578b0a16d2..6709424f4a9ae9af795571529c7e05c84fc797d7 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 65fcd09a882ea8fc3f83f4e5b6ebdd77e9641450..89912f0a16ffd5623b86f28086a3c56d38a3ee9d 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 935208432ec618eb5d77c7e637b11568da4abed2..cc3b4e28ff45f18b7ab372ad6021010b84b2b9a8 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 48457eeb65876894c1f35366eff3db4bc7e15a21..7969d524779751648f13ac594aae685a84b78743 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 9af60db09ed7ff1ad2c1cf88c599010a5e2fb329..3d951763fa52508e6eee73c8d3f9f7db81a7836b 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 49812b88b44a4983ab4f00b7b73a865fed7359bf..b7c93753c132f675c953b4167d82de12aa5446f6 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 d66e185912cca38eeeecc50ea53e3762c69bc8bc..415673d00c4df055232aef2807a5ec840615a9ee 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 3a7c561db3c72bc7756bec8f0fd2238bddad4018..5d7182376bc582c10f3998081631f3bd37c69048 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