• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi_os_account.h"
17 #include "account_permission_manager.h"
18 #include "napi_account_error.h"
19 #include "napi_os_account_common.h"
20 #include "napi/native_common.h"
21 
22 using namespace OHOS::AccountSA;
23 
24 namespace OHOS {
25 namespace AccountJsKit {
26 namespace {
27 const std::string OS_ACCOUNT_CLASS_NAME = "AccountManager";
28 static thread_local napi_ref osAccountRef_ = nullptr;
29 
30 const int OS_ACCOUNT_TYPE_ADMIN = 0;
31 const int OS_ACCOUNT_TYPE_NORMAL = 1;
32 const int OS_ACCOUNT_TYPE_GUEST = 2;
33 const int OS_ACCOUNT_TYPE_PRIVATE = 1024;
34 const int DOMAIN_ACCOUNT_STATUS_NOT_LOGGED_IN = 0;
35 const int DOMAIN_ACCOUNT_STATUS_LOGGED_IN = 1;
36 std::mutex g_lockForOsAccountSubscribers;
37 std::map<OsAccountManager *, std::vector<SubscribeCBInfo *>> g_osAccountSubscribers;
38 static napi_property_descriptor g_osAccountProperties[] = {
39     DECLARE_NAPI_FUNCTION("queryOsAccountById", QueryOsAccountById),
40     DECLARE_NAPI_FUNCTION("removeOsAccount", RemoveOsAccount),
41     DECLARE_NAPI_FUNCTION("setOsAccountName", SetOsAccountName),
42     DECLARE_NAPI_FUNCTION("setOsAccountConstraints", SetOsAccountConstraints),
43     DECLARE_NAPI_FUNCTION("activateOsAccount", ActivateOsAccount),
44     DECLARE_NAPI_FUNCTION("deactivateOsAccount", DeactivateOsAccount),
45     DECLARE_NAPI_FUNCTION("createOsAccount", CreateOsAccount),
46     DECLARE_NAPI_FUNCTION("createOsAccountForDomain", CreateOsAccountForDomain),
47     DECLARE_NAPI_FUNCTION("getCreatedOsAccountsCount", GetCreatedOsAccountsCount),
48     DECLARE_NAPI_FUNCTION("getOsAccountCount", GetOsAccountCount),
49     DECLARE_NAPI_FUNCTION("getDistributedVirtualDeviceId", GetDistributedVirtualDeviceId),
50     DECLARE_NAPI_FUNCTION("queryDistributedVirtualDeviceId", QueryDistributedVirtualDeviceId),
51     DECLARE_NAPI_FUNCTION("getOsAccountAllConstraints", GetOsAccountAllConstraints),
52     DECLARE_NAPI_FUNCTION("getOsAccountConstraints", GetOsAccountConstraints),
53     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdFromProcess", GetOsAccountLocalIdFromProcess),
54     DECLARE_NAPI_FUNCTION("queryOsAccountLocalIdFromProcess", QueryOsAccountLocalIdFromProcess),
55     DECLARE_NAPI_FUNCTION("getOsAccountLocalId", QueryOsAccountLocalIdFromProcess),
56     DECLARE_NAPI_FUNCTION("queryAllCreatedOsAccounts", QueryAllCreatedOsAccounts),
57     DECLARE_NAPI_FUNCTION("queryOsAccountConstraintSourceTypes", QueryOsAccountConstraintSourceTypes),
58     DECLARE_NAPI_FUNCTION("getOsAccountConstraintSourceTypes", QueryOsAccountConstraintSourceTypes),
59     DECLARE_NAPI_FUNCTION("queryActivatedOsAccountIds", QueryActivatedOsAccountIds),
60     DECLARE_NAPI_FUNCTION("getActivatedOsAccountIds", GetActivatedOsAccountIds),
61     DECLARE_NAPI_FUNCTION("getActivatedOsAccountLocalIds", GetActivatedOsAccountIds),
62     DECLARE_NAPI_FUNCTION("getForegroundOsAccountLocalId", GetForegroundOsAccountLocalId),
63     DECLARE_NAPI_FUNCTION("getOsAccountProfilePhoto", GetOsAccountProfilePhoto),
64     DECLARE_NAPI_FUNCTION("getOsAccountName", GetOsAccountName),
65     DECLARE_NAPI_FUNCTION("queryCurrentOsAccount", QueryCurrentOsAccount),
66     DECLARE_NAPI_FUNCTION("getCurrentOsAccount", GetCurrentOsAccount),
67     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdFromUid", GetOsAccountLocalIdFromUid),
68     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForUid", GetOsAccountLocalIdForUid),
69     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForUidSync", GetOsAccountLocalIdForUidSync),
70     DECLARE_NAPI_FUNCTION("getBundleIdFromUid", GetBundleIdFromUid),
71     DECLARE_NAPI_FUNCTION("getBundleIdForUid", GetBundleIdFromUid),
72     DECLARE_NAPI_FUNCTION("getBundleIdForUidSync", GetBundleIdForUidSync),
73     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdFromDomain", GetOsAccountLocalIdFromDomain),
74     DECLARE_NAPI_FUNCTION("queryOsAccountLocalIdFromDomain", QueryOsAccountLocalIdFromDomain),
75     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForDomain", QueryOsAccountLocalIdFromDomain),
76     DECLARE_NAPI_FUNCTION("setOsAccountProfilePhoto", SetOsAccountProfilePhoto),
77     DECLARE_NAPI_FUNCTION("queryMaxOsAccountNumber", QueryMaxOsAccountNumber),
78     DECLARE_NAPI_FUNCTION("queryMaxLoggedInOsAccountNumber", QueryMaxLoggedInOsAccountNumber),
79     DECLARE_NAPI_FUNCTION("isOsAccountActived", IsOsAccountActived),
80     DECLARE_NAPI_FUNCTION("checkOsAccountActivated", CheckOsAccountActivated),
81     DECLARE_NAPI_FUNCTION("isOsAccountConstraintEnable", IsOsAccountConstraintEnable),
82     DECLARE_NAPI_FUNCTION("checkConstraintEnabled", CheckConstraintEnabled),
83     DECLARE_NAPI_FUNCTION("checkOsAccountConstraintEnabled", CheckConstraintEnabled),
84     DECLARE_NAPI_FUNCTION("getOsAccountTypeFromProcess", GetOsAccountTypeFromProcess),
85     DECLARE_NAPI_FUNCTION("getOsAccountType", GetOsAccountType),
86     DECLARE_NAPI_FUNCTION("isMultiOsAccountEnable", IsMultiOsAccountEnable),
87     DECLARE_NAPI_FUNCTION("checkMultiOsAccountEnabled", CheckMultiOsAccountEnabled),
88     DECLARE_NAPI_FUNCTION("isOsAccountVerified", IsOsAccountVerified),
89     DECLARE_NAPI_FUNCTION("checkOsAccountVerified", CheckOsAccountVerified),
90     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdBySerialNumber", GetOsAccountLocalIdBySerialNumber),
91     DECLARE_NAPI_FUNCTION("queryOsAccountLocalIdBySerialNumber", QueryOsAccountLocalIdBySerialNumber),
92     DECLARE_NAPI_FUNCTION("getOsAccountLocalIdForSerialNumber", QueryOsAccountLocalIdBySerialNumber),
93     DECLARE_NAPI_FUNCTION("getSerialNumberByOsAccountLocalId", GetSerialNumberByOsAccountLocalId),
94     DECLARE_NAPI_FUNCTION("querySerialNumberByOsAccountLocalId", QuerySerialNumberByOsAccountLocalId),
95     DECLARE_NAPI_FUNCTION("getSerialNumberForOsAccountLocalId", QuerySerialNumberByOsAccountLocalId),
96     DECLARE_NAPI_FUNCTION("isTestOsAccount", IsTestOsAccount),
97     DECLARE_NAPI_FUNCTION("checkOsAccountTestable", CheckOsAccountTestable),
98     DECLARE_NAPI_FUNCTION("isMainOsAccount", IsMainOsAccount),
99     DECLARE_NAPI_FUNCTION("on", Subscribe),
100     DECLARE_NAPI_FUNCTION("off", Unsubscribe),
101     DECLARE_NAPI_FUNCTION("isOsAccountActivated", IsOsAccountActivated),
102     DECLARE_NAPI_FUNCTION("isOsAccountConstraintEnabled", IsOsAccountConstraintEnabled),
103     DECLARE_NAPI_FUNCTION("isOsAccountUnlocked", IsOsAccountUnlocked),
104     DECLARE_NAPI_FUNCTION("getEnabledOsAccountConstraints", GetEnabledOsAccountConstraints),
105     DECLARE_NAPI_FUNCTION("queryOsAccount", QueryOsAccount),
106     DECLARE_NAPI_FUNCTION("getOsAccountDomainInfo", GetOsAccountDomainInfo),
107 };
108 }  // namespace
OsAccountInit(napi_env env,napi_value exports)109 napi_value OsAccountInit(napi_env env, napi_value exports)
110 {
111     napi_property_descriptor descriptor[] = {
112         DECLARE_NAPI_FUNCTION("getAccountManager", GetAccountManager),
113     };
114     NAPI_CALL(
115         env, napi_define_properties(env, exports, sizeof(descriptor) / sizeof(napi_property_descriptor), descriptor));
116 
117     napi_value osAccountType = nullptr;
118     napi_create_object(env, &osAccountType);
119 
120     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_ADMIN, "ADMIN");
121     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_NORMAL, "NORMAL");
122     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_GUEST, "GUEST");
123     SetEnumProperty(env, osAccountType, OS_ACCOUNT_TYPE_PRIVATE, "PRIVATE");
124 
125     napi_value constraintSourceType = nullptr;
126     napi_create_object(env, &constraintSourceType);
127     SetEnumProperty(env, constraintSourceType, CONSTRAINT_NOT_EXIST, "CONSTRAINT_NOT_EXIST");
128     SetEnumProperty(env, constraintSourceType, CONSTRAINT_TYPE_BASE, "CONSTRAINT_TYPE_BASE");
129     SetEnumProperty(env, constraintSourceType, CONSTRAINT_TYPE_DEVICE_OWNER, "CONSTRAINT_TYPE_DEVICE_OWNER");
130     SetEnumProperty(env, constraintSourceType, CONSTRAINT_TYPE_PROFILE_OWNER, "CONSTRAINT_TYPE_PROFILE_OWNER");
131 
132     napi_value domainAccountStatus = nullptr;
133     napi_create_object(env, &domainAccountStatus);
134 
135     SetEnumProperty(env, domainAccountStatus, DOMAIN_ACCOUNT_STATUS_NOT_LOGGED_IN, "NOT_LOGGED_IN");
136     SetEnumProperty(env, domainAccountStatus, DOMAIN_ACCOUNT_STATUS_LOGGED_IN, "LOGGED_IN");
137 
138     napi_property_descriptor exportEnum[] = {
139         DECLARE_NAPI_PROPERTY("OsAccountType", osAccountType),
140         DECLARE_NAPI_PROPERTY("ConstraintSourceType", constraintSourceType),
141     };
142     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(exportEnum) / sizeof(*exportEnum), exportEnum));
143     napi_value cons = nullptr;
144     NAPI_CALL(env,
145         napi_define_class(env,
146             OS_ACCOUNT_CLASS_NAME.c_str(),
147             OS_ACCOUNT_CLASS_NAME.size(),
148             OsAccountJsConstructor,
149             nullptr,
150             sizeof(g_osAccountProperties) / sizeof(napi_property_descriptor),
151             g_osAccountProperties,
152             &cons));
153     NAPI_CALL(env, napi_create_reference(env, cons, 1, &osAccountRef_));
154     NAPI_CALL(env, napi_set_named_property(env, exports, OS_ACCOUNT_CLASS_NAME.c_str(), cons));
155 
156     return exports;
157 }
158 
GetAccountManager(napi_env env,napi_callback_info cbInfo)159 napi_value GetAccountManager(napi_env env, napi_callback_info cbInfo)
160 {
161     napi_value instance = nullptr;
162     napi_value cons = nullptr;
163     if (napi_get_reference_value(env, osAccountRef_, &cons) != napi_ok) {
164         return nullptr;
165     }
166 
167     if (napi_new_instance(env, cons, 0, nullptr, &instance) != napi_ok) {
168         return nullptr;
169     }
170 
171     OsAccountManager *objectInfo = new (std::nothrow) OsAccountManager();
172     if (objectInfo == nullptr) {
173         ACCOUNT_LOGE("failed to create OsAccountManager for insufficient memory");
174         return nullptr;
175     }
176     napi_status status = napi_wrap(env, instance, objectInfo,
177         [](napi_env env, void *data, void *hint) {
178             ACCOUNT_LOGI("Js instance release.");
179             delete reinterpret_cast<OsAccountManager *>(data);
180         }, nullptr, nullptr);
181     if (status != napi_ok) {
182         ACCOUNT_LOGE("failed to wrap js instance with native object");
183         delete objectInfo;
184         return nullptr;
185     }
186     return instance;
187 }
188 
OsAccountJsConstructor(napi_env env,napi_callback_info cbinfo)189 napi_value OsAccountJsConstructor(napi_env env, napi_callback_info cbinfo)
190 {
191     napi_value thisVar = nullptr;
192     NAPI_CALL(env, napi_get_cb_info(env, cbinfo, nullptr, nullptr, &thisVar, nullptr));
193     return thisVar;
194 }
195 
SetEnumProperty(napi_env env,napi_value dstObj,const int objValue,const char * propName)196 void SetEnumProperty(napi_env env, napi_value dstObj, const int objValue, const char *propName)
197 {
198     napi_value prop = nullptr;
199     napi_create_int32(env, objValue, &prop);
200     napi_set_named_property(env, dstObj, propName, prop);
201 }
202 
QueryOsAccountById(napi_env env,napi_callback_info cbInfo)203 napi_value QueryOsAccountById(napi_env env, napi_callback_info cbInfo)
204 {
205     auto queryOAByIdCB = std::make_unique<QueryOAByIdAsyncContext>();
206     queryOAByIdCB->env = env;
207     queryOAByIdCB->throwErr = true;
208 
209     if (!ParseParaQueryOAByIdCB(env, cbInfo, queryOAByIdCB.get())) {
210         return nullptr;
211     }
212 
213     napi_value result = nullptr;
214     if (queryOAByIdCB->callbackRef == nullptr) {
215         napi_create_promise(env, &queryOAByIdCB->deferred, &result);
216     } else {
217         napi_get_undefined(env, &result);
218     }
219 
220     napi_value resource = nullptr;
221     napi_create_string_utf8(env, "QueryOsAccountById", NAPI_AUTO_LENGTH, &resource);
222 
223     napi_create_async_work(env,
224         nullptr,
225         resource,
226         QueryOAByIdExecuteCB,
227         QueryOAByIdCallbackCompletedCB,
228         reinterpret_cast<void *>(queryOAByIdCB.get()),
229         &queryOAByIdCB->work);
230 
231     napi_queue_async_work_with_qos(env, queryOAByIdCB->work, napi_qos_default);
232     queryOAByIdCB.release();
233     return result;
234 }
235 
RemoveOsAccount(napi_env env,napi_callback_info cbInfo)236 napi_value RemoveOsAccount(napi_env env, napi_callback_info cbInfo)
237 {
238     auto removeOACB = std::make_unique<RemoveOAAsyncContext>();
239     removeOACB->env = env;
240     removeOACB->throwErr = true;
241 
242     if (!ParseParaRemoveOACB(env, cbInfo, removeOACB.get())) {
243         return nullptr;
244     }
245 
246     napi_value result = nullptr;
247     if (removeOACB->callbackRef == nullptr) {
248         napi_create_promise(env, &removeOACB->deferred, &result);
249     } else {
250         napi_get_undefined(env, &result);
251     }
252 
253     napi_value resource = nullptr;
254     napi_create_string_utf8(env, "RemoveOsAccount", NAPI_AUTO_LENGTH, &resource);
255 
256     napi_create_async_work(env, nullptr, resource, RemoveOAExecuteCB, RemoveOACallbackCompletedCB,
257         reinterpret_cast<void *>(removeOACB.get()), &removeOACB->work);
258 
259     napi_queue_async_work_with_qos(env, removeOACB->work, napi_qos_user_initiated);
260     removeOACB.release();
261     return result;
262 }
263 
SetOsAccountName(napi_env env,napi_callback_info cbInfo)264 napi_value SetOsAccountName(napi_env env, napi_callback_info cbInfo)
265 {
266     auto setOANameCB = std::make_unique<SetOANameAsyncContext>();
267     setOANameCB->env = env;
268     setOANameCB->throwErr = true;
269 
270     if (!ParseParaSetOAName(env, cbInfo, setOANameCB.get())) {
271         return nullptr;
272     }
273 
274     napi_value result = nullptr;
275     if (setOANameCB->callbackRef == nullptr) {
276         napi_create_promise(env, &setOANameCB->deferred, &result);
277     } else {
278         napi_get_undefined(env, &result);
279     }
280 
281     napi_value resource = nullptr;
282     napi_create_string_utf8(env, "SetOsAccountName", NAPI_AUTO_LENGTH, &resource);
283 
284     napi_create_async_work(env,
285         nullptr,
286         resource,
287         SetOANameExecuteCB,
288         SetOANameCallbackCompletedCB,
289         reinterpret_cast<void *>(setOANameCB.get()),
290         &setOANameCB->work);
291 
292     napi_queue_async_work_with_qos(env, setOANameCB->work, napi_qos_user_initiated);
293     setOANameCB.release();
294     return result;
295 }
296 
SetOsAccountConstraints(napi_env env,napi_callback_info cbInfo)297 napi_value SetOsAccountConstraints(napi_env env, napi_callback_info cbInfo)
298 {
299     auto setOAConsCB = std::make_unique<SetOAConsAsyncContext>();
300     setOAConsCB->env = env;
301     setOAConsCB->throwErr = true;
302 
303     if (!ParseParaSetOAConstraints(env, cbInfo, setOAConsCB.get())) {
304         return nullptr;
305     }
306 
307     napi_value result = nullptr;
308     if (setOAConsCB->callbackRef == nullptr) {
309         napi_create_promise(env, &setOAConsCB->deferred, &result);
310     } else {
311         napi_get_undefined(env, &result);
312     }
313 
314     napi_value resource = nullptr;
315     napi_create_string_utf8(env, "SetOsAccountConstraints", NAPI_AUTO_LENGTH, &resource);
316 
317     napi_create_async_work(env,
318         nullptr,
319         resource,
320         SetOAConsExecuteCB,
321         SetOAConsCallbackCompletedCB,
322         reinterpret_cast<void *>(setOAConsCB.get()),
323         &setOAConsCB->work);
324 
325     napi_queue_async_work_with_qos(env, setOAConsCB->work, napi_qos_default);
326     setOAConsCB.release();
327     return result;
328 }
329 
ActivateOsAccount(napi_env env,napi_callback_info cbInfo)330 napi_value ActivateOsAccount(napi_env env, napi_callback_info cbInfo)
331 {
332     auto activeOACB = std::make_unique<ActivateOAAsyncContext>();
333     activeOACB->env = env;
334     activeOACB->throwErr = true;
335 
336     if (!ParseParaActiveOA(env, cbInfo, activeOACB.get())) {
337         return nullptr;
338     }
339 
340     napi_value result = nullptr;
341     if (activeOACB->callbackRef == nullptr) {
342         napi_create_promise(env, &activeOACB->deferred, &result);
343     } else {
344         napi_get_undefined(env, &result);
345     }
346 
347     napi_value resource = nullptr;
348     napi_create_string_utf8(env, "ActivateOsAccount", NAPI_AUTO_LENGTH, &resource);
349 
350     napi_create_async_work(env,
351         nullptr,
352         resource,
353         ActivateOAExecuteCB,
354         ActivateOACallbackCompletedCB,
355         reinterpret_cast<void *>(activeOACB.get()),
356         &activeOACB->work);
357 
358     napi_queue_async_work_with_qos(env, activeOACB->work, napi_qos_user_initiated);
359     activeOACB.release();
360     return result;
361 }
362 
DeactivateOsAccount(napi_env env,napi_callback_info cbInfo)363 napi_value DeactivateOsAccount(napi_env env, napi_callback_info cbInfo)
364 {
365     auto asyncContext = std::make_unique<ActivateOAAsyncContext>();
366     asyncContext->env = env;
367 
368     if (!ParseParaDeactivateOA(env, cbInfo, asyncContext.get())) {
369         return nullptr;
370     }
371 
372     napi_value result = nullptr;
373     NAPI_CALL(env, napi_create_promise(env, &asyncContext->deferred, &result));
374 
375     napi_value resource = nullptr;
376     NAPI_CALL(env, napi_create_string_utf8(env, "DeactivateOsAccount", NAPI_AUTO_LENGTH, &resource));
377 
378     NAPI_CALL(env, napi_create_async_work(env,
379         nullptr,
380         resource,
381         DeactivateOAExecuteCB,
382         DeactivateOACompletedCB,
383         reinterpret_cast<void *>(asyncContext.get()),
384         &asyncContext->work));
385 
386     NAPI_CALL(env, napi_queue_async_work_with_qos(env, asyncContext->work, napi_qos_user_initiated));
387     asyncContext.release();
388     return result;
389 }
390 
CreateOsAccount(napi_env env,napi_callback_info cbInfo)391 napi_value CreateOsAccount(napi_env env, napi_callback_info cbInfo)
392 {
393     auto createOACB = std::make_unique<CreateOAAsyncContext>();
394     createOACB->env = env;
395     createOACB->throwErr = true;
396 
397     if (!ParseParaCreateOA(env, cbInfo, createOACB.get())) {
398         return nullptr;
399     }
400 
401     napi_value result = nullptr;
402     if (createOACB->callbackRef == nullptr) {
403         napi_create_promise(env, &createOACB->deferred, &result);
404     } else {
405         napi_get_undefined(env, &result);
406     }
407 
408     napi_value resource = nullptr;
409     napi_create_string_utf8(env, "CreateOsAccount", NAPI_AUTO_LENGTH, &resource);
410 
411     napi_create_async_work(env, nullptr, resource, CreateOAExecuteCB, CreateOACallbackCompletedCB,
412         reinterpret_cast<void *>(createOACB.get()), &createOACB->work);
413 
414     napi_queue_async_work_with_qos(env, createOACB->work, napi_qos_user_initiated);
415     createOACB.release();
416     return result;
417 }
418 
CreateOsAccountForDomain(napi_env env,napi_callback_info cbInfo)419 napi_value CreateOsAccountForDomain(napi_env env, napi_callback_info cbInfo)
420 {
421     auto createOAForDomainCB = std::make_unique<CreateOAForDomainAsyncContext>();
422     createOAForDomainCB->env = env;
423     createOAForDomainCB->throwErr = true;
424 
425     if (!ParseParaCreateOAForDomain(env, cbInfo, createOAForDomainCB.get())) {
426         return nullptr;
427     }
428 
429     napi_value result = nullptr;
430     if (createOAForDomainCB->callbackRef == nullptr) {
431         napi_create_promise(env, &createOAForDomainCB->deferred, &result);
432     } else {
433         napi_get_undefined(env, &result);
434     }
435 
436     napi_value resource = nullptr;
437     napi_create_string_utf8(env, "CreateOsAccountForDomain", NAPI_AUTO_LENGTH, &resource);
438 
439     napi_create_async_work(env, nullptr, resource, CreateOAForDomainExecuteCB, CreateOAForDomainCompletedCB,
440         createOAForDomainCB.get(), &createOAForDomainCB->work);
441 
442     napi_queue_async_work_with_qos(env, createOAForDomainCB->work, napi_qos_user_initiated);
443     createOAForDomainCB.release();
444     return result;
445 }
446 
GetOsAccountCount(napi_env env,napi_callback_info cbInfo)447 napi_value GetOsAccountCount(napi_env env, napi_callback_info cbInfo)
448 {
449     return GetCreatedOsAccountsCountInner(env, cbInfo, true);
450 }
451 
GetCreatedOsAccountsCount(napi_env env,napi_callback_info cbInfo)452 napi_value GetCreatedOsAccountsCount(napi_env env, napi_callback_info cbInfo)
453 {
454     return GetCreatedOsAccountsCountInner(env, cbInfo, false);
455 }
456 
GetCreatedOsAccountsCountInner(napi_env env,napi_callback_info cbInfo,bool throwErr)457 napi_value GetCreatedOsAccountsCountInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
458 {
459     auto getOACount = std::make_unique<GetOACountAsyncContext>();
460     getOACount->env = env;
461     getOACount->throwErr = throwErr;
462 
463     if (!ParseParaGetOACount(env, cbInfo, getOACount.get()) && throwErr) {
464         return nullptr;
465     }
466 
467     napi_value result = nullptr;
468     if (getOACount->callbackRef == nullptr) {
469         napi_create_promise(env, &getOACount->deferred, &result);
470     } else {
471         napi_get_undefined(env, &result);
472     }
473 
474     napi_value resource = nullptr;
475     napi_create_string_utf8(env, "GetCreatedOsAccountsCountInner", NAPI_AUTO_LENGTH, &resource);
476 
477     napi_create_async_work(env,
478         nullptr,
479         resource,
480         GetOACountExecuteCB,
481         GetOACountCallbackCompletedCB,
482         reinterpret_cast<void *>(getOACount.get()),
483         &getOACount->work);
484 
485     napi_queue_async_work_with_qos(env, getOACount->work, napi_qos_default);
486     getOACount.release();
487     return result;
488 }
489 
QueryDistributedVirtualDeviceId(napi_env env,napi_callback_info cbInfo)490 napi_value QueryDistributedVirtualDeviceId(napi_env env, napi_callback_info cbInfo)
491 {
492     return GetDistributedVirtualDeviceIdInner(env, cbInfo, true);
493 }
494 
GetDistributedVirtualDeviceId(napi_env env,napi_callback_info cbInfo)495 napi_value GetDistributedVirtualDeviceId(napi_env env, napi_callback_info cbInfo)
496 {
497     return GetDistributedVirtualDeviceIdInner(env, cbInfo, false);
498 }
499 
GetDistributedVirtualDeviceIdInner(napi_env env,napi_callback_info cbInfo,bool throwErr)500 napi_value GetDistributedVirtualDeviceIdInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
501 {
502     auto dbDeviceId = std::make_unique<DbDeviceIdAsyncContext>();
503     dbDeviceId->env = env;
504     dbDeviceId->throwErr = throwErr;
505 
506     if (!ParseParaDbDeviceId(env, cbInfo, dbDeviceId.get()) && throwErr) {
507         return nullptr;
508     }
509 
510     napi_value result = nullptr;
511     if (dbDeviceId->callbackRef == nullptr) {
512         napi_create_promise(env, &dbDeviceId->deferred, &result);
513     } else {
514         napi_get_undefined(env, &result);
515     }
516 
517     napi_value resource = nullptr;
518     napi_create_string_utf8(env, "GetDistributedVirtualDeviceIdInner", NAPI_AUTO_LENGTH, &resource);
519 
520     napi_create_async_work(env,
521         nullptr,
522         resource,
523         DbDeviceIdExecuteCB,
524         DbDeviceIdCallbackCompletedCB,
525         reinterpret_cast<void *>(dbDeviceId.get()),
526         &dbDeviceId->work);
527 
528     napi_queue_async_work_with_qos(env, dbDeviceId->work, napi_qos_default);
529     dbDeviceId.release();
530     return result;
531 }
532 
GetOsAccountConstraints(napi_env env,napi_callback_info cbInfo)533 napi_value GetOsAccountConstraints(napi_env env, napi_callback_info cbInfo)
534 {
535     return GetOsAccountAllConstraintsInner(env, cbInfo, true);
536 }
537 
GetOsAccountAllConstraints(napi_env env,napi_callback_info cbInfo)538 napi_value GetOsAccountAllConstraints(napi_env env, napi_callback_info cbInfo)
539 {
540     return GetOsAccountAllConstraintsInner(env, cbInfo, false);
541 }
542 
GetOsAccountAllConstraintsInner(napi_env env,napi_callback_info cbInfo,bool throwErr)543 napi_value GetOsAccountAllConstraintsInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
544 {
545     auto getAllConsCB = std::make_unique<GetAllConsAsyncContext>();
546     getAllConsCB->env = env;
547     getAllConsCB->throwErr = throwErr;
548 
549     if (!ParseParaGetAllCons(env, cbInfo, getAllConsCB.get()) && throwErr) {
550         return nullptr;
551     }
552 
553     napi_value result = nullptr;
554     if (getAllConsCB->callbackRef == nullptr) {
555         napi_create_promise(env, &getAllConsCB->deferred, &result);
556     } else {
557         napi_get_undefined(env, &result);
558     }
559 
560     napi_value resource = nullptr;
561     napi_create_string_utf8(env, "GetOsAccountAllConstraints", NAPI_AUTO_LENGTH, &resource);
562 
563     napi_create_async_work(env,
564         nullptr,
565         resource,
566         GetAllConsExecuteCB,
567         GetAllConsCallbackCompletedCB,
568         reinterpret_cast<void *>(getAllConsCB.get()),
569         &getAllConsCB->work);
570 
571     napi_queue_async_work_with_qos(env, getAllConsCB->work, napi_qos_default);
572     getAllConsCB.release();
573     return result;
574 }
575 
QueryOsAccountLocalIdFromProcess(napi_env env,napi_callback_info cbInfo)576 napi_value QueryOsAccountLocalIdFromProcess(napi_env env, napi_callback_info cbInfo)
577 {
578     return GetOsAccountLocalIdFromProcessInner(env, cbInfo, true);
579 }
580 
GetOsAccountLocalIdFromProcess(napi_env env,napi_callback_info cbInfo)581 napi_value GetOsAccountLocalIdFromProcess(napi_env env, napi_callback_info cbInfo)
582 {
583     return GetOsAccountLocalIdFromProcessInner(env, cbInfo, false);
584 }
585 
GetOsAccountLocalIdFromProcessInner(napi_env env,napi_callback_info cbInfo,bool throwErr)586 napi_value GetOsAccountLocalIdFromProcessInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
587 {
588     auto getIdCB = std::make_unique<GetIdAsyncContext>();
589     getIdCB->env = env;
590     getIdCB->throwErr = throwErr;
591 
592     if (!ParseParaProcessId(env, cbInfo, getIdCB.get()) && throwErr) {
593         return nullptr;
594     }
595 
596     napi_value result = nullptr;
597     if (getIdCB->callbackRef == nullptr) {
598         napi_create_promise(env, &getIdCB->deferred, &result);
599     } else {
600         napi_get_undefined(env, &result);
601     }
602 
603     napi_value resource = nullptr;
604     napi_create_string_utf8(env, "GetOsAccountLocalIdFromProcessInner", NAPI_AUTO_LENGTH, &resource);
605 
606     napi_create_async_work(env,
607         nullptr,
608         resource,
609         GetProcessIdExecuteCB,
610         GetProcessIdCallbackCompletedCB,
611         reinterpret_cast<void *>(getIdCB.get()),
612         &getIdCB->work);
613 
614     napi_queue_async_work_with_qos(env, getIdCB->work, napi_qos_default);
615     getIdCB.release();
616     return result;
617 }
618 
QueryAllCreatedOsAccounts(napi_env env,napi_callback_info cbInfo)619 napi_value QueryAllCreatedOsAccounts(napi_env env, napi_callback_info cbInfo)
620 {
621     auto queryAllOA = std::make_unique<QueryCreateOAAsyncContext>();
622     queryAllOA->env = env;
623     queryAllOA->throwErr = true;
624 
625     if (!ParseQueryAllCreateOA(env, cbInfo, queryAllOA.get())) {
626         return nullptr;
627     }
628 
629     napi_value result = nullptr;
630     if (queryAllOA->callbackRef == nullptr) {
631         napi_create_promise(env, &queryAllOA->deferred, &result);
632     } else {
633         napi_get_undefined(env, &result);
634     }
635 
636     napi_value resource = nullptr;
637     napi_create_string_utf8(env, "QueryAllCreatedOsAccounts", NAPI_AUTO_LENGTH, &resource);
638 
639     napi_create_async_work(env,
640         nullptr,
641         resource,
642         QueryCreateOAExecuteCB,
643         QueryCreateOACallbackCompletedCB,
644         reinterpret_cast<void *>(queryAllOA.get()),
645         &queryAllOA->work);
646 
647     napi_queue_async_work_with_qos(env, queryAllOA->work, napi_qos_default);
648     queryAllOA.release();
649     return result;
650 }
651 
QueryOsAccountConstraintSourceTypes(napi_env env,napi_callback_info cbInfo)652 napi_value QueryOsAccountConstraintSourceTypes(napi_env env, napi_callback_info cbInfo)
653 {
654     auto queryConstraintSource = std::make_unique<QueryOAConstraintSrcTypeContext>();
655     queryConstraintSource->env = env;
656     queryConstraintSource->throwErr = true;
657 
658     if (!ParseQueryOAConstraintSrcTypes(env, cbInfo, queryConstraintSource.get())) {
659         return nullptr;
660     }
661 
662     napi_value result = nullptr;
663     if (queryConstraintSource->callbackRef == nullptr) {
664         napi_create_promise(env, &queryConstraintSource->deferred, &result);
665     } else {
666         napi_get_undefined(env, &result);
667     }
668 
669     napi_value resource = nullptr;
670     napi_create_string_utf8(env, "QueryOsAccountConstraintSourceTypes", NAPI_AUTO_LENGTH, &resource);
671 
672     napi_create_async_work(env,
673         nullptr,
674         resource,
675         QueryOAContSrcTypeExecuteCB,
676         QueryOAContSrcTypeCallbackCompletedCB,
677         reinterpret_cast<void *>(queryConstraintSource.get()),
678         &queryConstraintSource->work);
679 
680     napi_queue_async_work_with_qos(env, queryConstraintSource->work, napi_qos_default);
681     queryConstraintSource.release();
682     return result;
683 }
684 
GetActivatedOsAccountIds(napi_env env,napi_callback_info cbInfo)685 napi_value GetActivatedOsAccountIds(napi_env env, napi_callback_info cbInfo)
686 {
687     return QueryActivatedOsAccountIdsInner(env, cbInfo, true);
688 }
689 
QueryActivatedOsAccountIds(napi_env env,napi_callback_info cbInfo)690 napi_value QueryActivatedOsAccountIds(napi_env env, napi_callback_info cbInfo)
691 {
692     return QueryActivatedOsAccountIdsInner(env, cbInfo, false);
693 }
694 
QueryActivatedOsAccountIdsInner(napi_env env,napi_callback_info cbInfo,bool throwErr)695 napi_value QueryActivatedOsAccountIdsInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
696 {
697     auto queryActiveIds = std::make_unique<QueryActiveIdsAsyncContext>();
698     queryActiveIds->env = env;
699     queryActiveIds->throwErr = throwErr;
700 
701     if (!ParseQueryActiveIds(env, cbInfo, queryActiveIds.get()) && throwErr) {
702         return nullptr;
703     }
704 
705     napi_value result = nullptr;
706     if (queryActiveIds->callbackRef == nullptr) {
707         napi_create_promise(env, &queryActiveIds->deferred, &result);
708     } else {
709         napi_get_undefined(env, &result);
710     }
711 
712     napi_value resource = nullptr;
713     napi_create_string_utf8(env, "QueryActivatedOsAccountIdsInner", NAPI_AUTO_LENGTH, &resource);
714 
715     napi_create_async_work(env,
716         nullptr,
717         resource,
718         QueryActiveIdsExecuteCB,
719         QueryActiveIdsCallbackCompletedCB,
720         reinterpret_cast<void *>(queryActiveIds.get()),
721         &queryActiveIds->work);
722 
723     napi_queue_async_work_with_qos(env, queryActiveIds->work, napi_qos_default);
724     queryActiveIds.release();
725     return result;
726 }
727 
GetForegroundOsAccountLocalId(napi_env env,napi_callback_info cbInfo)728 napi_value GetForegroundOsAccountLocalId(napi_env env, napi_callback_info cbInfo)
729 {
730     auto getForegroundIds = std::make_unique<GetForegroundOALocalIdAsyncContext>();
731     getForegroundIds->env = env;
732     getForegroundIds->throwErr = true;
733 
734     napi_value result = nullptr;
735     NAPI_CALL(env, napi_create_promise(env, &getForegroundIds->deferred, &result));
736 
737     napi_value resource = nullptr;
738     NAPI_CALL(env, napi_create_string_utf8(env, "GetForegroundOsAccountLocalId", NAPI_AUTO_LENGTH, &resource));
739 
740     NAPI_CALL(env, napi_create_async_work(env,
741         nullptr,
742         resource,
743         GetForegroundOALocalIdExecuteCB,
744         GetForegroundOALocalIdCallbackCompletedCB,
745         reinterpret_cast<void *>(getForegroundIds.get()),
746         &getForegroundIds->work));
747 
748     NAPI_CALL(env, napi_queue_async_work_with_qos(env, getForegroundIds->work, napi_qos_default));
749     getForegroundIds.release();
750     return result;
751 }
752 
GetOsAccountName(napi_env env,napi_callback_info cbInfo)753 napi_value GetOsAccountName(napi_env env, napi_callback_info cbInfo)
754 {
755     auto context = std::make_unique<GetOsAccountNameContext>();
756     context->env = env;
757 
758     napi_value result = nullptr;
759     NAPI_CALL(env, napi_create_promise(env, &context->deferred, &result));
760     napi_value resource = nullptr;
761     NAPI_CALL(env, napi_create_string_utf8(env, "GetOsAccountName", NAPI_AUTO_LENGTH, &resource));
762 
763     NAPI_CALL(env, napi_create_async_work(env, nullptr, resource, GetOsAccountNameExecuteCB,
764         GetOsAccountNameCallbackCompletedCB,
765         reinterpret_cast<void *>(context.get()), &context->work));
766 
767     NAPI_CALL(env, napi_queue_async_work_with_qos(env, context->work, napi_qos_default));
768     context.release();
769     return result;
770 }
771 
GetOsAccountProfilePhoto(napi_env env,napi_callback_info cbInfo)772 napi_value GetOsAccountProfilePhoto(napi_env env, napi_callback_info cbInfo)
773 {
774     auto getPhoto = std::make_unique<GetOAPhotoAsyncContext>();
775     getPhoto->env = env;
776     getPhoto->throwErr = true;
777 
778     if (!ParseParaGetPhoto(env, cbInfo, getPhoto.get())) {
779         return nullptr;
780     }
781 
782     napi_value result = nullptr;
783     if (getPhoto->callbackRef == nullptr) {
784         napi_create_promise(env, &getPhoto->deferred, &result);
785     } else {
786         napi_get_undefined(env, &result);
787     }
788 
789     napi_value resource = nullptr;
790     napi_create_string_utf8(env, "GetOsAccountProfilePhoto", NAPI_AUTO_LENGTH, &resource);
791 
792     napi_create_async_work(env, nullptr, resource, GetOAPhotoExecuteCB, GetOAPhotoCallbackCompletedCB,
793         reinterpret_cast<void *>(getPhoto.get()), &getPhoto->work);
794 
795     napi_queue_async_work_with_qos(env, getPhoto->work, napi_qos_default);
796     getPhoto.release();
797     return result;
798 }
799 
GetCurrentOsAccount(napi_env env,napi_callback_info cbInfo)800 napi_value GetCurrentOsAccount(napi_env env, napi_callback_info cbInfo)
801 {
802     return QueryCurrentOsAccountInner(env, cbInfo, true);
803 }
804 
QueryCurrentOsAccount(napi_env env,napi_callback_info cbInfo)805 napi_value QueryCurrentOsAccount(napi_env env, napi_callback_info cbInfo)
806 {
807     return QueryCurrentOsAccountInner(env, cbInfo, false);
808 }
809 
QueryCurrentOsAccountInner(napi_env env,napi_callback_info cbInfo,bool throwErr)810 napi_value QueryCurrentOsAccountInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
811 {
812     auto currentOA = std::make_unique<CurrentOAAsyncContext>();
813     currentOA->env = env;
814     currentOA->throwErr = throwErr;
815 
816     if (!ParseParaCurrentOA(env, cbInfo, currentOA.get()) && throwErr) {
817         return nullptr;
818     }
819 
820     napi_value result = nullptr;
821     if (currentOA->callbackRef == nullptr) {
822         napi_create_promise(env, &currentOA->deferred, &result);
823     } else {
824         napi_get_undefined(env, &result);
825     }
826 
827     napi_value resource = nullptr;
828     napi_create_string_utf8(env, "QueryCurrentOsAccount", NAPI_AUTO_LENGTH, &resource);
829 
830     napi_create_async_work(env,
831         nullptr,
832         resource,
833         QueryCurrentOAExecuteCB,
834         QueryCurrentOACallbackCompletedCB,
835         reinterpret_cast<void *>(currentOA.get()),
836         &currentOA->work);
837 
838     napi_queue_async_work_with_qos(env, currentOA->work, napi_qos_default);
839     currentOA.release();
840     return result;
841 }
842 
GetOsAccountLocalIdFromUidInner(napi_env env,napi_callback_info cbInfo,bool throwErr)843 napi_value GetOsAccountLocalIdFromUidInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
844 {
845     auto idByUid = std::make_unique<GetIdByUidAsyncContext>();
846     idByUid->env = env;
847     idByUid->throwErr = throwErr;
848 
849     if (!ParseParaGetIdByUid(env, cbInfo, idByUid.get()) && throwErr) {
850         return nullptr;
851     }
852 
853     napi_value result = nullptr;
854     if (idByUid->callbackRef == nullptr) {
855         napi_create_promise(env, &idByUid->deferred, &result);
856     } else {
857         napi_get_undefined(env, &result);
858     }
859 
860     napi_value resource = nullptr;
861     napi_create_string_utf8(env, "GetOsAccountLocalIdFromUidInner", NAPI_AUTO_LENGTH, &resource);
862 
863     napi_create_async_work(env, nullptr, resource, GetIdByUidExecuteCB, GetIdByUidCallbackCompletedCB,
864         reinterpret_cast<void *>(idByUid.get()), &idByUid->work);
865 
866     napi_queue_async_work_with_qos(env, idByUid->work, napi_qos_default);
867     idByUid.release();
868     return result;
869 }
870 
GetOsAccountLocalIdFromUid(napi_env env,napi_callback_info cbInfo)871 napi_value GetOsAccountLocalIdFromUid(napi_env env, napi_callback_info cbInfo)
872 {
873     return GetOsAccountLocalIdFromUidInner(env, cbInfo, false);
874 }
875 
GetOsAccountLocalIdForUid(napi_env env,napi_callback_info cbInfo)876 napi_value GetOsAccountLocalIdForUid(napi_env env, napi_callback_info cbInfo)
877 {
878     return GetOsAccountLocalIdFromUidInner(env, cbInfo, true);
879 }
880 
ParseUidFromCbInfo(napi_env env,napi_callback_info cbInfo,int32_t & uid)881 static bool ParseUidFromCbInfo(napi_env env, napi_callback_info cbInfo, int32_t &uid)
882 {
883     size_t argc = ARGS_SIZE_ONE;
884     napi_value argv[ARGS_SIZE_ONE] = {0};
885     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
886     if (argc == 0) {
887         ACCOUNT_LOGE("The number of parameters should be at least 1.");
888         std::string errMsg = "Parameter error. The number of parameters should be at least 1";
889         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
890         return false;
891     }
892     if (!GetIntProperty(env, argv[0], uid)) {
893         ACCOUNT_LOGE("Get uid failed.");
894         std::string errMsg = "Parameter error. The type of \"uid\" must be number";
895         AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
896         return false;
897     }
898     return true;
899 }
900 
GetOsAccountLocalIdForUidSync(napi_env env,napi_callback_info cbInfo)901 napi_value GetOsAccountLocalIdForUidSync(napi_env env, napi_callback_info cbInfo)
902 {
903     napi_value napiValue = nullptr;
904     int32_t uid = 0;
905     if (!ParseUidFromCbInfo(env, cbInfo, uid)) {
906         return napiValue;
907     }
908     int32_t localId = 0;
909     ErrCode errCode = OsAccountManager::GetOsAccountLocalIdFromUid(uid, localId);
910     if (errCode != ERR_OK) {
911         AccountNapiThrow(env, errCode);
912         return napiValue;
913     }
914     NAPI_CALL(env, napi_create_int32(env, localId, &napiValue));
915     return napiValue;
916 }
917 
GetBundleIdFromUid(napi_env env,napi_callback_info cbInfo)918 napi_value GetBundleIdFromUid(napi_env env, napi_callback_info cbInfo)
919 {
920     auto bundleIdByUid = std::make_unique<GetIdByUidAsyncContext>();
921     bundleIdByUid->env = env;
922     bundleIdByUid->throwErr = true;
923 
924     if (!ParseParaGetIdByUid(env, cbInfo, bundleIdByUid.get())) {
925         return nullptr;
926     }
927 
928     napi_value result = nullptr;
929     if (bundleIdByUid->callbackRef == nullptr) {
930         napi_create_promise(env, &bundleIdByUid->deferred, &result);
931     } else {
932         napi_get_undefined(env, &result);
933     }
934 
935     napi_value resource = nullptr;
936     napi_create_string_utf8(env, "GetBundleIdFromUid", NAPI_AUTO_LENGTH, &resource);
937 
938     napi_create_async_work(env, nullptr, resource,
939         GetBundleIdByUidExecuteCB,
940         GetBundleIdByUidCallbackCompletedCB,
941         reinterpret_cast<void *>(bundleIdByUid.get()),
942         &bundleIdByUid->work);
943 
944     napi_queue_async_work_with_qos(env, bundleIdByUid->work, napi_qos_default);
945     bundleIdByUid.release();
946     return result;
947 }
948 
GetBundleIdForUidSync(napi_env env,napi_callback_info cbInfo)949 napi_value GetBundleIdForUidSync(napi_env env, napi_callback_info cbInfo)
950 {
951     napi_value retValue = nullptr;
952     int32_t uid = 0;
953     if (!ParseUidFromCbInfo(env, cbInfo, uid)) {
954         return retValue;
955     }
956     int32_t bundleId = 0;
957     ErrCode errCode = OsAccountManager::GetBundleIdFromUid(uid, bundleId);
958     if (errCode != ERR_OK) {
959         AccountNapiThrow(env, errCode);
960         return retValue;
961     }
962     NAPI_CALL(env, napi_create_int32(env, bundleId, &retValue));
963     return retValue;
964 }
965 
QueryOsAccountLocalIdFromDomain(napi_env env,napi_callback_info cbInfo)966 napi_value QueryOsAccountLocalIdFromDomain(napi_env env, napi_callback_info cbInfo)
967 {
968     return GetOsAccountLocalIdFromDomainInner(env, cbInfo, true);
969 }
970 
GetOsAccountLocalIdFromDomain(napi_env env,napi_callback_info cbInfo)971 napi_value GetOsAccountLocalIdFromDomain(napi_env env, napi_callback_info cbInfo)
972 {
973     return GetOsAccountLocalIdFromDomainInner(env, cbInfo, false);
974 }
975 
GetOsAccountLocalIdFromDomainInner(napi_env env,napi_callback_info cbInfo,bool throwErr)976 napi_value GetOsAccountLocalIdFromDomainInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
977 {
978     auto idByDomain = std::make_unique<GetIdByDomainAsyncContext>();
979     idByDomain->env = env;
980     idByDomain->throwErr = throwErr;
981 
982     if (!ParseParaGetIdByDomain(env, cbInfo, idByDomain.get()) && throwErr) {
983         return nullptr;
984     }
985 
986     napi_value result = nullptr;
987     if (idByDomain->callbackRef == nullptr) {
988         napi_create_promise(env, &idByDomain->deferred, &result);
989     } else {
990         napi_get_undefined(env, &result);
991     }
992 
993     napi_value resource = nullptr;
994     napi_create_string_utf8(env, "GetOsAccountLocalIdFromDomainInner", NAPI_AUTO_LENGTH, &resource);
995 
996     napi_create_async_work(env, nullptr, resource, GetIdByDomainExecuteCB, GetIdByDomainCallbackCompletedCB,
997         reinterpret_cast<void *>(idByDomain.get()), &idByDomain->work);
998 
999     napi_queue_async_work_with_qos(env, idByDomain->work, napi_qos_default);
1000     idByDomain.release();
1001     return result;
1002 }
1003 
SetOsAccountProfilePhoto(napi_env env,napi_callback_info cbInfo)1004 napi_value SetOsAccountProfilePhoto(napi_env env, napi_callback_info cbInfo)
1005 {
1006     auto setPhoto = std::make_unique<SetOAPhotoAsyncContext>();
1007     setPhoto->env = env;
1008     setPhoto->throwErr = true;
1009 
1010     if (!ParseParaSetPhoto(env, cbInfo, setPhoto.get())) {
1011         return nullptr;
1012     }
1013 
1014     napi_value result = nullptr;
1015     if (setPhoto->callbackRef == nullptr) {
1016         napi_create_promise(env, &setPhoto->deferred, &result);
1017     } else {
1018         napi_get_undefined(env, &result);
1019     }
1020 
1021     napi_value resource = nullptr;
1022     napi_create_string_utf8(env, "SetOsAccountProfilePhoto", NAPI_AUTO_LENGTH, &resource);
1023 
1024     napi_create_async_work(env, nullptr, resource, SetPhotoExecuteCB, SetPhotoCompletedCB,
1025         reinterpret_cast<void *>(setPhoto.get()), &setPhoto->work);
1026 
1027     napi_queue_async_work_with_qos(env, setPhoto->work, napi_qos_user_initiated);
1028     setPhoto.release();
1029     return result;
1030 }
1031 
QueryMaxOsAccountNumber(napi_env env,napi_callback_info cbInfo)1032 napi_value QueryMaxOsAccountNumber(napi_env env, napi_callback_info cbInfo)
1033 {
1034     auto maxNum = std::make_unique<QueryMaxNumAsyncContext>();
1035     maxNum->env = env;
1036     maxNum->throwErr = true;
1037 
1038     if (!ParseParaQueryMaxNum(env, cbInfo, maxNum.get())) {
1039         return nullptr;
1040     }
1041 
1042     napi_value result = nullptr;
1043     if (maxNum->callbackRef == nullptr) {
1044         napi_create_promise(env, &maxNum->deferred, &result);
1045     } else {
1046         napi_get_undefined(env, &result);
1047     }
1048 
1049     napi_value resource = nullptr;
1050     napi_create_string_utf8(env, "QueryMaxOsAccountNumber", NAPI_AUTO_LENGTH, &resource);
1051 
1052     napi_create_async_work(env, nullptr, resource, QueryMaxNumExecuteCB, QueryMaxNumCompletedCB,
1053         reinterpret_cast<void *>(maxNum.get()), &maxNum->work);
1054 
1055     napi_queue_async_work_with_qos(env, maxNum->work, napi_qos_default);
1056     maxNum.release();
1057     return result;
1058 }
1059 
QueryMaxLoggedInOsAccountNumber(napi_env env,napi_callback_info cbInfo)1060 napi_value QueryMaxLoggedInOsAccountNumber(napi_env env, napi_callback_info cbInfo)
1061 {
1062     auto context = std::make_unique<QueryMaxNumAsyncContext>();
1063     napi_value result = nullptr;
1064     NAPI_CALL(env, napi_create_promise(env, &context->deferred, &result));
1065     napi_value resource = nullptr;
1066     NAPI_CALL(env, napi_create_string_utf8(env, "QueryMaxLoggedInOsAccountNumber", NAPI_AUTO_LENGTH, &resource));
1067     NAPI_CALL(env, napi_create_async_work(env, nullptr, resource,
1068         [](napi_env env, void *data) {
1069             auto context = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1070             context->errCode = OsAccountManager::QueryMaxLoggedInOsAccountNumber(context->maxLoggedInNumber);
1071         }, [](napi_env env, napi_status status, void *data) {
1072             auto context = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1073             napi_value errJs = nullptr;
1074             napi_value dataJs = nullptr;
1075             if (context->errCode == napi_ok) {
1076                 napi_create_uint32(env, context->maxLoggedInNumber, &dataJs);
1077             } else {
1078                 errJs = GenerateBusinessError(env, context->errCode);
1079             }
1080             ProcessCallbackOrPromise(env, context, errJs, dataJs);
1081             delete context;
1082         }, reinterpret_cast<void *>(context.get()), &context->work));
1083     NAPI_CALL(env, napi_queue_async_work_with_qos(env, context->work, napi_qos_default));
1084     context.release();
1085     return result;
1086 }
1087 
InnerIsOsAccountActived(napi_env env,napi_callback_info cbInfo,bool throwErr)1088 napi_value InnerIsOsAccountActived(napi_env env, napi_callback_info cbInfo, bool throwErr)
1089 {
1090     auto isActived = std::make_unique<IsActivedAsyncContext>();
1091     isActived->env = env;
1092     isActived->throwErr = throwErr;
1093 
1094     if (!ParseParaIsActived(env, cbInfo, isActived.get()) && throwErr) {
1095         return nullptr;
1096     }
1097 
1098     napi_value result = nullptr;
1099     if (isActived->callbackRef == nullptr) {
1100         napi_create_promise(env, &isActived->deferred, &result);
1101     } else {
1102         napi_get_undefined(env, &result);
1103     }
1104 
1105     napi_value resource = nullptr;
1106     napi_create_string_utf8(env, "IsOsAccountActived", NAPI_AUTO_LENGTH, &resource);
1107 
1108     napi_create_async_work(env, nullptr, resource, IsActivedExecuteCB, IsActivedCompletedCB,
1109         reinterpret_cast<void *>(isActived.get()), &isActived->work);
1110 
1111     napi_queue_async_work_with_qos(env, isActived->work, napi_qos_default);
1112     isActived.release();
1113     return result;
1114 }
1115 
CheckOsAccountActivated(napi_env env,napi_callback_info cbInfo)1116 napi_value CheckOsAccountActivated(napi_env env, napi_callback_info cbInfo)
1117 {
1118     return InnerIsOsAccountActived(env, cbInfo, true);
1119 }
1120 
IsOsAccountActived(napi_env env,napi_callback_info cbInfo)1121 napi_value IsOsAccountActived(napi_env env, napi_callback_info cbInfo)
1122 {
1123     return InnerIsOsAccountActived(env, cbInfo, false);
1124 }
1125 
InnerIsOsAccountConstraintEnable(napi_env env,napi_callback_info cbInfo,bool throwErr)1126 napi_value InnerIsOsAccountConstraintEnable(napi_env env, napi_callback_info cbInfo, bool throwErr)
1127 {
1128     auto isEnable = std::make_unique<IsConEnableAsyncContext>();
1129     isEnable->env = env;
1130     isEnable->throwErr = throwErr;
1131 
1132     if (!ParseParaIsEnable(env, cbInfo, isEnable.get()) && throwErr) {
1133         return nullptr;
1134     }
1135 
1136     napi_value result = nullptr;
1137     if (isEnable->callbackRef == nullptr) {
1138         napi_create_promise(env, &isEnable->deferred, &result);
1139     } else {
1140         napi_get_undefined(env, &result);
1141     }
1142 
1143     napi_value resource = nullptr;
1144     napi_create_string_utf8(env, "IsOsAccountConstraintEnable", NAPI_AUTO_LENGTH, &resource);
1145 
1146     napi_create_async_work(env, nullptr, resource, IsEnableExecuteCB, IsEnableCompletedCB,
1147         reinterpret_cast<void *>(isEnable.get()), &isEnable->work);
1148 
1149     napi_queue_async_work_with_qos(env, isEnable->work, napi_qos_default);
1150     isEnable.release();
1151     return result;
1152 }
1153 
IsOsAccountConstraintEnable(napi_env env,napi_callback_info cbInfo)1154 napi_value IsOsAccountConstraintEnable(napi_env env, napi_callback_info cbInfo)
1155 {
1156     return InnerIsOsAccountConstraintEnable(env, cbInfo, false);
1157 }
1158 
CheckConstraintEnabled(napi_env env,napi_callback_info cbInfo)1159 napi_value CheckConstraintEnabled(napi_env env, napi_callback_info cbInfo)
1160 {
1161     return InnerIsOsAccountConstraintEnable(env, cbInfo, true);
1162 }
1163 
GetOsAccountType(napi_env env,napi_callback_info cbInfo)1164 napi_value GetOsAccountType(napi_env env, napi_callback_info cbInfo)
1165 {
1166     return GetOsAccountTypeFromProcessInner(env, cbInfo, true);
1167 }
1168 
GetOsAccountTypeFromProcess(napi_env env,napi_callback_info cbInfo)1169 napi_value GetOsAccountTypeFromProcess(napi_env env, napi_callback_info cbInfo)
1170 {
1171     return GetOsAccountTypeFromProcessInner(env, cbInfo, false);
1172 }
1173 
GetOsAccountTypeFromProcessInner(napi_env env,napi_callback_info cbInfo,bool throwErr)1174 napi_value GetOsAccountTypeFromProcessInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
1175 {
1176     auto getType = std::make_unique<GetTypeAsyncContext>();
1177     getType->env = env;
1178     getType->throwErr = throwErr;
1179 
1180     if (!ParseParaGetType(env, cbInfo, getType.get()) && throwErr) {
1181         return nullptr;
1182     }
1183 
1184     napi_value result = nullptr;
1185     if (getType->callbackRef == nullptr) {
1186         napi_create_promise(env, &getType->deferred, &result);
1187     } else {
1188         napi_get_undefined(env, &result);
1189     }
1190 
1191     napi_value resource = nullptr;
1192     napi_create_string_utf8(env, "GetOsAccountTypeFromProcessInner", NAPI_AUTO_LENGTH, &resource);
1193 
1194     napi_create_async_work(env, nullptr, resource, GetTypeExecuteCB, GetTypeCompletedCB,
1195         reinterpret_cast<void *>(getType.get()), &getType->work);
1196 
1197     napi_queue_async_work_with_qos(env, getType->work, napi_qos_default);
1198     getType.release();
1199     return result;
1200 }
1201 
IsMultiOsAccountEnable(napi_env env,napi_callback_info cbInfo)1202 napi_value IsMultiOsAccountEnable(napi_env env, napi_callback_info cbInfo)
1203 {
1204     return InnerIsMultiOsAccountEnable(env, cbInfo, false);
1205 }
1206 
CheckMultiOsAccountEnabled(napi_env env,napi_callback_info cbInfo)1207 napi_value CheckMultiOsAccountEnabled(napi_env env, napi_callback_info cbInfo)
1208 {
1209     return InnerIsMultiOsAccountEnable(env, cbInfo, true);
1210 }
1211 
InnerIsMultiOsAccountEnable(napi_env env,napi_callback_info cbInfo,bool throwErr)1212 napi_value InnerIsMultiOsAccountEnable(napi_env env, napi_callback_info cbInfo, bool throwErr)
1213 {
1214     auto multiEn = std::make_unique<IsMultiEnAsyncContext>();
1215     multiEn->env = env;
1216     multiEn->throwErr = throwErr;
1217 
1218     if (!ParseParaIsMultiEn(env, cbInfo, multiEn.get()) && throwErr) {
1219         return nullptr;
1220     }
1221 
1222     napi_value result = nullptr;
1223     if (multiEn->callbackRef == nullptr) {
1224         napi_create_promise(env, &multiEn->deferred, &result);
1225     } else {
1226         napi_get_undefined(env, &result);
1227     }
1228 
1229     napi_value resource = nullptr;
1230     napi_create_string_utf8(env, "IsMultiOsAccountEnable", NAPI_AUTO_LENGTH, &resource);
1231 
1232     napi_create_async_work(env, nullptr, resource, IsMultiEnExecuteCB, IsMultiEnCompletedCB,
1233         reinterpret_cast<void *>(multiEn.get()), &multiEn->work);
1234 
1235     napi_queue_async_work_with_qos(env, multiEn->work, napi_qos_default);
1236     multiEn.release();
1237     return result;
1238 }
1239 
InnerIsOsAccountVerified(napi_env env,napi_callback_info cbInfo,bool throwErr)1240 napi_value InnerIsOsAccountVerified(napi_env env, napi_callback_info cbInfo, bool throwErr)
1241 {
1242     auto isVerified = std::make_unique<IsVerifiedAsyncContext>();
1243     isVerified->env = env;
1244     isVerified->throwErr = throwErr;
1245 
1246     if (!ParseParaIsVerified(env, cbInfo, isVerified.get()) && throwErr) {
1247         return nullptr;
1248     }
1249 
1250     napi_value result = nullptr;
1251     if (isVerified->callbackRef == nullptr) {
1252         napi_create_promise(env, &isVerified->deferred, &result);
1253     } else {
1254         napi_get_undefined(env, &result);
1255     }
1256 
1257     napi_value resource = nullptr;
1258     napi_create_string_utf8(env, "IsOsAccountVerified", NAPI_AUTO_LENGTH, &resource);
1259 
1260     napi_create_async_work(env, nullptr, resource, IsVerifiedExecuteCB, IsVerifiedCompletedCB,
1261         reinterpret_cast<void *>(isVerified.get()), &isVerified->work);
1262 
1263     napi_queue_async_work_with_qos(env, isVerified->work, napi_qos_default);
1264     isVerified.release();
1265     return result;
1266 }
1267 
IsOsAccountVerified(napi_env env,napi_callback_info cbInfo)1268 napi_value IsOsAccountVerified(napi_env env, napi_callback_info cbInfo)
1269 {
1270     return InnerIsOsAccountVerified(env, cbInfo, false);
1271 }
1272 
CheckOsAccountVerified(napi_env env,napi_callback_info cbInfo)1273 napi_value CheckOsAccountVerified(napi_env env, napi_callback_info cbInfo)
1274 {
1275     return InnerIsOsAccountVerified(env, cbInfo, true);
1276 }
1277 
QueryOsAccountLocalIdBySerialNumber(napi_env env,napi_callback_info cbInfo)1278 napi_value QueryOsAccountLocalIdBySerialNumber(napi_env env, napi_callback_info cbInfo)
1279 {
1280     return GetOsAccountLocalIdBySerialNumberInner(env, cbInfo, true);
1281 }
1282 
GetOsAccountLocalIdBySerialNumber(napi_env env,napi_callback_info cbInfo)1283 napi_value GetOsAccountLocalIdBySerialNumber(napi_env env, napi_callback_info cbInfo)
1284 {
1285     return GetOsAccountLocalIdBySerialNumberInner(env, cbInfo, false);
1286 }
1287 
GetOsAccountLocalIdBySerialNumberInner(napi_env env,napi_callback_info cbInfo,bool throwErr)1288 napi_value GetOsAccountLocalIdBySerialNumberInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
1289 {
1290     auto serialNumId = std::make_unique<GetSerialNumIdCBInfo>();
1291     serialNumId->env = env;
1292     serialNumId->throwErr = throwErr;
1293 
1294     if (!ParseParaSerialNumId(env, cbInfo, serialNumId.get()) && throwErr) {
1295         return nullptr;
1296     }
1297 
1298     napi_value result = nullptr;
1299     if (serialNumId->callbackRef == nullptr) {
1300         napi_create_promise(env, &serialNumId->deferred, &result);
1301     } else {
1302         napi_get_undefined(env, &result);
1303     }
1304 
1305     napi_value resource = nullptr;
1306     napi_create_string_utf8(env, "GetOsAccountLocalIdBySerialNumberInner", NAPI_AUTO_LENGTH, &resource);
1307 
1308     napi_create_async_work(env, nullptr, resource, SerialNumIdExecuteCB, SerialNumIdCompletedCB,
1309         reinterpret_cast<void *>(serialNumId.get()), &serialNumId->work);
1310 
1311     napi_queue_async_work_with_qos(env, serialNumId->work, napi_qos_default);
1312     serialNumId.release();
1313     return result;
1314 }
1315 
QuerySerialNumberByOsAccountLocalId(napi_env env,napi_callback_info cbInfo)1316 napi_value QuerySerialNumberByOsAccountLocalId(napi_env env, napi_callback_info cbInfo)
1317 {
1318     return GetSerialNumberByOsAccountLocalIdInner(env, cbInfo, true);
1319 }
1320 
GetSerialNumberByOsAccountLocalId(napi_env env,napi_callback_info cbInfo)1321 napi_value GetSerialNumberByOsAccountLocalId(napi_env env, napi_callback_info cbInfo)
1322 {
1323     return GetSerialNumberByOsAccountLocalIdInner(env, cbInfo, false);
1324 }
1325 
GetSerialNumberByOsAccountLocalIdInner(napi_env env,napi_callback_info cbInfo,bool throwErr)1326 napi_value GetSerialNumberByOsAccountLocalIdInner(napi_env env, napi_callback_info cbInfo, bool throwErr)
1327 {
1328     auto getSerialNum = std::make_unique<GetSerialNumForOAInfo>();
1329     getSerialNum->env = env;
1330     getSerialNum->throwErr = throwErr;
1331 
1332     if (!ParseParaGetSerialNum(env, cbInfo, getSerialNum.get()) && throwErr) {
1333         return nullptr;
1334     }
1335 
1336     napi_value result = nullptr;
1337     if (getSerialNum->callbackRef == nullptr) {
1338         napi_create_promise(env, &getSerialNum->deferred, &result);
1339     } else {
1340         napi_get_undefined(env, &result);
1341     }
1342 
1343     napi_value resource = nullptr;
1344     napi_create_string_utf8(env, "GetSerialNumberByOsAccountLocalId", NAPI_AUTO_LENGTH, &resource);
1345 
1346     napi_create_async_work(env,
1347         nullptr,
1348         resource,
1349         GetSerialNumExecuteCB,
1350         GetSerialNumCompletedCB,
1351         reinterpret_cast<void *>(getSerialNum.get()),
1352         &getSerialNum->work);
1353 
1354     napi_queue_async_work_with_qos(env, getSerialNum->work, napi_qos_default);
1355     getSerialNum.release();
1356     return result;
1357 }
1358 
IsTestOsAccount(napi_env env,napi_callback_info cbInfo)1359 napi_value IsTestOsAccount(napi_env env, napi_callback_info cbInfo)
1360 {
1361     return InnerIsTestOsAccount(env, cbInfo, false);
1362 }
1363 
CheckOsAccountTestable(napi_env env,napi_callback_info cbInfo)1364 napi_value CheckOsAccountTestable(napi_env env, napi_callback_info cbInfo)
1365 {
1366     return InnerIsTestOsAccount(env, cbInfo, true);
1367 }
1368 
InnerIsTestOsAccount(napi_env env,napi_callback_info cbInfo,bool throwErr)1369 napi_value InnerIsTestOsAccount(napi_env env, napi_callback_info cbInfo, bool throwErr)
1370 {
1371     auto isTest = std::make_unique<IsTestOAInfo>();
1372     isTest->env = env;
1373     isTest->throwErr = throwErr;
1374 
1375     if (!ParseParaIsTestOA(env, cbInfo, isTest.get()) && throwErr) {
1376         return nullptr;
1377     }
1378 
1379     napi_value result = nullptr;
1380     if (isTest->callbackRef == nullptr) {
1381         napi_create_promise(env, &isTest->deferred, &result);
1382     } else {
1383         napi_get_undefined(env, &result);
1384     }
1385 
1386     napi_value resource = nullptr;
1387     napi_create_string_utf8(env, "IsTestOsAccount", NAPI_AUTO_LENGTH, &resource);
1388 
1389     napi_create_async_work(env,
1390         nullptr,
1391         resource,
1392         [](napi_env env, void *data) {},
1393         [](napi_env env, napi_status status, void *data) {
1394             ACCOUNT_LOGI("napi_create_async_work complete");
1395             IsTestOAInfo *isTest = reinterpret_cast<IsTestOAInfo *>(data);
1396             isTest->errCode = 0;
1397             isTest->isTestOsAccount = false;
1398             napi_value result[RESULT_COUNT] = {0};
1399             result[PARAMZERO] = GenerateBusinessSuccess(env, isTest->throwErr);
1400             napi_get_boolean(env, isTest->isTestOsAccount, &result[PARAMONE]);
1401             ProcessCallbackOrPromise(env, isTest, result[PARAMZERO], result[PARAMONE]);
1402             delete isTest;
1403         },
1404         reinterpret_cast<void *>(isTest.get()),
1405         &isTest->work);
1406     napi_queue_async_work_with_qos(env, isTest->work, napi_qos_default);
1407     isTest.release();
1408     return result;
1409 }
1410 
IsMainOsAccount(napi_env env,napi_callback_info cbInfo)1411 napi_value IsMainOsAccount(napi_env env, napi_callback_info cbInfo)
1412 {
1413     auto isMain = std::make_unique<IsMainOAInfo>();
1414     isMain->env = env;
1415     isMain->throwErr = true;
1416 
1417     if (!ParseParaIsMainOA(env, cbInfo, isMain.get())) {
1418         return nullptr;
1419     }
1420 
1421     napi_value result = nullptr;
1422     if (isMain->callbackRef == nullptr) {
1423         napi_create_promise(env, &isMain->deferred, &result);
1424     } else {
1425         napi_get_undefined(env, &result);
1426     }
1427 
1428     napi_value resource = nullptr;
1429     napi_create_string_utf8(env, "IsMainOsAccount", NAPI_AUTO_LENGTH, &resource);
1430 
1431     napi_create_async_work(env,
1432         nullptr,
1433         resource,
1434         [](napi_env env, void *data) {
1435             IsMainOAInfo *isMain = reinterpret_cast<IsMainOAInfo *>(data);
1436             isMain->errCode = OsAccountManager::IsMainOsAccount(isMain->isMainOsAccount);
1437             ACCOUNT_LOGD("error code is %{public}d", isMain->errCode);
1438             isMain->status = (isMain->errCode == 0) ? napi_ok : napi_generic_failure;
1439         },
1440         [](napi_env env, napi_status status, void *data) {
1441             ACCOUNT_LOGD("napi_create_async_work complete");
1442             IsMainOAInfo *isMain = reinterpret_cast<IsMainOAInfo *>(data);
1443             napi_value result[RESULT_COUNT] = {0};
1444             result[PARAMZERO] = GenerateBusinessError(env, isMain->errCode);
1445             napi_get_boolean(env, isMain->isMainOsAccount, &result[PARAMONE]);
1446             ProcessCallbackOrPromise(env, isMain, result[PARAMZERO], result[PARAMONE]);
1447             delete isMain;
1448         },
1449         reinterpret_cast<void *>(isMain.get()),
1450         &isMain->work);
1451 
1452     napi_queue_async_work_with_qos(env, isMain->work, napi_qos_default);
1453     isMain.release();
1454     return result;
1455 }
1456 
IsSubscribeInMap(napi_env env,SubscribeCBInfo * subscribeCBInfo)1457 static bool IsSubscribeInMap(napi_env env, SubscribeCBInfo *subscribeCBInfo)
1458 {
1459     std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1460     auto subscribe = g_osAccountSubscribers.find(subscribeCBInfo->osManager);
1461     if (subscribe == g_osAccountSubscribers.end()) {
1462         return false;
1463     }
1464     auto it = subscribe->second.begin();
1465     while (it != subscribe->second.end()) {
1466         if (((*it)->osSubscribeType == subscribeCBInfo->osSubscribeType) &&
1467             (CompareOnAndOffRef(env, (*it)->callbackRef, subscribeCBInfo->callbackRef))) {
1468             return true;
1469         }
1470         it++;
1471     }
1472     return false;
1473 }
1474 
Subscribe(napi_env env,napi_callback_info cbInfo)1475 napi_value Subscribe(napi_env env, napi_callback_info cbInfo)
1476 {
1477     SubscribeCBInfo *subscribeCBInfo = new (std::nothrow) SubscribeCBInfo(env);
1478     if (subscribeCBInfo == nullptr) {
1479         ACCOUNT_LOGE("insufficient memory for subscribeCBInfo!");
1480         return nullptr;
1481     }
1482     subscribeCBInfo->throwErr = true;
1483 
1484     napi_value thisVar = nullptr;
1485 
1486     if (!ParseParaToSubscriber(env, cbInfo, subscribeCBInfo, &thisVar)) {
1487         delete subscribeCBInfo;
1488         ACCOUNT_LOGE("Parse subscribe failed");
1489         return nullptr;
1490     }
1491 
1492     // make osaccount subscribe info
1493     OsAccountSubscribeInfo subscribeInfo(subscribeCBInfo->osSubscribeType, subscribeCBInfo->name);
1494     // make a subscriber
1495     subscribeCBInfo->subscriber = std::make_shared<SubscriberPtr>(subscribeInfo);
1496 
1497     OsAccountManager *objectInfo = nullptr;
1498     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&objectInfo));
1499     subscribeCBInfo->osManager = objectInfo;
1500     subscribeCBInfo->subscriber->SetEnv(env);
1501     subscribeCBInfo->subscriber->SetCallbackRef(subscribeCBInfo->callbackRef);
1502     if (IsSubscribeInMap(env, subscribeCBInfo)) {
1503         delete subscribeCBInfo;
1504         return WrapVoidToJS(env);
1505     }
1506     ErrCode errCode = OsAccountManager::SubscribeOsAccount(subscribeCBInfo->subscriber);
1507     if (errCode != ERR_OK) {
1508         delete subscribeCBInfo;
1509         AccountNapiThrow(env, errCode, true);
1510         return WrapVoidToJS(env);
1511     } else {
1512         std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1513         g_osAccountSubscribers[objectInfo].emplace_back(subscribeCBInfo);
1514     }
1515     return WrapVoidToJS(env);
1516 }
1517 
SubscriberPtr(const OsAccountSubscribeInfo & subscribeInfo)1518 SubscriberPtr::SubscriberPtr(const OsAccountSubscribeInfo &subscribeInfo) : OsAccountSubscriber(subscribeInfo)
1519 {}
1520 
~SubscriberPtr()1521 SubscriberPtr::~SubscriberPtr()
1522 {}
1523 
OnAccountsChanged(const int & id)1524 void SubscriberPtr::OnAccountsChanged(const int &id)
1525 {
1526     OnAccountsSubNotify(id, id);
1527 }
1528 
OnAccountsSwitch(const int & newId,const int & oldId)1529 void SubscriberPtr::OnAccountsSwitch(const int &newId, const int &oldId)
1530 {
1531     OnAccountsSubNotify(newId, oldId);
1532 }
1533 
OnAccountsSubNotify(const int & newId,const int & oldId)1534 void SubscriberPtr::OnAccountsSubNotify(const int &newId, const int &oldId)
1535 {
1536     std::shared_ptr<SubscriberOAWorker> subscriberOAWorker = std::make_shared<SubscriberOAWorker>();
1537     if (subscriberOAWorker == nullptr) {
1538         ACCOUNT_LOGE("insufficient memory for SubscriberAccountsWorker!");
1539         return;
1540     }
1541     subscriberOAWorker->oldId = oldId;
1542     subscriberOAWorker->newId = newId;
1543     subscriberOAWorker->env = env_;
1544     subscriberOAWorker->ref = ref_;
1545     subscriberOAWorker->subscriber = this;
1546     auto task = OnAccountsSubNotifyTask(subscriberOAWorker);
1547     if (napi_ok != napi_send_event(env_, task, napi_eprio_vip)) {
1548         ACCOUNT_LOGE("Post task failed");
1549         return;
1550     }
1551     ACCOUNT_LOGI("Post task finish");
1552 }
1553 
CreateSwitchEventInfoObj(const std::shared_ptr<SubscriberOAWorker> & subscriberOAWorker)1554 static napi_value CreateSwitchEventInfoObj(const std::shared_ptr<SubscriberOAWorker> &subscriberOAWorker)
1555 {
1556     napi_env env = subscriberOAWorker->env;
1557     napi_value objInfo = nullptr;
1558     NAPI_CALL(env, napi_create_object(env, &objInfo));
1559     napi_value fromAccountIdJs;
1560     NAPI_CALL(env, napi_create_int32(env, subscriberOAWorker->oldId, &fromAccountIdJs));
1561     NAPI_CALL(env, napi_set_named_property(env, objInfo, "fromAccountId", fromAccountIdJs));
1562     napi_value toAccountIdJs;
1563     NAPI_CALL(env, napi_create_int32(env, subscriberOAWorker->newId, &toAccountIdJs));
1564     NAPI_CALL(env, napi_set_named_property(env, objInfo, "toAccountId", toAccountIdJs));
1565 
1566     return objInfo;
1567 }
1568 
OnAccountsSubNotifyTask(const std::shared_ptr<SubscriberOAWorker> & subscriberOAWorkerData)1569 std::function<void()> OnAccountsSubNotifyTask(const std::shared_ptr<SubscriberOAWorker> &subscriberOAWorkerData)
1570 {
1571     return [subscriberOAWorkerData] {
1572         ACCOUNT_LOGI("Enter OnAccountsSubNotify task");
1573         napi_handle_scope scope = nullptr;
1574         napi_open_handle_scope(subscriberOAWorkerData->env, &scope);
1575         if (scope == nullptr) {
1576             ACCOUNT_LOGE("Fail to open scope");
1577             return;
1578         }
1579         bool isFound = false;
1580         {
1581             std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1582             SubscriberPtr *subscriber = subscriberOAWorkerData->subscriber;
1583             for (auto subscriberInstance : g_osAccountSubscribers) {
1584                 isFound = std::any_of(subscriberInstance.second.begin(), subscriberInstance.second.end(),
1585                     [subscriber] (const SubscribeCBInfo *item) {
1586                         return item->subscriber.get() == subscriber;
1587                 });
1588                 if (isFound) {
1589                     ACCOUNT_LOGD("OsAccount subscriber has been found.");
1590                     break;
1591                 }
1592             }
1593         }
1594         if (isFound) {
1595             OsAccountSubscribeInfo subscribeInfo;
1596             OS_ACCOUNT_SUBSCRIBE_TYPE osSubscribeType;
1597             subscriberOAWorkerData->subscriber->GetSubscribeInfo(subscribeInfo);
1598             subscribeInfo.GetOsAccountSubscribeType(osSubscribeType);
1599 
1600             napi_value result[ARGS_SIZE_ONE] = { nullptr };
1601             if ((osSubscribeType == SWITCHING || osSubscribeType == SWITCHED)) {
1602                 ACCOUNT_LOGI("Switch condition, return oldId=%{public}d and newId=%{public}d.",
1603                     subscriberOAWorkerData->oldId, subscriberOAWorkerData->newId);
1604                 result[PARAMZERO] = CreateSwitchEventInfoObj(subscriberOAWorkerData);
1605             } else {
1606                 napi_create_int32(subscriberOAWorkerData->env, subscriberOAWorkerData->newId, &result[PARAMZERO]);
1607             }
1608             NapiCallVoidFunction(
1609                 subscriberOAWorkerData->env, &result[PARAMZERO], ARGS_SIZE_ONE, subscriberOAWorkerData->ref);
1610         }
1611         napi_close_handle_scope(subscriberOAWorkerData->env, scope);
1612     };
1613 }
1614 
SetEnv(const napi_env & env)1615 void SubscriberPtr::SetEnv(const napi_env &env)
1616 {
1617     env_ = env;
1618 }
1619 
SetCallbackRef(const napi_ref & ref)1620 void SubscriberPtr::SetCallbackRef(const napi_ref &ref)
1621 {
1622     ref_ = ref;
1623 }
1624 
Unsubscribe(napi_env env,napi_callback_info cbInfo)1625 napi_value Unsubscribe(napi_env env, napi_callback_info cbInfo)
1626 {
1627     UnsubscribeCBInfo *unsubscribeCBInfo = new (std::nothrow) UnsubscribeCBInfo(env);
1628     if (unsubscribeCBInfo == nullptr) {
1629         ACCOUNT_LOGE("insufficient memory for unsubscribeCBInfo!");
1630         return WrapVoidToJS(env);
1631     }
1632     unsubscribeCBInfo->callbackRef = nullptr;
1633     unsubscribeCBInfo->throwErr = true;
1634 
1635     napi_value thisVar = nullptr;
1636 
1637     if (!ParseParaToUnsubscriber(env, cbInfo, unsubscribeCBInfo, &thisVar)) {
1638         delete unsubscribeCBInfo;
1639         ACCOUNT_LOGE("Parse unsubscribe failed");
1640         return nullptr;
1641     }
1642 
1643     OsAccountManager *objectInfo = nullptr;
1644     napi_unwrap(env, thisVar, reinterpret_cast<void **>(&objectInfo));
1645     unsubscribeCBInfo->osManager = objectInfo;
1646 
1647     UnsubscribeSync(env, unsubscribeCBInfo);
1648     delete unsubscribeCBInfo;
1649     return WrapVoidToJS(env);
1650 }
1651 
UnsubscribeSync(napi_env env,UnsubscribeCBInfo * unsubscribeCBInfo)1652 void UnsubscribeSync(napi_env env, UnsubscribeCBInfo *unsubscribeCBInfo)
1653 {
1654     std::lock_guard<std::mutex> lock(g_lockForOsAccountSubscribers);
1655     auto subscribe = g_osAccountSubscribers.find(unsubscribeCBInfo->osManager);
1656     if (subscribe == g_osAccountSubscribers.end()) {
1657         return;
1658     }
1659     auto item = subscribe->second.begin();
1660     while (item != subscribe->second.end()) {
1661         OsAccountSubscribeInfo subscribeInfo;
1662         OS_ACCOUNT_SUBSCRIBE_TYPE osSubscribeType;
1663         std::string name;
1664         (*item)->subscriber->GetSubscribeInfo(subscribeInfo);
1665         subscribeInfo.GetOsAccountSubscribeType(osSubscribeType);
1666         subscribeInfo.GetName(name);
1667         if (((unsubscribeCBInfo->osSubscribeType != osSubscribeType) || (unsubscribeCBInfo->name != name)) ||
1668             ((unsubscribeCBInfo->callbackRef != nullptr) &&
1669             (!CompareOnAndOffRef(env, (*item)->callbackRef, unsubscribeCBInfo->callbackRef)))) {
1670             item++;
1671             continue;
1672         }
1673         int errCode = OsAccountManager::UnsubscribeOsAccount((*item)->subscriber);
1674         if (errCode != ERR_OK) {
1675             AccountNapiThrow(env, errCode, true);
1676             return;
1677         }
1678         delete (*item);
1679         item = subscribe->second.erase(item);
1680         if (unsubscribeCBInfo->callbackRef != nullptr) {
1681             break;
1682         }
1683     }
1684     if (subscribe->second.empty()) {
1685         g_osAccountSubscribers.erase(subscribe->first);
1686     }
1687 }
1688 
IsOsAccountActivated(napi_env env,napi_callback_info cbInfo)1689 napi_value IsOsAccountActivated(napi_env env, napi_callback_info cbInfo)
1690 {
1691     if (AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1692         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1693         return nullptr;
1694     }
1695     return InnerIsOsAccountActived(env, cbInfo, true);
1696 }
1697 
IsOsAccountConstraintEnabled(napi_env env,napi_callback_info cbInfo)1698 napi_value IsOsAccountConstraintEnabled(napi_env env, napi_callback_info cbInfo)
1699 {
1700     size_t argc = ARGS_SIZE_TWO;
1701     napi_value argv[ARGS_SIZE_TWO] = {0};
1702     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1703 
1704     if (argc == ARGS_SIZE_TWO && AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1705         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1706         return nullptr;
1707     }
1708     return InnerIsOsAccountConstraintEnable(env, cbInfo, true);
1709 }
1710 
IsOsAccountUnlocked(napi_env env,napi_callback_info cbInfo)1711 napi_value IsOsAccountUnlocked(napi_env env, napi_callback_info cbInfo)
1712 {
1713     size_t argc = ARGS_SIZE_TWO;
1714     napi_value argv[ARGS_SIZE_TWO] = {0};
1715     napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1716 
1717     if (argc != 0 && AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1718         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1719         return nullptr;
1720     }
1721     return InnerIsOsAccountVerified(env, cbInfo, true);
1722 }
1723 
GetEnabledOsAccountConstraints(napi_env env,napi_callback_info cbInfo)1724 napi_value GetEnabledOsAccountConstraints(napi_env env, napi_callback_info cbInfo)
1725 {
1726     if (AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1727         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1728         return nullptr;
1729     }
1730     return GetOsAccountAllConstraintsInner(env, cbInfo, true);
1731 }
1732 
QueryOsAccount(napi_env env,napi_callback_info cbInfo)1733 napi_value QueryOsAccount(napi_env env, napi_callback_info cbInfo)
1734 {
1735     if (AccountPermissionManager::CheckSystemApp(false) != ERR_OK) {
1736         AccountNapiThrow(env, ERR_JS_IS_NOT_SYSTEM_APP);
1737         return nullptr;
1738     }
1739     return QueryCurrentOsAccountInner(env, cbInfo, true);
1740 }
1741 
GetOsAccountDomainInfo(napi_env env,napi_callback_info cbInfo)1742 napi_value GetOsAccountDomainInfo(napi_env env, napi_callback_info cbInfo)
1743 {
1744     auto getDomainInfoContext = std::make_unique<GetOsAccountDomainInfoAsyncContext>();
1745     getDomainInfoContext->env = env;
1746     if (!ParseUidFromCbInfo(env, cbInfo, getDomainInfoContext->id)) {
1747         return nullptr;
1748     }
1749 
1750     napi_value result = nullptr;
1751     NAPI_CALL(env, napi_create_promise(env, &getDomainInfoContext->deferred, &result));
1752 
1753     napi_value resource = nullptr;
1754     NAPI_CALL(env, napi_create_string_utf8(env, "GetOsAccountDomainInfo", NAPI_AUTO_LENGTH, &resource));
1755 
1756     NAPI_CALL(env, napi_create_async_work(env, nullptr, resource,
1757         GetOsAccountDomainInfoExecuteCB,
1758         GetOsAccountDomainInfoCompletedCB,
1759         reinterpret_cast<void *>(getDomainInfoContext.get()),
1760         &getDomainInfoContext->work));
1761 
1762     NAPI_CALL(env, napi_queue_async_work_with_qos(env, getDomainInfoContext->work, napi_qos_default));
1763     getDomainInfoContext.release();
1764     return result;
1765 }
1766 }  // namespace AccountJsKit
1767 }  // namespace OHOS