diff --git a/common/include/dscreen_constants.h b/common/include/dscreen_constants.h index 1eb156f26d431d38eca0cd87a660801827e0477d..4f2cabeafc254dbf095d14ae49d61994bab4b3fd 100644 --- a/common/include/dscreen_constants.h +++ b/common/include/dscreen_constants.h @@ -117,6 +117,18 @@ const std::string KEY_VIDEO_PARAM = "videoParam"; const std::string KEY_MAPRELATION = "mapRelation"; const std::string CODEC_NAME_H264 = "OMX_hisi_video_encoder_avc"; const std::string CODEC_NAME_MPEG4 = "avenc_mpeg4"; +// Publish massage +const std::string SOURCE_WIN_ID = "sourceWinId"; +const std::string SOURCE_DEV_ID = "sourceDevId"; +const std::string SINK_DEV_ID = "sinkDevId"; +const std::string SOURCE_WIN_WIDTH = "sourceWinWidth"; +const std::string SOURCE_WIN_HEIGHT = "sourceWinHeight"; +const std::string SINK_SHOW_WIN_ID = "sinkShowWinId"; +const std::string SINK_PROJ_SHOW_WIDTH = "sinkProjShowWidth"; +const std::string SINK_PROJ_SHOW_HEIGHT = "sinkProjShowHeight"; +const std::string SINK_WIN_SHOW_X = "sinkWinShowX"; +const std::string SINK_WIN_SHOW_Y = "sinkWinShowY"; + constexpr float DEFAULT_DENSITY = 2.0; constexpr int32_t DEFAULT_SCREEN_FLAGS = 0; constexpr uint32_t DEFAULT_FPS = 30; diff --git a/services/common/utils/include/dscreen_fwkkit.h b/services/common/utils/include/dscreen_fwkkit.h new file mode 100644 index 0000000000000000000000000000000000000000..a1f7502b20721b8515ac0d80167a55f230db808f --- /dev/null +++ b/services/common/utils/include/dscreen_fwkkit.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef OHOS_DSCREEN_FWKKIT_H +#define OHOS_DSCREEN_FWKKIT_H + +#include + +#include "distributed_hardware_fwk_kit.h" +#include "single_instance.h" + +namespace OHOS { +namespace DistributedHardware { +class DScreenFwkKit { +DECLARE_SINGLE_INSTANCE_BASE(DScreenFwkKit); +public: + std::shared_ptr GetDHFwkKit(); +private: + DScreenFwkKit() = default; + ~DScreenFwkKit() = default; + std::shared_ptr dhfwkKit_ = nullptr; + std::mutex kitMtx_; +}; +} // namespace DistributedHardware +} // namespace OHOS +#endif \ No newline at end of file diff --git a/services/common/utils/src/dscreen_fwkkit.cpp b/services/common/utils/src/dscreen_fwkkit.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3f013e005ab0c4db4dc9e6546295ee79867c7b17 --- /dev/null +++ b/services/common/utils/src/dscreen_fwkkit.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (c) 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "dscreen_fwkkit.h" +#include "dscreen_log.h" + +namespace OHOS { +namespace DistributedHardware { +IMPLEMENT_SINGLE_INSTANCE(DScreenFwkKit); +std::shared_ptr DScreenFwkKit::GetDHFwkKit() +{ + DHLOGI("GetDHFwkKit"); + std::lock_guard lck(kitMtx_); + if (dhfwkKit_ == nullptr) { + dhfwkKit_ = std::make_shared(); + } + return dhfwkKit_; +} +} // namespace DistributedHardware +} // namespace OHOS \ No newline at end of file diff --git a/services/screenservice/sinkservice/BUILD.gn b/services/screenservice/sinkservice/BUILD.gn index 57e7f66985f43f91465411f291437f8a08db6280..7e5e105683b8d6ea996352b0ec0669d9c81bec33 100644 --- a/services/screenservice/sinkservice/BUILD.gn +++ b/services/screenservice/sinkservice/BUILD.gn @@ -25,6 +25,7 @@ ohos_shared_library("distributed_screen_sink") { "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "${windowmanager_path}/interfaces/innerkits/dm", "${fwk_common_path}/utils/include", + "${distributedhardwarefwk_path}/interfaces/inner_kits/include", ] include_dirs += [ @@ -47,6 +48,7 @@ ohos_shared_library("distributed_screen_sink") { sources = [ "${interfaces_path}/innerkits/native_cpp/screen_sink/src/dscreen_sink_proxy.cpp", "${interfaces_path}/innerkits/native_cpp/screen_source/src/dscreen_source_proxy.cpp", + "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/dscreen_maprelation.cpp", "${services_path}/common/utils/src/video_param.cpp", "./dscreenservice/src/dscreen_sink_service.cpp", @@ -57,6 +59,7 @@ ohos_shared_library("distributed_screen_sink") { deps = [ "${common_path}:distributed_screen_utils", + "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "${services_path}/screenclient:distributed_screen_client", "${services_path}/screentransport/screensinktrans:distributed_screen_sinktrans", "${windowmanager_path}/dm:libdm", diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h index 6709424f4a9ae9af795571529c7e05c84fc797d7..23bfe298612d5a3906994642896d6951eac15e8e 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregion.h @@ -16,11 +16,14 @@ #ifndef OHOS_DSCREEN_SCREEN_REGION_H #define OHOS_DSCREEN_SCREEN_REGION_H +#include + #include "surface.h" #include "iscreen_sink_trans_callback.h" #include "iscreen_sink_trans.h" #include "dscreen_maprelation.h" +#include "screen_client_common.h" #include "video_param.h" namespace OHOS { @@ -50,6 +53,7 @@ public: int32_t SetUp(); int32_t Start(); int32_t Stop(); + std::shared_ptr GetWindowProperty(); private: std::string remoteDevId_; @@ -62,6 +66,7 @@ private: sptr surface_ = nullptr; int32_t windowId_ = INVALID_WINDOW_ID; std::shared_ptr sinkTrans_ = nullptr; + std::shared_ptr windowProperty_ = nullptr; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h index 89912f0a16ffd5623b86f28086a3c56d38a3ee9d..0495174fcc940c55c90b19da20c8d2fc5354dc05 100644 --- a/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h +++ b/services/screenservice/sinkservice/screenregionmgr/include/screenregionmgr.h @@ -19,6 +19,7 @@ #include #include +#include "distributed_hardware_fwk_kit.h" #include "single_instance.h" #include "screenregion.h" @@ -32,6 +33,8 @@ public: int32_t ReleaseAllRegions(); void HandleDScreenNotify(const std::string &devId, int32_t eventCode, const std::string &eventContent); void GetScreenDumpInfo(std::string &result); + void PublishMessage(const DHTopic topic, const uint64_t &screenId, const std::string &remoteDevId, + const int32_t &windowId, std::shared_ptr windowProperty); private: ScreenRegionManager(); diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp index ee5c18d708baab73b33150158396e136dfa420a4..408b7adbc600184452d38999e2ee314ca52aa931 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregion.cpp @@ -84,6 +84,11 @@ int32_t ScreenRegion::GetWindowId() return windowId_; } +std::shared_ptr ScreenRegion::GetWindowProperty() +{ + return windowProperty_; +} + int32_t ScreenRegion::SetUp() { DHLOGI("ScreenRegion::SetUp, remoteDevId: %s", GetAnonyString(remoteDevId_).c_str()); @@ -96,6 +101,7 @@ int32_t ScreenRegion::SetUp() windowProperty->startY = screenRect.startY; windowProperty->width = screenRect.width; windowProperty->height = screenRect.height; + windowProperty_ = windowProperty; windowId_ = ScreenClient::GetInstance().AddWindow(windowProperty); if (windowId_ < 0) { diff --git a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp index d01e4ff45b45329183db7f8248f6897a91eba7a9..812126d65048de0839cacbc6328b5163d7ecb149 100644 --- a/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp +++ b/services/screenservice/sinkservice/screenregionmgr/src/screenregionmgr.cpp @@ -22,6 +22,7 @@ #include "dscreen_constants.h" #include "dscreen_errcode.h" +#include "dscreen_fwkkit.h" #include "dscreen_log.h" #include "dscreen_maprelation.h" #include "dscreen_util.h" @@ -116,14 +117,12 @@ void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, cons DHLOGI("HandleNotifySetUp, remoteDevId: %s", GetAnonyString(remoteDevId).c_str()); json eventContentJson = json::parse(eventContent, nullptr, false); if (eventContentJson.is_discarded()) { - DHLOGE("HandleNotifySetUp, eventJsonContent is invalid."); NotifyRemoteSourceSetUpResult(remoteDevId, "", ERR_DH_SCREEN_SA_SCREENREGION_SETUP_FAIL, ""); return; } if (!eventContentJson.contains(KEY_SCREEN_ID) || !eventContentJson.contains(KEY_DH_ID) || !eventContentJson.contains(KEY_VIDEO_PARAM) || !eventContentJson.contains(KEY_MAPRELATION)) { - DHLOGE("HandleNotifySetUp, eventJsonContent is invalid."); NotifyRemoteSourceSetUpResult(remoteDevId, "", ERR_DH_SCREEN_SA_SCREENREGION_SETUP_FAIL, ""); return; } @@ -158,7 +157,7 @@ void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, cons ret = screenRegion->SetUp(); if (ret != DH_SUCCESS) { - DHLOGE("screen region start failed"); + DHLOGE("screen region setup failed"); NotifyRemoteSourceSetUpResult(remoteDevId, dhId, ERR_DH_SCREEN_SA_SCREENREGION_SETUP_FAIL, ""); return; } @@ -170,6 +169,8 @@ void ScreenRegionManager::HandleNotifySetUp(const std::string &remoteDevId, cons return; } + PublishMessage(DHTopic::TOPIC_SINK_PROJECT_WINDOW_INFO, screenId, remoteDevId, screenRegion->GetWindowId(), + screenRegion->GetWindowProperty()); NotifyRemoteSourceSetUpResult(remoteDevId, dhId, DH_SUCCESS, ""); } @@ -233,5 +234,28 @@ sptr ScreenRegionManager::GetDScreenSourceSA(const std::string & } return remoteSourceSA; } + +void ScreenRegionManager::PublishMessage(const DHTopic topic, const uint64_t &screenId, + const std::string &remoteDevId, const int32_t &windowId, std::shared_ptr windowProperty) +{ + DHLOGD("PublishMessage"); + if (DScreenFwkKit::GetInstance().GetDHFwkKit() == nullptr) { + DHLOGE("GetDHFwkKit fail."); + return; + } + + json messageJosn; + std::string message; + messageJosn[SOURCE_WIN_ID] = screenId; + messageJosn[SOURCE_DEV_ID] = remoteDevId; + messageJosn[SINK_SHOW_WIN_ID] = windowId; + messageJosn[SINK_PROJ_SHOW_WIDTH] = windowProperty->width; + messageJosn[SINK_PROJ_SHOW_HEIGHT] = windowProperty->height; + messageJosn[SINK_WIN_SHOW_X] = windowProperty->startX; + messageJosn[SINK_WIN_SHOW_Y] = windowProperty->startY; + message = messageJosn.dump(); + + DScreenFwkKit::GetInstance().GetDHFwkKit()->PublishMessage(topic, message); +} } // namespace DistributedHardware } // namespace OHOS \ No newline at end of file diff --git a/services/screenservice/sourceservice/BUILD.gn b/services/screenservice/sourceservice/BUILD.gn index 9937c87879940fc8acf15267962076c353f930af..8d98dfe40b9c5b355b53c29ed2d737a7ef309685 100644 --- a/services/screenservice/sourceservice/BUILD.gn +++ b/services/screenservice/sourceservice/BUILD.gn @@ -26,6 +26,7 @@ ohos_shared_library("distributed_screen_source") { "//foundation/graphic/graphic_2d/interfaces/innerkits/surface", "${fwk_common_path}/utils/include", "${mediastandard_path}/interfaces/inner_api/native", + "${distributedhardwarefwk_path}/interfaces/inner_kits/include", ] include_dirs += [ @@ -48,6 +49,7 @@ ohos_shared_library("distributed_screen_source") { sources = [ "${interfaces_path}/innerkits/native_cpp/screen_sink/src/dscreen_sink_proxy.cpp", "${interfaces_path}/innerkits/native_cpp/screen_source/src/dscreen_source_proxy.cpp", + "${services_path}/common/utils/src/dscreen_fwkkit.cpp", "${services_path}/common/utils/src/dscreen_maprelation.cpp", "${services_path}/common/utils/src/video_param.cpp", "./dscreenmgr/src/dscreen.cpp", @@ -60,6 +62,7 @@ ohos_shared_library("distributed_screen_source") { deps = [ "${common_path}:distributed_screen_utils", + "${distributedhardwarefwk_path}/interfaces/inner_kits:libdhfwk_sdk", "${mediastandard_path}/interfaces/inner_api/native:media_client", "${services_path}/screentransport/screensourcetrans:distributed_screen_sourcetrans", "${windowmanager_path}/dm:libdm", diff --git a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h index 3d951763fa52508e6eee73c8d3f9f7db81a7836b..11eeb995582b35319b0c1361e091d2acac83af59 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/dscreen_manager.h @@ -16,6 +16,7 @@ #ifndef OHOS_DSCREEN_MGR_H #define OHOS_DSCREEN_MGR_H +#include "distributed_hardware_fwk_kit.h" #include "dm_common.h" #include "single_instance.h" #include "screen_manager.h" @@ -59,7 +60,7 @@ public: void HandleScreenChange(const std::shared_ptr &changedScreen, Rosen::ScreenGroupChangeEvent event); std::shared_ptr FindDScreenByScreenId(uint64_t screenId); void GetScreenDumpInfo(std::string &result); - + void PublishMessage(const DHTopic topic, const std::shared_ptr &dScreen); private: ~DScreenManager(); DScreenManager(); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp index 4b4c31bdf115c8b9cd599df73716ab601c8ae8b4..9a7c47de59d9d5cd2710fb68cd20628ba53383b4 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/dscreen_manager.cpp @@ -23,6 +23,7 @@ #include "dscreen_constants.h" #include "dscreen_errcode.h" +#include "dscreen_fwkkit.h" #include "dscreen_log.h" #include "dscreen_util.h" #include "idscreen_sink.h" @@ -67,6 +68,7 @@ int32_t DScreenManager::Init() if (!dScreenCallback_) { dScreenCallback_ = std::make_shared(); } + return ret; } @@ -118,6 +120,7 @@ void DScreenManager::HandleScreenChange(const std::shared_ptr &changedS DHLOGE("DScreenManager::HandleScreenChange, dScreen is null."); return; } + uint64_t screenId = changedScreen->GetScreenId(); DHLOGI("DScreenManager::HandleScreenChange, screenId: %ulld, changeEvent: %", screenId, event); if (event == Rosen::ScreenGroupChangeEvent::ADD_TO_GROUP) { @@ -143,6 +146,7 @@ void DScreenManager::HandleScreenChange(const std::shared_ptr &changedS mapRelations_[screenId] = mapRelation; } NotifyRemoteSinkSetUp(changedScreen); + PublishMessage(DHTopic::TOPIC_START_DSCREEN, changedScreen); } else if (event == Rosen::ScreenGroupChangeEvent::REMOVE_FROM_GROUP) { if (changedScreen->GetState() == DISCONNECTING) { DHLOGD("screen is disconnecting, no need handle change"); @@ -159,6 +163,7 @@ void DScreenManager::HandleScreenChange(const std::shared_ptr &changedS mapRelations_.erase(screenId); } changedScreen->AddTask(std::make_shared(TaskType::TASK_DISCONNECT, "")); + PublishMessage(DHTopic::TOPIC_STOP_DSCREEN, changedScreen); } else if (event == Rosen::ScreenGroupChangeEvent::CHANGE_GROUP) { DHLOGE("CHANGE_GROUP not implement."); } else { @@ -239,6 +244,7 @@ int32_t DScreenManager::EnableDistributedScreen(const std::string &devId, const DHLOGE("EnableDistributedScreen, add task failed. devId: %s, dhId:%s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); } + return ret; } @@ -403,6 +409,36 @@ sptr DScreenManager::GetDScreenSinkSA(const std::string &devId) return remoteSinkSA; } +void DScreenManager::PublishMessage(const DHTopic topic, const std::shared_ptr &dScreen) +{ + DHLOGD("PublishMessage"); + if (DScreenFwkKit::GetInstance().GetDHFwkKit() == nullptr) { + DHLOGE("GetDHFwkKit fail."); + return; + } + + json messageJosn; + std::string message; + if (topic == DHTopic::TOPIC_START_DSCREEN) { + messageJosn[SOURCE_WIN_ID] = dScreen->GetScreenId(); + messageJosn[SINK_DEV_ID] = dScreen->GetDevId(); + std::shared_ptr videoParam = dScreen->GetVideoParam(); + if (videoParam == nullptr) { + DHLOGE("videoParam is nullptr"); + return; + } + messageJosn[SOURCE_WIN_WIDTH] = videoParam->GetScreenWidth(); + messageJosn[SOURCE_WIN_HEIGHT] = videoParam->GetScreenHeight(); + message = messageJosn.dump(); + } else if (topic == DHTopic::TOPIC_STOP_DSCREEN) { + messageJosn[SOURCE_WIN_ID] = dScreen->GetScreenId(); + messageJosn[SOURCE_DEV_ID] = dScreen->GetDevId(); + message = messageJosn.dump(); + } + + DScreenFwkKit::GetInstance().GetDHFwkKit()->PublishMessage(topic, message); +} + void DScreenManager::NotifyRemoteSinkSetUp(const std::shared_ptr &dScreen) { DHLOGI("NotifyRemoteSinkSetUp");