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