• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "resource_manager_napi_async_impl.h"
17 
18 #include <unordered_map>
19 #if !defined(__IDE_PREVIEW__)
20 #include "hisysevent_adapter.h"
21 #include "hitrace_meter.h"
22 #endif
23 #include "resource_manager_napi_utils.h"
24 namespace OHOS {
25 namespace Global {
26 namespace Resource {
27 using namespace std::placeholders;
28 constexpr int PARAMS_NUM_TWO = 2;
29 constexpr int PARAMS_NUM_THREE = 3;
ResourceManagerNapiAsyncImpl()30 ResourceManagerNapiAsyncImpl::ResourceManagerNapiAsyncImpl()
31 {}
32 
~ResourceManagerNapiAsyncImpl()33 ResourceManagerNapiAsyncImpl::~ResourceManagerNapiAsyncImpl()
34 {}
35 
36 std::unordered_map<std::string, std::function<napi_value(napi_env&, napi_callback_info&)>>
37     ResourceManagerNapiAsyncImpl::asyncFuncMatch {
38     /*===========================since 6 but deprecated since 9======================================*/
__anon840267040102(napi_env& env, napi_callback_info& info) 39     {"GetString", [](napi_env& env, napi_callback_info& info) -> napi_value {
40         return ResourceManagerNapiAsyncImpl::GetString(env, info);}},
__anon840267040202(napi_env& env, napi_callback_info& info) 41     {"GetStringArray", [](napi_env& env, napi_callback_info& info) -> napi_value {
42         return ResourceManagerNapiAsyncImpl::GetStringArray(env, info);}},
__anon840267040302(napi_env& env, napi_callback_info& info) 43     {"GetMedia", [](napi_env& env, napi_callback_info& info) -> napi_value {
44         return ResourceManagerNapiAsyncImpl::GetMedia(env, info);}},
__anon840267040402(napi_env& env, napi_callback_info& info) 45     {"GetMediaBase64", [](napi_env& env, napi_callback_info& info) -> napi_value {
46         return ResourceManagerNapiAsyncImpl::GetMediaBase64(env, info);}},
__anon840267040502(napi_env& env, napi_callback_info& info) 47     {"GetPluralString", [](napi_env& env, napi_callback_info& info) -> napi_value {
48         return ResourceManagerNapiAsyncImpl::GetPluralString(env, info);}},
__anon840267040602(napi_env& env, napi_callback_info& info) 49     {"GetRawFile", [](napi_env& env, napi_callback_info& info) -> napi_value {
50         return ResourceManagerNapiAsyncImpl::GetRawFile(env, info);}},
__anon840267040702(napi_env& env, napi_callback_info& info) 51     {"GetRawFileDescriptor", [](napi_env& env, napi_callback_info& info) -> napi_value {
52         return ResourceManagerNapiAsyncImpl::GetRawFileDescriptor(env, info);}},
__anon840267040802(napi_env& env, napi_callback_info& info) 53     {"CloseRawFileDescriptor", [](napi_env& env, napi_callback_info& info) -> napi_value {
54         return ResourceManagerNapiAsyncImpl::CloseRawFileDescriptor(env, info);}},
55     /*===========================since 6 but deprecated since 9========================================*/
56 
__anon840267040902(napi_env& env, napi_callback_info& info) 57     {"GetStringValue", [](napi_env& env, napi_callback_info& info) -> napi_value {
58         return ResourceManagerNapiAsyncImpl::GetStringValue(env, info);}},
__anon840267040a02(napi_env& env, napi_callback_info& info) 59     {"GetStringArrayValue", [](napi_env& env, napi_callback_info& info) -> napi_value {
60         return ResourceManagerNapiAsyncImpl::GetStringArrayValue(env, info);}},
__anon840267040b02(napi_env& env, napi_callback_info& info) 61     {"GetMediaContent", [](napi_env& env, napi_callback_info& info) -> napi_value {
62         return ResourceManagerNapiAsyncImpl::GetMediaContent(env, info);}},
__anon840267040c02(napi_env& env, napi_callback_info& info) 63     {"GetMediaContentBase64", [](napi_env& env, napi_callback_info& info) -> napi_value {
64         return ResourceManagerNapiAsyncImpl::GetMediaContentBase64(env, info);}},
__anon840267040d02(napi_env& env, napi_callback_info& info) 65     {"GetPluralStringValue", [](napi_env& env, napi_callback_info& info) -> napi_value {
66         return ResourceManagerNapiAsyncImpl::GetPluralStringValue(env, info);}},
__anon840267040e02(napi_env& env, napi_callback_info& info) 67     {"GetRawFileContent", [](napi_env& env, napi_callback_info& info) -> napi_value {
68         return ResourceManagerNapiAsyncImpl::GetRawFileContent(env, info);}},
__anon840267040f02(napi_env& env, napi_callback_info& info) 69     {"GetRawFd", [](napi_env& env, napi_callback_info& info) -> napi_value {
70         return ResourceManagerNapiAsyncImpl::GetRawFd(env, info);}},
__anon840267041002(napi_env& env, napi_callback_info& info) 71     {"CloseRawFd", [](napi_env& env, napi_callback_info& info) -> napi_value {
72         return ResourceManagerNapiAsyncImpl::CloseRawFd(env, info);}},
__anon840267041102(napi_env& env, napi_callback_info& info) 73     {"GetConfiguration", [](napi_env& env, napi_callback_info& info) -> napi_value {
74         return ResourceManagerNapiAsyncImpl::GetConfiguration(env, info);}},
__anon840267041202(napi_env& env, napi_callback_info& info) 75     {"GetDeviceCapability", [](napi_env& env, napi_callback_info& info) -> napi_value {
76         return ResourceManagerNapiAsyncImpl::GetDeviceCapability(env, info);}},
__anon840267041302(napi_env& env, napi_callback_info& info) 77     {"GetStringByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
78         return ResourceManagerNapiAsyncImpl::GetStringByName(env, info);}},
__anon840267041402(napi_env& env, napi_callback_info& info) 79     {"GetStringArrayByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
80         return ResourceManagerNapiAsyncImpl::GetStringArrayByName(env, info);}},
__anon840267041502(napi_env& env, napi_callback_info& info) 81     {"GetMediaByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
82         return ResourceManagerNapiAsyncImpl::GetMediaByName(env, info);}},
__anon840267041602(napi_env& env, napi_callback_info& info) 83     {"GetMediaBase64ByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
84         return ResourceManagerNapiAsyncImpl::GetMediaBase64ByName(env, info);}},
__anon840267041702(napi_env& env, napi_callback_info& info) 85     {"GetPluralStringByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
86         return ResourceManagerNapiAsyncImpl::GetPluralStringByName(env, info);}},
__anon840267041802(napi_env& env, napi_callback_info& info) 87     {"GetRawFileList", [](napi_env& env, napi_callback_info& info) -> napi_value {
88         return ResourceManagerNapiAsyncImpl::GetRawFileList(env, info);}},
__anon840267041902(napi_env& env, napi_callback_info& info) 89     {"GetColor", [](napi_env& env, napi_callback_info& info) -> napi_value {
90         return ResourceManagerNapiAsyncImpl::GetColor(env, info);}},
__anon840267041a02(napi_env& env, napi_callback_info& info) 91     {"GetColorByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
92         return ResourceManagerNapiAsyncImpl::GetColorByName(env, info);}},
93 };
94 
GetResource(napi_env env,napi_callback_info info,const std::string & functionName)95 napi_value ResourceManagerNapiAsyncImpl::GetResource(napi_env env, napi_callback_info info,
96     const std::string &functionName)
97 {
98     auto functionIndex = asyncFuncMatch.find(functionName);
99     if (functionIndex == asyncFuncMatch.end()) {
100         RESMGR_HILOGI(RESMGR_JS_TAG, "Invalid functionName, %{public}s", functionName.c_str());
101         return nullptr;
102     }
103     return functionIndex->second(env, info);
104 }
105 
GetCallbackErrorCode(napi_env env,const int32_t errCode,const std::string & errMsg)106 napi_value GetCallbackErrorCode(napi_env env, const int32_t errCode, const std::string &errMsg)
107 {
108     napi_value error = nullptr;
109     napi_value eCode = nullptr;
110     napi_value eMsg = nullptr;
111     napi_create_int32(env, errCode, &eCode);
112     napi_create_string_utf8(env, errMsg.c_str(), NAPI_AUTO_LENGTH, &eMsg);
113     napi_create_object(env, &error);
114     napi_set_named_property(env, error, "code", eCode);
115     napi_set_named_property(env, error, "message", eMsg);
116     return error;
117 }
118 
Complete(napi_env env,napi_status status,void * data)119 void ResourceManagerNapiAsyncImpl::Complete(napi_env env, napi_status status, void* data)
120 {
121     ResMgrDataContext* dataContext = static_cast<ResMgrDataContext*>(data);
122 
123     napi_value finalResult = nullptr;
124     if (dataContext->createValueFunc_ != nullptr) {
125         finalResult = dataContext->createValueFunc_(env, *dataContext);
126     }
127 
128     napi_value result[] = { nullptr, nullptr };
129     if (dataContext->success_) {
130         napi_get_undefined(env, &result[0]);
131         result[1] = finalResult;
132     } else {
133         result[0] = GetCallbackErrorCode(env, dataContext->errCode_, dataContext->errMsg_.c_str());
134         napi_get_undefined(env, &result[1]);
135     }
136     if (dataContext->deferred_) {
137         if (dataContext->success_) {
138             if (napi_resolve_deferred(env, dataContext->deferred_, result[1]) != napi_ok) {
139                 RESMGR_HILOGE(RESMGR_JS_TAG, "napi_resolve_deferred failed");
140             }
141         } else {
142             result[0] = GetCallbackErrorCode(env, dataContext->errCode_, dataContext->errMsg_.c_str());
143             if (napi_reject_deferred(env, dataContext->deferred_, result[0]) != napi_ok) {
144                 RESMGR_HILOGE(RESMGR_JS_TAG, "napi_reject_deferred failed");
145             }
146         }
147     } else {
148         do {
149             napi_value callback = nullptr;
150             napi_status status = napi_get_reference_value(env, dataContext->callbackRef_, &callback);
151             if (status != napi_ok) {
152                 RESMGR_HILOGE(RESMGR_JS_TAG, "napi_get_reference_value failed status=%{public}d", status);
153                 break;
154             }
155             napi_value userRet = nullptr;
156             status = napi_call_function(env, nullptr, callback, sizeof(result) / sizeof(napi_value), result, &userRet);
157             if (status != napi_ok) {
158                 RESMGR_HILOGE(RESMGR_JS_TAG, "napi_call_function failed status=%{public}d", status);
159                 break;
160             }
161             status = napi_delete_reference(env, dataContext->callbackRef_);
162             if (status != napi_ok) {
163                 RESMGR_HILOGE(RESMGR_JS_TAG, "napi_call_function failed status=%{public}d", status);
164                 break;
165             }
166         } while (false);
167     }
168     napi_delete_async_work(env, dataContext->work_);
169     delete dataContext;
170 };
171 
GetResult(napi_env env,std::unique_ptr<ResMgrDataContext> & dataContext,const std::string & name,napi_async_execute_callback & execute)172 napi_value ResourceManagerNapiAsyncImpl::GetResult(napi_env env, std::unique_ptr<ResMgrDataContext> &dataContext,
173     const std::string &name, napi_async_execute_callback &execute)
174 {
175     napi_value result = nullptr;
176     if (dataContext->callbackRef_ == nullptr) {
177         napi_create_promise(env, &dataContext->deferred_, &result);
178     } else {
179         napi_get_undefined(env, &result);
180     }
181     napi_value resource = nullptr;
182     napi_create_string_utf8(env, name.c_str(), NAPI_AUTO_LENGTH, &resource);
183     if (napi_create_async_work(env, nullptr, resource, execute, ResourceManagerNapiAsyncImpl::Complete,
184         static_cast<void*>(dataContext.get()), &dataContext->work_) != napi_ok) {
185         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to create async work for %{public}s", name.c_str());
186         return result;
187     }
188     if (napi_queue_async_work_with_qos(env, dataContext->work_, napi_qos_user_initiated) != napi_ok) {
189         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to queue async work for %{public}s", name.c_str());
190         return result;
191     }
192     dataContext.release();
193     return result;
194 }
195 
ProcessNameParamV9(napi_env env,napi_callback_info info,const std::string & name,napi_async_execute_callback execute)196 napi_value ResourceManagerNapiAsyncImpl::ProcessNameParamV9(napi_env env, napi_callback_info info,
197     const std::string &name, napi_async_execute_callback execute)
198 {
199     GET_PARAMS(env, info, PARAMS_NUM_THREE);
200     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
201     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
202     if (dataContext->addon_ == nullptr) {
203         return nullptr;
204     }
205     for (size_t i = 0; i < argc; i++) {
206         napi_valuetype valueType;
207         napi_typeof(env, argv[i], &valueType);
208         if (i == 0 && valueType == napi_string) {
209             dataContext->resName_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
210         } else if (i == 1 && valueType == napi_function) {
211             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
212             break;
213         } else if (i == 1 && ResourceManagerNapiUtils::GetDataType(env, argv[i], dataContext->density_) != SUCCESS) {
214             ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
215             return nullptr;
216         } else if (i == 2 && valueType == napi_function) { // the third callback param
217             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
218             break;
219         } else {
220             // self resourcemanager with promise
221         }
222     }
223 
224     napi_value result = GetResult(env, dataContext, name, execute);
225     return result;
226 }
227 
ProcessIdParamV9(napi_env env,napi_callback_info info,const std::string & name,napi_async_execute_callback execute)228 napi_value ResourceManagerNapiAsyncImpl::ProcessIdParamV9(napi_env env, napi_callback_info info,
229     const std::string &name, napi_async_execute_callback execute)
230 {
231     GET_PARAMS(env, info, PARAMS_NUM_THREE);
232 
233     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
234     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
235     if (dataContext->addon_ == nullptr) {
236         return nullptr;
237     }
238     for (size_t i = 0; i < argc; i++) {
239         napi_valuetype valueType;
240         napi_typeof(env, argv[i], &valueType);
241         if (i == 0 && valueType == napi_number) {
242             dataContext->resId_ = ResourceManagerNapiUtils::GetResId(env, argc, argv);
243         } else if (i == 1 && valueType == napi_function) {
244             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
245             break;
246         } else if (i == 1 && ResourceManagerNapiUtils::GetDataType(env, argv[i], dataContext->density_) != SUCCESS) {
247             ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
248             return nullptr;
249         } else if (i == 2 && valueType == napi_function) { // the third callback param
250             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
251             break;
252         } else {
253             // self resourcemanager with promise
254         }
255     }
256 
257     napi_value result = GetResult(env, dataContext, name, execute);
258     return result;
259 }
260 
ProcessResourceParamV9(napi_env env,napi_callback_info info,const std::string & name,napi_async_execute_callback execute)261 napi_value ResourceManagerNapiAsyncImpl::ProcessResourceParamV9(napi_env env, napi_callback_info info,
262     const std::string &name, napi_async_execute_callback execute)
263 {
264     GET_PARAMS(env, info, PARAMS_NUM_THREE);
265 
266     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
267     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
268     if (dataContext->addon_ == nullptr) {
269         return nullptr;
270     }
271     for (size_t i = 0; i < argc; i++) {
272         napi_valuetype valueType;
273         napi_typeof(env, argv[i], &valueType);
274         if (i == 0 && valueType == napi_object) {
275             auto resourcePtr = std::make_shared<ResourceManager::Resource>();
276             int32_t retCode = ResourceManagerNapiUtils::GetResourceObject(env, resourcePtr, argv[0]);
277             if (retCode != SUCCESS) {
278                 RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get native Resource object");
279                 ResourceManagerNapiUtils::NapiThrow(env, retCode);
280                 return nullptr;
281             }
282             dataContext->resource_ = resourcePtr;
283         } else if (i == 1 && valueType == napi_function) {
284             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
285             break;
286         } else if (i == 1 && ResourceManagerNapiUtils::GetDataType(env, argv[i], dataContext->density_) != SUCCESS) {
287             ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
288             return nullptr;
289         } else if (i == 2 && valueType == napi_function) { // the third callback param
290             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
291             break;
292         } else {
293             // self resourcemanager with promise
294         }
295     }
296 
297     napi_value result = GetResult(env, dataContext, name, execute);
298     return result;
299 }
300 
ProcessOnlyIdParam(napi_env env,napi_callback_info info,const std::string & name,napi_async_execute_callback execute)301 napi_value ResourceManagerNapiAsyncImpl::ProcessOnlyIdParam(napi_env env, napi_callback_info info,
302     const std::string &name, napi_async_execute_callback execute)
303 {
304     GET_PARAMS(env, info, PARAMS_NUM_TWO);
305 
306     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
307     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
308     if (dataContext->addon_ == nullptr) {
309         return nullptr;
310     }
311     for (size_t i = 0; i < argc; i++) {
312         napi_valuetype valueType;
313         napi_typeof(env, argv[i], &valueType);
314         if (i == 0 && valueType == napi_number) {
315             dataContext->resId_ = ResourceManagerNapiUtils::GetResId(env, argc, argv);
316         } else if (i == 1 && valueType == napi_function) {
317             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
318             break;
319         } else if (i == 0 && valueType == napi_string) {
320             dataContext->path_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
321         } else if (i == 0 && valueType == napi_object) {
322             std::shared_ptr<ResourceManager::Resource> resourcePtr = std::make_shared<ResourceManager::Resource>();
323             int32_t retCode = ResourceManagerNapiUtils::GetResourceObject(env, resourcePtr, argv[0]);
324             if (retCode != SUCCESS) {
325                 ResourceManagerNapiUtils::NapiThrow(env, retCode);
326                 return nullptr;
327             }
328             dataContext->resource_ = resourcePtr;
329         } else {
330             // self resourcemanager with promise
331         }
332     }
333     napi_value result = GetResult(env, dataContext, name, execute);
334     return result;
335 }
336 
ProcessIdNameParam(napi_env env,napi_callback_info info,const std::string & name,napi_async_execute_callback execute)337 napi_value ResourceManagerNapiAsyncImpl::ProcessIdNameParam(napi_env env, napi_callback_info info,
338     const std::string& name, napi_async_execute_callback execute)
339 {
340     GET_PARAMS(env, info, PARAMS_NUM_THREE);
341 
342     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
343     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
344     for (size_t i = 0; i < argc; i++) {
345         napi_valuetype valueType;
346         napi_typeof(env, argv[i], &valueType);
347         if (i == 0 && valueType == napi_number) {
348             dataContext->resId_ = ResourceManagerNapiUtils::GetResId(env, argc, argv);
349         } else if (i == 0 && valueType == napi_string) {
350             dataContext->resName_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
351         } else if (i == 0 && valueType == napi_object) {
352             std::shared_ptr<ResourceManager::Resource> resourcePtr = std::make_shared<ResourceManager::Resource>();
353             int32_t retCode = ResourceManagerNapiUtils::GetResourceObject(env, resourcePtr, argv[0]);
354             if (retCode != SUCCESS) {
355                 RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get native Resource object");
356                 return nullptr;
357             }
358             dataContext->resource_ = resourcePtr;
359         } else if (i == 1 && valueType != napi_number) { // the second quantity param
360             RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number");
361             ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
362             return nullptr;
363         } else if (i == 1 && valueType == napi_number) {
364             // dataContext->param_ is the quantity to select plural string
365             napi_get_value_int32(env, argv[i], &dataContext->param_);
366             // param is the value to replace placeholder in the plural string
367             double param;
368             if (napi_get_value_double(env, argv[i], &param) != napi_ok) {
369                 RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get parameter value in ProcessIdNameParam");
370                 return nullptr;
371             }
372             dataContext->jsParams_.push_back(std::make_tuple(ResourceManager::NapiValueType::NAPI_NUMBER,
373                 std::to_string(param)));
374         } else if (i == 2 && valueType == napi_function) { // the third callback param
375             napi_create_reference(env, argv[i], 1, &dataContext->callbackRef_);
376             break;
377         } else {
378             // self resourcemanager with promise
379         }
380     }
381     napi_value result = GetResult(env, dataContext, name, execute);
382     return result;
383 }
384 
ProcessNoParam(napi_env env,napi_callback_info info,const std::string & name,napi_async_execute_callback execute)385 napi_value ResourceManagerNapiAsyncImpl::ProcessNoParam(napi_env env, napi_callback_info info,
386     const std::string &name, napi_async_execute_callback execute)
387 {
388     GET_PARAMS(env, info, 1);
389 
390     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
391     std::shared_ptr<ResourceManagerAddon> *addonPtr = nullptr;
392     napi_status status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&addonPtr));
393     if (status != napi_ok) {
394         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to unwrap ProcessNoParam");
395         return nullptr;
396     }
397     dataContext->addon_ = *addonPtr;
398     napi_valuetype valueType;
399     napi_typeof(env, argv[0], &valueType);
400     if (valueType == napi_function) {
401         napi_create_reference(env, argv[0], 1, &dataContext->callbackRef_);
402     }
403 
404     napi_value result = GetResult(env, dataContext, name, execute);
405     return result;
406 }
407 
__anon840267041b02(napi_env env, void* data) 408 auto getStringFunc = [](napi_env env, void* data) {
409     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
410     std::shared_ptr<ResourceManager> resMgr = nullptr;
411     uint32_t resId = 0;
412 
413     bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext, resMgr, resId);
414     if (!ret) {
415         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to GetHapResourceManager in getStringFunc");
416         dataContext->SetErrorMsg("Failed to get string, invalid bundleName or moduleName",
417             false, ERROR_CODE_INVALID_INPUT_PARAMETER);
418         return;
419     }
420     RState state = resMgr->GetStringById(resId, dataContext->value_);
421     if (state != RState::SUCCESS) {
422         dataContext->SetErrorMsg("GetStringById failed state", true, state);
423 #if !defined(__IDE_PREVIEW__)
424         ReportGetResourceByIdFail(resId, dataContext->value_, "failed in getStringFunc");
425 #endif
426         return;
427     }
428     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsString;
429 };
430 
GetStringValue(napi_env env,napi_callback_info info)431 napi_value ResourceManagerNapiAsyncImpl::GetStringValue(napi_env env, napi_callback_info info)
432 {
433     if (ResourceManagerNapiUtils::IsNapiNumber(env, info)) {
434         return ProcessIdParamV9(env, info, "getStringValue", getStringFunc);
435     } else if (ResourceManagerNapiUtils::IsNapiObject(env, info)) {
436         return ProcessResourceParamV9(env, info, "getStringValue", getStringFunc);
437     } else {
438         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
439         return nullptr;
440     }
441 }
442 
GetString(napi_env env,napi_callback_info info)443 napi_value ResourceManagerNapiAsyncImpl::GetString(napi_env env, napi_callback_info info)
444 {
445     return ProcessOnlyIdParam(env, info, "getString", getStringFunc);
446 }
447 
__anon840267041c02(napi_env env, void* data) 448 auto getStringByNameFunc = [](napi_env env, void* data) {
449     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
450     RState state = dataContext->addon_->GetResMgr()->GetStringByName(dataContext->resName_.c_str(),
451         dataContext->value_);
452     if (state != RState::SUCCESS) {
453         dataContext->SetErrorMsg("GetStringByName failed state", false, state);
454 #if !defined(__IDE_PREVIEW__)
455         ReportGetResourceByNameFail(dataContext->resName_, dataContext->value_,
456             "failed in getStringByNameFunc");
457 #endif
458         return;
459     }
460     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsString;
461 };
462 
GetStringByName(napi_env env,napi_callback_info info)463 napi_value ResourceManagerNapiAsyncImpl::GetStringByName(napi_env env, napi_callback_info info)
464 {
465     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
466         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
467         return nullptr;
468     }
469     return ProcessNameParamV9(env, info, "getStringByName", getStringByNameFunc);
470 }
471 
__anon840267041d02(napi_env env, void* data) 472 auto getStringArrayFunc = [](napi_env env, void* data) {
473     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
474     RState state;
475     uint32_t resId = 0;
476     std::shared_ptr<ResourceManager> resMgr = nullptr;
477     if (dataContext->resId_ != 0 || dataContext->resource_ != nullptr) {
478         bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext, resMgr, resId);
479         if (!ret) {
480             RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to GetHapResourceManager in getStringArrayFunc");
481             dataContext->SetErrorMsg("Failed to get string array, invalid bundleName or moduleName",
482                 false, ERROR_CODE_INVALID_INPUT_PARAMETER);
483             return;
484         }
485         state = resMgr->GetStringArrayById(resId, dataContext->arrayValue_);
486         if (state != RState::SUCCESS) {
487             dataContext->SetErrorMsg("GetStringArrayById failed state", true, state);
488             return;
489         }
490     } else {
491         state = dataContext->addon_->GetResMgr()->GetStringArrayByName(dataContext->resName_.c_str(),
492             dataContext->arrayValue_);
493         if (state != RState::SUCCESS) {
494             dataContext->SetErrorMsg("GetStringArrayByName failed state", false, state);
495             return;
496         }
497     }
498     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsArray;
499 };
500 
GetStringArray(napi_env env,napi_callback_info info)501 napi_value ResourceManagerNapiAsyncImpl::GetStringArray(napi_env env, napi_callback_info info)
502 {
503     return ProcessOnlyIdParam(env, info, "getStringArray", getStringArrayFunc);
504 }
505 
GetStringArrayValue(napi_env env,napi_callback_info info)506 napi_value ResourceManagerNapiAsyncImpl::GetStringArrayValue(napi_env env, napi_callback_info info)
507 {
508     if (ResourceManagerNapiUtils::IsNapiNumber(env, info)) {
509         return ProcessIdParamV9(env, info, "getStringArrayValue", getStringArrayFunc);
510     } else if (ResourceManagerNapiUtils::IsNapiObject(env, info)) {
511         return ProcessResourceParamV9(env, info, "getStringArrayValue", getStringArrayFunc);
512     } else {
513         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
514         return nullptr;
515     }
516 }
517 
GetStringArrayByName(napi_env env,napi_callback_info info)518 napi_value ResourceManagerNapiAsyncImpl::GetStringArrayByName(napi_env env, napi_callback_info info)
519 {
520     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
521         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
522         return nullptr;
523     }
524     return ProcessNameParamV9(env, info, "GetStringArrayByName", getStringArrayFunc);
525 }
526 
__anon840267041e02(napi_env env, void *data) 527 auto getMediaFunc = [](napi_env env, void *data) {
528     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
529     std::string path;
530     uint32_t resId = 0;
531     std::shared_ptr<ResourceManager> resMgr = nullptr;
532     bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext, resMgr, resId);
533     if (!ret) {
534         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to GetHapResourceManager in getMediaFunc");
535         dataContext->SetErrorMsg("Failed to get media data, invalid bundleName or moduleName",
536             false, ERROR_CODE_INVALID_INPUT_PARAMETER);
537         return;
538     }
539     RState state = resMgr->GetMediaDataById(resId, dataContext->len_, dataContext->mediaData,
540         dataContext->density_);
541     if (state != SUCCESS) {
542         dataContext->SetErrorMsg("Failed to get media data in getMediaFunc", true, state);
543         return;
544     }
545     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsUint8Array;
546 };
547 
GetMediaContent(napi_env env,napi_callback_info info)548 napi_value ResourceManagerNapiAsyncImpl::GetMediaContent(napi_env env, napi_callback_info info)
549 {
550     if (ResourceManagerNapiUtils::IsNapiNumber(env, info)) {
551         return ProcessIdParamV9(env, info, "getMediaContent", getMediaFunc);
552     } else if (ResourceManagerNapiUtils::IsNapiObject(env, info)) {
553         return ProcessResourceParamV9(env, info, "getMediaContent", getMediaFunc);
554     } else {
555         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
556         return nullptr;
557     }
558 }
559 
GetMedia(napi_env env,napi_callback_info info)560 napi_value ResourceManagerNapiAsyncImpl::GetMedia(napi_env env, napi_callback_info info)
561 {
562 #if !defined(__IDE_PREVIEW__)
563     StartTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR, "ResourceManagerAddon::GetMedia");
564 #endif
565     napi_value media = ProcessOnlyIdParam(env, info, "getMedia", getMediaFunc);
566 #if !defined(__IDE_PREVIEW__)
567     FinishTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR);
568 #endif
569     return media;
570 }
571 
__anon840267041f02(napi_env env, void *data) 572 auto getMediaBase64Func = [](napi_env env, void *data) {
573     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
574     std::string path;
575     RState state;
576     if (dataContext->resId_ != 0 || dataContext->resource_ != nullptr) {
577         uint32_t resId = 0;
578         std::shared_ptr<ResourceManager> resMgr = nullptr;
579         bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext, resMgr, resId);
580         if (!ret) {
581             RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to GetHapResourceManager in getMediaBase64Func");
582             dataContext->SetErrorMsg("Failed to get media data, invalid bundleName or moduleName",
583                 false, ERROR_CODE_INVALID_INPUT_PARAMETER);
584             return;
585         }
586         state = resMgr->GetMediaBase64DataById(resId, dataContext->value_, dataContext->density_);
587         if (state != RState::SUCCESS) {
588             dataContext->SetErrorMsg("Failed to get media data in getMediaBase64Func", true, state);
589             return;
590         }
591         dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsString;
592     } else {
593         state = dataContext->addon_->GetResMgr()->GetMediaBase64DataByName(dataContext->resName_.c_str(),
594             dataContext->value_, dataContext->density_);
595         if (state != RState::SUCCESS) {
596             dataContext->SetErrorMsg("Failed to get media data in getMediaBase64Func", false, state);
597             return;
598         }
599         dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsString;
600     }
601 };
602 
GetMediaContentBase64(napi_env env,napi_callback_info info)603 napi_value ResourceManagerNapiAsyncImpl::GetMediaContentBase64(napi_env env, napi_callback_info info)
604 {
605     if (ResourceManagerNapiUtils::IsNapiNumber(env, info)) {
606         return ProcessIdParamV9(env, info, "getMediaContentBase64", getMediaBase64Func);
607     } else if (ResourceManagerNapiUtils::IsNapiObject(env, info)) {
608         return ProcessResourceParamV9(env, info, "getMediaContentBase64", getMediaBase64Func);
609     } else {
610         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
611         return nullptr;
612     }
613 }
614 
GetMediaBase64(napi_env env,napi_callback_info info)615 napi_value ResourceManagerNapiAsyncImpl::GetMediaBase64(napi_env env, napi_callback_info info)
616 {
617 #if !defined(__IDE_PREVIEW__)
618     StartTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR, "ResourceManagerAddon::GetMediaBase64");
619 #endif
620     napi_value mediaBase64 = ProcessOnlyIdParam(env, info, "GetMediaBase64", getMediaBase64Func);
621 #if !defined(__IDE_PREVIEW__)
622     FinishTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR);
623 #endif
624     return mediaBase64;
625 }
626 
GetMediaBase64ByName(napi_env env,napi_callback_info info)627 napi_value ResourceManagerNapiAsyncImpl::GetMediaBase64ByName(napi_env env, napi_callback_info info)
628 {
629     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
630         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
631         return nullptr;
632     }
633 #if !defined(__IDE_PREVIEW__)
634     StartTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR, "ResourceManagerAddon::GetMediaBase64ByName");
635 #endif
636     napi_value mediaBase64 = ProcessNameParamV9(env, info, "GetMediaBase64ByName", getMediaBase64Func);
637 #if !defined(__IDE_PREVIEW__)
638     FinishTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR);
639 #endif
640     return mediaBase64;
641 }
642 
__anon840267042002(napi_env env, void *data) 643 auto getPluralCapFunc = [](napi_env env, void *data) {
644     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
645     RState state;
646     if (dataContext->resId_ != 0 || dataContext->resource_ != nullptr) {
647         uint32_t resId = 0;
648         std::shared_ptr<ResourceManager> resMgr = nullptr;
649         bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext, resMgr, resId);
650         if (!ret) {
651             RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to GetHapResourceManager in getPluralCapFunc");
652             dataContext->SetErrorMsg("Failed to get plural string, invalid bundleName or moduleName",
653                 false, ERROR_CODE_INVALID_INPUT_PARAMETER);
654             return;
655         }
656         state = resMgr->GetFormatPluralStringById(dataContext->value_, resId, dataContext->param_,
657             dataContext->jsParams_);
658         if (state != RState::SUCCESS) {
659             dataContext->SetErrorMsg("GetPluralString failed", true, state);
660             return;
661         }
662     } else {
663         state = dataContext->addon_->GetResMgr()->GetFormatPluralStringByName(dataContext->value_,
664             dataContext->resName_.c_str(), dataContext->param_, dataContext->jsParams_);
665         if (state != RState::SUCCESS) {
666             dataContext->SetErrorMsg("GetPluralString failed", false, state);
667             return;
668         }
669     }
670     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsString;
671 };
672 
GetPluralStringValue(napi_env env,napi_callback_info info)673 napi_value ResourceManagerNapiAsyncImpl::GetPluralStringValue(napi_env env, napi_callback_info info)
674 {
675     if (ResourceManagerNapiUtils::IsNapiString(env, info)) {
676         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
677         return nullptr;
678     }
679     return ProcessIdNameParam(env, info, "getPluralStringValue", getPluralCapFunc);
680 }
681 
GetPluralStringByName(napi_env env,napi_callback_info info)682 napi_value ResourceManagerNapiAsyncImpl::GetPluralStringByName(napi_env env, napi_callback_info info)
683 {
684     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
685         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
686         return nullptr;
687     }
688     return ProcessIdNameParam(env, info, "GetPluralStringByName", getPluralCapFunc);
689 }
690 
GetPluralString(napi_env env,napi_callback_info info)691 napi_value ResourceManagerNapiAsyncImpl::GetPluralString(napi_env env, napi_callback_info info)
692 {
693     return ProcessIdNameParam(env, info, "GetPluralString", getPluralCapFunc);
694 }
695 
__anon840267042102(napi_env env, void* data) 696 auto g_getRawFileFunc = [](napi_env env, void* data) {
697     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
698     RState state = dataContext->addon_->GetResMgr()->GetRawFileFromHap(dataContext->path_,
699         dataContext->len_, dataContext->mediaData);
700     if (state != RState::SUCCESS) {
701         dataContext->SetErrorMsg("GetRawFileContent failed", false, state);
702         return;
703     }
704     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsUint8Array;
705 };
706 
GetRawFileContent(napi_env env,napi_callback_info info)707 napi_value ResourceManagerNapiAsyncImpl::GetRawFileContent(napi_env env, napi_callback_info info)
708 {
709     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
710         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
711         return nullptr;
712     }
713     return ProcessOnlyIdParam(env, info, "getRawFileContent", g_getRawFileFunc);
714 }
715 
GetRawFile(napi_env env,napi_callback_info info)716 napi_value ResourceManagerNapiAsyncImpl::GetRawFile(napi_env env, napi_callback_info info)
717 {
718     return ProcessOnlyIdParam(env, info, "getRawFile", g_getRawFileFunc);
719 }
720 
__anon840267042202(napi_env env, void* data) 721 auto g_getRawFileDescriptorFunc = [](napi_env env, void* data) {
722     ResMgrDataContext *context = static_cast<ResMgrDataContext*>(data);
723     RState state = context->addon_->GetResMgr()->GetRawFileDescriptorFromHap(context->path_, context->descriptor_);
724     if (state != RState::SUCCESS) {
725         context->SetErrorMsg("Failed to get descriptor", false, state);
726         return;
727     }
728     context->createValueFunc_ = ResourceManagerNapiUtils::CreateJsRawFd;
729 };
730 
GetRawFd(napi_env env,napi_callback_info info)731 napi_value ResourceManagerNapiAsyncImpl::GetRawFd(napi_env env, napi_callback_info info)
732 {
733     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
734         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
735         return nullptr;
736     }
737     return ProcessOnlyIdParam(env, info, "getRawFd", g_getRawFileDescriptorFunc);
738 }
739 
GetRawFileDescriptor(napi_env env,napi_callback_info info)740 napi_value ResourceManagerNapiAsyncImpl::GetRawFileDescriptor(napi_env env, napi_callback_info info)
741 {
742     return ProcessOnlyIdParam(env, info, "getRawFileDescriptor", g_getRawFileDescriptorFunc);
743 }
744 
__anon840267042302(napi_env env, void* data) 745 auto closeRawFileDescriptorFunc = [](napi_env env, void* data) {
746     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
747     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CloseJsRawFd;
748 };
749 
CloseRawFd(napi_env env,napi_callback_info info)750 napi_value ResourceManagerNapiAsyncImpl::CloseRawFd(napi_env env, napi_callback_info info)
751 {
752     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
753         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
754         return nullptr;
755     }
756     return ProcessOnlyIdParam(env, info, "closeRawFd", closeRawFileDescriptorFunc);
757 }
758 
CloseRawFileDescriptor(napi_env env,napi_callback_info info)759 napi_value ResourceManagerNapiAsyncImpl::CloseRawFileDescriptor(napi_env env, napi_callback_info info)
760 {
761     return ProcessOnlyIdParam(env, info, "closeRawFileDescriptor", closeRawFileDescriptorFunc);
762 }
763 
__anon840267042402(napi_env env, void *data) 764 auto getMediaByNameFunc = [](napi_env env, void *data) {
765     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
766     RState state = dataContext->addon_->GetResMgr()->GetMediaDataByName(dataContext->resName_.c_str(),
767         dataContext->len_, dataContext->mediaData, dataContext->density_);
768     if (state != RState::SUCCESS) {
769         dataContext->SetErrorMsg("Failed to get media data in getMediaByNameFunc", false, state);
770         return;
771     }
772     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsUint8Array;
773     return;
774 };
775 
GetMediaByName(napi_env env,napi_callback_info info)776 napi_value ResourceManagerNapiAsyncImpl::GetMediaByName(napi_env env, napi_callback_info info)
777 {
778     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
779         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
780         return nullptr;
781     }
782 #if !defined(__IDE_PREVIEW__)
783     StartTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR, "ResourceManagerAddon::GetMediaByName");
784 #endif
785     napi_value media = ProcessNameParamV9(env, info, "getMediaByName", getMediaByNameFunc);
786 #if !defined(__IDE_PREVIEW__)
787     FinishTraceEx(HITRACE_LEVEL_INFO, HITRACE_TAG_GLOBAL_RESMGR);
788 #endif
789     return media;
790 }
791 
__anon840267042502(napi_env env, void *data) 792 auto getConfigFunc = [](napi_env env, void *data) {
793     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
794     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsConfig;
795 };
796 
GetConfiguration(napi_env env,napi_callback_info info)797 napi_value ResourceManagerNapiAsyncImpl::GetConfiguration(napi_env env, napi_callback_info info)
798 {
799     return ProcessNoParam(env, info, "GetConfiguration", getConfigFunc);
800 }
801 
__anon840267042602(napi_env env, void *data) 802 auto getDeviceCapFunc = [](napi_env env, void *data) {
803     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
804     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsDeviceCap;
805 };
806 
GetDeviceCapability(napi_env env,napi_callback_info info)807 napi_value ResourceManagerNapiAsyncImpl::GetDeviceCapability(napi_env env, napi_callback_info info)
808 {
809     return ProcessNoParam(env, info, "GetDeviceCapability", getDeviceCapFunc);
810 }
811 
__anon840267042702(napi_env env, void* data) 812 auto getRawFileListFunc = [](napi_env env, void* data) {
813     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
814     RState state = dataContext->addon_->GetResMgr()->GetRawFileList(dataContext->path_, dataContext->arrayValue_);
815     if (state != SUCCESS) {
816         dataContext->SetErrorMsg("GetRawFileList failed state", false, state);
817         return;
818     }
819     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsArray;
820 };
821 
GetRawFileList(napi_env env,napi_callback_info info)822 napi_value ResourceManagerNapiAsyncImpl::GetRawFileList(napi_env env, napi_callback_info info)
823 {
824     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
825         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
826         return nullptr;
827     }
828     return ProcessOnlyIdParam(env, info, "getRawFileList", getRawFileListFunc);
829 }
830 
__anon840267042802(napi_env env, void* data) 831 auto getColorFunc = [](napi_env env, void* data) {
832     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
833     std::shared_ptr<ResourceManager> resMgr = nullptr;
834     uint32_t resId = 0;
835 
836     if (!ResourceManagerNapiUtils::GetHapResourceManager(dataContext, resMgr, resId)) {
837         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to GetHapResourceManager in getColorFunc");
838         dataContext->SetErrorMsg("Failed to get color, invalid bundleName or moduleName",
839             false, ERROR_CODE_INVALID_INPUT_PARAMETER);
840         return;
841     }
842     RState state = resMgr->GetColorById(resId, dataContext->colorValue_);
843     if (state != RState::SUCCESS) {
844         dataContext->SetErrorMsg("GetColorById failed state", true, state);
845         return;
846     }
847     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsColor;
848 };
849 
GetColor(napi_env env,napi_callback_info info)850 napi_value ResourceManagerNapiAsyncImpl::GetColor(napi_env env, napi_callback_info info)
851 {
852     if (ResourceManagerNapiUtils::IsNapiNumber(env, info)) {
853         return ProcessIdParamV9(env, info, "getColor", getColorFunc);
854     } else if (ResourceManagerNapiUtils::IsNapiObject(env, info)) {
855         return ProcessResourceParamV9(env, info, "getColor", getColorFunc);
856     } else {
857         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
858         return nullptr;
859     }
860 }
861 
__anon840267042902(napi_env env, void* data) 862 auto getColorByNameFunc = [](napi_env env, void* data) {
863     ResMgrDataContext *dataContext = static_cast<ResMgrDataContext*>(data);
864     RState state = dataContext->addon_->GetResMgr()->GetColorByName(dataContext->resName_.c_str(),
865         dataContext->colorValue_);
866     if (state != RState::SUCCESS) {
867         dataContext->SetErrorMsg("getColorByNameFunc failed state", false, state);
868         return;
869     }
870     dataContext->createValueFunc_ = ResourceManagerNapiUtils::CreateJsColor;
871 };
872 
GetColorByName(napi_env env,napi_callback_info info)873 napi_value ResourceManagerNapiAsyncImpl::GetColorByName(napi_env env, napi_callback_info info)
874 {
875     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
876         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
877         return nullptr;
878     }
879     return ProcessNameParamV9(env, info, "getColorByName", getColorByNameFunc);
880 }
881 } // namespace Resource
882 } // namespace Global
883 } // namespace OHOS
884