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