diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index c4b08a4b15ca14fa32b802a062b98f3c87059d89..4e9d59fd2e0de67c07e35cc510bd1842b4a057c7 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -57,6 +57,30 @@ enum VideoFormat : uint8_t { VIDEO_DATA_FORMAT_RGBA8888 = 3, }; +enum class HidumpFlag { + UNKNOW = 0, + GET_HELP, + GET_ENABLE_INFO, + GET_SCREEN_INFO, + GET_SESSION_INFO, + GET_ENCODER_INFO, + GET_DECODER_INFO, + GET_DISABLE_INFO, +}; + +struct HidumpParam { + HidumpFlag hidumpFlag = HidumpFlag::UNKNOW; + std::string args; +}; + +struct ScreenDumpInfo { + std::string version; + std::string attrs; + std::string devId; + std::string dhId; + std::string reqId; +}; + /* Screen package name */ const std::string PKG_NAME = "ohos.dhardware.dscreen"; diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 987e9195c9054b11cb22a90e67e78cd9c68e9c32..3e4ece2a78ee213bde6ae44258915903e872b236 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -90,6 +90,10 @@ enum DScreenErrorCode { ERR_DH_SCREEN_SCREENCLIENT_ADD_WINDOW_ERROR = -54002, ERR_DH_SCREEN_SCREENCLIENT_MOVE_WINDOW_ERROR = -54003, ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR = -54004, + // hidumper + ERR_DH_SCREEN_HIDUMP_UNKONW = -55000, + ERR_DH_SCREEN_HIDUMP_ERROR = -55001, + ERR_DH_SCREEN_HIDUMP_INVALID_ARGS = -55002, }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/common/utils/include/dscreen_maprelation.h b/services/common/utils/include/hidump_helper.h similarity index 30% rename from services/common/utils/include/dscreen_maprelation.h rename to services/common/utils/include/hidump_helper.h index 25c440278e7b9d4f27327825afbc211d71ab9b29..973ab5c9be446ad0f3b8c5611b082ed915ea2111 100644 --- a/services/common/utils/include/dscreen_maprelation.h +++ b/services/common/utils/include/hidump_helper.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Huawei Device Co., Ltd. + * Copyright (c) 2022-2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -13,53 +13,41 @@ * limitations under the License. */ -#ifndef OHOS_DSCREEN_MAP_RELATION_H -#define OHOS_DSCREEN_MAP_RELATION_H +#ifndef FOUNDATION_APPEXECFWK_SERVICES_BUNDLEMGR_INCLUDE_HIDUMPE_HELPER_H +#define FOUNDATION_APPEXECFWK_SERVICES_BUNDLEMGR_INCLUDE_HIDUMPE_HELPER_H -#include "nlohmann/json.hpp" +#include +#include -using json = nlohmann::json; +#include "single_instance.h" namespace OHOS { namespace DistributedHardware { -struct ScreenRect { - int32_t startX; - int32_t startY; - uint16_t width; - uint16_t height; -}; -struct DisplayRect { - int32_t startX; - int32_t startY; - int32_t width; - int32_t height; -}; - -class DScreenMapRelation { +class HidumpHelper { +DECLARE_SINGLE_INSTANCE_BASE(HidumpHelper); public: - void SetDisplayId(uint64_t displayId); - uint64_t GetDisplayId() const; - void SetScreenId(uint64_t screenId); - uint64_t GetScreenId() const; - void SetDisplayRect(const DisplayRect &displayRect); - DisplayRect& GetDisplayRect(); - void SetScreenRect(const ScreenRect &screenRect); - ScreenRect& GetScreenRect(); + void SetScreenDumpInfo(ScreenDumpInfo& dumpInfo); + void Dump(const std::vector& args, std::string &result); private: - friend void to_json(json &j, const DScreenMapRelation &dScreenMapRelation); - friend void from_json(const json &j, DScreenMapRelation &dScreenMapRelation); + explicit HidumpHelper() = default; + ~HidumpHelper() = default; + int32_t ProcessParam(const std::string& args, std::string &result); + int32_t ProcessOneParam(const std::string& args, std::string &result); + int32_t ProcessTwoParam(const std::string& firstParam, + const std::string& secondParam, std::string &result); + void ShowHelp(std::string &result); + void ShowIllealInfomation(std::string &result); + int32_t ProcessDump(const HidumpParam& hidumpParam, std::string &result); - uint64_t displayId_; - uint64_t screenId_; - DisplayRect displayRect_; - ScreenRect screenRect_; + int32_t GetEnableInfo(std::string &result); + int32_t GetScreenInfo(std::string &result); + int32_t GetSessionInfo(const std::string &name, std::string &result); + int32_t GetEncoderInfo(std::string &result); + int32_t GetDecoderInfo(std::string &result); + int32_t GetDisableInfo(const std::string &name, std::string &result); +private: + ScreenDumpInfo dumpInfo_; }; -void to_json(const json &j, const DScreenMapRelation &dScreenMapRelation); -void from_json(const json &j, DScreenMapRelation &dScreenMapRelation); -void to_json(json &j, const DisplayRect &rect); -void to_json(json &j, const ScreenRect &rect); -void from_json(const json &j, DisplayRect &rect); -void from_json(const json &j, ScreenRect &rect); -} // namespace DistributedHardware -} // namespace OHOS -#endif \ No newline at end of file +} // namespace AppExecFwk +} // namespace OHOS +#endif // FOUNDATION_APPEXECFWK_SERVICES_BUNDLEMGR_INCLUDE_HIDUMPE_HELPER_H diff --git a/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h b/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h index a314bacb659f56489276b189f9871c8fbd7dd874..1cdf5dbea724d776cbe21c2bbe5d543b94d399bc 100644 --- a/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h +++ b/services/screenservice/sinkservice/dscreenservice/include/dscreen_sink_service.h @@ -15,6 +15,7 @@ #ifndef OHOS_DSCREEN_SINK_SERVICE_H #define OHOS_DSCREEN_SINK_SERVICE_H +#include #include "ipc_object_stub.h" #include "system_ability.h" 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..798b08064cc1b0e37fc202c3dfb4805861f8446c 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h @@ -31,7 +31,7 @@ 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(); 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..2ef53b4262a38f88df303e9cb2337b7de53c1d2c 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp @@ -74,6 +74,38 @@ 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(" exsit 0 screenRegion\n]"); + DHLOGD("no screenRegion"); + return; + } + + for (const auto &iter : screenRegions_) { + 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 = "{ windowId:" + windowId + ", devId:"+ GetAnonyString(devId) + + ", screenWidth:" + screenWidth + ", screenHeight:" + screenHeight + " }\n"; + result.append(screenInfo); + } + result.append("]"); +} + void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, const std::string &eventContent) { DHLOGI("HandleNotifySetUp, remoteDevId: %s", GetAnonyString(remoteDevId).c_str()); diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index 922c984444db5ca4c7ca6fc1086a42bbaa765211..1b9d422ec87f15c03bc21c4aff8e0a86ab0753ba 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -55,6 +55,7 @@ ohos_shared_library("distributed_screen_source") { "./dscreenservice/src/callback/dscreen_source_callback_proxy.cpp", "./dscreenservice/src/dscreen_source_service.cpp", "./dscreenservice/src/dscreen_source_stub.cpp", + ] deps = [ diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index 9af60db09ed7ff1ad2c1cf88c599010a5e2fb329..67c3cdd2e729eb07ff049a711e34f1a0ae825ca5 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(); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index 49812b88b44a4983ab4f00b7b73a865fed7359bf..ddc1bc1ac1c9fc998068ae696f1abd955ff4638d 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -293,6 +293,38 @@ 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(" exsit 0 virtualScreen\n]"); + DHLOGD("no virtualscreen"); + return; + } + + for (const auto &iter : dScreens_) { + 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 screenInfo = "{ virtualScreenId:" + screenId + ", devId:"+ GetAnonyString(devId) + + ", screenWidth:" + screenWidth + ", screenHeight:" + screenHeight + ", state:" + state + " }\n"; + result.append(screenInfo); + } + result.append("]"); +} + void DScreenManager::HandleDScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent) { diff --git a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h index d66e185912cca38eeeecc50ea53e3762c69bc8bc..40d180947128b4dc55b3c56682f34eecd9e7a8f6 100644 --- a/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h +++ b/services/screenservice/sourceservice/dscreenservice/include/dscreen_source_service.h @@ -15,6 +15,7 @@ #ifndef OHOS_DSCREEN_SOURCE_SERVICE_H #define OHOS_DSCREEN_SOURCE_SERVICE_H +#include #include "system_ability.h" #include "ipc_object_stub.h" @@ -40,6 +41,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..2c6ae8db084b6cfae1b4f25d6b67627ef3b33630 100644 --- a/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp +++ b/services/screenservice/sourceservice/dscreenservice/src/dscreen_source_service.cpp @@ -26,6 +26,7 @@ #include "dscreen_errcode.h" #include "dscreen_log.h" #include "dscreen_util.h" +#include "hidump_helper.h" namespace OHOS { namespace DistributedHardware { @@ -104,6 +105,15 @@ int32_t DScreenSourceService::RegisterDistributedHardware(const std::string &dev DHLOGI("RegisterDistributedHardware"); std::string version = param.version; std::string attrs = param.attrs; + + ScreenDumpInfo screenDumpInfo = { + version, + attrs, + GetAnonyString(devId), + GetAnonyString(dhId), + reqId + }; + HidumpHelper::GetInstance().SetScreenDumpInfo(screenDumpInfo); DHLOGD("enable distributedScreen. devId: %s, dhId: %s, reqId: %s, attrs: %s, version: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), reqId.c_str(), attrs.c_str(), version.c_str()); int ret = DScreenManager::GetInstance().EnableDistributedScreen(devId, dhId, attrs, reqId); @@ -141,5 +151,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_HIDUMP_ERROR; + } + + return ERR_OK; +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file