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_common.h"
17 #include <string>
18 #include "napi_account_error.h"
19 #include "napi_account_common.h"
20 #include "napi/native_common.h"
21 #include "napi_os_account.h"
22
23 namespace OHOS {
24 namespace AccountJsKit {
25 constexpr int32_t COMPATIBILITY_CHANGE_VERSION_API12 = 12;
NapiCreateDomainCallback(napi_env env,napi_ref callbackRef,napi_deferred deferred)26 NapiCreateDomainCallback::NapiCreateDomainCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred)
27 : env_(env), callbackRef_(callbackRef), deferred_(deferred)
28 {}
29
~NapiCreateDomainCallback()30 NapiCreateDomainCallback::~NapiCreateDomainCallback()
31 {
32 std::unique_lock<std::mutex> lock(lockInfo_.mutex);
33 if (callbackRef_ != nullptr) {
34 ReleaseNapiRefAsync(env_, callbackRef_);
35 callbackRef_ = nullptr;
36 }
37 }
38
OnResult(const int32_t errCode,Parcel & parcel)39 void NapiCreateDomainCallback::OnResult(const int32_t errCode, Parcel &parcel)
40 {
41 std::shared_ptr<OsAccountInfo> osAccountInfo(OsAccountInfo::Unmarshalling(parcel));
42 if (osAccountInfo == nullptr) {
43 ACCOUNT_LOGE("failed to unmarshalling OsAccountInfo");
44 return;
45 }
46 std::unique_lock<std::mutex> lock(lockInfo_.mutex);
47 if ((callbackRef_ == nullptr) && (deferred_ == nullptr)) {
48 ACCOUNT_LOGE("js callback is nullptr");
49 return;
50 }
51 auto asyncContext = std::make_shared<CreateOAForDomainAsyncContext>();
52 asyncContext->osAccountInfos = *osAccountInfo;
53 asyncContext->errCode = errCode;
54 asyncContext->env = env_;
55 asyncContext->callbackRef = callbackRef_;
56 asyncContext->deferred = deferred_;
57 // transfer control of callbackRef & deferred to asyncContext, they would be released in async context
58 callbackRef_ = nullptr;
59 deferred_ = nullptr;
60 if (napi_ok != napi_send_event(env_, CreateOAForDomainCallbackCompletedWork(asyncContext), napi_eprio_vip)) {
61 ACCOUNT_LOGE("Post task failed");
62 return;
63 }
64 ACCOUNT_LOGI("Post task finish");
65 }
66
WrapVoidToJS(napi_env env)67 napi_value WrapVoidToJS(napi_env env)
68 {
69 napi_value result = nullptr;
70 NAPI_CALL(env, napi_get_null(env, &result));
71 return result;
72 }
73
ParseOneParaContext(napi_env env,napi_callback_info cbInfo,CommonAsyncContext * asyncContext)74 static bool ParseOneParaContext(napi_env env, napi_callback_info cbInfo, CommonAsyncContext *asyncContext)
75 {
76 size_t argc = ARGS_SIZE_ONE;
77 napi_value argv[ARGS_SIZE_ONE] = {0};
78 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
79 if (argc >= ARGS_SIZE_ONE) {
80 if (!GetCallbackProperty(env, argv[PARAMZERO], asyncContext->callbackRef, 1)) {
81 ACCOUNT_LOGE("Get callbackRef failed");
82 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
83 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
84 return false;
85 }
86 }
87 return true;
88 }
89
ParseCallbackAndId(napi_env env,napi_callback_info cbInfo,napi_ref & callbackRef,int & id,bool throwErr)90 bool ParseCallbackAndId(napi_env env, napi_callback_info cbInfo, napi_ref &callbackRef, int &id, bool throwErr)
91 {
92 size_t argc = ARGS_SIZE_TWO;
93 napi_value argv[ARGS_SIZE_TWO] = {0};
94 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
95
96 if (argc == ARGS_SIZE_TWO) {
97 if (!GetCallbackProperty(env, argv[argc - 1], callbackRef, 1)) {
98 ACCOUNT_LOGE("Get callbackRef failed");
99 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
100 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, throwErr);
101 return false;
102 }
103 }
104 if (!GetIntProperty(env, argv[PARAMZERO], id)) {
105 ACCOUNT_LOGE("Get id failed");
106 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
107 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, throwErr);
108 return false;
109 }
110 return true;
111 }
112
ParseParaDeactivateOA(napi_env env,napi_callback_info cbInfo,ActivateOAAsyncContext * asyncContext)113 bool ParseParaDeactivateOA(napi_env env, napi_callback_info cbInfo, ActivateOAAsyncContext *asyncContext)
114 {
115 size_t argc = ARGS_SIZE_ONE;
116 napi_value argv[ARGS_SIZE_ONE] = {0};
117 NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr), false);
118
119 if (argc < ARGS_SIZE_ONE) {
120 ACCOUNT_LOGE("The number of parameters should be at least 1.");
121 std::string errMsg = "The number of parameters should be at least 1";
122 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
123 return false;
124 }
125 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
126 ACCOUNT_LOGE("Get local Id failed.");
127 std::string errMsg = "The type of first arg must be number";
128 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
129 return false;
130 }
131 return true;
132 }
133
DeactivateOAExecuteCB(napi_env env,void * data)134 void DeactivateOAExecuteCB(napi_env env, void *data)
135 {
136 ActivateOAAsyncContext *asyncContext = reinterpret_cast<ActivateOAAsyncContext *>(data);
137 asyncContext->errCode = OsAccountManager::DeactivateOsAccount(asyncContext->id);
138 }
139
DeactivateOACompletedCB(napi_env env,napi_status status,void * data)140 void DeactivateOACompletedCB(napi_env env, napi_status status, void *data)
141 {
142 ActivateOAAsyncContext *asyncContext = reinterpret_cast<ActivateOAAsyncContext *>(data);
143 std::unique_ptr<ActivateOAAsyncContext> asyncContextPtr{asyncContext};
144 napi_value errJs = nullptr;
145 napi_value dataJs = nullptr;
146 if (asyncContext->errCode == ERR_OK) {
147 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &dataJs));
148 } else {
149 errJs = GenerateBusinessError(env, asyncContext->errCode);
150 }
151 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
152 }
153
ParseParaQueryOAByIdCB(napi_env env,napi_callback_info cbInfo,QueryOAByIdAsyncContext * asyncContext)154 bool ParseParaQueryOAByIdCB(napi_env env, napi_callback_info cbInfo, QueryOAByIdAsyncContext *asyncContext)
155 {
156 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
157 }
158
QueryOAByIdExecuteCB(napi_env env,void * data)159 void QueryOAByIdExecuteCB(napi_env env, void *data)
160 {
161 QueryOAByIdAsyncContext *asyncContext = reinterpret_cast<QueryOAByIdAsyncContext *>(data);
162 asyncContext->errCode = OsAccountManager::QueryOsAccountById(asyncContext->id, asyncContext->osAccountInfos);
163 ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
164 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
165 }
166
QueryOAByIdCallbackCompletedCB(napi_env env,napi_status status,void * data)167 void QueryOAByIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
168 {
169 QueryOAByIdAsyncContext *asyncContext = reinterpret_cast<QueryOAByIdAsyncContext *>(data);
170 napi_value errJs = nullptr;
171 napi_value dataJs = nullptr;
172 if (asyncContext->status == napi_ok) {
173 napi_get_null(env, &errJs);
174 GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
175 } else {
176 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
177 napi_get_null(env, &dataJs);
178 }
179 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
180 delete asyncContext;
181 }
182
CreateJsDomainInfo(napi_env env,const DomainAccountInfo & info,napi_value & result)183 void CreateJsDomainInfo(napi_env env, const DomainAccountInfo &info, napi_value &result)
184 {
185 napi_create_object(env, &result);
186 napi_value value = nullptr;
187 // domain
188 napi_create_string_utf8(env, info.domain_.c_str(), info.domain_.size(), &value);
189 napi_set_named_property(env, result, "domain", value);
190
191 // domain accountName
192 napi_create_string_utf8(env, info.accountName_.c_str(), info.accountName_.size(), &value);
193 napi_set_named_property(env, result, "accountName", value);
194
195 napi_create_string_utf8(env, info.accountId_.c_str(), info.accountId_.size(), &value);
196 napi_set_named_property(env, result, "accountId", value);
197 if ((info.status_ == DomainAccountStatus::LOGOUT) || (info.status_ >= DomainAccountStatus::LOG_END)) {
198 napi_get_boolean(env, false, &value);
199 } else {
200 napi_get_boolean(env, true, &value);
201 }
202 napi_set_named_property(env, result, "isAuthenticated", value);
203
204 //serverConfigId
205 napi_create_string_utf8(env, info.serverConfigId_.c_str(), info.serverConfigId_.size(), &value);
206 napi_set_named_property(env, result, "serverConfigId", value);
207 }
208
CreateJsDistributedInfo(napi_env env,const OhosAccountInfo & info,napi_value & result)209 void CreateJsDistributedInfo(napi_env env, const OhosAccountInfo &info, napi_value &result)
210 {
211 napi_create_object(env, &result);
212 napi_value value = nullptr;
213 // name
214 napi_create_string_utf8(env, info.name_.c_str(), info.name_.size(), &value);
215 napi_set_named_property(env, result, "name", value);
216
217 // id
218 napi_create_string_utf8(env, info.uid_.c_str(), info.uid_.size(), &value);
219 napi_set_named_property(env, result, "id", value);
220
221 // event
222 napi_create_string_utf8(env, "", 0, &value);
223 napi_set_named_property(env, result, "event", value);
224
225 // scalableData
226 napi_value scalable = nullptr;
227 napi_create_object(env, &scalable);
228 napi_set_named_property(env, result, "scalableData", scalable);
229 }
230
GetOACBInfoToJs(napi_env env,OsAccountInfo & info,napi_value & objOAInfo)231 void GetOACBInfoToJs(napi_env env, OsAccountInfo &info, napi_value &objOAInfo)
232 {
233 napi_create_object(env, &objOAInfo);
234 napi_value idToJs = nullptr;
235 napi_create_int32(env, info.GetLocalId(), &idToJs);
236 napi_set_named_property(env, objOAInfo, "localId", idToJs);
237
238 napi_value nameToJs = nullptr;
239 napi_create_string_utf8(env, info.GetLocalName().c_str(), NAPI_AUTO_LENGTH, &nameToJs);
240 napi_set_named_property(env, objOAInfo, "localName", nameToJs);
241
242 napi_value shortNameToJs = nullptr;
243 napi_create_string_utf8(env, info.GetShortName().c_str(), NAPI_AUTO_LENGTH, &shortNameToJs);
244 napi_set_named_property(env, objOAInfo, "shortName", shortNameToJs);
245
246 napi_value typeToJsObj = nullptr;
247 napi_create_int32(env, static_cast<int>(info.GetType()), &typeToJsObj);
248 napi_set_named_property(env, objOAInfo, "type", typeToJsObj);
249
250 napi_value constraintsToJs = nullptr;
251 napi_create_array(env, &constraintsToJs);
252 MakeArrayToJs(env, info.GetConstraints(), constraintsToJs);
253 napi_set_named_property(env, objOAInfo, "constraints", constraintsToJs);
254
255 napi_value isVerifiedToJs = nullptr;
256 napi_get_boolean(env, info.GetIsVerified(), &isVerifiedToJs);
257 napi_set_named_property(env, objOAInfo, "isVerified", isVerifiedToJs);
258 napi_set_named_property(env, objOAInfo, "isUnlocked", isVerifiedToJs);
259
260 napi_value photoToJs = nullptr;
261 napi_create_string_utf8(env, info.GetPhoto().c_str(), NAPI_AUTO_LENGTH, &photoToJs);
262 napi_set_named_property(env, objOAInfo, "photo", photoToJs);
263
264 napi_value createTimeToJs = nullptr;
265 napi_create_int64(env, info.GetCreateTime(), &createTimeToJs);
266 napi_set_named_property(env, objOAInfo, "createTime", createTimeToJs);
267
268 napi_value lastLoginTimeToJs = nullptr;
269 napi_create_int64(env, info.GetLastLoginTime(), &lastLoginTimeToJs);
270 napi_set_named_property(env, objOAInfo, "lastLoginTime", lastLoginTimeToJs);
271
272 napi_value serialNumberToJs = nullptr;
273 napi_create_int64(env, info.GetSerialNumber(), &serialNumberToJs);
274 napi_set_named_property(env, objOAInfo, "serialNumber", serialNumberToJs);
275
276 napi_value isActivedToJs = nullptr;
277 napi_get_boolean(env, info.GetIsActived(), &isActivedToJs);
278 napi_set_named_property(env, objOAInfo, "isActived", isActivedToJs);
279 napi_set_named_property(env, objOAInfo, "isActivated", isActivedToJs);
280
281 napi_value isLoggedInToJs = nullptr;
282 napi_get_boolean(env, info.GetIsLoggedIn(), &isLoggedInToJs);
283 napi_set_named_property(env, objOAInfo, "isLoggedIn", isLoggedInToJs);
284
285 napi_value isCreateCompletedToJs = nullptr;
286 napi_get_boolean(env, info.GetIsCreateCompleted(), &isCreateCompletedToJs);
287 napi_set_named_property(env, objOAInfo, "isCreateCompleted", isCreateCompletedToJs);
288
289 GetOtherAccountInfoToJs(env, info, objOAInfo);
290 }
291
GetOtherAccountInfoToJs(napi_env env,OsAccountInfo & info,napi_value & objOAInfo)292 void GetOtherAccountInfoToJs(napi_env env, OsAccountInfo &info, napi_value &objOAInfo)
293 {
294 // distributedInfo: distributedAccount.DistributedInfo
295 napi_value dbInfoToJs = nullptr;
296 std::pair<bool, OhosAccountInfo> dbAccountInfo = OhosAccountKits::GetInstance().QueryOhosAccountInfo();
297 if (dbAccountInfo.first) {
298 CreateJsDistributedInfo(env, dbAccountInfo.second, dbInfoToJs);
299 }
300 napi_set_named_property(env, objOAInfo, "distributedInfo", dbInfoToJs);
301
302 // domainInfo: domainInfo.DomainAccountInfo
303 DomainAccountInfo domainInfo;
304 info.GetDomainInfo(domainInfo);
305 CreateJsDomainInfo(env, domainInfo, dbInfoToJs);
306 napi_set_named_property(env, objOAInfo, "domainInfo", dbInfoToJs);
307 }
308
MakeArrayToJs(napi_env env,const std::vector<std::string> & constraints,napi_value jsArray)309 void MakeArrayToJs(napi_env env, const std::vector<std::string> &constraints, napi_value jsArray)
310 {
311 uint32_t index = 0;
312
313 for (auto item : constraints) {
314 napi_value constraint = nullptr;
315 napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &constraint);
316 napi_set_element(env, jsArray, index, constraint);
317 index++;
318 }
319 }
320
ParseParaRemoveOACB(napi_env env,napi_callback_info cbInfo,RemoveOAAsyncContext * asyncContext)321 bool ParseParaRemoveOACB(napi_env env, napi_callback_info cbInfo, RemoveOAAsyncContext *asyncContext)
322 {
323 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
324 }
325
RemoveOAExecuteCB(napi_env env,void * data)326 void RemoveOAExecuteCB(napi_env env, void *data)
327 {
328 RemoveOAAsyncContext *asyncContext = reinterpret_cast<RemoveOAAsyncContext *>(data);
329 asyncContext->errCode = OsAccountManager::RemoveOsAccount(asyncContext->id);
330 ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
331 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
332 }
333
RemoveOACallbackCompletedCB(napi_env env,napi_status status,void * data)334 void RemoveOACallbackCompletedCB(napi_env env, napi_status status, void *data)
335 {
336 ACCOUNT_LOGD("napi_create_async_work complete");
337 RemoveOAAsyncContext *asyncContext = reinterpret_cast<RemoveOAAsyncContext *>(data);
338 napi_value errJs = nullptr;
339 napi_value dataJs = nullptr;
340 if (asyncContext->status == napi_ok) {
341 napi_get_null(env, &errJs);
342 napi_get_null(env, &dataJs);
343 } else {
344 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
345 napi_get_null(env, &dataJs);
346 }
347 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
348 delete asyncContext;
349 }
350
ParseParaSetOAName(napi_env env,napi_callback_info cbInfo,SetOANameAsyncContext * asyncContext)351 bool ParseParaSetOAName(napi_env env, napi_callback_info cbInfo, SetOANameAsyncContext *asyncContext)
352 {
353 size_t argc = ARGS_SIZE_THREE;
354 napi_value argv[ARGS_SIZE_THREE] = {0};
355 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
356
357 if (argc == ARGS_SIZE_THREE) {
358 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
359 ACCOUNT_LOGE("Get SetOAName callbackRef failed");
360 std::string errMsg = "The type of arg " + std::to_string(argc) + " must be function";
361 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
362 return false;
363 }
364 }
365
366 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
367 ACCOUNT_LOGE("Get id failed");
368 std::string errMsg = "The type of arg 1 must be number";
369 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
370 return false;
371 }
372 if (!GetStringProperty(env, argv[PARAMONE], asyncContext->name)) {
373 ACCOUNT_LOGE("Get name failed");
374 std::string errMsg = "The type of arg 2 must be string";
375 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
376 return false;
377 }
378
379 return true;
380 }
381
SetOANameExecuteCB(napi_env env,void * data)382 void SetOANameExecuteCB(napi_env env, void *data)
383 {
384 SetOANameAsyncContext *asyncContext = reinterpret_cast<SetOANameAsyncContext *>(data);
385 asyncContext->errCode = OsAccountManager::SetOsAccountName(asyncContext->id, asyncContext->name);
386 ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
387 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
388 }
389
SetOANameCallbackCompletedCB(napi_env env,napi_status status,void * data)390 void SetOANameCallbackCompletedCB(napi_env env, napi_status status, void *data)
391 {
392 ACCOUNT_LOGD("napi_create_async_work complete");
393 SetOANameAsyncContext *asyncContext = reinterpret_cast<SetOANameAsyncContext *>(data);
394 napi_value errJs = nullptr;
395 napi_value dataJs = nullptr;
396 if (asyncContext->status == napi_ok) {
397 napi_get_null(env, &errJs);
398 napi_get_null(env, &dataJs);
399 } else {
400 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
401 napi_get_null(env, &dataJs);
402 }
403 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
404 delete asyncContext;
405 }
406
ParseParaSetOAConstraints(napi_env env,napi_callback_info cbInfo,SetOAConsAsyncContext * asyncContext)407 bool ParseParaSetOAConstraints(napi_env env, napi_callback_info cbInfo, SetOAConsAsyncContext *asyncContext)
408 {
409 size_t argc = ARGS_SIZE_FOUR;
410 napi_value argv[ARGS_SIZE_FOUR] = {0};
411 NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr), false);
412
413 // argv[3] : callback
414 if (argc == ARGS_SIZE_FOUR) {
415 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
416 ACCOUNT_LOGE("Get callbackRef failed");
417 std::string errMsg = "The type of arg " + std::to_string(argc) + " must be function";
418 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
419 return false;
420 }
421 }
422
423 // argv[0] : localId
424 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
425 ACCOUNT_LOGE("Get id failed");
426 std::string errMsg = "The type of arg 1 must be number";
427 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
428 return false;
429 }
430
431 // argv[1] : Array<string>
432 if (!GetStringArrayProperty(env, argv[PARAMONE], asyncContext->constraints, false)) {
433 ACCOUNT_LOGE("Get constraints failed, expected array of strings");
434 std::string errMsg = "The type of arg 2 must be unempty array of strings";
435 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
436 return false;
437 }
438
439 // argv[2] : enable
440 if (!GetBoolProperty(env, argv[PARAMTWO], asyncContext->enable)) {
441 ACCOUNT_LOGE("Get enable failed");
442 std::string errMsg = "The type of arg 3 must be boolean";
443 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
444 return false;
445 }
446
447 return true;
448 }
449
SetOAConsExecuteCB(napi_env env,void * data)450 void SetOAConsExecuteCB(napi_env env, void *data)
451 {
452 SetOAConsAsyncContext *asyncContext = reinterpret_cast<SetOAConsAsyncContext *>(data);
453 asyncContext->errCode =
454 OsAccountManager::SetOsAccountConstraints(asyncContext->id, asyncContext->constraints, asyncContext->enable);
455 ACCOUNT_LOGD("errcode is %{public}d", asyncContext->errCode);
456 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
457 }
458
SetOAConsCallbackCompletedCB(napi_env env,napi_status status,void * data)459 void SetOAConsCallbackCompletedCB(napi_env env, napi_status status, void *data)
460 {
461 ACCOUNT_LOGD("napi_create_async_work complete");
462 SetOAConsAsyncContext *asyncContext = reinterpret_cast<SetOAConsAsyncContext *>(data);
463 napi_value errJs = nullptr;
464 napi_value dataJs = nullptr;
465 if (asyncContext->status == napi_ok) {
466 napi_get_null(env, &errJs);
467 napi_get_null(env, &dataJs);
468 } else {
469 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
470 napi_get_null(env, &dataJs);
471 }
472 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
473 delete asyncContext;
474 }
475
ParseParaActiveOA(napi_env env,napi_callback_info cbInfo,ActivateOAAsyncContext * asyncContext)476 bool ParseParaActiveOA(napi_env env, napi_callback_info cbInfo, ActivateOAAsyncContext *asyncContext)
477 {
478 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
479 }
480
ActivateOAExecuteCB(napi_env env,void * data)481 void ActivateOAExecuteCB(napi_env env, void *data)
482 {
483 ActivateOAAsyncContext *activateOACB = reinterpret_cast<ActivateOAAsyncContext *>(data);
484 activateOACB->errCode = OsAccountManager::ActivateOsAccount(activateOACB->id);
485 ACCOUNT_LOGD("errcode is %{public}d", activateOACB->errCode);
486 activateOACB->status = (activateOACB->errCode == 0) ? napi_ok : napi_generic_failure;
487 }
488
ActivateOACallbackCompletedCB(napi_env env,napi_status status,void * data)489 void ActivateOACallbackCompletedCB(napi_env env, napi_status status, void *data)
490 {
491 ACCOUNT_LOGD("napi_create_async_work complete");
492 ActivateOAAsyncContext *asyncContext = reinterpret_cast<ActivateOAAsyncContext *>(data);
493 napi_value errJs = nullptr;
494 napi_value dataJs = nullptr;
495 if (asyncContext->status == napi_ok) {
496 napi_get_null(env, &errJs);
497 napi_get_null(env, &dataJs);
498 } else {
499 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
500 napi_get_null(env, &dataJs);
501 }
502 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
503 delete asyncContext;
504 }
505
ParseParaCreateOA(napi_env env,napi_callback_info cbInfo,CreateOAAsyncContext * asyncContext)506 bool ParseParaCreateOA(napi_env env, napi_callback_info cbInfo, CreateOAAsyncContext *asyncContext)
507 {
508 size_t argc = ARGS_SIZE_THREE;
509 napi_value argv[ARGS_SIZE_THREE] = {0};
510 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
511 if (argc == ARGS_SIZE_THREE) {
512 if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
513 napi_has_named_property(env, argv[PARAMTWO], "shortName", &asyncContext->hasShortName);
514 if (asyncContext->hasShortName &&
515 !GetStringPropertyByKey(env, argv[PARAMTWO], "shortName", asyncContext->shortName)) {
516 ACCOUNT_LOGE("get CreateOsAccountOptions's shortName failed");
517 std::string errMsg = "Parameter error. The type of arg 3 must be function or CreateOsAccountOptions";
518 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
519 return false;
520 }
521 bool hasDisallowedBundleNames = false;
522 napi_has_named_property(env, argv[PARAMTWO], "disallowedBundleNames", &hasDisallowedBundleNames);
523 if (hasDisallowedBundleNames) {
524 GetStringArrayPropertyByKey(env, argv[PARAMTWO], "disallowedBundleNames",
525 asyncContext->disallowedHapList, true);
526 } else {
527 GetStringArrayPropertyByKey(env, argv[PARAMTWO], "disallowedPreinstalledBundles",
528 asyncContext->disallowedHapList, true);
529 }
530 bool hasAllowedPreinstalledBundles = false;
531 napi_has_named_property(
532 env, argv[PARAMTWO], "allowedPreinstalledBundles", &hasAllowedPreinstalledBundles);
533 if (hasAllowedPreinstalledBundles) {
534 std::vector<std::string> list;
535 GetStringArrayPropertyByKey(env, argv[PARAMTWO], "allowedPreinstalledBundles", list, true);
536 asyncContext->allowedHapList = std::make_optional<std::vector<std::string>>(list);
537 }
538 }
539 }
540
541 if (!GetStringProperty(env, argv[PARAMZERO], asyncContext->name)) {
542 ACCOUNT_LOGE("Get name failed");
543 std::string errMsg = "Parameter error. The type of \"localName\" must be string";
544 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
545 return false;
546 }
547
548 int32_t type = 0;
549 if (!GetIntProperty(env, argv[PARAMONE], type)) {
550 ACCOUNT_LOGE("Get type failed");
551 std::string errMsg = "Parameter error. The type of \"type\" must be OsAccountType";
552 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
553 return false;
554 }
555
556 asyncContext->type = static_cast<OsAccountType>(type);
557 return true;
558 }
559
ParseDomainAccountInfo(napi_env env,napi_value object,DomainAccountInfo & info)560 static bool ParseDomainAccountInfo(napi_env env, napi_value object, DomainAccountInfo &info)
561 {
562 if (!GetStringPropertyByKey(env, object, "domain", info.domain_)) {
563 ACCOUNT_LOGE("get domainInfo's domain failed");
564 return false;
565 }
566 if (!GetStringPropertyByKey(env, object, "accountName", info.accountName_)) {
567 ACCOUNT_LOGE("get domainInfo's accountName failed");
568 return false;
569 }
570 bool hasProp = false;
571 napi_has_named_property(env, object, "accountId", &hasProp);
572 if (hasProp) {
573 napi_value value = nullptr;
574 napi_get_named_property(env, object, "accountId", &value);
575 napi_valuetype valueType = napi_undefined;
576 napi_typeof(env, value, &valueType);
577 if ((valueType == napi_undefined) || (valueType == napi_null)) {
578 ACCOUNT_LOGI("the accountId is undefined or null");
579 } else {
580 if (!GetStringProperty(env, value, info.accountId_)) {
581 ACCOUNT_LOGE("get domainInfo's accountId failed");
582 return false;
583 }
584 }
585 }
586 if (!GetOptionalStringPropertyByKey(env, object, "serverConfigId", info.serverConfigId_)) {
587 ACCOUNT_LOGE("Get domainInfo's serverConfigId failed");
588 return false;
589 }
590 return true;
591 }
592
ParseDomainOptionInfo(napi_env env,napi_value object,CreateOsAccountForDomainOptions & domainOptions)593 static bool ParseDomainOptionInfo(napi_env env, napi_value object, CreateOsAccountForDomainOptions &domainOptions)
594 {
595 if (!GetStringPropertyByKey(env, object, "shortName", domainOptions.shortName)) {
596 ACCOUNT_LOGE("Failed to get options's shortName");
597 return false;
598 }
599 domainOptions.hasShortName = true;
600 return true;
601 }
602
ParseParaCreateOAForDomain(napi_env env,napi_callback_info cbInfo,CreateOAForDomainAsyncContext * asyncContext)603 bool ParseParaCreateOAForDomain(napi_env env, napi_callback_info cbInfo,
604 CreateOAForDomainAsyncContext *asyncContext)
605 {
606 size_t argc = ARGS_SIZE_THREE;
607 napi_value argv[ARGS_SIZE_THREE] = {0};
608 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
609
610 napi_valuetype valueType = napi_undefined;
611 if (argc == ARGS_SIZE_THREE) {
612 napi_typeof(env, argv[ARGS_SIZE_TWO], &valueType);
613 if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
614 if (!ParseDomainOptionInfo(env, argv[PARAMTWO], asyncContext->domainOptions)) {
615 ACCOUNT_LOGE("Failed to get domainOptions");
616 std::string errMsg =
617 "Parameter error. The type of arg 3 must be function or CreateOsAccountForDomainOptions";
618 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
619 return false;
620 }
621 }
622 }
623
624 int32_t id = 0;
625 if (!GetIntProperty(env, argv[PARAMZERO], id)) {
626 ACCOUNT_LOGE("Get type failed");
627 std::string errMsg = "Parameter error. The type of \"type\" must be OsAccountType";
628 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
629 return false;
630 }
631 asyncContext->type = static_cast<OsAccountType>(id);
632
633 if (!ParseDomainAccountInfo(env, argv[PARAMONE], asyncContext->domainInfo)) {
634 ACCOUNT_LOGE("get domainInfo failed");
635 std::string errMsg = "Parameter error. The type of \"domainInfo\" must be DomainAccountInfo";
636 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
637 return false;
638 }
639 return true;
640 }
641
CreateOAExecuteCB(napi_env env,void * data)642 void CreateOAExecuteCB(napi_env env, void *data)
643 {
644 ACCOUNT_LOGD("napi_create_async_work running");
645 CreateOAAsyncContext *asyncContext = reinterpret_cast<CreateOAAsyncContext *>(data);
646 CreateOsAccountOptions options;
647 options.shortName = asyncContext->shortName;
648 options.disallowedHapList = asyncContext->disallowedHapList;
649 options.allowedHapList = asyncContext->allowedHapList;
650 options.hasShortName = asyncContext->hasShortName;
651 asyncContext->errCode = OsAccountManager::CreateOsAccount(asyncContext->name, asyncContext->shortName,
652 asyncContext->type, options, asyncContext->osAccountInfos);
653 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
654 }
655
CreateOAForDomainCompletedCB(napi_env env,napi_status status,void * data)656 void CreateOAForDomainCompletedCB(napi_env env, napi_status status, void *data)
657 {
658 delete reinterpret_cast<CreateOAForDomainAsyncContext *>(data);
659 }
660
CreateOAForDomainExecuteCB(napi_env env,void * data)661 void CreateOAForDomainExecuteCB(napi_env env, void *data)
662 {
663 CreateOAForDomainAsyncContext *asyncContext = reinterpret_cast<CreateOAForDomainAsyncContext *>(data);
664 auto callback = std::make_shared<NapiCreateDomainCallback>(env, asyncContext->callbackRef, asyncContext->deferred);
665 asyncContext->errCode =
666 OsAccountManager::CreateOsAccountForDomain(asyncContext->type, asyncContext->domainInfo,
667 callback, asyncContext->domainOptions);
668 if (asyncContext->errCode != ERR_OK) {
669 Parcel emptyParcel;
670 callback->OnResult(asyncContext->errCode, emptyParcel);
671 }
672 asyncContext->callbackRef = nullptr;
673 asyncContext->deferred = nullptr;
674 }
675
CreateOACallbackCompletedCB(napi_env env,napi_status status,void * data)676 void CreateOACallbackCompletedCB(napi_env env, napi_status status, void *data)
677 {
678 ACCOUNT_LOGD("napi_create_async_work complete");
679 CreateOAAsyncContext *asyncContext = reinterpret_cast<CreateOAAsyncContext *>(data);
680 napi_value errJs = nullptr;
681 napi_value dataJs = nullptr;
682 if (asyncContext->status == napi_ok) {
683 napi_get_null(env, &errJs);
684 GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
685 } else {
686 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
687 napi_get_null(env, &dataJs);
688 }
689 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
690 delete asyncContext;
691 }
692
CreateOAForDomainCallbackCompletedWork(std::shared_ptr<CreateOAForDomainAsyncContext> param)693 std::function<void()> CreateOAForDomainCallbackCompletedWork(std::shared_ptr<CreateOAForDomainAsyncContext> param)
694 {
695 return [asyncContext = std::move(param)] {
696 ACCOUNT_LOGI("Enter CreateOAForDomainCallbackCompletedWork");
697 napi_handle_scope scope = nullptr;
698 napi_open_handle_scope(asyncContext->env, &scope);
699 if (scope == nullptr) {
700 ACCOUNT_LOGE("Fail to open scope");
701 return;
702 }
703 napi_value errJs = nullptr;
704 napi_value dataJs = nullptr;
705 if (asyncContext->errCode == ERR_OK) {
706 GetOACBInfoToJs(asyncContext->env, asyncContext->osAccountInfos, dataJs);
707 } else {
708 errJs = GenerateBusinessError(asyncContext->env, asyncContext->errCode);
709 }
710 ReturnCallbackOrPromise(asyncContext->env, asyncContext.get(), errJs, dataJs);
711 napi_close_handle_scope(asyncContext->env, scope);
712 };
713 }
714
ParseParaGetOACount(napi_env env,napi_callback_info cbInfo,GetOACountAsyncContext * asyncContext)715 bool ParseParaGetOACount(napi_env env, napi_callback_info cbInfo, GetOACountAsyncContext *asyncContext)
716 {
717 return ParseOneParaContext(env, cbInfo, asyncContext);
718 }
719
GetOACountExecuteCB(napi_env env,void * data)720 void GetOACountExecuteCB(napi_env env, void *data)
721 {
722 GetOACountAsyncContext *asyncContext = reinterpret_cast<GetOACountAsyncContext *>(data);
723 asyncContext->errCode = OsAccountManager::GetCreatedOsAccountsCount(asyncContext->osAccountsCount);
724 // for compatibility
725 if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
726 asyncContext->errCode = ERR_OSACCOUNT_KIT_GET_CREATED_OS_ACCOUNT_COUNT_ERROR;
727 }
728 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
729 }
730
GetOACountCallbackCompletedCB(napi_env env,napi_status status,void * data)731 void GetOACountCallbackCompletedCB(napi_env env, napi_status status, void *data)
732 {
733 ACCOUNT_LOGD("napi_create_async_work complete");
734 GetOACountAsyncContext *asyncContext = reinterpret_cast<GetOACountAsyncContext *>(data);
735 napi_value errJs = nullptr;
736 napi_value dataJs = nullptr;
737 if (asyncContext->status == napi_ok) {
738 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
739 napi_create_uint32(env, asyncContext->osAccountsCount, &dataJs);
740 } else {
741 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
742 if (asyncContext->throwErr) {
743 napi_get_null(env, &dataJs);
744 } else {
745 napi_create_uint32(env, asyncContext->osAccountsCount, &dataJs);
746 }
747 }
748 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
749 delete asyncContext;
750 }
751
ParseParaDbDeviceId(napi_env env,napi_callback_info cbInfo,DbDeviceIdAsyncContext * asyncContext)752 bool ParseParaDbDeviceId(napi_env env, napi_callback_info cbInfo, DbDeviceIdAsyncContext *asyncContext)
753 {
754 return ParseOneParaContext(env, cbInfo, asyncContext);
755 }
756
DbDeviceIdExecuteCB(napi_env env,void * data)757 void DbDeviceIdExecuteCB(napi_env env, void *data)
758 {
759 DbDeviceIdAsyncContext *asyncContext = reinterpret_cast<DbDeviceIdAsyncContext *>(data);
760 asyncContext->errCode = OsAccountManager::GetDistributedVirtualDeviceId(asyncContext->deviceId);
761 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
762 if (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED) {
763 uint32_t targetVersion = 0;
764 if (GetSelfTargetVersion(targetVersion) && (targetVersion < COMPATIBILITY_CHANGE_VERSION_API12)) {
765 asyncContext->errCode = ERR_OSACCOUNT_KIT_GET_DISTRIBUTED_VIRTUAL_DEVICE_ID_ERROR;
766 }
767 }
768 if (asyncContext->errCode != ERR_OK) {
769 ACCOUNT_LOGE("GetDistributedVirtualDeviceId err is %{public}d", asyncContext->errCode);
770 }
771 }
772
DbDeviceIdCallbackCompletedCB(napi_env env,napi_status status,void * data)773 void DbDeviceIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
774 {
775 ACCOUNT_LOGD("napi_create_async_work complete");
776 DbDeviceIdAsyncContext *asyncContext = reinterpret_cast<DbDeviceIdAsyncContext *>(data);
777 napi_value errJs = nullptr;
778 napi_value dataJs = nullptr;
779 if (asyncContext->status == napi_ok) {
780 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
781 napi_create_string_utf8(env, asyncContext->deviceId.c_str(), NAPI_AUTO_LENGTH, &dataJs);
782 } else {
783 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
784 if (asyncContext->throwErr) {
785 napi_get_null(env, &dataJs);
786 } else {
787 napi_create_string_utf8(env, asyncContext->deviceId.c_str(), NAPI_AUTO_LENGTH, &dataJs);
788 }
789 }
790 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
791 delete asyncContext;
792 }
793
ParseParaGetAllCons(napi_env env,napi_callback_info cbInfo,GetAllConsAsyncContext * asyncContext)794 bool ParseParaGetAllCons(napi_env env, napi_callback_info cbInfo, GetAllConsAsyncContext *asyncContext)
795 {
796 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
797 }
798
GetAllConsExecuteCB(napi_env env,void * data)799 void GetAllConsExecuteCB(napi_env env, void *data)
800 {
801 GetAllConsAsyncContext *asyncContext = reinterpret_cast<GetAllConsAsyncContext *>(data);
802 asyncContext->errCode = OsAccountManager::GetOsAccountAllConstraints(asyncContext->id, asyncContext->constraints);
803 // for compatibility
804 if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
805 asyncContext->errCode = ERR_OSACCOUNT_KIT_GET_OS_ACCOUNT_ALL_CONSTRAINTS_ERROR;
806 }
807 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
808 }
809
GetAllConsCallbackCompletedCB(napi_env env,napi_status status,void * data)810 void GetAllConsCallbackCompletedCB(napi_env env, napi_status status, void *data)
811 {
812 ACCOUNT_LOGD("napi_create_async_work complete");
813 GetAllConsAsyncContext *asyncContext = reinterpret_cast<GetAllConsAsyncContext *>(data);
814 napi_value errJs = nullptr;
815 napi_value dataJs = nullptr;
816 if (asyncContext->status == napi_ok) {
817 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
818 GetAllAccountCons(env, asyncContext->constraints, dataJs);
819 } else {
820 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
821 if (asyncContext->throwErr) {
822 napi_get_null(env, &dataJs);
823 } else {
824 GetAllAccountCons(env, asyncContext->constraints, dataJs);
825 }
826 }
827 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
828 delete asyncContext;
829 }
830
GetAllAccountCons(napi_env env,const std::vector<std::string> & info,napi_value & result)831 void GetAllAccountCons(napi_env env, const std::vector<std::string> &info, napi_value &result)
832 {
833 napi_create_array(env, &result);
834 uint32_t index = 0;
835
836 for (auto item : info) {
837 napi_value consStr = nullptr;
838 napi_create_string_utf8(env, item.c_str(), NAPI_AUTO_LENGTH, &consStr);
839 napi_set_element(env, result, index, consStr);
840 index++;
841 }
842 }
843
GetActiveIds(napi_env env,const std::vector<int> & ids,napi_value & result)844 void GetActiveIds(napi_env env, const std::vector<int> &ids, napi_value &result)
845 {
846 napi_create_array(env, &result);
847 uint32_t index = 0;
848
849 for (auto id : ids) {
850 napi_value tempID = nullptr;
851 napi_create_int32(env, id, &tempID);
852 napi_set_element(env, result, index, tempID);
853 index++;
854 }
855 }
856
ParseParaProcessId(napi_env env,napi_callback_info cbInfo,GetIdAsyncContext * asyncContext)857 bool ParseParaProcessId(napi_env env, napi_callback_info cbInfo, GetIdAsyncContext *asyncContext)
858 {
859 return ParseOneParaContext(env, cbInfo, asyncContext);
860 }
861
GetProcessIdExecuteCB(napi_env env,void * data)862 void GetProcessIdExecuteCB(napi_env env, void *data)
863 {
864 GetIdAsyncContext *asyncContext = reinterpret_cast<GetIdAsyncContext *>(data);
865 asyncContext->errCode = OsAccountManager::GetOsAccountLocalIdFromProcess(asyncContext->id);
866 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
867 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
868 }
869
GetProcessIdCallbackCompletedCB(napi_env env,napi_status status,void * data)870 void GetProcessIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
871 {
872 ACCOUNT_LOGD("napi_create_async_work complete");
873 GetIdAsyncContext *asyncContext = reinterpret_cast<GetIdAsyncContext *>(data);
874 napi_value errJs = nullptr;
875 napi_value dataJs = nullptr;
876 if (asyncContext->status == napi_ok) {
877 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
878 napi_create_int32(env, asyncContext->id, &dataJs);
879 } else {
880 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
881 if (asyncContext->throwErr) {
882 napi_get_null(env, &dataJs);
883 } else {
884 napi_create_int32(env, asyncContext->id, &dataJs);
885 }
886 }
887 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
888 delete asyncContext;
889 }
890
ParseQueryAllCreateOA(napi_env env,napi_callback_info cbInfo,QueryCreateOAAsyncContext * asyncContext)891 bool ParseQueryAllCreateOA(napi_env env, napi_callback_info cbInfo, QueryCreateOAAsyncContext *asyncContext)
892 {
893 return ParseOneParaContext(env, cbInfo, asyncContext);
894 }
895
ParseQueryOAConstraintSrcTypes(napi_env env,napi_callback_info cbInfo,QueryOAConstraintSrcTypeContext * asyncContext)896 bool ParseQueryOAConstraintSrcTypes(napi_env env, napi_callback_info cbInfo,
897 QueryOAConstraintSrcTypeContext *asyncContext)
898 {
899 size_t argc = ARGS_SIZE_THREE;
900 napi_value argv[ARGS_SIZE_THREE] = {0};
901 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
902 if (argc == ARGS_SIZE_THREE) {
903 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
904 ACCOUNT_LOGE("Get callbackRef failed");
905 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
906 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
907 return false;
908 }
909 }
910
911 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
912 ACCOUNT_LOGE("Get id failed");
913 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
914 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
915 return false;
916 }
917 if (!GetStringProperty(env, argv[PARAMONE], asyncContext->constraint)) {
918 ACCOUNT_LOGE("Get constraint failed");
919 std::string errMsg = "Parameter error. The type of \"constraint\" must be string";
920 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
921 return false;
922 }
923
924 return true;
925 }
926
QueryOAContSrcTypeExecuteCB(napi_env env,void * data)927 void QueryOAContSrcTypeExecuteCB(napi_env env, void *data)
928 {
929 QueryOAConstraintSrcTypeContext *asyncContext = reinterpret_cast<QueryOAConstraintSrcTypeContext *>(data);
930 asyncContext->errCode = OsAccountManager::QueryOsAccountConstraintSourceTypes(asyncContext->id,
931 asyncContext->constraint, asyncContext->constraintSourceTypeInfos);
932 ACCOUNT_LOGI("errocde is %{public}d", asyncContext->errCode);
933 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
934 }
935
QueryOAContSrcTypeCallbackCompletedCB(napi_env env,napi_status status,void * data)936 void QueryOAContSrcTypeCallbackCompletedCB(napi_env env, napi_status status, void *data)
937 {
938 ACCOUNT_LOGI("napi_create_async_work complete");
939 QueryOAConstraintSrcTypeContext *asyncContext = reinterpret_cast<QueryOAConstraintSrcTypeContext *>(data);
940 napi_value errJs = nullptr;
941 napi_value dataJs = nullptr;
942 if (asyncContext->status == napi_ok) {
943 napi_get_null(env, &errJs);
944 QueryOAContSrcTypeForResult(env, asyncContext->constraintSourceTypeInfos, dataJs);
945 } else {
946 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
947 napi_get_null(env, &dataJs);
948 }
949 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
950 delete asyncContext;
951 }
952
QueryOAContSrcTypeForResult(napi_env env,const std::vector<ConstraintSourceTypeInfo> & infos,napi_value & result)953 void QueryOAContSrcTypeForResult(napi_env env, const std::vector<ConstraintSourceTypeInfo> &infos, napi_value &result)
954 {
955 napi_create_array(env, &result);
956 uint32_t index = 0;
957
958 for (auto item : infos) {
959 napi_value objTypeInfo = nullptr;
960 napi_create_object(env, &objTypeInfo);
961
962 napi_value srcLocalId = nullptr;
963 napi_create_int32(env, item.localId, &srcLocalId);
964 napi_set_named_property(env, objTypeInfo, "localId", srcLocalId);
965
966 napi_value valToJs = nullptr;
967 napi_create_int32(env, item.typeInfo, &valToJs);
968
969 napi_set_named_property(env, objTypeInfo, "type", valToJs);
970 napi_set_element(env, result, index, objTypeInfo);
971 index++;
972 }
973 }
974
ParseQueryActiveIds(napi_env env,napi_callback_info cbInfo,QueryActiveIdsAsyncContext * asyncContext)975 bool ParseQueryActiveIds(napi_env env, napi_callback_info cbInfo, QueryActiveIdsAsyncContext *asyncContext)
976 {
977 return ParseOneParaContext(env, cbInfo, asyncContext);
978 }
979
QueryCreateOAExecuteCB(napi_env env,void * data)980 void QueryCreateOAExecuteCB(napi_env env, void *data)
981 {
982 QueryCreateOAAsyncContext *asyncContext = reinterpret_cast<QueryCreateOAAsyncContext *>(data);
983 asyncContext->errCode = OsAccountManager::QueryAllCreatedOsAccounts(asyncContext->osAccountInfos);
984 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
985 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
986 }
987
QueryActiveIdsExecuteCB(napi_env env,void * data)988 void QueryActiveIdsExecuteCB(napi_env env, void *data)
989 {
990 QueryActiveIdsAsyncContext *asyncContext = reinterpret_cast<QueryActiveIdsAsyncContext *>(data);
991 asyncContext->errCode = OsAccountManager::QueryActiveOsAccountIds(asyncContext->osAccountIds);
992 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
993 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
994 }
995
QueryCreateOACallbackCompletedCB(napi_env env,napi_status status,void * data)996 void QueryCreateOACallbackCompletedCB(napi_env env, napi_status status, void *data)
997 {
998 ACCOUNT_LOGD("napi_create_async_work complete");
999 QueryCreateOAAsyncContext *asyncContext = reinterpret_cast<QueryCreateOAAsyncContext *>(data);
1000 napi_value errJs = nullptr;
1001 napi_value dataJs = nullptr;
1002 if (asyncContext->status == napi_ok) {
1003 napi_get_null(env, &errJs);
1004 QueryOAInfoForResult(env, asyncContext->osAccountInfos, dataJs);
1005 } else {
1006 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1007 napi_get_null(env, &dataJs);
1008 }
1009 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1010 delete asyncContext;
1011 }
1012
GetForegroundOALocalIdExecuteCB(napi_env env,void * data)1013 void GetForegroundOALocalIdExecuteCB(napi_env env, void *data)
1014 {
1015 GetForegroundOALocalIdAsyncContext *asyncContext = reinterpret_cast<GetForegroundOALocalIdAsyncContext *>(data);
1016 asyncContext->errCode = OsAccountManager::GetForegroundOsAccountLocalId(asyncContext->id);
1017 }
1018
GetForegroundOALocalIdCallbackCompletedCB(napi_env env,napi_status status,void * data)1019 void GetForegroundOALocalIdCallbackCompletedCB(napi_env env, napi_status status, void *data)
1020 {
1021 GetForegroundOALocalIdAsyncContext *asyncContext = reinterpret_cast<GetForegroundOALocalIdAsyncContext *>(data);
1022 std::unique_ptr<GetForegroundOALocalIdAsyncContext> asyncContextPtr{asyncContext};
1023 napi_value errJs = nullptr;
1024 napi_value dataJs = nullptr;
1025 if (asyncContext->errCode == ERR_OK) {
1026 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &errJs));
1027 NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncContext->id, &dataJs));
1028 } else {
1029 errJs = GenerateBusinessError(env, asyncContext->errCode);
1030 NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &dataJs));
1031 }
1032 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1033 }
1034
QueryActiveIdsCallbackCompletedCB(napi_env env,napi_status status,void * data)1035 void QueryActiveIdsCallbackCompletedCB(napi_env env, napi_status status, void *data)
1036 {
1037 ACCOUNT_LOGD("napi_create_async_work complete");
1038 QueryActiveIdsAsyncContext *asyncContext = reinterpret_cast<QueryActiveIdsAsyncContext *>(data);
1039 napi_value errJs = nullptr;
1040 napi_value dataJs = nullptr;
1041 if (asyncContext->status == napi_ok) {
1042 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1043 GetActiveIds(env, asyncContext->osAccountIds, dataJs);
1044 } else {
1045 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1046 if (asyncContext->throwErr) {
1047 napi_get_null(env, &dataJs);
1048 } else {
1049 GetActiveIds(env, asyncContext->osAccountIds, dataJs);
1050 }
1051 }
1052 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1053 delete asyncContext;
1054 }
1055
QueryOAInfoForResult(napi_env env,const std::vector<OsAccountInfo> & info,napi_value & result)1056 void QueryOAInfoForResult(napi_env env, const std::vector<OsAccountInfo> &info, napi_value &result)
1057 {
1058 napi_create_array(env, &result);
1059 uint32_t index = 0;
1060
1061 for (auto item : info) {
1062 napi_value objOAInfo = nullptr;
1063 napi_create_object(env, &objOAInfo);
1064 GetOACBInfoToJs(env, item, objOAInfo);
1065 napi_set_element(env, result, index, objOAInfo);
1066 index++;
1067 }
1068 }
1069
ParseParaGetPhoto(napi_env env,napi_callback_info cbInfo,GetOAPhotoAsyncContext * asyncContext)1070 bool ParseParaGetPhoto(napi_env env, napi_callback_info cbInfo, GetOAPhotoAsyncContext *asyncContext)
1071 {
1072 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
1073 }
1074
GetOsAccountNameExecuteCB(napi_env env,void * data)1075 void GetOsAccountNameExecuteCB(napi_env env, void *data)
1076 {
1077 ACCOUNT_LOGD("Running napi_create_async_work");
1078 GetOsAccountNameContext *asyncContext = reinterpret_cast<GetOsAccountNameContext *>(data);
1079 asyncContext->errCode = OsAccountManager::GetOsAccountName(asyncContext->name);
1080 }
1081
GetOsAccountNameCallbackCompletedCB(napi_env env,napi_status status,void * data)1082 void GetOsAccountNameCallbackCompletedCB(napi_env env, napi_status status, void *data)
1083 {
1084 ACCOUNT_LOGD("Complete napi_create_async_work");
1085 GetOsAccountNameContext *asyncContext = reinterpret_cast<GetOsAccountNameContext *>(data);
1086 napi_value errJs = nullptr;
1087 napi_value dataJs = nullptr;
1088 if (asyncContext->errCode == napi_ok) {
1089 napi_get_null(env, &errJs);
1090 napi_create_string_utf8(env, asyncContext->name.c_str(), NAPI_AUTO_LENGTH, &dataJs);
1091 } else {
1092 errJs = GenerateBusinessError(env, asyncContext->errCode);
1093 napi_get_null(env, &dataJs);
1094 }
1095 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1096 delete asyncContext;
1097 }
1098
GetOAPhotoExecuteCB(napi_env env,void * data)1099 void GetOAPhotoExecuteCB(napi_env env, void *data)
1100 {
1101 ACCOUNT_LOGD("napi_create_async_work running");
1102 GetOAPhotoAsyncContext *asyncContext = reinterpret_cast<GetOAPhotoAsyncContext *>(data);
1103 asyncContext->errCode = OsAccountManager::GetOsAccountProfilePhoto(asyncContext->id, asyncContext->photo);
1104 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1105 }
1106
GetOAPhotoCallbackCompletedCB(napi_env env,napi_status status,void * data)1107 void GetOAPhotoCallbackCompletedCB(napi_env env, napi_status status, void *data)
1108 {
1109 ACCOUNT_LOGD("napi_create_async_work complete");
1110 GetOAPhotoAsyncContext *asyncContext = reinterpret_cast<GetOAPhotoAsyncContext *>(data);
1111 napi_value errJs = nullptr;
1112 napi_value dataJs = nullptr;
1113 if (asyncContext->status == napi_ok) {
1114 napi_get_null(env, &errJs);
1115 napi_create_string_utf8(env, asyncContext->photo.c_str(), NAPI_AUTO_LENGTH, &dataJs);
1116 } else {
1117 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1118 napi_get_null(env, &dataJs);
1119 }
1120 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1121 delete asyncContext;
1122 }
1123
ParseParaCurrentOA(napi_env env,napi_callback_info cbInfo,CurrentOAAsyncContext * asyncContext)1124 bool ParseParaCurrentOA(napi_env env, napi_callback_info cbInfo, CurrentOAAsyncContext *asyncContext)
1125 {
1126 return ParseOneParaContext(env, cbInfo, asyncContext);
1127 }
1128
QueryCurrentOAExecuteCB(napi_env env,void * data)1129 void QueryCurrentOAExecuteCB(napi_env env, void *data)
1130 {
1131 CurrentOAAsyncContext *asyncContext = reinterpret_cast<CurrentOAAsyncContext *>(data);
1132 asyncContext->errCode = OsAccountManager::QueryCurrentOsAccount(asyncContext->osAccountInfos);
1133 // for compatibility
1134 if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1135 asyncContext->errCode = ERR_OSACCOUNT_KIT_QUERY_CURRENT_OS_ACCOUNT_ERROR;
1136 }
1137 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1138 }
1139
QueryCurrentOACallbackCompletedCB(napi_env env,napi_status status,void * data)1140 void QueryCurrentOACallbackCompletedCB(napi_env env, napi_status status, void *data)
1141 {
1142 CurrentOAAsyncContext *asyncContext = reinterpret_cast<CurrentOAAsyncContext *>(data);
1143 napi_value errJs = nullptr;
1144 napi_value dataJs = nullptr;
1145 if (asyncContext->status == napi_ok) {
1146 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1147 GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
1148 } else {
1149 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1150 if (asyncContext->throwErr) {
1151 napi_get_null(env, &dataJs);
1152 } else {
1153 GetOACBInfoToJs(env, asyncContext->osAccountInfos, dataJs);
1154 }
1155 }
1156 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1157 delete asyncContext;
1158 }
1159
ParseParaGetIdByUid(napi_env env,napi_callback_info cbInfo,GetIdByUidAsyncContext * asyncContext)1160 bool ParseParaGetIdByUid(napi_env env, napi_callback_info cbInfo, GetIdByUidAsyncContext *asyncContext)
1161 {
1162 size_t argc = ARGS_SIZE_TWO;
1163 napi_value argv[ARGS_SIZE_TWO] = {0};
1164 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1165 if (argc == ARGS_SIZE_TWO) {
1166 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1167 ACCOUNT_LOGE("Get callbackRef failed");
1168 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1169 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1170 return false;
1171 }
1172 }
1173
1174 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->uid)) {
1175 ACCOUNT_LOGE("Get uid failed");
1176 std::string errMsg = "Parameter error. The type of \"uid\" must be number";
1177 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1178 return false;
1179 }
1180 return true;
1181 }
1182
ParseParaGetIdByDomain(napi_env env,napi_callback_info cbInfo,GetIdByDomainAsyncContext * asyncContext)1183 bool ParseParaGetIdByDomain(napi_env env, napi_callback_info cbInfo, GetIdByDomainAsyncContext *asyncContext)
1184 {
1185 size_t argc = ARGS_SIZE_TWO;
1186 napi_value argv[ARGS_SIZE_TWO] = {0};
1187 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1188 if (argc == ARGS_SIZE_TWO) {
1189 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1190 ACCOUNT_LOGE("Get callbackRef failed");
1191 std::string errMsg = "The type of arg " + std::to_string(argc) + " must be function";
1192 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1193 return false;
1194 }
1195 }
1196
1197 if (!ParseDomainAccountInfo(env, argv[PARAMZERO], asyncContext->domainInfo)) {
1198 ACCOUNT_LOGE("get domainInfo failed");
1199 std::string errMsg = "DomainInfo parse failed";
1200 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1201 return false;
1202 }
1203 return true;
1204 }
1205
GetIdByUidExecuteCB(napi_env env,void * data)1206 void GetIdByUidExecuteCB(napi_env env, void *data)
1207 {
1208 GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1209 NativeErrMsg() = "";
1210 asyncContext->errCode = OsAccountManager::GetOsAccountLocalIdFromUid(asyncContext->uid, asyncContext->id);
1211 asyncContext->nativeErrMsg = NativeErrMsg();
1212 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1213 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1214 }
1215
GetBundleIdByUidExecuteCB(napi_env env,void * data)1216 void GetBundleIdByUidExecuteCB(napi_env env, void *data)
1217 {
1218 GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1219 asyncContext->errCode = OsAccountManager::GetBundleIdFromUid(asyncContext->uid, asyncContext->id);
1220 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1221 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1222 }
1223
GetIdByDomainExecuteCB(napi_env env,void * data)1224 void GetIdByDomainExecuteCB(napi_env env, void *data)
1225 {
1226 GetIdByDomainAsyncContext *asyncContext = reinterpret_cast<GetIdByDomainAsyncContext *>(data);
1227 NativeErrMsg() = "";
1228 asyncContext->errCode = OsAccountManager::GetOsAccountLocalIdFromDomain(
1229 asyncContext->domainInfo, asyncContext->id);
1230 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1231 asyncContext->nativeErrMsg = NativeErrMsg();
1232 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1233 }
1234
GetIdByUidCallbackCompletedCB(napi_env env,napi_status status,void * data)1235 void GetIdByUidCallbackCompletedCB(napi_env env, napi_status status, void *data)
1236 {
1237 ACCOUNT_LOGD("napi_create_async_work complete");
1238 GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1239 napi_value errJs = nullptr;
1240 napi_value dataJs = nullptr;
1241 if (asyncContext->status == napi_ok) {
1242 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1243 napi_create_int32(env, asyncContext->id, &dataJs);
1244 } else {
1245 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1246 if (asyncContext->throwErr) {
1247 napi_get_null(env, &dataJs);
1248 } else {
1249 napi_create_int32(env, asyncContext->id, &dataJs);
1250 }
1251 }
1252 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1253 delete asyncContext;
1254 }
1255
GetBundleIdByUidCallbackCompletedCB(napi_env env,napi_status status,void * data)1256 void GetBundleIdByUidCallbackCompletedCB(napi_env env, napi_status status, void *data)
1257 {
1258 ACCOUNT_LOGD("napi_create_async_work complete");
1259 GetIdByUidAsyncContext *asyncContext = reinterpret_cast<GetIdByUidAsyncContext *>(data);
1260 napi_value errJs = nullptr;
1261 napi_value dataJs = nullptr;
1262 if (asyncContext->status == napi_ok) {
1263 napi_get_null(env, &errJs);
1264 napi_create_int32(env, asyncContext->id, &dataJs);
1265 } else {
1266 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1267 napi_get_null(env, &dataJs);
1268 }
1269 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1270 delete asyncContext;
1271 }
1272
GetIdByDomainCallbackCompletedCB(napi_env env,napi_status status,void * data)1273 void GetIdByDomainCallbackCompletedCB(napi_env env, napi_status status, void *data)
1274 {
1275 ACCOUNT_LOGD("napi_create_async_work complete");
1276 GetIdByDomainAsyncContext *asyncContext = reinterpret_cast<GetIdByDomainAsyncContext *>(data);
1277 napi_value errJs = nullptr;
1278 napi_value dataJs = nullptr;
1279 if (asyncContext->status == napi_ok) {
1280 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1281 napi_create_int32(env, asyncContext->id, &dataJs);
1282 } else {
1283 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1284 if (asyncContext->throwErr) {
1285 napi_get_null(env, &dataJs);
1286 } else {
1287 napi_create_int32(env, asyncContext->id, &dataJs);
1288 }
1289 }
1290 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1291 delete asyncContext;
1292 }
1293
ParseParaSetPhoto(napi_env env,napi_callback_info cbInfo,SetOAPhotoAsyncContext * asyncContext)1294 bool ParseParaSetPhoto(napi_env env, napi_callback_info cbInfo, SetOAPhotoAsyncContext *asyncContext)
1295 {
1296 size_t argc = ARGS_SIZE_THREE;
1297 napi_value argv[ARGS_SIZE_THREE] = {0};
1298 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1299 if (argc == ARGS_SIZE_THREE) {
1300 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1301 ACCOUNT_LOGE("Get callbackRef failed");
1302 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1303 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1304 return false;
1305 }
1306 }
1307
1308 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
1309 ACCOUNT_LOGE("Get id failed");
1310 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1311 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1312 return false;
1313 }
1314 if (!GetStringProperty(env, argv[PARAMONE], asyncContext->photo)) {
1315 ACCOUNT_LOGE("Get photo failed");
1316 std::string errMsg = "Parameter error. The type of \"photo\" must be string";
1317 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1318 return false;
1319 }
1320
1321 return true;
1322 }
1323
SetPhotoExecuteCB(napi_env env,void * data)1324 void SetPhotoExecuteCB(napi_env env, void *data)
1325 {
1326 SetOAPhotoAsyncContext *asyncContext = reinterpret_cast<SetOAPhotoAsyncContext *>(data);
1327 asyncContext->errCode = OsAccountManager::SetOsAccountProfilePhoto(asyncContext->id, asyncContext->photo);
1328 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1329 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1330 }
1331
SetPhotoCompletedCB(napi_env env,napi_status status,void * data)1332 void SetPhotoCompletedCB(napi_env env, napi_status status, void *data)
1333 {
1334 ACCOUNT_LOGD("napi_create_async_work complete");
1335 SetOAPhotoAsyncContext *asyncContext = reinterpret_cast<SetOAPhotoAsyncContext *>(data);
1336 napi_value errJs = nullptr;
1337 napi_value dataJs = nullptr;
1338 if (asyncContext->status == napi_ok) {
1339 napi_get_null(env, &errJs);
1340 napi_get_null(env, &dataJs);
1341 } else {
1342 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1343 napi_get_null(env, &dataJs);
1344 }
1345 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1346 delete asyncContext;
1347 }
1348
ParseParaQueryMaxNum(napi_env env,napi_callback_info cbInfo,QueryMaxNumAsyncContext * asyncContext)1349 bool ParseParaQueryMaxNum(napi_env env, napi_callback_info cbInfo, QueryMaxNumAsyncContext *asyncContext)
1350 {
1351 return ParseOneParaContext(env, cbInfo, asyncContext);
1352 }
1353
QueryMaxNumExecuteCB(napi_env env,void * data)1354 void QueryMaxNumExecuteCB(napi_env env, void *data)
1355 {
1356 QueryMaxNumAsyncContext *asyncContext = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1357 asyncContext->errCode = OsAccountManager::QueryMaxOsAccountNumber(asyncContext->maxOsAccountNumber);
1358 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1359 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1360 }
1361
QueryMaxNumCompletedCB(napi_env env,napi_status status,void * data)1362 void QueryMaxNumCompletedCB(napi_env env, napi_status status, void *data)
1363 {
1364 ACCOUNT_LOGD("napi_create_async_work complete");
1365 QueryMaxNumAsyncContext *asyncContext = reinterpret_cast<QueryMaxNumAsyncContext *>(data);
1366 napi_value errJs = nullptr;
1367 napi_value dataJs = nullptr;
1368 if (asyncContext->status == napi_ok) {
1369 napi_get_null(env, &errJs);
1370 napi_create_uint32(env, asyncContext->maxOsAccountNumber, &dataJs);
1371 } else {
1372 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1373 napi_get_null(env, &dataJs);
1374 }
1375 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1376 delete asyncContext;
1377 }
1378
ParseParaIsActived(napi_env env,napi_callback_info cbInfo,IsActivedAsyncContext * asyncContext)1379 bool ParseParaIsActived(napi_env env, napi_callback_info cbInfo, IsActivedAsyncContext *asyncContext)
1380 {
1381 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
1382 }
1383
IsActivedExecuteCB(napi_env env,void * data)1384 void IsActivedExecuteCB(napi_env env, void *data)
1385 {
1386 IsActivedAsyncContext *asyncContext = reinterpret_cast<IsActivedAsyncContext *>(data);
1387 asyncContext->errCode = OsAccountManager::IsOsAccountActived(asyncContext->id, asyncContext->isOsAccountActived);
1388 // for compatibility
1389 if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1390 asyncContext->errCode = ERR_OSACCOUNT_KIT_IS_OS_ACCOUNT_ACTIVED_ERROR;
1391 }
1392 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1393 }
1394
IsActivedCompletedCB(napi_env env,napi_status status,void * data)1395 void IsActivedCompletedCB(napi_env env, napi_status status, void *data)
1396 {
1397 ACCOUNT_LOGD("napi_create_async_work complete");
1398 IsActivedAsyncContext *asyncContext = reinterpret_cast<IsActivedAsyncContext *>(data);
1399 napi_value errJs = nullptr;
1400 napi_value dataJs = nullptr;
1401 if (asyncContext->status == napi_ok) {
1402 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1403 napi_get_boolean(env, asyncContext->isOsAccountActived, &dataJs);
1404 } else {
1405 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1406 if (asyncContext->throwErr) {
1407 napi_get_null(env, &dataJs);
1408 } else {
1409 napi_get_boolean(env, asyncContext->isOsAccountActived, &dataJs);
1410 }
1411 }
1412 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1413 delete asyncContext;
1414 }
1415
ParseParaIsEnable(napi_env env,napi_callback_info cbInfo,IsConEnableAsyncContext * asyncContext)1416 bool ParseParaIsEnable(napi_env env, napi_callback_info cbInfo, IsConEnableAsyncContext *asyncContext)
1417 {
1418 size_t argc = ARGS_SIZE_THREE;
1419 napi_value argv[ARGS_SIZE_THREE] = {0};
1420 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1421 if (argc == ARGS_SIZE_ONE) {
1422 std::vector<int> ids;
1423 ErrCode errCode = OsAccountManager::QueryActiveOsAccountIds(ids);
1424 if (errCode != ERR_OK) {
1425 ACCOUNT_LOGE("Get id failed");
1426 AccountNapiThrow(env, errCode, asyncContext->throwErr);
1427 return false;
1428 }
1429 if (ids.empty()) {
1430 ACCOUNT_LOGE("No Active OsAccount Ids");
1431 std::string errMsg = "No active osAccount ids, please wait for the user's startup to complete.";
1432 AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1433 return false;
1434 }
1435 asyncContext->id = ids[0];
1436 if (!GetStringProperty(env, argv[PARAMZERO], asyncContext->constraint)) {
1437 ACCOUNT_LOGE("Get constraint failed");
1438 std::string errMsg = "Parameter error. The type of \"constraint\" must be string";
1439 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1440 return false;
1441 }
1442 return true;
1443 }
1444 if (argc == ARGS_SIZE_THREE) {
1445 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1446 ACCOUNT_LOGE("Get callbackRef failed");
1447 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1448 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1449 return false;
1450 }
1451 }
1452
1453 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
1454 ACCOUNT_LOGE("Get id failed");
1455 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1456 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1457 return false;
1458 }
1459 if (!GetStringProperty(env, argv[PARAMONE], asyncContext->constraint)) {
1460 ACCOUNT_LOGE("Get constraint failed");
1461 std::string errMsg = "Parameter error. The type of \"constraint\" must be string";
1462 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1463 return false;
1464 }
1465 return true;
1466 }
1467
IsEnableExecuteCB(napi_env env,void * data)1468 void IsEnableExecuteCB(napi_env env, void *data)
1469 {
1470 IsConEnableAsyncContext *asyncContext = reinterpret_cast<IsConEnableAsyncContext *>(data);
1471 if (asyncContext->throwErr) {
1472 asyncContext->errCode = OsAccountManager::CheckOsAccountConstraintEnabled(asyncContext->id,
1473 asyncContext->constraint, asyncContext->isConsEnable);
1474 } else {
1475 asyncContext->errCode = OsAccountManager::IsOsAccountConstraintEnable(asyncContext->id,
1476 asyncContext->constraint, asyncContext->isConsEnable);
1477 }
1478
1479 // for compatibility
1480 if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1481 asyncContext->errCode = ERR_OSACCOUNT_KIT_IS_OS_ACCOUNT_CONSTRAINT_ENABLE_ERROR;
1482 }
1483 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1484 }
1485
IsEnableCompletedCB(napi_env env,napi_status status,void * data)1486 void IsEnableCompletedCB(napi_env env, napi_status status, void *data)
1487 {
1488 ACCOUNT_LOGD("napi_create_async_work complete");
1489 IsConEnableAsyncContext *asyncContext = reinterpret_cast<IsConEnableAsyncContext *>(data);
1490 napi_value errJs = nullptr;
1491 napi_value dataJs = nullptr;
1492 if (asyncContext->status == napi_ok) {
1493 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1494 napi_get_boolean(env, asyncContext->isConsEnable, &dataJs);
1495 } else {
1496 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1497 if (asyncContext->throwErr) {
1498 napi_get_null(env, &dataJs);
1499 } else {
1500 napi_get_boolean(env, asyncContext->isConsEnable, &dataJs);
1501 }
1502 }
1503 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1504 delete asyncContext;
1505 }
1506
ParseParaGetType(napi_env env,napi_callback_info cbInfo,GetTypeAsyncContext * asyncContext)1507 bool ParseParaGetType(napi_env env, napi_callback_info cbInfo, GetTypeAsyncContext *asyncContext)
1508 {
1509 size_t argc = ARGS_SIZE_ONE;
1510 napi_value argv[ARGS_SIZE_ONE] = {0};
1511 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1512 if (argc == ARGS_SIZE_ZERO) {
1513 return true;
1514 }
1515
1516 napi_valuetype valueType = napi_undefined;
1517 napi_typeof(env, argv[PARAMZERO], &valueType);
1518 if (valueType == napi_number) {
1519 napi_get_value_int32(env, argv[PARAMZERO], &(asyncContext->id));
1520 asyncContext->withId = true;
1521 } else if (valueType == napi_function) {
1522 napi_create_reference(env, argv[PARAMZERO], 1, &(asyncContext->callbackRef));
1523 } else {
1524 ACCOUNT_LOGE("Get callbackRef or id failed.");
1525 std::string errMsg = "Parameter error. The type of arg " + std::to_string(argc) + " must be function or number";
1526 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1527 return false;
1528 }
1529 return true;
1530 }
1531
GetTypeExecuteCB(napi_env env,void * data)1532 void GetTypeExecuteCB(napi_env env, void *data)
1533 {
1534 GetTypeAsyncContext *asyncContext = reinterpret_cast<GetTypeAsyncContext *>(data);
1535 if (asyncContext->withId) {
1536 asyncContext->errCode = OsAccountManager::GetOsAccountType(asyncContext->id, asyncContext->type);
1537 } else {
1538 asyncContext->errCode = OsAccountManager::GetOsAccountTypeFromProcess(asyncContext->type);
1539 }
1540 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1541 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1542 }
1543
GetTypeCompletedCB(napi_env env,napi_status status,void * data)1544 void GetTypeCompletedCB(napi_env env, napi_status status, void *data)
1545 {
1546 GetTypeAsyncContext *asyncContext = reinterpret_cast<GetTypeAsyncContext *>(data);
1547 napi_value errJs = nullptr;
1548 napi_value dataJs = nullptr;
1549 if (asyncContext->status == napi_ok) {
1550 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1551 int cType = static_cast<int>(asyncContext->type);
1552 napi_create_int32(env, cType, &dataJs);
1553 } else {
1554 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1555 napi_get_null(env, &dataJs);
1556 }
1557 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1558 delete asyncContext;
1559 }
1560
ParseParaIsMultiEn(napi_env env,napi_callback_info cbInfo,IsMultiEnAsyncContext * asyncContext)1561 bool ParseParaIsMultiEn(napi_env env, napi_callback_info cbInfo, IsMultiEnAsyncContext *asyncContext)
1562 {
1563 return ParseOneParaContext(env, cbInfo, asyncContext);
1564 }
1565
IsMultiEnExecuteCB(napi_env env,void * data)1566 void IsMultiEnExecuteCB(napi_env env, void *data)
1567 {
1568 IsMultiEnAsyncContext *asyncContext = reinterpret_cast<IsMultiEnAsyncContext *>(data);
1569 asyncContext->errCode = OsAccountManager::IsMultiOsAccountEnable(asyncContext->isMultiOAEnable);
1570 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1571 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1572 }
1573
IsMultiEnCompletedCB(napi_env env,napi_status status,void * data)1574 void IsMultiEnCompletedCB(napi_env env, napi_status status, void *data)
1575 {
1576 ACCOUNT_LOGD("napi_create_async_work complete");
1577 IsMultiEnAsyncContext *asyncContext = reinterpret_cast<IsMultiEnAsyncContext *>(data);
1578 napi_value errJs = nullptr;
1579 napi_value dataJs = nullptr;
1580 if (asyncContext->status == napi_ok) {
1581 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1582 napi_get_boolean(env, asyncContext->isMultiOAEnable, &dataJs);
1583 } else {
1584 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1585 if (asyncContext->throwErr) {
1586 napi_get_null(env, &dataJs);
1587 } else {
1588 napi_get_boolean(env, asyncContext->isMultiOAEnable, &dataJs);
1589 }
1590 }
1591 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1592 delete asyncContext;
1593 }
1594
ParseParaIsVerifiedWithOneParam(napi_env env,napi_value value,IsVerifiedAsyncContext * asyncContext)1595 static bool ParseParaIsVerifiedWithOneParam(
1596 napi_env env, napi_value value, IsVerifiedAsyncContext *asyncContext)
1597 {
1598 napi_valuetype valueType = napi_undefined;
1599 napi_typeof(env, value, &valueType);
1600 if (valueType == napi_number) {
1601 if (!GetIntProperty(env, value, asyncContext->id)) {
1602 ACCOUNT_LOGE("Get id failed");
1603 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1604 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1605 return false;
1606 }
1607 asyncContext->hasAccountId = true;
1608 } else if (valueType == napi_function) {
1609 if (!GetCallbackProperty(env, value, asyncContext->callbackRef, 1)) {
1610 ACCOUNT_LOGE("Get callbackRef failed");
1611 std::string errMsg = "The type of arg 1 must be function";
1612 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1613 return false;
1614 }
1615 } else if ((valueType == napi_undefined) || (valueType == napi_null)) {
1616 ACCOUNT_LOGI("id is undefined or null");
1617 } else {
1618 ACCOUNT_LOGE("Wrong arg type, expected number or function");
1619 std::string errMsg = "The type of arg 1 must be number or function";
1620 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1621 return false;
1622 }
1623 return true;
1624 }
1625
ParseParaIsVerified(napi_env env,napi_callback_info cbInfo,IsVerifiedAsyncContext * asyncContext)1626 bool ParseParaIsVerified(napi_env env, napi_callback_info cbInfo, IsVerifiedAsyncContext *asyncContext)
1627 {
1628 size_t argc = ARGS_SIZE_TWO;
1629 napi_value argv[ARGS_SIZE_TWO] = {0};
1630 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1631
1632 if (argc == 0) {
1633 return true;
1634 }
1635 if (argc == ARGS_SIZE_ONE) {
1636 return ParseParaIsVerifiedWithOneParam(env, argv[PARAMZERO], asyncContext);
1637 }
1638 if (argc == ARGS_SIZE_TWO) {
1639 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1640 ACCOUNT_LOGE("Get callbackRef failed");
1641 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1642 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1643 return false;
1644 }
1645 napi_valuetype valueType = napi_undefined;
1646 napi_typeof(env, argv[PARAMZERO], &valueType);
1647 if ((valueType == napi_undefined) || (valueType == napi_null)) {
1648 ACCOUNT_LOGI("id is undefined or null");
1649 } else {
1650 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->id)) {
1651 ACCOUNT_LOGE("Get id failed");
1652 std::string errMsg = "Parameter error. The type of \"localId\" must be number";
1653 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1654 return false;
1655 }
1656 asyncContext->hasAccountId = true;
1657 }
1658 }
1659 return true;
1660 }
1661
IsVerifiedExecuteCB(napi_env env,void * data)1662 void IsVerifiedExecuteCB(napi_env env, void *data)
1663 {
1664 IsVerifiedAsyncContext *asyncContext = reinterpret_cast<IsVerifiedAsyncContext *>(data);
1665 if (!asyncContext->hasAccountId) {
1666 asyncContext->errCode = OsAccountManager::IsCurrentOsAccountVerified(asyncContext->IsVerified);
1667 } else {
1668 asyncContext->errCode = OsAccountManager::IsOsAccountVerified(asyncContext->id, asyncContext->IsVerified);
1669 }
1670 // for compatibility
1671 if ((!asyncContext->throwErr) && (asyncContext->errCode == ERR_ACCOUNT_COMMON_PERMISSION_DENIED)) {
1672 asyncContext->errCode = ERR_OSACCOUNT_KIT_IS_OS_ACCOUNT_VERIFIED_ERROR;
1673 }
1674 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1675 }
1676
IsVerifiedCompletedCB(napi_env env,napi_status status,void * data)1677 void IsVerifiedCompletedCB(napi_env env, napi_status status, void *data)
1678 {
1679 ACCOUNT_LOGD("napi_create_async_work complete");
1680 IsVerifiedAsyncContext *asyncContext = reinterpret_cast<IsVerifiedAsyncContext *>(data);
1681 napi_value errJs = nullptr;
1682 napi_value dataJs = nullptr;
1683 if (asyncContext->status == napi_ok) {
1684 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1685 napi_get_boolean(env, asyncContext->IsVerified, &dataJs);
1686 } else {
1687 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1688 if (asyncContext->throwErr) {
1689 napi_get_null(env, &dataJs);
1690 } else {
1691 napi_get_boolean(env, asyncContext->IsVerified, &dataJs);
1692 }
1693 }
1694 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1695 delete asyncContext;
1696 }
1697
ParseParaSerialNumId(napi_env env,napi_callback_info cbInfo,GetSerialNumIdCBInfo * asyncContext)1698 bool ParseParaSerialNumId(napi_env env, napi_callback_info cbInfo, GetSerialNumIdCBInfo *asyncContext)
1699 {
1700 size_t argc = ARGS_SIZE_TWO;
1701 napi_value argv[ARGS_SIZE_TWO] = {0};
1702 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
1703 if (argc == ARGS_SIZE_TWO) {
1704 if (!GetCallbackProperty(env, argv[argc - 1], asyncContext->callbackRef, 1)) {
1705 ACCOUNT_LOGE("Get callbackRef failed");
1706 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1707 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1708 return false;
1709 }
1710 }
1711 if (!GetLongIntProperty(env, argv[PARAMZERO], asyncContext->serialNumber)) {
1712 ACCOUNT_LOGE("Get serialNumber failed");
1713 std::string errMsg = "Parameter error. The type of \"serialNumber\" must be number";
1714 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1715 return false;
1716 }
1717
1718 return true;
1719 }
1720
SerialNumIdExecuteCB(napi_env env,void * data)1721 void SerialNumIdExecuteCB(napi_env env, void *data)
1722 {
1723 GetSerialNumIdCBInfo *asyncContext = reinterpret_cast<GetSerialNumIdCBInfo *>(data);
1724 asyncContext->errCode =
1725 OsAccountManager::GetOsAccountLocalIdBySerialNumber(asyncContext->serialNumber, asyncContext->id);
1726 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1727 }
1728
SerialNumIdCompletedCB(napi_env env,napi_status status,void * data)1729 void SerialNumIdCompletedCB(napi_env env, napi_status status, void *data)
1730 {
1731 GetSerialNumIdCBInfo *asyncContext = reinterpret_cast<GetSerialNumIdCBInfo *>(data);
1732 napi_value errJs = nullptr;
1733 napi_value dataJs = nullptr;
1734 if (asyncContext->status == napi_ok) {
1735 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1736 napi_create_int32(env, asyncContext->id, &dataJs);
1737 } else {
1738 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1739 if (asyncContext->throwErr) {
1740 napi_get_null(env, &dataJs);
1741 } else {
1742 napi_create_int32(env, asyncContext->id, &dataJs);
1743 }
1744 }
1745 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1746 delete asyncContext;
1747 }
1748
ParseParaGetSerialNum(napi_env env,napi_callback_info cbInfo,GetSerialNumForOAInfo * asyncContext)1749 bool ParseParaGetSerialNum(napi_env env, napi_callback_info cbInfo, GetSerialNumForOAInfo *asyncContext)
1750 {
1751 return ParseCallbackAndId(env, cbInfo, asyncContext->callbackRef, asyncContext->id, asyncContext->throwErr);
1752 }
1753
GetSerialNumExecuteCB(napi_env env,void * data)1754 void GetSerialNumExecuteCB(napi_env env, void *data)
1755 {
1756 GetSerialNumForOAInfo *asyncContext = reinterpret_cast<GetSerialNumForOAInfo *>(data);
1757 asyncContext->errCode =
1758 OsAccountManager::GetSerialNumberByOsAccountLocalId(asyncContext->id, asyncContext->serialNum);
1759 ACCOUNT_LOGD("error code is %{public}d", asyncContext->errCode);
1760 asyncContext->status = (asyncContext->errCode == 0) ? napi_ok : napi_generic_failure;
1761 }
1762
GetSerialNumCompletedCB(napi_env env,napi_status status,void * data)1763 void GetSerialNumCompletedCB(napi_env env, napi_status status, void *data)
1764 {
1765 ACCOUNT_LOGD("napi_create_async_work complete");
1766 GetSerialNumForOAInfo *asyncContext = reinterpret_cast<GetSerialNumForOAInfo *>(data);
1767 napi_value errJs = nullptr;
1768 napi_value dataJs = nullptr;
1769 if (asyncContext->status == napi_ok) {
1770 errJs = GenerateBusinessSuccess(env, asyncContext->throwErr);
1771 napi_create_int64(env, asyncContext->serialNum, &dataJs);
1772 } else {
1773 errJs = GenerateBusinessError(env, asyncContext->errCode, asyncContext->throwErr);
1774 if (asyncContext->throwErr) {
1775 napi_get_null(env, &dataJs);
1776 } else {
1777 napi_create_int64(env, asyncContext->serialNum, &dataJs);
1778 }
1779 }
1780 ProcessCallbackOrPromise(env, asyncContext, errJs, dataJs);
1781 delete asyncContext;
1782 }
1783
ParseParaIsTestOA(napi_env env,napi_callback_info cbInfo,IsTestOAInfo * asyncContext)1784 bool ParseParaIsTestOA(napi_env env, napi_callback_info cbInfo, IsTestOAInfo *asyncContext)
1785 {
1786 return ParseOneParaContext(env, cbInfo, asyncContext);
1787 }
1788
ParseParaIsMainOA(napi_env env,napi_callback_info cbInfo,IsMainOAInfo * asyncContext)1789 bool ParseParaIsMainOA(napi_env env, napi_callback_info cbInfo, IsMainOAInfo *asyncContext)
1790 {
1791 return ParseOneParaContext(env, cbInfo, asyncContext);
1792 }
1793
ParseParamForActiveSubscriber(const napi_env & env,const std::string & type,SubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1794 static bool ParseParamForActiveSubscriber(const napi_env &env, const std::string &type, SubscribeCBInfo *asyncContext,
1795 size_t argc, napi_value *argv)
1796 {
1797 if (argc < ARGS_SIZE_THREE) {
1798 ACCOUNT_LOGE("The arg number less than 3 characters");
1799 std::string errMsg = "Parameter error. The number of parameters should be at least 3";
1800 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1801 return false;
1802 }
1803 if (argc >= ARGS_SIZE_THREE) {
1804 if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
1805 ACCOUNT_LOGE("Get callbackRef failed");
1806 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1807 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1808 return false;
1809 }
1810 }
1811
1812 // argv[0] type: 'activate' | 'activating'
1813 if (type == "activate") {
1814 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATED;
1815 } else {
1816 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING;
1817 }
1818
1819 // argv[1] name: string
1820 if (!GetStringProperty(env, argv[PARAMONE], asyncContext->name)) {
1821 ACCOUNT_LOGE("Get name failed");
1822 std::string errMsg = "Parameter error. The type of \"name\" must be string";
1823 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1824 return false;
1825 }
1826 size_t nameSize = asyncContext->name.size();
1827 if (nameSize == 0 || nameSize > MAX_SUBSCRIBER_NAME_LEN) {
1828 ACCOUNT_LOGE("Subscriber name size %{public}zu is invalid.", nameSize);
1829 std::string errMsg = "Parameter error. The length of \"name\" is invalid";
1830 AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1831 return false;
1832 }
1833
1834 return true;
1835 }
1836
ParseParamForSwitchSubscriber(const napi_env & env,const std::string & type,SubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1837 static bool ParseParamForSwitchSubscriber(const napi_env &env, const std::string &type, SubscribeCBInfo *asyncContext,
1838 size_t argc, napi_value *argv)
1839 {
1840 if (argc < ARGS_SIZE_TWO) {
1841 ACCOUNT_LOGE("The number of parameters should be at least 2");
1842 std::string errMsg = "Parameter error. The number of parameters should be at least 2";
1843 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1844 return false;
1845 }
1846 if (argc >= ARGS_SIZE_TWO) {
1847 if (!GetCallbackProperty(env, argv[PARAMONE], asyncContext->callbackRef, 1)) {
1848 ACCOUNT_LOGE("Get callbackRef failed");
1849 std::string errMsg = "Parameter error. The type of \"callback\" must be function";
1850 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1851 return false;
1852 }
1853 }
1854 // argv[0] type: 'switched' | 'switching'
1855 if (type == "switched") {
1856 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED;
1857 } else {
1858 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING;
1859 }
1860
1861 return true;
1862 }
1863
ParseParaToSubscriber(const napi_env & env,napi_callback_info cbInfo,SubscribeCBInfo * asyncContext,napi_value * thisVar)1864 bool ParseParaToSubscriber(const napi_env &env, napi_callback_info cbInfo, SubscribeCBInfo *asyncContext,
1865 napi_value *thisVar)
1866 {
1867 size_t argc = ARGS_SIZE_THREE;
1868 napi_value argv[ARGS_SIZE_THREE] = {nullptr};
1869 NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, thisVar, NULL), false);
1870 if (argc < ARGS_SIZE_TWO) {
1871 ACCOUNT_LOGE("The number of parameters should be at least 2");
1872 std::string errMsg = "Parameter error. The number of parameters should be at least 2";
1873 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1874 return false;
1875 }
1876 std::string type;
1877 if (!GetStringProperty(env, argv[PARAMZERO], type)) {
1878 ACCOUNT_LOGE("Get type failed.");
1879 std::string errMsg = "Parameter error. The type of \"type\" must be string";
1880 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1881 return false;
1882 }
1883 if ((type == "activate" || type == "activating")) {
1884 return ParseParamForActiveSubscriber(env, type, asyncContext, argc, argv);
1885 }
1886 if (type == "switched" || type == "switching") {
1887 return ParseParamForSwitchSubscriber(env, type, asyncContext, argc, argv);
1888 }
1889 ACCOUNT_LOGE("Get type fail, %{public}s is invalid.", type.c_str());
1890 std::string errMsg = "Parameter error. The content of \"type\" must be \"activate|activating|switched|switching\"";
1891 AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1892 return false;
1893 }
1894
ParseParamForActiveUnsubscriber(const napi_env & env,const std::string & type,UnsubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1895 static bool ParseParamForActiveUnsubscriber(const napi_env &env, const std::string &type,
1896 UnsubscribeCBInfo *asyncContext, size_t argc, napi_value *argv)
1897 {
1898 if (argc < ARGS_SIZE_TWO) {
1899 ACCOUNT_LOGE("The arg number less than 2 characters.");
1900 std::string errMsg = "The arg number must be at least 2 characters";
1901 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1902 return false;
1903 }
1904 if (argc >= ARGS_SIZE_THREE) {
1905 if (!GetCallbackProperty(env, argv[PARAMTWO], asyncContext->callbackRef, 1)) {
1906 ACCOUNT_LOGE("Get callbackRef failed.");
1907 std::string errMsg = "The type of arg " + std::to_string(PARAMTWO + 1) + " must be function";
1908 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1909 return false;
1910 }
1911 }
1912
1913 // argv[0] type: 'activate' | 'activating'
1914 if (type == "activate") {
1915 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATED;
1916 } else {
1917 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::ACTIVATING;
1918 }
1919
1920 // argv[1] name: string
1921 if (!GetStringProperty(env, argv[PARAMONE], asyncContext->name)) {
1922 ACCOUNT_LOGE("Get name failed");
1923 std::string errMsg = "The type of arg 2 must be string";
1924 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1925 return false;
1926 }
1927 size_t nameSize = asyncContext->name.size();
1928 if (nameSize == 0 || nameSize > MAX_SUBSCRIBER_NAME_LEN) {
1929 ACCOUNT_LOGE("Subscriber name size %{public}zu is invalid.", nameSize);
1930 std::string errMsg = "The length of arg 2 is invalid";
1931 AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1932 return false;
1933 }
1934
1935 return true;
1936 }
1937
ParseParamForSwitchUnsubscriber(const napi_env & env,const std::string & type,UnsubscribeCBInfo * asyncContext,size_t argc,napi_value * argv)1938 static bool ParseParamForSwitchUnsubscriber(const napi_env &env, const std::string &type,
1939 UnsubscribeCBInfo *asyncContext, size_t argc, napi_value *argv)
1940 {
1941 if (argc < ARGS_SIZE_ONE) {
1942 ACCOUNT_LOGE("The arg number less than 1 characters.");
1943 std::string errMsg = "The arg number must be at least 1 characters";
1944 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1945 return false;
1946 }
1947 if (argc >= ARGS_SIZE_TWO) {
1948 if (!GetCallbackProperty(env, argv[PARAMONE], asyncContext->callbackRef, 1)) {
1949 ACCOUNT_LOGE("Get callbackRef failed.");
1950 std::string errMsg = "The type of arg " + std::to_string(PARAMONE + 1) + " must be function";
1951 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1952 return false;
1953 }
1954 }
1955 // argv[0] type: 'switched' | 'switching'
1956 if (type == "switched") {
1957 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED;
1958 } else {
1959 asyncContext->osSubscribeType = OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING;
1960 }
1961
1962 return true;
1963 }
1964
ParseParaToUnsubscriber(const napi_env & env,napi_callback_info cbInfo,UnsubscribeCBInfo * asyncContext,napi_value * thisVar)1965 bool ParseParaToUnsubscriber(const napi_env &env, napi_callback_info cbInfo, UnsubscribeCBInfo *asyncContext,
1966 napi_value *thisVar)
1967 {
1968 size_t argc = ARGS_SIZE_THREE;
1969 napi_value argv[ARGS_SIZE_THREE] = {nullptr};
1970 NAPI_CALL_BASE(env, napi_get_cb_info(env, cbInfo, &argc, argv, thisVar, NULL), false);
1971 if (argc < ARGS_SIZE_ONE) {
1972 ACCOUNT_LOGE("The arg number less than 1 characters.");
1973 std::string errMsg = "Parameter error. The number of parameters should be at least 1";
1974 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1975 return false;
1976 }
1977 std::string type;
1978 if (!GetStringProperty(env, argv[PARAMZERO], type)) {
1979 ACCOUNT_LOGE("Get type failed.");
1980 std::string errMsg = "Parameter error. The type of \"type\" must be string";
1981 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, asyncContext->throwErr);
1982 return false;
1983 }
1984 if ((type == "activate" || type == "activating")) {
1985 return ParseParamForActiveUnsubscriber(env, type, asyncContext, argc, argv);
1986 }
1987 if (type == "switched" || type == "switching") {
1988 return ParseParamForSwitchUnsubscriber(env, type, asyncContext, argc, argv);
1989 }
1990 ACCOUNT_LOGE("Get type fail, %{public}s is invalid.", type.c_str());
1991 std::string errMsg = "Parameter error. The content of \"type\" must be \"activate|activating|switched|switching\"";
1992 AccountNapiThrow(env, ERR_JS_INVALID_PARAMETER, errMsg, asyncContext->throwErr);
1993 return false;
1994 }
1995
GetOsAccountDomainInfoExecuteCB(napi_env env,void * data)1996 void GetOsAccountDomainInfoExecuteCB(napi_env env, void *data)
1997 {
1998 GetOsAccountDomainInfoAsyncContext* asyncContext =
1999 reinterpret_cast<GetOsAccountDomainInfoAsyncContext *>(data);
2000 asyncContext->errCode = OsAccountManager::GetOsAccountDomainInfo(asyncContext->id, asyncContext->domainInfo);
2001 }
2002
GetOsAccountDomainInfoCompletedCB(napi_env env,napi_status status,void * data)2003 void GetOsAccountDomainInfoCompletedCB(napi_env env, napi_status status, void *data)
2004 {
2005 GetOsAccountDomainInfoAsyncContext* contextPtr =
2006 reinterpret_cast<GetOsAccountDomainInfoAsyncContext *>(data);
2007 std::unique_ptr<GetOsAccountDomainInfoAsyncContext> asyncContext(contextPtr);
2008
2009 napi_value errJs = nullptr;
2010 napi_value dataJs = nullptr;
2011 if (asyncContext->errCode == ERR_OK) {
2012 errJs = GenerateBusinessSuccess(env, true);
2013 CreateJsDomainInfo(env, asyncContext->domainInfo, dataJs);
2014 } else {
2015 // If local account exists but no domain info, need return success, but info is null.
2016 if (asyncContext->errCode == ERR_DOMAIN_ACCOUNT_SERVICE_NOT_DOMAIN_ACCOUNT) {
2017 errJs = GenerateBusinessSuccess(env, false);
2018 asyncContext->errCode = ERR_OK;
2019 } else {
2020 errJs = GenerateBusinessError(env, asyncContext->errCode, true);
2021 }
2022 napi_get_null(env, &dataJs);
2023 }
2024 ProcessCallbackOrPromise(env, contextPtr, errJs, dataJs);
2025 }
2026
OnResult(const int32_t errCode,Parcel & parcel)2027 void NapiBindDomainCallback::OnResult(const int32_t errCode, Parcel &parcel)
2028 {
2029 std::unique_lock<std::mutex> lock(lockInfo_.mutex);
2030 if (env_ == nullptr || deferred_ == nullptr) {
2031 ACCOUNT_LOGE("Js promise or env is nullptr");
2032 return;
2033 }
2034 std::shared_ptr<BindDomainAccountAsyncContext> asyncContext = std::make_shared<BindDomainAccountAsyncContext>();
2035 asyncContext->env = env_;
2036 asyncContext->deferred = deferred_;
2037 asyncContext->errCode = errCode;
2038 if (napi_ok != napi_send_event(env_, BindDomainAccountCompleteWork(asyncContext), napi_eprio_vip)) {
2039 ACCOUNT_LOGE("Post task failed");
2040 return;
2041 }
2042 deferred_ = nullptr;
2043 ACCOUNT_LOGI("Post task finish");
2044 }
2045
ParseParaBindDomainAccount(napi_env env,napi_callback_info cbInfo,std::unique_ptr<BindDomainAccountAsyncContext> & asyncContext)2046 bool ParseParaBindDomainAccount(
2047 napi_env env, napi_callback_info cbInfo, std::unique_ptr<BindDomainAccountAsyncContext> &asyncContext)
2048 {
2049 size_t argc = ARGS_SIZE_TWO;
2050 napi_value argv[ARGS_SIZE_TWO] = {0};
2051 napi_get_cb_info(env, cbInfo, &argc, argv, nullptr, nullptr);
2052
2053 if (!GetIntProperty(env, argv[PARAMZERO], asyncContext->localID)) {
2054 ACCOUNT_LOGE("Get localId failed");
2055 std::string errMsg = "Parameter error. The type of \"localId\" must be integer.";
2056 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
2057 return false;
2058 }
2059
2060 if (!ParseDomainAccountInfo(env, argv[PARAMONE], asyncContext->domainInfo)) {
2061 ACCOUNT_LOGE("Get domainInfo failed");
2062 std::string errMsg = "Parameter error. The type of \"domainInfo\" must be DomainAccountInfo.";
2063 AccountNapiThrow(env, ERR_JS_PARAMETER_ERROR, errMsg, true);
2064 return false;
2065 }
2066 return true;
2067 }
2068
BindDomainAccountExecuteCB(napi_env env,void * data)2069 void BindDomainAccountExecuteCB(napi_env env, void *data)
2070 {
2071 BindDomainAccountAsyncContext *asyncContext = reinterpret_cast<BindDomainAccountAsyncContext *>(data);
2072 std::shared_ptr<NapiBindDomainCallback> callback = std::make_shared<NapiBindDomainCallback>(
2073 asyncContext->env, asyncContext->deferred);
2074 asyncContext->errCode = OsAccountManager::BindDomainAccount(
2075 asyncContext->localID, asyncContext->domainInfo, callback);
2076 if (asyncContext->errCode != ERR_OK) {
2077 Parcel emptyParcel;
2078 callback->OnResult(asyncContext->errCode, emptyParcel);
2079 }
2080 asyncContext->deferred = nullptr;
2081 }
2082
BindDomainAccountCompletedCB(napi_env env,napi_status status,void * data)2083 void BindDomainAccountCompletedCB(napi_env env, napi_status status, void *data)
2084 {
2085 BindDomainAccountAsyncContext *asyncContext = reinterpret_cast<BindDomainAccountAsyncContext *>(data);
2086 delete asyncContext;
2087 }
2088
BindDomainAccountCompleteWork(const std::shared_ptr<BindDomainAccountAsyncContext> & param)2089 std::function<void()> BindDomainAccountCompleteWork(const std::shared_ptr<BindDomainAccountAsyncContext> ¶m)
2090 {
2091 return [asyncContext = param] {
2092 ACCOUNT_LOGI("Enter BindDomainAccountCompleteWork");
2093 napi_handle_scope scope = nullptr;
2094 napi_open_handle_scope(asyncContext->env, &scope);
2095 if (scope == nullptr) {
2096 ACCOUNT_LOGE("Fail to open scope");
2097 return;
2098 }
2099 napi_value errJs = nullptr;
2100 napi_value dataJs = nullptr;
2101 napi_get_undefined(asyncContext->env, &dataJs);
2102 if (asyncContext->errCode != ERR_OK) {
2103 errJs = GenerateBusinessError(asyncContext->env, asyncContext->errCode);
2104 } else {
2105 errJs = GenerateBusinessSuccess(asyncContext->env, true);
2106 }
2107 ReturnCallbackOrPromise(asyncContext->env, asyncContext.get(), errJs, dataJs);
2108 napi_close_handle_scope(asyncContext->env, scope);
2109 };
2110 }
2111 } // namespace AccountJsKit
2112 } // namespace OHOS
2113