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, ¤tOA->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 ¤tOA->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