1 /*
2  * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "1.0/include/screenregion.h"
17 
18 #include "dscreen_constants.h"
19 #include "dscreen_errcode.h"
20 #include "dscreen_hisysevent.h"
21 #include "dscreen_log.h"
22 #include "dscreen_util.h"
23 #include "screen_client.h"
24 #include "screen_client_common.h"
25 #include "screen_sink_trans.h"
26 
27 namespace OHOS {
28 namespace DistributedHardware {
29 namespace V1_0 {
ScreenRegion(const std::string & remoteDevId,uint64_t screenId,uint64_t displayId)30 ScreenRegion::ScreenRegion(const std::string &remoteDevId, uint64_t screenId, uint64_t displayId)
31 {
32     DHLOGD("ScreenRegion construct");
33     remoteDevId_ = remoteDevId;
34     screenId_ = screenId;
35     displayId_ = displayId;
36     windowId_ = INVALID_WINDOW_ID;
37 }
38 
~ScreenRegion()39 ScreenRegion::~ScreenRegion()
40 {
41     DHLOGD("ScreenRegion deConstruct");
42     if (sinkTrans_ != nullptr) {
43         sinkTrans_->Release();
44     }
45 }
46 
OnTransError(int32_t err,const std::string & content)47 void ScreenRegion::OnTransError(int32_t err, const std::string &content)
48 {
49     DHLOGW("OnTransError, err: %{public}" PRId32, err);
50     Stop();
51 }
52 
SetVideoParam(std::shared_ptr<VideoParam> & videoParam)53 void ScreenRegion::SetVideoParam(std::shared_ptr<VideoParam> &videoParam)
54 {
55     videoParam_ = videoParam;
56 }
57 
SetMapRelation(std::shared_ptr<DScreenMapRelation> & mapRelation)58 void ScreenRegion::SetMapRelation(std::shared_ptr<DScreenMapRelation> &mapRelation)
59 {
60     mapRelation_ = mapRelation;
61 }
62 
GetScreenId()63 uint64_t ScreenRegion::GetScreenId()
64 {
65     return screenId_;
66 }
67 
GetDisplayId()68 uint64_t ScreenRegion::GetDisplayId()
69 {
70     return displayId_;
71 }
72 
GetRemoteDevId()73 std::string ScreenRegion::GetRemoteDevId()
74 {
75     return remoteDevId_;
76 }
77 
GetVideoParam()78 std::shared_ptr<VideoParam> ScreenRegion::GetVideoParam()
79 {
80     return videoParam_;
81 }
82 
GetWindowId()83 int32_t ScreenRegion::GetWindowId()
84 {
85     return windowId_;
86 }
87 
GetWindowProperty()88 std::shared_ptr<WindowProperty> ScreenRegion::GetWindowProperty()
89 {
90     return windowProperty_;
91 }
92 
SetUpWindow()93 int32_t ScreenRegion::SetUpWindow()
94 {
95     DHLOGI("ScreenRegion::SetUpWindow");
96     std::shared_ptr<WindowProperty> windowProperty = std::make_shared<WindowProperty>();
97     windowProperty->displayId = displayId_;
98     if (mapRelation_ == nullptr) {
99         DHLOGE("ScreenRegion::SetUp mapRelation is nullptr.");
100         return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
101     }
102     ScreenRect screenRect = mapRelation_->GetScreenRect();
103     windowProperty->startX = screenRect.startX;
104     windowProperty->startY = screenRect.startY;
105     windowProperty->width = screenRect.width;
106     windowProperty->height = screenRect.height;
107     windowProperty_ = windowProperty;
108 
109     windowId_ = ScreenClient::GetInstance().AddWindow(windowProperty);
110     if (windowId_ < 0) {
111         DHLOGE("AddWindow failed.");
112         ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED, "AddWindow failed.");
113         return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
114     }
115     int32_t ret = ScreenClient::GetInstance().ShowWindow(windowId_);
116     if (ret != DH_SUCCESS) {
117         DHLOGE("show window failed.");
118         ReportOptFail(DSCREEN_OPT_FAIL, ret, "show window failed.");
119         return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
120     }
121 
122     sptr<Surface> surface = ScreenClient::GetInstance().GetSurface(windowId_);
123     if (surface == nullptr) {
124         DHLOGE("get window surface failed.");
125         ReportOptFail(DSCREEN_OPT_FAIL, ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED, "get window surface failed.");
126         return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
127     }
128     surface_ = surface;
129 
130     return DH_SUCCESS;
131 }
132 
SetUp(const std::string & version)133 int32_t ScreenRegion::SetUp(const std::string &version)
134 {
135     DHLOGI("ScreenRegion::SetUp, remoteDevId: %{public}s", GetAnonyString(remoteDevId_).c_str());
136     int32_t ret = SetUpWindow();
137     if (ret != DH_SUCCESS) {
138         DHLOGE("SetUpWindow failed.");
139         return ret;
140     }
141 
142     if (sinkTrans_ == nullptr) {
143         sinkTrans_ = std::make_shared<ScreenSinkTrans>();
144     }
145     sinkTrans_->SetScreenVersion(version);
146     sinkTrans_->RegisterStateCallback(shared_from_this());
147     sinkTrans_->SetImageSurface(surface_);
148     ret = sinkTrans_->SetUp(*videoParam_, *videoParam_, remoteDevId_);
149     if (ret != DH_SUCCESS) {
150         DHLOGE("sinkTrans setup failed.");
151         return ERR_DH_SCREEN_SA_DSCREEN_SCREENGION_SETUP_FAILED;
152     }
153 
154     return DH_SUCCESS;
155 }
156 
Start()157 int32_t ScreenRegion::Start()
158 {
159     DHLOGI("ScreenRegion::Start remoteDevId: %{public}s", GetAnonyString(remoteDevId_).c_str());
160     if (sinkTrans_ == nullptr) {
161         DHLOGE("sink trans not init.");
162         return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
163     }
164 
165     int32_t ret = sinkTrans_->Start();
166     if (ret != DH_SUCCESS) {
167         DHLOGE("sink trans start failed.");
168         return ret;
169     }
170     isRunning = true;
171     return DH_SUCCESS;
172 }
173 
Stop()174 int32_t ScreenRegion::Stop()
175 {
176     DHLOGI("ScreenRegion::Stop remoteDevId: %{public}s", GetAnonyString(remoteDevId_).c_str());
177     if (!isRunning) {
178         DHLOGI("ScreenRegion not running, no need stop");
179         return DH_SUCCESS;
180     }
181 
182     if (sinkTrans_ != nullptr) {
183         (void)sinkTrans_->Stop();
184         (void)sinkTrans_->Release();
185     } else {
186         DHLOGE("sink trans not init.");
187         (void)ScreenClient::GetInstance().RemoveWindow(windowId_);
188         return ERR_DH_SCREEN_SA_SINKTRANS_NOT_INIT;
189     }
190 
191     int32_t ret = ScreenClient::GetInstance().RemoveWindow(windowId_);
192     if (ret != DH_SUCCESS) {
193         DHLOGE("remove window failed.");
194         return ret;
195     }
196 
197     isRunning = false;
198     return DH_SUCCESS;
199 }
200 } // namespace V1_0
201 } // namespace DistributedHardware
202 } // namespace OHOS