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