1 /*
2 * Copyright (c) 2022 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 "js_screen_manager.h"
17
18 #include <cinttypes>
19 #include <hitrace_meter.h>
20 #include <vector>
21 #include <new>
22 #include "js_runtime_utils.h"
23 #include "js_screen.h"
24 #include "js_screen_listener.h"
25
26 #include "native_engine/native_reference.h"
27 #include "screen_manager.h"
28 #include "singleton_container.h"
29 #include "surface_utils.h"
30 #include "window_manager_hilog.h"
31 #include "pixel_map_napi.h"
32
33 namespace OHOS {
34 namespace Rosen {
35 using namespace AbilityRuntime;
36 constexpr size_t ARGC_ONE = 1;
37 constexpr size_t ARGC_TWO = 2;
38 constexpr size_t ARGC_THREE = 3;
39 constexpr size_t ARGC_FOUR = 4;
40 constexpr int32_t INDEX_ZERO = 0;
41 constexpr int32_t INDEX_ONE = 1;
42 constexpr int32_t INDEX_TWO = 2;
43 constexpr uint32_t MAX_SCREENS_NUM = 1000;
44 namespace {
45 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "JsScreenManager"};
46 }
47
48 class JsScreenManager {
49 public:
JsScreenManager(napi_env env)50 explicit JsScreenManager(napi_env env) {
51 }
52
53 ~JsScreenManager() = default;
54
Finalizer(napi_env env,void * data,void * hint)55 static void Finalizer(napi_env env, void* data, void* hint)
56 {
57 WLOGI("JsScreenManager::Finalizer is called");
58 std::unique_ptr<JsScreenManager>(static_cast<JsScreenManager*>(data));
59 }
60
GetAllScreens(napi_env env,napi_callback_info info)61 static napi_value GetAllScreens(napi_env env, napi_callback_info info)
62 {
63 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
64 return (me != nullptr) ? me->OnGetAllScreens(env, info) : nullptr;
65 }
66
RegisterScreenManagerCallback(napi_env env,napi_callback_info info)67 static napi_value RegisterScreenManagerCallback(napi_env env, napi_callback_info info)
68 {
69 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
70 return (me != nullptr) ? me->OnRegisterScreenManagerCallback(env, info) : nullptr;
71 }
72
UnregisterScreenMangerCallback(napi_env env,napi_callback_info info)73 static napi_value UnregisterScreenMangerCallback(napi_env env, napi_callback_info info)
74 {
75 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
76 return (me != nullptr) ? me->OnUnregisterScreenManagerCallback(env, info) : nullptr;
77 }
78
MakeMirror(napi_env env,napi_callback_info info)79 static napi_value MakeMirror(napi_env env, napi_callback_info info)
80 {
81 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
82 return (me != nullptr) ? me->OnMakeMirror(env, info) : nullptr;
83 }
84
MakeMirrorWithRegion(napi_env env,napi_callback_info info)85 static napi_value MakeMirrorWithRegion(napi_env env, napi_callback_info info)
86 {
87 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
88 return (me != nullptr) ? me->OnMakeMirrorWithRegion(env, info) : nullptr;
89 }
90
SetMultiScreenMode(napi_env env,napi_callback_info info)91 static napi_value SetMultiScreenMode(napi_env env, napi_callback_info info)
92 {
93 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
94 return (me != nullptr) ? me->OnSetMultiScreenMode(env, info) : nullptr;
95 }
96
SetMultiScreenRelativePosition(napi_env env,napi_callback_info info)97 static napi_value SetMultiScreenRelativePosition(napi_env env, napi_callback_info info)
98 {
99 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
100 return (me != nullptr) ? me->OnSetMultiScreenRelativePosition(env, info) : nullptr;
101 }
102
MakeExpand(napi_env env,napi_callback_info info)103 static napi_value MakeExpand(napi_env env, napi_callback_info info)
104 {
105 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
106 return (me != nullptr) ? me->OnMakeExpand(env, info) : nullptr;
107 }
108
StopMirror(napi_env env,napi_callback_info info)109 static napi_value StopMirror(napi_env env, napi_callback_info info)
110 {
111 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
112 return (me != nullptr) ? me->OnStopMirror(env, info) : nullptr;
113 }
114
StopExpand(napi_env env,napi_callback_info info)115 static napi_value StopExpand(napi_env env, napi_callback_info info)
116 {
117 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
118 return (me != nullptr) ? me->OnStopExpand(env, info) : nullptr;
119 }
120
CreateVirtualScreen(napi_env env,napi_callback_info info)121 static napi_value CreateVirtualScreen(napi_env env, napi_callback_info info)
122 {
123 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
124 return (me != nullptr) ? me->OnCreateVirtualScreen(env, info) : nullptr;
125 }
126
DestroyVirtualScreen(napi_env env,napi_callback_info info)127 static napi_value DestroyVirtualScreen(napi_env env, napi_callback_info info)
128 {
129 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
130 return (me != nullptr) ? me->OnDestroyVirtualScreen(env, info) : nullptr;
131 }
132
SetVirtualScreenSurface(napi_env env,napi_callback_info info)133 static napi_value SetVirtualScreenSurface(napi_env env, napi_callback_info info)
134 {
135 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
136 return (me != nullptr) ? me->OnSetVirtualScreenSurface(env, info) : nullptr;
137 }
138
SetScreenPrivacyMaskImage(napi_env env,napi_callback_info info)139 static napi_value SetScreenPrivacyMaskImage(napi_env env, napi_callback_info info)
140 {
141 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
142 return (me != nullptr) ? me->OnSetScreenPrivacyMaskImage(env, info) : nullptr;
143 }
144
IsScreenRotationLocked(napi_env env,napi_callback_info info)145 static napi_value IsScreenRotationLocked(napi_env env, napi_callback_info info)
146 {
147 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
148 return (me != nullptr) ? me->OnIsScreenRotationLocked(env, info) : nullptr;
149 }
150
SetScreenRotationLocked(napi_env env,napi_callback_info info)151 static napi_value SetScreenRotationLocked(napi_env env, napi_callback_info info)
152 {
153 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
154 return (me != nullptr) ? me->OnSetScreenRotationLocked(env, info) : nullptr;
155 }
156
MakeUnique(napi_env env,napi_callback_info info)157 static napi_value MakeUnique(napi_env env, napi_callback_info info)
158 {
159 JsScreenManager* me = CheckParamsAndGetThis<JsScreenManager>(env, info);
160 return (me != nullptr) ? me->OnMakeUnique(env, info) : nullptr;
161 }
162
163 private:
164 std::map<std::string, std::map<std::unique_ptr<NativeReference>, sptr<JsScreenListener>>> jsCbMap_;
165 std::mutex mtx_;
166
OnGetAllScreens(napi_env env,napi_callback_info info)167 napi_value OnGetAllScreens(napi_env env, napi_callback_info info)
168 {
169 WLOGI("OnGetAllScreens is called");
170 size_t argc = 4;
171 napi_value argv[4] = {nullptr};
172 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
173 napi_value lastParam = nullptr;
174 if (argc >= ARGC_ONE && argv[ARGC_ONE - 1] != nullptr &&
175 GetType(env, argv[ARGC_ONE - 1]) == napi_function) {
176 lastParam = argv[ARGC_ONE - 1];
177 }
178 napi_value result = nullptr;
179 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
180 auto asyncTask = [this, env, task = napiAsyncTask.get()]() {
181 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnGetAllScreens");
182 std::vector<sptr<Screen>> screens;
183 auto res = DM_JS_TO_ERROR_CODE_MAP.at(SingletonContainer::Get<ScreenManager>().GetAllScreens(screens));
184 if (res != DmErrorCode::DM_OK) {
185 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
186 "JsScreenManager::OnGetAllScreens failed."));
187 } else if (!screens.empty()) {
188 task->Resolve(env, CreateJsScreenVectorObject(env, screens));
189 WLOGI("JsScreenManager::OnGetAllScreens success");
190 } else {
191 task->Reject(env, CreateJsError(env,
192 static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN),
193 "JsScreenManager::OnGetAllScreens failed."));
194 }
195 delete task;
196 };
197 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
198 return result;
199 }
200
CreateJsDisplayIdVectorObject(napi_env env,std::vector<DisplayId> & displayIds)201 napi_value CreateJsDisplayIdVectorObject(napi_env env, std::vector<DisplayId>& displayIds)
202 {
203 napi_value arrayValue = nullptr;
204 napi_create_array_with_length(env, displayIds.size(), &arrayValue);
205 if (arrayValue == nullptr) {
206 WLOGFE("Failed to get screens");
207 return NapiGetUndefined(env);
208 }
209 size_t i = 0;
210 for (auto& displayId : displayIds) {
211 napi_set_element(env, arrayValue, i++, CreateJsValue(env, static_cast<uint32_t>(displayId)));
212 }
213 return arrayValue;
214 }
215
CreateJsScreenVectorObject(napi_env env,std::vector<sptr<Screen>> & screens)216 napi_value CreateJsScreenVectorObject(napi_env env, std::vector<sptr<Screen>>& screens)
217 {
218 napi_value arrayValue = nullptr;
219 napi_create_array_with_length(env, screens.size(), &arrayValue);
220 if (arrayValue == nullptr) {
221 WLOGFE("Failed to get screens");
222 return NapiGetUndefined(env);
223 }
224 size_t i = 0;
225 for (auto& screen : screens) {
226 if (screen == nullptr) {
227 continue;
228 }
229 napi_set_element(env, arrayValue, i++, CreateJsScreenObject(env, screen));
230 }
231 return arrayValue;
232 }
233
IfCallbackRegistered(napi_env env,const std::string & type,napi_value jsListenerObject)234 bool IfCallbackRegistered(napi_env env, const std::string& type, napi_value jsListenerObject)
235 {
236 if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
237 WLOGI("JsScreenManager::IfCallbackRegistered methodName %{public}s not registered!", type.c_str());
238 return false;
239 }
240
241 for (auto& iter : jsCbMap_[type]) {
242 bool isEquals = false;
243 napi_strict_equals(env, jsListenerObject, iter.first->GetNapiValue(), &isEquals);
244 if (isEquals) {
245 WLOGFE("JsScreenManager::IfCallbackRegistered callback already registered!");
246 return true;
247 }
248 }
249 return false;
250 }
251
RegisterScreenListenerWithType(napi_env env,const std::string & type,napi_value value)252 DmErrorCode RegisterScreenListenerWithType(napi_env env, const std::string& type, napi_value value)
253 {
254 if (IfCallbackRegistered(env, type, value)) {
255 WLOGFE("JsScreenManager::RegisterScreenListenerWithType callback already registered!");
256 return DmErrorCode::DM_ERROR_INVALID_CALLING;
257 }
258 std::unique_ptr<NativeReference> callbackRef;
259 napi_ref result = nullptr;
260 napi_create_reference(env, value, 1, &result);
261 callbackRef.reset(reinterpret_cast<NativeReference*>(result));
262 sptr<JsScreenListener> screenListener = new(std::nothrow) JsScreenListener(env);
263 if (screenListener == nullptr) {
264 WLOGFE("screenListener is nullptr");
265 return DmErrorCode::DM_ERROR_INVALID_SCREEN;
266 }
267 if (type == EVENT_CONNECT || type == EVENT_DISCONNECT || type == EVENT_CHANGE) {
268 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
269 SingletonContainer::Get<ScreenManager>().RegisterScreenListener(screenListener));
270 if (ret != DmErrorCode::DM_OK) {
271 return ret;
272 }
273 WLOGI("JsScreenManager::RegisterScreenListenerWithType success");
274 } else {
275 WLOGFE("JsScreenManager::RegisterScreenListenerWithType failed method: %{public}s not support!",
276 type.c_str());
277 return DmErrorCode::DM_ERROR_INVALID_CALLING;
278 }
279 screenListener->AddCallback(type, value);
280 jsCbMap_[type][std::move(callbackRef)] = screenListener;
281 return DmErrorCode::DM_OK;
282 }
283
UnregisterAllScreenListenerWithType(const std::string & type)284 DmErrorCode UnregisterAllScreenListenerWithType(const std::string& type)
285 {
286 if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
287 WLOGFE("JsScreenManager::UnregisterAllScreenListenerWithType methodName %{public}s not registered!",
288 type.c_str());
289 return DmErrorCode::DM_OK;
290 }
291 for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) {
292 it->second->RemoveAllCallback();
293 if (type == EVENT_CONNECT || type == EVENT_DISCONNECT || type == EVENT_CHANGE) {
294 sptr<ScreenManager::IScreenListener> thisListener(it->second);
295 SingletonContainer::Get<ScreenManager>().UnregisterScreenListener(thisListener);
296 WLOGI("JsScreenManager::UnregisterAllScreenListenerWithType success");
297 }
298 jsCbMap_[type].erase(it++);
299 }
300 jsCbMap_.erase(type);
301 return DmErrorCode::DM_OK;
302 }
303
UnRegisterScreenListenerWithType(napi_env env,const std::string & type,napi_value value)304 DmErrorCode UnRegisterScreenListenerWithType(napi_env env, const std::string& type, napi_value value)
305 {
306 if (jsCbMap_.empty() || jsCbMap_.find(type) == jsCbMap_.end()) {
307 WLOGI("JsScreenManager::UnRegisterScreenListenerWithType methodName %{public}s not registered!",
308 type.c_str());
309 return DmErrorCode::DM_OK;
310 }
311 if (value == nullptr) {
312 WLOGFE("JsScreenManager::UnRegisterScreenListenerWithType value is nullptr");
313 return DmErrorCode::DM_ERROR_INVALID_SCREEN;
314 }
315 DmErrorCode ret = DmErrorCode::DM_OK;
316 for (auto it = jsCbMap_[type].begin(); it != jsCbMap_[type].end();) {
317 bool isEquals = false;
318 napi_strict_equals(env, value, it->first->GetNapiValue(), &isEquals);
319 if (isEquals) {
320 it->second->RemoveCallback(env, type, value);
321 if (type == EVENT_CONNECT || type == EVENT_DISCONNECT || type == EVENT_CHANGE) {
322 sptr<ScreenManager::IScreenListener> thisListener(it->second);
323 ret = DM_JS_TO_ERROR_CODE_MAP.at(
324 SingletonContainer::Get<ScreenManager>().UnregisterScreenListener(thisListener));
325 }
326 jsCbMap_[type].erase(it++);
327 break;
328 } else {
329 it++;
330 }
331 }
332 if (jsCbMap_[type].empty()) {
333 jsCbMap_.erase(type);
334 }
335 if (ret == DmErrorCode::DM_OK) {
336 WLOGFI("JsScreenManager::UnRegisterScreenListenerWithType success");
337 }
338 return ret;
339 }
340
NapiIsCallable(napi_env env,napi_value value)341 bool NapiIsCallable(napi_env env, napi_value value)
342 {
343 bool result = false;
344 napi_is_callable(env, value, &result);
345 return result;
346 }
347
NapiThrowError(napi_env env,DmErrorCode errCode,std::string msg="")348 napi_value NapiThrowError(napi_env env, DmErrorCode errCode, std::string msg = "")
349 {
350 napi_throw(env, CreateJsError(env, static_cast<int32_t>(errCode), msg));
351 return NapiGetUndefined(env);
352 }
353
OnRegisterScreenManagerCallback(napi_env env,napi_callback_info info)354 napi_value OnRegisterScreenManagerCallback(napi_env env, napi_callback_info info)
355 {
356 WLOGI("JsScreenManager::OnRegisterScreenManagerCallback is called");
357 size_t argc = 4;
358 napi_value argv[4] = {nullptr};
359 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
360 if (argc < ARGC_TWO) {
361 WLOGFE("Invalid args count, need 2 args!");
362 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, 2 args is needed.");
363 }
364 std::string cbType;
365 if (!ConvertFromJsValue(env, argv[0], cbType)) {
366 WLOGFE("Failed to convert parameter to eventType");
367 std::string errMsg = "Failed to convert parameter to eventType";
368 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
369 }
370 napi_value value = argv[INDEX_ONE];
371 if (value == nullptr) {
372 WLOGI("JsScreenManager::OnRegisterScreenManagerCallback argv[1] is nullptr");
373 std::string errMsg = "OnRegisterScreenManagerCallback error, argv[1] is nullptr";
374 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
375 }
376 if (!NapiIsCallable(env, value)) {
377 WLOGI("JsScreenManager::OnRegisterScreenManagerCallback argv[1] is not callable");
378 std::string errMsg = "OnRegisterScreenManagerCallback error, argv[1] is not callable";
379 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
380 }
381 std::lock_guard<std::mutex> lock(mtx_);
382 DmErrorCode ret = RegisterScreenListenerWithType(env, cbType, value);
383 if (ret != DmErrorCode::DM_OK) {
384 WLOGFE("JsScreenManager::OnRegisterScreenManagerCallback failed");
385 napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
386 }
387 return NapiGetUndefined(env);
388 }
389
OnUnregisterScreenManagerCallback(napi_env env,napi_callback_info info)390 napi_value OnUnregisterScreenManagerCallback(napi_env env, napi_callback_info info)
391 {
392 WLOGI("JsScreenManager::OnUnregisterScreenCallback is called");
393 size_t argc = 4;
394 napi_value argv[4] = {nullptr};
395 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
396 if (argc < ARGC_ONE) {
397 WLOGFE("Invalid args count, need one arg at least!");
398 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
399 }
400 std::string cbType;
401 if (!ConvertFromJsValue(env, argv[0], cbType)) {
402 WLOGFE("Failed to convert parameter to eventType");
403 std::string errMsg = "Failed to convert parameter to eventType";
404 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
405 }
406 std::lock_guard<std::mutex> lock(mtx_);
407 if (argc == ARGC_ONE) {
408 DmErrorCode ret = UnregisterAllScreenListenerWithType(cbType);
409 if (ret != DmErrorCode::DM_OK) {
410 WLOGFE("unregister all callback failed");
411 napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
412 }
413 } else {
414 napi_value value = argv[INDEX_ONE];
415 if ((value == nullptr) || (!NapiIsCallable(env, value))) {
416 DmErrorCode ret = UnregisterAllScreenListenerWithType(cbType);
417 if (ret != DmErrorCode::DM_OK) {
418 WLOGFE("JsScreenManager::OnUnRegisterAllScreenManagerCallback failed");
419 napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
420 }
421 } else {
422 DmErrorCode ret = UnRegisterScreenListenerWithType(env, cbType, value);
423 if (ret != DmErrorCode::DM_OK) {
424 WLOGFE("JsScreenManager::OnUnRegisterScreenManagerCallback failed");
425 napi_throw(env, CreateJsError(env, static_cast<int32_t>(ret)));
426 }
427 }
428 }
429 return NapiGetUndefined(env);
430 }
431
OnMakeMirror(napi_env env,napi_callback_info info)432 napi_value OnMakeMirror(napi_env env, napi_callback_info info)
433 {
434 WLOGI("OnMakeMirror is called");
435 size_t argc = 4;
436 napi_value argv[4] = {nullptr};
437 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
438 if (argc < ARGC_TWO) {
439 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need 2 args at least!");
440 }
441
442 int64_t mainScreenId;
443 if (!ConvertFromJsValue(env, argv[0], mainScreenId)) {
444 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
445 }
446 napi_value array = argv[INDEX_ONE];
447 if (array == nullptr) {
448 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get mirrorScreen, is nullptr");
449 }
450 uint32_t size = 0;
451 napi_get_array_length(env, array, &size);
452 std::vector<ScreenId> screenIds;
453 for (uint32_t i = 0; i < size; i++) {
454 uint32_t screenId;
455 napi_value value = nullptr;
456 napi_get_element(env, array, i, &value);
457 if (!ConvertFromJsValue(env, value, screenId)) {
458 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
459 }
460 screenIds.emplace_back(static_cast<ScreenId>(screenId));
461 }
462 napi_value lastParam = nullptr;
463 if (argc >= ARGC_THREE && argv[ARGC_THREE - 1] != nullptr &&
464 GetType(env, argv[ARGC_THREE - 1]) == napi_function) {
465 lastParam = argv[ARGC_THREE - 1];
466 }
467 napi_value result = nullptr;
468 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
469 auto asyncTask = [mainScreenId, screenIds, env, task = napiAsyncTask.get()]() {
470 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeMirror");
471 ScreenId screenGroupId = INVALID_SCREEN_ID;
472 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
473 SingletonContainer::Get<ScreenManager>().MakeMirror(mainScreenId, screenIds, screenGroupId));
474 if (ret == DmErrorCode::DM_OK) {
475 task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(screenGroupId)));
476 } else {
477 task->Reject(env,
478 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeMirror failed."));
479 }
480 };
481 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
482 return result;
483 }
484
OnMakeMirrorWithRegion(napi_env env,napi_callback_info info)485 napi_value OnMakeMirrorWithRegion(napi_env env, napi_callback_info info)
486 {
487 WLOGI("OnMakeMirrorWithRegion is called");
488 size_t argc = 4;
489 napi_value argv[4] = {nullptr};
490 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
491 if (argc < ARGC_THREE) {
492 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need 3 args at least!");
493 }
494 int64_t mainScreenId;
495 if (!ConvertFromJsValue(env, argv[INDEX_ZERO], mainScreenId)) {
496 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to mainScreenId");
497 }
498 napi_value array = argv[INDEX_ONE];
499 if (array == nullptr) {
500 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get mirrorScreen, is nullptr");
501 }
502 uint32_t size = 0;
503 napi_get_array_length(env, array, &size);
504 std::vector<ScreenId> mirrorScreenIds;
505 for (uint32_t i = 0; i < size; i++) {
506 uint32_t screenId;
507 napi_value value = nullptr;
508 napi_get_element(env, array, i, &value);
509 if (!ConvertFromJsValue(env, value, screenId)) {
510 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
511 }
512 mirrorScreenIds.emplace_back(static_cast<ScreenId>(screenId));
513 }
514 DMRect mainScreenRegion;
515 if (GetRectFromJs(env, argv[INDEX_TWO], mainScreenRegion) == -1) {
516 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert to mainScreenRegion");
517 }
518 napi_value lastParam = nullptr;
519 napi_value result = nullptr;
520 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
521 auto asyncTask = [mainScreenId, mirrorScreenIds, mainScreenRegion, env, task = napiAsyncTask.get()]() {
522 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeMirrorWithRegion");
523 ScreenId screenGroupId = INVALID_SCREEN_ID;
524 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(SingletonContainer::Get<ScreenManager>().MakeMirror(mainScreenId,
525 mirrorScreenIds, mainScreenRegion, screenGroupId));
526 if (ret == DmErrorCode::DM_OK) {
527 task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(screenGroupId)));
528 } else {
529 task->Reject(env,
530 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeMirrorWithRegion failed."));
531 }
532 };
533 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
534 return result;
535 }
536
OnSetMultiScreenMode(napi_env env,napi_callback_info info)537 napi_value OnSetMultiScreenMode(napi_env env, napi_callback_info info)
538 {
539 size_t argc = ARGC_FOUR;
540 napi_value argv[ARGC_FOUR] = {nullptr};
541 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
542 if (argc < ARGC_THREE) {
543 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need three args");
544 }
545 int64_t mainScreenId;
546 if (!ConvertFromJsValue(env, argv[INDEX_ZERO], mainScreenId)) {
547 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
548 }
549 int64_t secondaryScreenId;
550 if (!ConvertFromJsValue(env, argv[INDEX_ONE], secondaryScreenId)) {
551 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
552 }
553 MultiScreenMode screenMode;
554 if (!ConvertFromJsValue(env, argv[INDEX_TWO], screenMode)) {
555 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter");
556 }
557 napi_value lastParam = nullptr;
558 napi_value result = nullptr;
559 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
560 auto asyncTask = [mainScreenId, secondaryScreenId, env, screenMode,
561 task = napiAsyncTask.get()]() {
562 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetMultiScreenMode");
563 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
564 SingletonContainer::Get<ScreenManager>().SetMultiScreenMode(mainScreenId, secondaryScreenId,
565 screenMode));
566 if (ret == DmErrorCode::DM_OK) {
567 task->Resolve(env, NapiGetUndefined(env));
568 } else {
569 task->Reject(env,
570 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnSetMultiScreenMode failed."));
571 }
572 delete task;
573 };
574 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
575 return result;
576 }
577
OnSetMultiScreenRelativePosition(napi_env env,napi_callback_info info)578 napi_value OnSetMultiScreenRelativePosition(napi_env env, napi_callback_info info)
579 {
580 size_t argc = ARGC_FOUR;
581 napi_value argv[ARGC_FOUR] = {nullptr};
582 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
583 if (argc < ARGC_TWO) {
584 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need two args");
585 }
586 MultiScreenPositionOptions mainScreenOptions;
587 if (GetMultiScreenPositionOptionsFromJs(env, argv[INDEX_ZERO], mainScreenOptions) == -1) {
588 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
589 }
590 MultiScreenPositionOptions secondScreenOption;
591 if (GetMultiScreenPositionOptionsFromJs(env, argv[INDEX_ONE], secondScreenOption) == -1) {
592 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to int");
593 }
594 napi_value lastParam = nullptr;
595 napi_value result = nullptr;
596 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
597 auto asyncTask = [mainScreenOptions, secondScreenOption, env,
598 task = napiAsyncTask.get()]() {
599 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetMultiScreenRelativePosition");
600 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
601 SingletonContainer::Get<ScreenManager>().SetMultiScreenRelativePosition(mainScreenOptions,
602 secondScreenOption));
603 if (ret == DmErrorCode::DM_OK) {
604 task->Resolve(env, NapiGetUndefined(env));
605 } else {
606 task->Reject(env,
607 CreateJsError(env, static_cast<int32_t>(ret), "OnSetMultiScreenRelativePosition failed."));
608 }
609 delete task;
610 };
611 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
612 return result;
613 }
614
OnMakeExpand(napi_env env,napi_callback_info info)615 napi_value OnMakeExpand(napi_env env, napi_callback_info info)
616 {
617 WLOGI("OnMakeExpand is called");
618 size_t argc = 4;
619 napi_value argv[4] = {nullptr};
620 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
621 if (argc < ARGC_ONE) {
622 WLOGFE("Invalid args count, need one arg at least!");
623 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
624 }
625
626 napi_value array = argv[0];
627 if (array == nullptr) {
628 WLOGFE("Failed to get options, options is nullptr");
629 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get options, options is nullptr");
630 }
631 uint32_t size = 0;
632 napi_get_array_length(env, array, &size);
633 std::vector<ExpandOption> options;
634 for (uint32_t i = 0; i < size; ++i) {
635 napi_value object = nullptr;
636 napi_get_element(env, array, i, &object);
637 ExpandOption expandOption;
638 int32_t res = GetExpandOptionFromJs(env, object, expandOption);
639 if (res == -1) {
640 WLOGE("expandoption param %{public}d error!", i);
641 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "expandoption param error!");
642 }
643 options.emplace_back(expandOption);
644 }
645 napi_value lastParam = nullptr;
646 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
647 lastParam = argv[ARGC_TWO - 1];
648 }
649 napi_value result = nullptr;
650 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
651 auto asyncTask = [options, env, task = napiAsyncTask.get()]() {
652 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeExpand");
653 ScreenId screenGroupId = INVALID_SCREEN_ID;
654 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
655 SingletonContainer::Get<ScreenManager>().MakeExpand(options, screenGroupId));
656 if (ret == DmErrorCode::DM_OK) {
657 task->Resolve(env, CreateJsValue(env, static_cast<uint32_t>(screenGroupId)));
658 WLOGI("MakeExpand success");
659 } else {
660 task->Reject(env,
661 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeExpand failed."));
662 WLOGFE("MakeExpand failed");
663 }
664 delete task;
665 };
666 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
667 return result;
668 }
669
OnStopMirror(napi_env env,napi_callback_info info)670 napi_value OnStopMirror(napi_env env, napi_callback_info info)
671 {
672 WLOGI("OnStopMirror is called");
673 size_t argc = 4;
674 napi_value argv[4] = {nullptr};
675 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
676 if (argc < ARGC_ONE) {
677 WLOGFE("Invalid args count, need one arg at least!");
678 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
679 }
680
681 napi_value array = argv[0];
682 if (array == nullptr) {
683 WLOGFE("Failed to get mirrorScreen, mirrorScreen is nullptr");
684 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get mirrorScreen, is nullptr");
685 }
686 uint32_t size = 0;
687 napi_get_array_length(env, array, &size);
688 if (size > MAX_SCREENS_NUM) {
689 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "size of mirrorScreen is greater than 1000");
690 }
691 std::vector<ScreenId> screenIds;
692 for (uint32_t i = 0; i < size; i++) {
693 uint32_t screenId;
694 napi_value value = nullptr;
695 napi_get_element(env, array, i, &value);
696 if (!ConvertFromJsValue(env, value, screenId)) {
697 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
698 }
699 screenIds.emplace_back(static_cast<ScreenId>(screenId));
700 }
701 napi_value lastParam = nullptr;
702 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
703 lastParam = argv[ARGC_TWO - 1];
704 }
705 napi_value result = nullptr;
706 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
707 auto asyncTask = [screenIds, env, task = napiAsyncTask.get()]() {
708 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnStopMirror");
709 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
710 SingletonContainer::Get<ScreenManager>().StopMirror(screenIds));
711 if (ret == DmErrorCode::DM_OK) {
712 task->Resolve(env, NapiGetUndefined(env));
713 } else {
714 task->Reject(env,
715 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnStopMirror failed."));
716 }
717 delete task;
718 };
719 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
720 return result;
721 }
722
OnStopExpand(napi_env env,napi_callback_info info)723 napi_value OnStopExpand(napi_env env, napi_callback_info info)
724 {
725 WLOGI("OnStopExpand is called");
726 size_t argc = 4;
727 napi_value argv[4] = {nullptr};
728 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
729 if (argc < ARGC_ONE) {
730 WLOGFE("Invalid args count, need one arg at least!");
731 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
732 }
733
734 napi_value array = argv[0];
735 if (array == nullptr) {
736 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get expandScreen, is nullptr");
737 }
738 uint32_t size = 0;
739 napi_get_array_length(env, array, &size);
740 if (size > MAX_SCREENS_NUM) {
741 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "size of expandScreen is greater than 1000");
742 }
743 std::vector<ScreenId> screenIds;
744 for (uint32_t i = 0; i < size; i++) {
745 uint32_t screenId;
746 napi_value value = nullptr;
747 napi_get_element(env, array, i, &value);
748 if (!ConvertFromJsValue(env, value, screenId)) {
749 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
750 }
751 screenIds.emplace_back(static_cast<ScreenId>(screenId));
752 }
753 napi_value lastParam = nullptr;
754 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
755 lastParam = argv[ARGC_TWO - 1];
756 }
757 napi_value result = nullptr;
758 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
759 auto asyncTask = [screenIds, env, task = napiAsyncTask.get()]() {
760 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnStopExpand");
761 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
762 SingletonContainer::Get<ScreenManager>().StopExpand(screenIds));
763 if (ret == DmErrorCode::DM_OK) {
764 task->Resolve(env, NapiGetUndefined(env));
765 WLOGI("MakeExpand success");
766 } else {
767 task->Reject(env,
768 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnStopExpand failed."));
769 }
770 delete task;
771 };
772 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
773 return result;
774 }
775
OnMakeUnique(napi_env env,napi_callback_info info)776 napi_value OnMakeUnique(napi_env env, napi_callback_info info)
777 {
778 WLOGI("OnMakeUnique is called");
779 size_t argc = 4;
780 napi_value argv[4] = {nullptr};
781 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
782 if (argc < ARGC_ONE) {
783 WLOGFE("Invalid args count, need one arg at least!");
784 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Invalid args count, need one arg at least!");
785 }
786 napi_value array = argv[0];
787 if (array == nullptr) {
788 WLOGFE("Failed to get options, options is nullptr");
789 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to get options, options is nullptr");
790 }
791 uint32_t size = 0;
792 napi_get_array_length(env, array, &size);
793 std::vector<ScreenId> screenIds;
794 for (uint32_t i = 0; i < size; i++) {
795 uint32_t screenId;
796 napi_value value = nullptr;
797 napi_get_element(env, array, i, &value);
798 if (!ConvertFromJsValue(env, value, screenId)) {
799 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "Failed to convert parameter to ScreenId");
800 }
801 if (static_cast<int32_t>(screenId) < 0) {
802 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, "ScreenId cannot be a negative number");
803 }
804 screenIds.emplace_back(static_cast<ScreenId>(screenId));
805 }
806 napi_value lastParam = nullptr;
807 napi_value result = nullptr;
808 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
809 auto asyncTask = [this, screenIds, env, task = napiAsyncTask.get()]() {
810 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnMakeUnique");
811 std::vector<DisplayId> displayIds;
812 DmErrorCode ret = DM_JS_TO_ERROR_CODE_MAP.at(
813 SingletonContainer::Get<ScreenManager>().MakeUniqueScreen(screenIds, displayIds));
814 if (ret == DmErrorCode::DM_OK) {
815 task->Resolve(env, CreateJsDisplayIdVectorObject(env, displayIds));
816 WLOGI("makeUnique success");
817 } else {
818 task->Reject(env,
819 CreateJsError(env, static_cast<int32_t>(ret), "JsScreenManager::OnMakeUnique failed."));
820 }
821 delete task;
822 };
823 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
824 return result;
825 }
826
GetExpandOptionFromJs(napi_env env,napi_value optionObject,ExpandOption & option)827 static int32_t GetExpandOptionFromJs(napi_env env, napi_value optionObject, ExpandOption& option)
828 {
829 napi_value screedIdValue = nullptr;
830 napi_value startXValue = nullptr;
831 napi_value startYValue = nullptr;
832 uint32_t screenId;
833 uint32_t startX;
834 uint32_t startY;
835 napi_get_named_property(env, optionObject, "screenId", &screedIdValue);
836 napi_get_named_property(env, optionObject, "startX", &startXValue);
837 napi_get_named_property(env, optionObject, "startY", &startYValue);
838 if (!ConvertFromJsValue(env, screedIdValue, screenId)) {
839 WLOGFE("Failed to convert screedIdValue to callbackType");
840 return -1;
841 }
842 if (!ConvertFromJsValue(env, startXValue, startX)) {
843 WLOGFE("Failed to convert startXValue to callbackType");
844 return -1;
845 }
846 if (!ConvertFromJsValue(env, startYValue, startY)) {
847 WLOGFE("Failed to convert startYValue to callbackType");
848 return -1;
849 }
850 option = {screenId, startX, startY};
851 return 0;
852 }
853
GetMultiScreenPositionOptionsFromJs(napi_env env,napi_value optionObject,MultiScreenPositionOptions & option)854 static int32_t GetMultiScreenPositionOptionsFromJs(napi_env env, napi_value optionObject,
855 MultiScreenPositionOptions& option)
856 {
857 napi_value screedIdValue = nullptr;
858 napi_value startXValue = nullptr;
859 napi_value startYValue = nullptr;
860 uint32_t screenId;
861 uint32_t startX;
862 uint32_t startY;
863 napi_get_named_property(env, optionObject, "id", &screedIdValue);
864 napi_get_named_property(env, optionObject, "startX", &startXValue);
865 napi_get_named_property(env, optionObject, "startY", &startYValue);
866 if (!ConvertFromJsValue(env, screedIdValue, screenId)) {
867 WLOGFE("Failed to convert screedIdValue to callbackType");
868 return -1;
869 }
870 if (!ConvertFromJsValue(env, startXValue, startX)) {
871 WLOGFE("Failed to convert startXValue to callbackType");
872 return -1;
873 }
874 if (!ConvertFromJsValue(env, startYValue, startY)) {
875 WLOGFE("Failed to convert startYValue to callbackType");
876 return -1;
877 }
878 option = {screenId, startX, startY};
879 return 0;
880 }
881
GetRectFromJs(napi_env env,napi_value optionObject,DMRect & rect)882 static int32_t GetRectFromJs(napi_env env, napi_value optionObject, DMRect& rect)
883 {
884 napi_value leftValue = nullptr;
885 napi_value topValue = nullptr;
886 napi_value widthValue = nullptr;
887 napi_value heightValue = nullptr;
888 int32_t left;
889 int32_t top;
890 uint32_t width;
891 uint32_t height;
892 napi_get_named_property(env, optionObject, "left", &leftValue);
893 napi_get_named_property(env, optionObject, "top", &topValue);
894 napi_get_named_property(env, optionObject, "width", &widthValue);
895 napi_get_named_property(env, optionObject, "height", &heightValue);
896 if (!ConvertFromJsValue(env, leftValue, left)) {
897 WLOGFE("Failed to convert leftValue to callbackType");
898 return -1;
899 }
900 if (!ConvertFromJsValue(env, topValue, top)) {
901 WLOGFE("Failed to convert topValue to callbackType");
902 return -1;
903 }
904 if (!ConvertFromJsValue(env, widthValue, width)) {
905 WLOGFE("Failed to convert widthValue to callbackType");
906 return -1;
907 }
908 if (!ConvertFromJsValue(env, heightValue, height)) {
909 WLOGFE("Failed to convert heightValue to callbackType");
910 return -1;
911 }
912 rect = {left, top, width, height};
913 return 0;
914 }
915
OnCreateVirtualScreen(napi_env env,napi_callback_info info)916 napi_value OnCreateVirtualScreen(napi_env env, napi_callback_info info)
917 {
918 WLOGI("JsScreenManager::OnCreateVirtualScreen is called");
919 DmErrorCode errCode = DmErrorCode::DM_OK;
920 VirtualScreenOption option;
921 size_t argc = 4;
922 std::string errMsg = "";
923 napi_value argv[4] = {nullptr};
924 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
925 if (argc < ARGC_ONE) {
926 errMsg = "Invalid args count, need one arg at least!";
927 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
928 } else {
929 napi_value object = argv[0];
930 if (object == nullptr) {
931 errMsg = "Failed to get options, options is nullptr";
932 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
933 } else {
934 errCode = GetVirtualScreenOptionFromJs(env, object, option);
935 }
936 }
937 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM) {
938 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
939 }
940 napi_value lastParam = nullptr;
941 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr &&
942 GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
943 lastParam = argv[ARGC_TWO - 1];
944 }
945 napi_value result = nullptr;
946 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
947 auto asyncTask = [option, env, task = napiAsyncTask.get()]() {
948 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnCreateVirtualScreen");
949 auto screenId = SingletonContainer::Get<ScreenManager>().CreateVirtualScreen(option);
950 auto screen = SingletonContainer::Get<ScreenManager>().GetScreenById(screenId);
951 if (screen == nullptr) {
952 DmErrorCode ret = DmErrorCode::DM_ERROR_INVALID_SCREEN;
953 if (screenId == ERROR_ID_NOT_SYSTEM_APP) {
954 ret = DmErrorCode::DM_ERROR_NOT_SYSTEM_APP;
955 }
956 task->Reject(env, CreateJsError(env, static_cast<int32_t>(ret), "CreateVirtualScreen failed."));
957 WLOGFE("ScreenManager::CreateVirtualScreen failed.");
958 } else {
959 task->Resolve(env, CreateJsScreenObject(env, screen));
960 WLOGI("JsScreenManager::OnCreateVirtualScreen success");
961 }
962 delete task;
963 };
964 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
965 return result;
966 }
967
GetVirtualScreenOptionFromJs(napi_env env,napi_value optionObject,VirtualScreenOption & option)968 DmErrorCode GetVirtualScreenOptionFromJs(napi_env env, napi_value optionObject, VirtualScreenOption& option)
969 {
970 napi_value name = nullptr;
971 napi_get_named_property(env, optionObject, "name", &name);
972 if (!ConvertFromJsValue(env, name, option.name_)) {
973 WLOGFE("Failed to convert parameter to name.");
974 return DmErrorCode::DM_ERROR_INVALID_PARAM;
975 }
976 napi_value width = nullptr;
977 napi_get_named_property(env, optionObject, "width", &width);
978 if (!ConvertFromJsValue(env, width, option.width_)) {
979 WLOGFE("Failed to convert parameter to width.");
980 return DmErrorCode::DM_ERROR_INVALID_PARAM;
981 }
982 napi_value height = nullptr;
983 napi_get_named_property(env, optionObject, "height", &height);
984 if (!ConvertFromJsValue(env, height, option.height_)) {
985 WLOGFE("Failed to convert parameter to height.");
986 return DmErrorCode::DM_ERROR_INVALID_PARAM;
987 }
988 napi_value density = nullptr;
989 napi_get_named_property(env, optionObject, "density", &density);
990 double densityValue;
991 if (!ConvertFromJsValue(env, density, densityValue)) {
992 WLOGFE("Failed to convert parameter to density.");
993 return DmErrorCode::DM_ERROR_INVALID_PARAM;
994 }
995 option.density_ = static_cast<float>(densityValue);
996
997 napi_value surfaceIdNapiValue = nullptr;
998 napi_get_named_property(env, optionObject, "surfaceId", &surfaceIdNapiValue);
999 if (!GetSurfaceFromJs(env, surfaceIdNapiValue, option.surface_)) {
1000 return DmErrorCode::DM_ERROR_INVALID_PARAM;
1001 }
1002 return DmErrorCode::DM_OK;
1003 }
1004
GetSurfaceFromJs(napi_env env,napi_value surfaceIdNapiValue,sptr<Surface> & surface)1005 bool GetSurfaceFromJs(napi_env env, napi_value surfaceIdNapiValue, sptr<Surface>& surface)
1006 {
1007 if (surfaceIdNapiValue == nullptr || GetType(env, surfaceIdNapiValue) != napi_string) {
1008 WLOGFE("Failed to convert parameter to surface. Invalidate params.");
1009 return false;
1010 }
1011
1012 char buffer[PATH_MAX];
1013 size_t length = 0;
1014 uint64_t surfaceId = 0;
1015 if (napi_get_value_string_utf8(env, surfaceIdNapiValue, buffer, PATH_MAX, &length) != napi_ok) {
1016 WLOGFE("Failed to convert parameter to surface.");
1017 return false;
1018 }
1019 std::istringstream inputStream(buffer);
1020 inputStream >> surfaceId;
1021 surface = SurfaceUtils::GetInstance()->GetSurface(surfaceId);
1022 if (surface == nullptr) {
1023 WLOGI("GetSurfaceFromJs failed, surfaceId:%{public}" PRIu64"", surfaceId);
1024 }
1025 return true;
1026 }
1027
OnDestroyVirtualScreen(napi_env env,napi_callback_info info)1028 napi_value OnDestroyVirtualScreen(napi_env env, napi_callback_info info)
1029 {
1030 WLOGI("JsScreenManager::OnDestroyVirtualScreen is called");
1031 DmErrorCode errCode = DmErrorCode::DM_OK;
1032 int64_t screenId = -1LL;
1033 std::string errMsg = "";
1034 size_t argc = 4;
1035 napi_value argv[4] = {nullptr};
1036 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1037 if (argc < ARGC_ONE) {
1038 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1039 errMsg = "Invalid args count, need one arg at least!";
1040 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1041 } else {
1042 if (!ConvertFromJsValue(env, argv[0], screenId)) {
1043 WLOGFE("Failed to convert parameter to screen id.");
1044 errMsg = "Failed to convert parameter to screen id.";
1045 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1046 }
1047 }
1048 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || screenId == -1LL) {
1049 WLOGFE("JsScreenManager::OnDestroyVirtualScreen failed, Invalidate params.");
1050 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1051 }
1052 napi_value lastParam = nullptr;
1053 if (argc >= ARGC_TWO && argv[ARGC_TWO - 1] != nullptr &&
1054 GetType(env, argv[ARGC_TWO - 1]) == napi_function) {
1055 lastParam = argv[ARGC_TWO - 1];
1056 }
1057 napi_value result = nullptr;
1058 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1059 auto asyncTask = [screenId, env, task = napiAsyncTask.get()]() {
1060 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnDestroyVirtualScreen");
1061 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1062 SingletonContainer::Get<ScreenManager>().DestroyVirtualScreen(screenId));
1063 if (res != DmErrorCode::DM_OK) {
1064 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1065 "ScreenManager::DestroyVirtualScreen failed."));
1066 WLOGFE("ScreenManager::DestroyVirtualScreen failed.");
1067 delete task;
1068 return;
1069 }
1070 task->Resolve(env, NapiGetUndefined(env));
1071 WLOGI("JsScreenManager::OnDestroyVirtualScreen success");
1072 delete task;
1073 };
1074 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1075 return result;
1076 }
1077
OnSetVirtualScreenSurface(napi_env env,napi_callback_info info)1078 napi_value OnSetVirtualScreenSurface(napi_env env, napi_callback_info info)
1079 {
1080 WLOGI("JsScreenManager::OnSetVirtualScreenSurface is called");
1081 DmErrorCode errCode = DmErrorCode::DM_OK;
1082 int64_t screenId = -1LL;
1083 sptr<Surface> surface;
1084 size_t argc = 4;
1085 std::string errMsg = "";
1086 napi_value argv[4] = {nullptr};
1087 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1088 if (argc < ARGC_TWO) {
1089 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1090 errMsg = "Invalid args count, need 2 args at least!";
1091 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1092 } else {
1093 if (!ConvertFromJsValue(env, argv[0], screenId)) {
1094 errMsg = "Failed to convert parameter to screen id.";
1095 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1096 }
1097 if (!GetSurfaceFromJs(env, argv[1], surface)) {
1098 errMsg = "Failed to convert parameter.";
1099 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1100 }
1101 }
1102 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM || surface == nullptr) {
1103 WLOGFE("JsScreenManager::OnSetVirtualScreenSurface failed, Invalidate params.");
1104 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1105 }
1106 napi_value lastParam = nullptr;
1107 if (argc >= ARGC_THREE && argv[ARGC_THREE - 1] != nullptr &&
1108 GetType(env, argv[ARGC_THREE - 1]) == napi_function) {
1109 lastParam = argv[ARGC_THREE - 1];
1110 }
1111 napi_value result = nullptr;
1112 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1113 auto asyncTask = [screenId, surface, env, task = napiAsyncTask.get()]() {
1114 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetVirtualScreenSurface");
1115 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1116 SingletonContainer::Get<ScreenManager>().SetVirtualScreenSurface(screenId, surface));
1117 if (res != DmErrorCode::DM_OK) {
1118 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1119 "ScreenManager::SetVirtualScreenSurface failed."));
1120 WLOGFE("ScreenManager::SetVirtualScreenSurface failed.");
1121 } else {
1122 task->Resolve(env, NapiGetUndefined(env));
1123 }
1124 delete task;
1125 };
1126 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1127 return result;
1128 }
1129
OnSetScreenPrivacyMaskImage(napi_env env,napi_callback_info info)1130 napi_value OnSetScreenPrivacyMaskImage(napi_env env, napi_callback_info info)
1131 {
1132 WLOGI("JsScreenManager::OnSetScreenPrivacyMaskImage is called");
1133 DmErrorCode errCode = DmErrorCode::DM_OK;
1134 int64_t screenId = -1LL;
1135 size_t argc = 4;
1136 std::string errMsg = "";
1137 napi_value argv[4] = {nullptr};
1138 std::shared_ptr<Media::PixelMap> privacyMaskImg;
1139 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1140 if (argc < ARGC_ONE) {
1141 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1142 errMsg = "Invalid args count, need 1 args at least!";
1143 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1144 } else {
1145 if (!ConvertFromJsValue(env, argv[0], screenId)) {
1146 errMsg = "Failed to convert parameter to screen id.";
1147 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1148 }
1149 if (argc > ARGC_ONE && GetType(env, argv[1]) == napi_object) {
1150 privacyMaskImg = OHOS::Media::PixelMapNapi::GetPixelMap(env, argv[1]);
1151 if (privacyMaskImg == nullptr) {
1152 errMsg = "Failed to convert parameter to pixelmap.";
1153 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1154 }
1155 }
1156 }
1157 if (errCode != DmErrorCode::DM_OK) {
1158 WLOGFE("JsScreenManager::OnSetScreenPrivacyMaskImage failed, Invalidate params.");
1159 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1160 }
1161 napi_value lastParam = nullptr;
1162 lastParam = (argc >= ARGC_THREE && GetType(env, argv[ARGC_THREE - 1]) ==
1163 napi_function) ? argv[ARGC_THREE - 1] : argv[ARGC_TWO - 1];
1164 napi_value result = nullptr;
1165 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1166 auto asyncTask = [screenId, privacyMaskImg, env, task = napiAsyncTask.get()]() {
1167 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetScreenPrivacyMaskImage");
1168 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1169 SingletonContainer::Get<ScreenManager>().SetScreenPrivacyMaskImage(screenId, privacyMaskImg));
1170 if (res != DmErrorCode::DM_OK) {
1171 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res), "OnSetScreenPrivacyMaskImage failed."));
1172 WLOGFE("OnSetScreenPrivacyMaskImage failed.");
1173 } else {
1174 task->Resolve(env, NapiGetUndefined(env));
1175 }
1176 delete task;
1177 };
1178 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1179 return result;
1180 }
1181
OnIsScreenRotationLocked(napi_env env,napi_callback_info info)1182 napi_value OnIsScreenRotationLocked(napi_env env, napi_callback_info info)
1183 {
1184 size_t argc = 4;
1185 napi_value argv[4] = {nullptr};
1186 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1187 WLOGI("OnIsScreenRotationLocked is called");
1188 napi_value lastParam = nullptr;
1189 if (argc >= ARGC_ONE && argv[ARGC_ONE - 1] != nullptr &&
1190 GetType(env, argv[ARGC_ONE - 1]) == napi_function) {
1191 lastParam = argv[ARGC_ONE - 1];
1192 }
1193 napi_value result = nullptr;
1194 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1195 auto asyncTask = [env, task = napiAsyncTask.get()]() {
1196 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnIsScreenRotationLocked");
1197 bool isLocked = false;
1198 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1199 SingletonContainer::Get<ScreenManager>().IsScreenRotationLocked(isLocked));
1200 if (res == DmErrorCode::DM_OK) {
1201 task->Resolve(env, CreateJsValue(env, isLocked));
1202 WLOGFI("OnIsScreenRotationLocked success");
1203 } else {
1204 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1205 "JsScreenManager::OnIsScreenRotationLocked failed."));
1206 WLOGFE("OnIsScreenRotationLocked failed");
1207 }
1208 delete task;
1209 };
1210 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1211 return result;
1212 }
1213
OnSetScreenRotationLocked(napi_env env,napi_callback_info info)1214 napi_value OnSetScreenRotationLocked(napi_env env, napi_callback_info info)
1215 {
1216 WLOGI("JsScreenManager::OnSetScreenRotationLocked is called");
1217 DmErrorCode errCode = DmErrorCode::DM_OK;
1218 size_t argc = 4;
1219 std::string errMsg = "";
1220 napi_value argv[4] = {nullptr};
1221 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
1222 if (argc < ARGC_ONE) {
1223 WLOGFE("[NAPI]Argc is invalid: %{public}zu", argc);
1224 errMsg = "Invalid args count, need one arg at least!";
1225 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1226 }
1227 bool isLocked = false;
1228 if (errCode == DmErrorCode::DM_OK) {
1229 napi_value nativeVal = argv[0];
1230 if (nativeVal == nullptr) {
1231 WLOGFE("[NAPI]Failed to convert parameter to isLocked");
1232 errMsg = "Failed to convert parameter to isLocked.";
1233 errCode = DmErrorCode::DM_ERROR_INVALID_PARAM;
1234 } else {
1235 napi_get_value_bool(env, nativeVal, &isLocked);
1236 }
1237 }
1238 if (errCode == DmErrorCode::DM_ERROR_INVALID_PARAM) {
1239 WLOGFE("JsScreenManager::OnSetScreenRotationLocked failed, Invalidate params.");
1240 return NapiThrowError(env, DmErrorCode::DM_ERROR_INVALID_PARAM, errMsg);
1241 }
1242 napi_value lastParam = (argc <= ARGC_ONE) ? nullptr :
1243 ((argv[ARGC_TWO - 1] != nullptr && GetType(env, argv[ARGC_TWO - 1]) == napi_function) ?
1244 argv[1] : nullptr);
1245 napi_value result = nullptr;
1246 std::unique_ptr<NapiAsyncTask> napiAsyncTask = CreateEmptyAsyncTask(env, lastParam, &result);
1247 auto asyncTask = [isLocked, env, task = napiAsyncTask.get()]() {
1248 HITRACE_METER_FMT(HITRACE_TAG_WINDOW_MANAGER, "JsScreenManager::OnSetScreenRotationLocked");
1249 auto res = DM_JS_TO_ERROR_CODE_MAP.at(
1250 SingletonContainer::Get<ScreenManager>().SetScreenRotationLocked(isLocked));
1251 if (res == DmErrorCode::DM_OK) {
1252 task->Resolve(env, NapiGetUndefined(env));
1253 WLOGFI("OnSetScreenRotationLocked success");
1254 } else {
1255 task->Reject(env, CreateJsError(env, static_cast<int32_t>(res),
1256 "JsScreenManager::OnSetScreenRotationLocked failed."));
1257 WLOGFE("OnSetScreenRotationLocked failed");
1258 }
1259 delete task;
1260 };
1261 NapiSendDmsEvent(env, asyncTask, napiAsyncTask);
1262 return result;
1263 }
1264
NapiSendDmsEvent(napi_env env,std::function<void ()> asyncTask,std::unique_ptr<AbilityRuntime::NapiAsyncTask> & napiAsyncTask)1265 void NapiSendDmsEvent(napi_env env, std::function<void()> asyncTask,
1266 std::unique_ptr<AbilityRuntime::NapiAsyncTask>& napiAsyncTask)
1267 {
1268 if (!env) {
1269 WLOGFE("env is null");
1270 return;
1271 }
1272 if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_immediate)) {
1273 napiAsyncTask->Reject(env, CreateJsError(env,
1274 static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN), "Send event failed!"));
1275 } else {
1276 napiAsyncTask.release();
1277 WLOGFE("send event success");
1278 }
1279 }
1280 };
1281
InitScreenOrientation(napi_env env)1282 napi_value InitScreenOrientation(napi_env env)
1283 {
1284 WLOGD("JsScreenManager::InitScreenOrientation called");
1285
1286 if (env == nullptr) {
1287 WLOGFE("env is nullptr");
1288 return nullptr;
1289 }
1290
1291 napi_value objValue = nullptr;
1292 napi_create_object(env, &objValue);
1293 if (objValue == nullptr) {
1294 WLOGFE("Failed to get object");
1295 return nullptr;
1296 }
1297
1298 napi_set_named_property(env, objValue, "UNSPECIFIED",
1299 CreateJsValue(env, static_cast<int32_t>(Orientation::UNSPECIFIED)));
1300 napi_set_named_property(env, objValue, "VERTICAL",
1301 CreateJsValue(env, static_cast<int32_t>(Orientation::VERTICAL)));
1302 napi_set_named_property(env, objValue, "HORIZONTAL",
1303 CreateJsValue(env, static_cast<int32_t>(Orientation::HORIZONTAL)));
1304 napi_set_named_property(env, objValue, "REVERSE_VERTICAL",
1305 CreateJsValue(env, static_cast<int32_t>(Orientation::REVERSE_VERTICAL)));
1306 napi_set_named_property(env, objValue, "REVERSE_HORIZONTAL",
1307 CreateJsValue(env, static_cast<int32_t>(Orientation::REVERSE_HORIZONTAL)));
1308 return objValue;
1309 }
1310
InitScreenSourceMode(napi_env env)1311 napi_value InitScreenSourceMode(napi_env env)
1312 {
1313 WLOGD("JsScreenManager::InitScreenSourceMode called");
1314
1315 if (env == nullptr) {
1316 WLOGFE("env is nullptr");
1317 return nullptr;
1318 }
1319
1320 napi_value objValue = nullptr;
1321 napi_create_object(env, &objValue);
1322 if (objValue == nullptr) {
1323 WLOGFE("Failed to get object");
1324 return nullptr;
1325 }
1326
1327 napi_set_named_property(env, objValue, "SCREEN_MAIN",
1328 CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_MAIN)));
1329 napi_set_named_property(env, objValue, "SCREEN_MIRROR",
1330 CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_MIRROR)));
1331 napi_set_named_property(env, objValue, "SCREEN_EXTEND",
1332 CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_EXTEND)));
1333 napi_set_named_property(env, objValue, "SCREEN_ALONE",
1334 CreateJsValue(env, static_cast<uint32_t>(ScreenSourceMode::SCREEN_ALONE)));
1335 return objValue;
1336 }
1337
InitMultiScreenMode(napi_env env)1338 napi_value InitMultiScreenMode(napi_env env)
1339 {
1340 WLOGD("JsScreenManager::InitMultiScreenMode called");
1341
1342 if (env == nullptr) {
1343 WLOGFE("env is nullptr");
1344 return nullptr;
1345 }
1346
1347 napi_value objValue = nullptr;
1348 napi_create_object(env, &objValue);
1349 if (objValue == nullptr) {
1350 WLOGFE("Failed to get object");
1351 return nullptr;
1352 }
1353
1354 napi_set_named_property(env, objValue, "SCREEN_MIRROR",
1355 CreateJsValue(env, static_cast<uint32_t>(MultiScreenMode::SCREEN_MIRROR)));
1356 napi_set_named_property(env, objValue, "SCREEN_EXTEND",
1357 CreateJsValue(env, static_cast<uint32_t>(MultiScreenMode::SCREEN_EXTEND)));
1358 return objValue;
1359 }
1360
InitDisplayErrorCode(napi_env env)1361 napi_value InitDisplayErrorCode(napi_env env)
1362 {
1363 WLOGD("JsDisplayManager::InitDisplayErrorCode called");
1364
1365 if (env == nullptr) {
1366 WLOGFE("env is nullptr");
1367 return nullptr;
1368 }
1369
1370 napi_value objValue = nullptr;
1371 napi_create_object(env, &objValue);
1372 if (objValue == nullptr) {
1373 WLOGFE("Failed to get object");
1374 return nullptr;
1375 }
1376
1377 napi_set_named_property(env, objValue, "DM_ERROR_NO_PERMISSION",
1378 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_NO_PERMISSION)));
1379 napi_set_named_property(env, objValue, "DM_ERROR_NOT_SYSTEM_APP",
1380 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_NOT_SYSTEM_APP)));
1381 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_PARAM",
1382 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_PARAM)));
1383 napi_set_named_property(env, objValue, "DM_ERROR_DEVICE_NOT_SUPPORT",
1384 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_DEVICE_NOT_SUPPORT)));
1385 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_SCREEN",
1386 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_SCREEN)));
1387 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_CALLING",
1388 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_INVALID_CALLING)));
1389 napi_set_named_property(env, objValue, "DM_ERROR_SYSTEM_INNORMAL",
1390 CreateJsValue(env, static_cast<int32_t>(DmErrorCode::DM_ERROR_SYSTEM_INNORMAL)));
1391 return objValue;
1392 }
1393
InitDisplayError(napi_env env)1394 napi_value InitDisplayError(napi_env env)
1395 {
1396 WLOGD("JsDisplayManager::InitDisplayError called");
1397
1398 if (env == nullptr) {
1399 WLOGFE("env is nullptr");
1400 return nullptr;
1401 }
1402
1403 napi_value objValue = nullptr;
1404 napi_create_object(env, &objValue);
1405 if (objValue == nullptr) {
1406 WLOGFE("Failed to get object");
1407 return nullptr;
1408 }
1409
1410 napi_set_named_property(env, objValue, "DM_ERROR_INIT_DMS_PROXY_LOCKED",
1411 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED)));
1412 napi_set_named_property(env, objValue, "DM_ERROR_IPC_FAILED",
1413 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_IPC_FAILED)));
1414 napi_set_named_property(env, objValue, "DM_ERROR_REMOTE_CREATE_FAILED",
1415 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_REMOTE_CREATE_FAILED)));
1416 napi_set_named_property(env, objValue, "DM_ERROR_NULLPTR",
1417 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_NULLPTR)));
1418 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_PARAM",
1419 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_PARAM)));
1420 napi_set_named_property(env, objValue, "DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED",
1421 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED)));
1422 napi_set_named_property(env, objValue, "DM_ERROR_DEATH_RECIPIENT",
1423 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_DEATH_RECIPIENT)));
1424 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_MODE_ID",
1425 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_MODE_ID)));
1426 napi_set_named_property(env, objValue, "DM_ERROR_WRITE_DATA_FAILED",
1427 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_WRITE_DATA_FAILED)));
1428 napi_set_named_property(env, objValue, "DM_ERROR_RENDER_SERVICE_FAILED",
1429 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_RENDER_SERVICE_FAILED)));
1430 napi_set_named_property(env, objValue, "DM_ERROR_UNREGISTER_AGENT_FAILED",
1431 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_UNREGISTER_AGENT_FAILED)));
1432 napi_set_named_property(env, objValue, "DM_ERROR_INVALID_CALLING",
1433 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_INVALID_CALLING)));
1434 napi_set_named_property(env, objValue, "DM_ERROR_UNKNOWN",
1435 CreateJsValue(env, static_cast<int32_t>(DMError::DM_ERROR_UNKNOWN)));
1436 return objValue;
1437 }
1438
JsScreenManagerInit(napi_env env,napi_value exportObj)1439 napi_value JsScreenManagerInit(napi_env env, napi_value exportObj)
1440 {
1441 WLOGD("JsScreenManagerInit is called");
1442
1443 if (env == nullptr || exportObj == nullptr) {
1444 WLOGFE("JsScreenManagerInit env or exportObj is nullptr");
1445 return nullptr;
1446 }
1447
1448 std::unique_ptr<JsScreenManager> jsScreenManager = std::make_unique<JsScreenManager>(env);
1449 napi_wrap(env, exportObj, jsScreenManager.release(), JsScreenManager::Finalizer, nullptr, nullptr);
1450 napi_set_named_property(env, exportObj, "Orientation", InitScreenOrientation(env));
1451 napi_set_named_property(env, exportObj, "ScreenSourceMode", InitScreenSourceMode(env));
1452 napi_set_named_property(env, exportObj, "DmErrorCode", InitDisplayErrorCode(env));
1453 napi_set_named_property(env, exportObj, "DMError", InitDisplayError(env));
1454 napi_set_named_property(env, exportObj, "MultiScreenMode", InitMultiScreenMode(env));
1455
1456 const char *moduleName = "JsScreenManager";
1457 BindNativeFunction(env, exportObj, "getAllScreens", moduleName, JsScreenManager::GetAllScreens);
1458 BindNativeFunction(env, exportObj, "on", moduleName, JsScreenManager::RegisterScreenManagerCallback);
1459 BindNativeFunction(env, exportObj, "off", moduleName, JsScreenManager::UnregisterScreenMangerCallback);
1460 BindNativeFunction(env, exportObj, "makeMirror", moduleName, JsScreenManager::MakeMirror);
1461 BindNativeFunction(env, exportObj, "makeMirrorWithRegion", moduleName, JsScreenManager::MakeMirrorWithRegion);
1462 BindNativeFunction(env, exportObj, "setMultiScreenMode", moduleName, JsScreenManager::SetMultiScreenMode);
1463 BindNativeFunction(env, exportObj, "setMultiScreenRelativePosition", moduleName,
1464 JsScreenManager::SetMultiScreenRelativePosition);
1465 BindNativeFunction(env, exportObj, "makeExpand", moduleName, JsScreenManager::MakeExpand);
1466 BindNativeFunction(env, exportObj, "stopMirror", moduleName, JsScreenManager::StopMirror);
1467 BindNativeFunction(env, exportObj, "stopExpand", moduleName, JsScreenManager::StopExpand);
1468 BindNativeFunction(env, exportObj, "createVirtualScreen", moduleName, JsScreenManager::CreateVirtualScreen);
1469 BindNativeFunction(env, exportObj, "destroyVirtualScreen", moduleName, JsScreenManager::DestroyVirtualScreen);
1470 BindNativeFunction(env, exportObj, "setVirtualScreenSurface", moduleName,
1471 JsScreenManager::SetVirtualScreenSurface);
1472 BindNativeFunction(env, exportObj, "setScreenPrivacyMaskImage", moduleName,
1473 JsScreenManager::SetScreenPrivacyMaskImage);
1474 BindNativeFunction(env, exportObj, "setScreenRotationLocked", moduleName,
1475 JsScreenManager::SetScreenRotationLocked);
1476 BindNativeFunction(env, exportObj, "isScreenRotationLocked", moduleName,
1477 JsScreenManager::IsScreenRotationLocked);
1478 BindNativeFunction(env, exportObj, "makeUnique", moduleName, JsScreenManager::MakeUnique);
1479 return NapiGetUndefined(env);
1480 }
1481 } // namespace Rosen
1482 } // namespace OHOS
1483