• 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_sync_impl.h"
17 
18 #ifdef __IDE_PREVIEW__
19 #include <limits.h>
20 #endif
21 #include <unordered_map>
22 #include "drawable_descriptor/drawable_descriptor.h"
23 #include "drawable_descriptor/js_drawable_descriptor.h"
24 #include "resource_manager_napi_utils.h"
25 #include "resource_manager_addon.h"
26 #include "utils/utils.h"
27 
28 namespace OHOS {
29 namespace Global {
30 namespace Resource {
31 using namespace std::placeholders;
32 constexpr int ARRAY_SUBCRIPTOR_ZERO = 0;
33 constexpr int ARRAY_SUBCRIPTOR_ONE = 1;
34 constexpr int ARRAY_SUBCRIPTOR_TWO = 2;
35 constexpr int PARAMS_NUM_TWO = 2;
36 constexpr int PARAMS_NUM_THREE = 3;
ResourceManagerNapiSyncImpl()37 ResourceManagerNapiSyncImpl::ResourceManagerNapiSyncImpl()
38 {}
39 
~ResourceManagerNapiSyncImpl()40 ResourceManagerNapiSyncImpl::~ResourceManagerNapiSyncImpl()
41 {}
42 
43 std::unordered_map<std::string, std::function<napi_value(napi_env&, napi_callback_info&)>>
44     ResourceManagerNapiSyncImpl::syncFuncMatch {
__anon915834830102(napi_env& env, napi_callback_info& info) 45     {"GetStringSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
46         return ResourceManagerNapiSyncImpl::GetStringSync(env, info);}},
__anon915834830202(napi_env& env, napi_callback_info& info) 47     {"GetStringByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
48         return ResourceManagerNapiSyncImpl::GetStringByNameSync(env, info);}},
__anon915834830302(napi_env& env, napi_callback_info& info) 49     {"GetBoolean", [](napi_env& env, napi_callback_info& info) -> napi_value {
50         return ResourceManagerNapiSyncImpl::GetBoolean(env, info);}},
__anon915834830402(napi_env& env, napi_callback_info& info) 51     {"GetBooleanByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
52         return ResourceManagerNapiSyncImpl::GetBooleanByName(env, info);}},
__anon915834830502(napi_env& env, napi_callback_info& info) 53     {"GetNumber", [](napi_env& env, napi_callback_info& info) -> napi_value {
54         return ResourceManagerNapiSyncImpl::GetNumber(env, info);}},
__anon915834830602(napi_env& env, napi_callback_info& info) 55     {"GetNumberByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
56         return ResourceManagerNapiSyncImpl::GetNumberByName(env, info);}},
__anon915834830702(napi_env& env, napi_callback_info& info) 57     {"GetDrawableDescriptor", [](napi_env& env, napi_callback_info& info) -> napi_value {
58         return ResourceManagerNapiSyncImpl::GetDrawableDescriptor(env, info);}},
__anon915834830802(napi_env& env, napi_callback_info& info) 59     {"GetDrawableDescriptorByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
60         return ResourceManagerNapiSyncImpl::GetDrawableDescriptorByName(env, info);}},
__anon915834830902(napi_env& env, napi_callback_info& info) 61     {"GetColorSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
62         return ResourceManagerNapiSyncImpl::GetColorSync(env, info);}},
__anon915834830a02(napi_env& env, napi_callback_info& info) 63     {"GetColorByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
64         return ResourceManagerNapiSyncImpl::GetColorByNameSync(env, info);}},
__anon915834830b02(napi_env& env, napi_callback_info& info) 65     {"AddResource", [](napi_env& env, napi_callback_info& info) -> napi_value {
66         return ResourceManagerNapiSyncImpl::AddResource(env, info);}},
__anon915834830c02(napi_env& env, napi_callback_info& info) 67     {"RemoveResource", [](napi_env& env, napi_callback_info& info) -> napi_value {
68         return ResourceManagerNapiSyncImpl::RemoveResource(env, info);}},
__anon915834830d02(napi_env& env, napi_callback_info& info) 69     {"GetMediaContentBase64Sync", [](napi_env& env, napi_callback_info& info) -> napi_value {
70         return ResourceManagerNapiSyncImpl::GetMediaContentBase64Sync(env, info);}},
__anon915834830e02(napi_env& env, napi_callback_info& info) 71     {"GetMediaContentSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
72         return ResourceManagerNapiSyncImpl::GetMediaContentSync(env, info);}},
__anon915834830f02(napi_env& env, napi_callback_info& info) 73     {"GetPluralStringValueSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
74         return ResourceManagerNapiSyncImpl::GetPluralStringValueSync(env, info);}},
__anon915834831002(napi_env& env, napi_callback_info& info) 75     {"GetStringArrayValueSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
76         return ResourceManagerNapiSyncImpl::GetStringArrayValueSync(env, info);}},
__anon915834831102(napi_env& env, napi_callback_info& info) 77     {"GetRawFileContentSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
78         return ResourceManagerNapiSyncImpl::GetRawFileContentSync(env, info);}},
__anon915834831202(napi_env& env, napi_callback_info& info) 79     {"GetRawFdSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
80         return ResourceManagerNapiSyncImpl::GetRawFdSync(env, info);}},
__anon915834831302(napi_env& env, napi_callback_info& info) 81     {"CloseRawFdSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
82         return ResourceManagerNapiSyncImpl::CloseRawFdSync(env, info);}},
__anon915834831402(napi_env& env, napi_callback_info& info) 83     {"GetRawFileListSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
84         return ResourceManagerNapiSyncImpl::GetRawFileListSync(env, info);}},
__anon915834831502(napi_env& env, napi_callback_info& info) 85     {"GetPluralStringByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
86         return ResourceManagerNapiSyncImpl::GetPluralStringByNameSync(env, info);}},
__anon915834831602(napi_env& env, napi_callback_info& info) 87     {"GetMediaBase64ByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
88         return ResourceManagerNapiSyncImpl::GetMediaBase64ByNameSync(env, info);}},
__anon915834831702(napi_env& env, napi_callback_info& info) 89     {"GetMediaByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
90         return ResourceManagerNapiSyncImpl::GetMediaByNameSync(env, info);}},
__anon915834831802(napi_env& env, napi_callback_info& info) 91     {"GetStringArrayByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
92         return ResourceManagerNapiSyncImpl::GetStringArrayByNameSync(env, info);}},
__anon915834831902(napi_env& env, napi_callback_info& info) 93     {"GetConfigurationSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
94         return ResourceManagerNapiSyncImpl::GetConfigurationSync(env, info);}},
__anon915834831a02(napi_env& env, napi_callback_info& info) 95     {"GetDeviceCapabilitySync", [](napi_env& env, napi_callback_info& info) -> napi_value {
96         return ResourceManagerNapiSyncImpl::GetDeviceCapabilitySync(env, info);}},
__anon915834831b02(napi_env& env, napi_callback_info& info) 97     {"GetLocales", [](napi_env& env, napi_callback_info& info) -> napi_value {
98         return ResourceManagerNapiSyncImpl::GetLocales(env, info);}},
__anon915834831c02(napi_env& env, napi_callback_info& info) 99     {"GetSymbol", [](napi_env& env, napi_callback_info& info) -> napi_value {
100         return ResourceManagerNapiSyncImpl::GetSymbol(env, info);}},
__anon915834831d02(napi_env& env, napi_callback_info& info) 101     {"GetSymbolByName", [](napi_env& env, napi_callback_info& info) -> napi_value {
102         return ResourceManagerNapiSyncImpl::GetSymbolByName(env, info);}},
__anon915834831e02(napi_env& env, napi_callback_info& info) 103     {"IsRawDir", [](napi_env& env, napi_callback_info& info) -> napi_value {
104         return ResourceManagerNapiSyncImpl::IsRawDir(env, info);}},
__anon915834831f02(napi_env& env, napi_callback_info& info) 105     {"GetOverrideResourceManager", [](napi_env& env, napi_callback_info& info) -> napi_value {
106         return ResourceManagerNapiSyncImpl::GetOverrideResourceManager(env, info);}},
__anon915834832002(napi_env& env, napi_callback_info& info) 107     {"GetOverrideConfiguration", [](napi_env& env, napi_callback_info& info) -> napi_value {
108         return ResourceManagerNapiSyncImpl::GetOverrideConfiguration(env, info);}},
__anon915834832102(napi_env& env, napi_callback_info& info) 109     {"UpdateOverrideConfiguration", [](napi_env& env, napi_callback_info& info) -> napi_value {
110         return ResourceManagerNapiSyncImpl::UpdateOverrideConfiguration(env, info);}},
__anon915834832202(napi_env& env, napi_callback_info& info) 111     {"GetIntPluralStringValueSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
112         return ResourceManagerNapiSyncImpl::GetIntPluralStringValueSync(env, info);}},
__anon915834832302(napi_env& env, napi_callback_info& info) 113     {"GetDoublePluralStringValueSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
114         return ResourceManagerNapiSyncImpl::GetDoublePluralStringValueSync(env, info);}},
__anon915834832402(napi_env& env, napi_callback_info& info) 115     {"GetIntPluralStringByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
116         return ResourceManagerNapiSyncImpl::GetIntPluralStringByNameSync(env, info);}},
__anon915834832502(napi_env& env, napi_callback_info& info) 117     {"GetDoublePluralStringByNameSync", [](napi_env& env, napi_callback_info& info) -> napi_value {
118         return ResourceManagerNapiSyncImpl::GetDoublePluralStringByNameSync(env, info);}},
119 };
120 
GetResource(napi_env env,napi_callback_info info,const std::string & functionName)121 napi_value ResourceManagerNapiSyncImpl::GetResource(napi_env env, napi_callback_info info,
122     const std::string &functionName)
123 {
124     auto functionIndex = syncFuncMatch.find(functionName);
125     if (functionIndex == syncFuncMatch.end()) {
126         RESMGR_HILOGI(RESMGR_JS_TAG, "Invalid functionName, %{public}s", functionName.c_str());
127         return nullptr;
128     }
129     return functionIndex->second(env, info);
130 }
131 
InitPathAddon(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)132 int32_t ResourceManagerNapiSyncImpl::InitPathAddon(napi_env env, napi_callback_info info,
133     std::unique_ptr<ResMgrDataContext> &dataContext)
134 {
135     GET_PARAMS(env, info, PARAMS_NUM_TWO);
136     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
137     if (dataContext->addon_ == nullptr) {
138         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon in InitPathAddon");
139         return NOT_FOUND;
140     }
141     if (ResourceManagerNapiUtils::IsNapiString(env, info)) {
142         dataContext->path_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
143     } else {
144         return ERROR_CODE_INVALID_INPUT_PARAMETER;
145     }
146     return SUCCESS;
147 }
148 
GetRawFileListSync(napi_env env,napi_callback_info info)149 napi_value ResourceManagerNapiSyncImpl::GetRawFileListSync(napi_env env, napi_callback_info info)
150 {
151     GET_PARAMS(env, info, PARAMS_NUM_TWO);
152 
153     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
154 
155     int32_t ret = InitPathAddon(env, info, dataContext);
156     if (ret != RState::SUCCESS) {
157         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to init para in GetRawFileListSync by rawfile");
158         ResourceManagerNapiUtils::NapiThrow(env, ret);
159         return nullptr;
160     }
161 
162     RState state = dataContext->addon_->GetResMgr()->GetRawFileList(dataContext->path_.c_str(),
163         dataContext->arrayValue_);
164     if (state != RState::SUCCESS || dataContext->arrayValue_.empty()) {
165         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get rawfile list");
166         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_RES_PATH_INVALID);
167         return nullptr;
168     }
169 
170     return ResourceManagerNapiUtils::CreateJsArray(env, *dataContext);
171 }
172 
GetRawFileContentSync(napi_env env,napi_callback_info info)173 napi_value ResourceManagerNapiSyncImpl::GetRawFileContentSync(napi_env env, napi_callback_info info)
174 {
175     GET_PARAMS(env, info, PARAMS_NUM_TWO);
176 
177     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
178 
179     int32_t ret = InitPathAddon(env, info, dataContext);
180     if (ret != RState::SUCCESS) {
181         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to init para in GetRawFileContentSync");
182         ResourceManagerNapiUtils::NapiThrow(env, ret);
183         return nullptr;
184     }
185 
186     RState state = dataContext->addon_->GetResMgr()->GetRawFileFromHap(dataContext->path_,
187         dataContext->len_, dataContext->mediaData);
188     if (state != SUCCESS) {
189         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get rawfile");
190         ResourceManagerNapiUtils::NapiThrow(env, state);
191         return nullptr;
192     }
193 
194     return ResourceManagerNapiUtils::CreateJsUint8Array(env, *dataContext);
195 }
196 
GetRawFdSync(napi_env env,napi_callback_info info)197 napi_value ResourceManagerNapiSyncImpl::GetRawFdSync(napi_env env, napi_callback_info info)
198 {
199     GET_PARAMS(env, info, PARAMS_NUM_TWO);
200 
201     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
202 
203     int32_t ret = InitPathAddon(env, info, dataContext);
204     if (ret != RState::SUCCESS) {
205         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to init para in GetRawFdSync");
206         ResourceManagerNapiUtils::NapiThrow(env, ret);
207         return nullptr;
208     }
209 
210     RState state = dataContext->addon_->GetResMgr()->GetRawFileDescriptorFromHap(dataContext->path_,
211         dataContext->descriptor_);
212     if (state != RState::SUCCESS) {
213         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get rawfd");
214         ResourceManagerNapiUtils::NapiThrow(env, state);
215         return nullptr;
216     }
217     return ResourceManagerNapiUtils::CreateJsRawFd(env, *dataContext);
218 }
219 
CloseRawFdSync(napi_env env,napi_callback_info info)220 napi_value ResourceManagerNapiSyncImpl::CloseRawFdSync(napi_env env, napi_callback_info info)
221 {
222     GET_PARAMS(env, info, PARAMS_NUM_TWO);
223 
224     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
225 
226     int32_t ret = InitPathAddon(env, info, dataContext);
227     if (ret != RState::SUCCESS) {
228         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to init para in CloseRawFdSync");
229         ResourceManagerNapiUtils::NapiThrow(env, ret);
230         return nullptr;
231     }
232 
233     RState state = dataContext->addon_->GetResMgr()->CloseRawFileDescriptor(dataContext->path_);
234     if (state != RState::SUCCESS) {
235         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to close rawfd");
236         ResourceManagerNapiUtils::NapiThrow(env, state);
237         return nullptr;
238     }
239 
240     napi_value undefined;
241     if (napi_get_undefined(env, &undefined) != napi_ok) {
242         return nullptr;
243     }
244     return undefined;
245 }
246 
InitParamsFromParamArray(napi_env env,napi_value value,std::vector<std::tuple<ResourceManager::NapiValueType,std::string>> & jsParams)247 bool ResourceManagerNapiSyncImpl::InitParamsFromParamArray(napi_env env, napi_value value,
248     std::vector<std::tuple<ResourceManager::NapiValueType, std::string>> &jsParams)
249 {
250     napi_valuetype valuetype = ResourceManagerNapiUtils::GetType(env, value);
251     if (valuetype == napi_number) {
252         double param;
253         if (napi_get_value_double(env, value, &param) != napi_ok) {
254             RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get parameter value in InitParamsFromParamArray");
255             return false;
256         }
257         jsParams.push_back(std::make_tuple(ResourceManager::NapiValueType::NAPI_NUMBER, std::to_string(param)));
258         return true;
259     }
260     if (valuetype == napi_string) {
261         size_t len = 0;
262         if (napi_get_value_string_utf8(env, value, nullptr, 0, &len) != napi_ok) {
263             RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get parameter length in InitParamsFromParamArray");
264             return false;
265         }
266         std::vector<char> buf(len + 1);
267         if (napi_get_value_string_utf8(env, value, buf.data(), len + 1, &len) != napi_ok) {
268             RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get parameter value in InitParamsFromParamArray");
269             return false;
270         }
271         jsParams.push_back(std::make_tuple(ResourceManager::NapiValueType::NAPI_STRING, buf.data()));
272         return true;
273     }
274     return false;
275 }
276 
InitNapiParameters(napi_env env,napi_callback_info info,std::vector<std::tuple<ResourceManager::NapiValueType,std::string>> & jsParams)277 bool ResourceManagerNapiSyncImpl::InitNapiParameters(napi_env env, napi_callback_info info,
278     std::vector<std::tuple<ResourceManager::NapiValueType, std::string>> &jsParams)
279 {
280     size_t size = 1;
281     napi_get_cb_info(env, info, &size, nullptr, nullptr, nullptr);
282     // one parameter: resId or resource or Name
283     if (size == 1) {
284         return true;
285     }
286     napi_value paramArray[size];
287     napi_get_cb_info(env, info, &size, paramArray, nullptr, nullptr);
288 
289     for (size_t i = 1; i < size; ++i) {
290         if (!InitParamsFromParamArray(env, paramArray[i], jsParams)) {
291             return false;
292         }
293     }
294     return true;
295 }
296 
InitIdResourceAddon(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)297 int32_t ResourceManagerNapiSyncImpl::InitIdResourceAddon(napi_env env, napi_callback_info info,
298     std::unique_ptr<ResMgrDataContext> &dataContext)
299 {
300     GET_PARAMS(env, info, PARAMS_NUM_TWO);
301     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
302     if (dataContext->addon_ == nullptr) {
303         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon in InitIdResourceAddon");
304         return NOT_FOUND;
305     }
306     if (ResourceManagerNapiUtils::IsNapiNumber(env, info)) {
307         dataContext->resId_ = ResourceManagerNapiUtils::GetResId(env, argc, argv);
308     } else if (ResourceManagerNapiUtils::IsNapiObject(env, info)) {
309         auto resourcePtr = std::make_shared<ResourceManager::Resource>();
310         int32_t retCode = ResourceManagerNapiUtils::GetResourceObject(env, resourcePtr, argv[ARRAY_SUBCRIPTOR_ZERO]);
311         dataContext->resource_ = resourcePtr;
312         return retCode;
313     } else {
314         return ERROR_CODE_INVALID_INPUT_PARAMETER;
315     }
316     return SUCCESS;
317 }
318 
ProcessStrResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)319 int32_t ResourceManagerNapiSyncImpl::ProcessStrResource(napi_env env, napi_callback_info info,
320     std::unique_ptr<ResMgrDataContext> &dataContext)
321 {
322     std::shared_ptr<ResourceManager> resMgr = nullptr;
323     uint32_t resId = 0;
324     bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
325     if (!ret) {
326         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetStringSync");
327         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
328     }
329 
330     if (!InitNapiParameters(env, info, dataContext->jsParams_)) {
331         RESMGR_HILOGE(RESMGR_JS_TAG, "GetStringSync formatting error");
332         return ERROR_CODE_RES_ID_FORMAT_ERROR;
333     }
334 
335     RState state = resMgr->GetStringFormatById(resId, dataContext->value_, dataContext->jsParams_);
336     if (state != RState::SUCCESS) {
337         dataContext->SetErrorMsg("GetStringSync failed state", true);
338         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
339         return state;
340     }
341     return SUCCESS;
342 }
343 
GetStringSync(napi_env env,napi_callback_info info)344 napi_value ResourceManagerNapiSyncImpl::GetStringSync(napi_env env, napi_callback_info info)
345 {
346     GET_PARAMS(env, info, PARAMS_NUM_TWO);
347 
348     auto dataContext = std::make_unique<ResMgrDataContext>();
349     if (dataContext == nullptr) {
350         return nullptr;
351     }
352     int32_t state = InitIdResourceAddon(env, info, dataContext);
353     if (state != RState::SUCCESS) {
354         dataContext->SetErrorMsg("Failed to init para in GetStringSync", true);
355         ResourceManagerNapiUtils::NapiThrow(env, state);
356         return nullptr;
357     }
358 
359     state = ProcessStrResource(env, info, dataContext);
360     if (state != RState::SUCCESS) {
361         dataContext->SetErrorMsg("Failed to process string in GetStringSync", true);
362         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
363         return nullptr;
364     }
365 
366     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
367 }
368 
ProcessSymbolResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)369 int32_t ResourceManagerNapiSyncImpl::ProcessSymbolResource(napi_env env, napi_callback_info info,
370     std::unique_ptr<ResMgrDataContext> &dataContext)
371 {
372     std::shared_ptr<ResourceManager> resMgr = nullptr;
373     uint32_t resId = 0;
374     bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
375     if (!ret) {
376         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetSymbol");
377         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
378     }
379 
380     RState state = resMgr->GetSymbolById(resId, dataContext->symbolValue_);
381     if (state != RState::SUCCESS) {
382         dataContext->SetErrorMsg("GetSymbol failed state", true);
383         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
384     }
385     return state;
386 }
387 
GetSymbol(napi_env env,napi_callback_info info)388 napi_value ResourceManagerNapiSyncImpl::GetSymbol(napi_env env, napi_callback_info info)
389 {
390     GET_PARAMS(env, info, PARAMS_NUM_TWO);
391 
392     auto dataContext = std::make_unique<ResMgrDataContext>();
393     if (dataContext == nullptr) {
394         return nullptr;
395     }
396     int32_t state = InitIdResourceAddon(env, info, dataContext);
397     if (state != RState::SUCCESS) {
398         dataContext->SetErrorMsg("Failed to init para in GetSymbol", true);
399         ResourceManagerNapiUtils::NapiThrow(env, state);
400         return nullptr;
401     }
402 
403     state = ProcessSymbolResource(env, info, dataContext);
404     if (state != RState::SUCCESS) {
405         dataContext->SetErrorMsg("Failed to process symbol in GetSymbol", true);
406         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
407         return nullptr;
408     }
409 
410     return ResourceManagerNapiUtils::CreateJsSymbol(env, *dataContext);
411 }
412 
ProcessColorResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)413 int32_t ResourceManagerNapiSyncImpl::ProcessColorResource(napi_env env, napi_callback_info info,
414     std::unique_ptr<ResMgrDataContext> &dataContext)
415 {
416     std::shared_ptr<ResourceManager> resMgr = nullptr;
417     uint32_t resId = 0;
418     bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
419     if (!ret) {
420         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in ProcessColorResource");
421         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
422     }
423 
424     RState state = resMgr->GetColorById(resId, dataContext->colorValue_);
425     if (state != RState::SUCCESS) {
426         dataContext->SetErrorMsg("GetColor failed state", true);
427         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
428         return state;
429     }
430     return SUCCESS;
431 }
432 
GetColorSync(napi_env env,napi_callback_info info)433 napi_value ResourceManagerNapiSyncImpl::GetColorSync(napi_env env, napi_callback_info info)
434 {
435     GET_PARAMS(env, info, PARAMS_NUM_TWO);
436 
437     auto dataContext = std::make_unique<ResMgrDataContext>();
438     if (dataContext == nullptr) {
439         return nullptr;
440     }
441     int32_t state = InitIdResourceAddon(env, info, dataContext);
442     if (state != RState::SUCCESS) {
443         dataContext->SetErrorMsg("Failed to init para in GetColorSync", true);
444         ResourceManagerNapiUtils::NapiThrow(env, state);
445         return nullptr;
446     }
447 
448     state = ProcessColorResource(env, info, dataContext);
449     if (state != RState::SUCCESS) {
450         dataContext->SetErrorMsg("Failed to process string in GetColorSync", true);
451         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
452         return nullptr;
453     }
454 
455     return ResourceManagerNapiUtils::CreateJsColor(env, *dataContext);
456 }
457 
ProcessNumResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)458 int32_t ResourceManagerNapiSyncImpl::ProcessNumResource(napi_env env, napi_callback_info info,
459     std::unique_ptr<ResMgrDataContext> &dataContext)
460 {
461     std::shared_ptr<ResourceManager> resMgr = nullptr;
462     uint32_t resId = 0;
463     bool ret = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
464     if (!ret) {
465         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to ResourceManagerNapiUtils::GetHapResourceManager in GetNumber");
466         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
467     }
468 
469     RState state = resMgr->GetIntegerById(resId, dataContext->iValue_);
470     if (state != RState::SUCCESS) {
471         state = resMgr->GetFloatById(resId, dataContext->fValue_);
472         return state;
473     }
474     return SUCCESS;
475 }
476 
GetNumber(napi_env env,napi_callback_info info)477 napi_value ResourceManagerNapiSyncImpl::GetNumber(napi_env env, napi_callback_info info)
478 {
479     GET_PARAMS(env, info, PARAMS_NUM_TWO);
480 
481     auto dataContext = std::make_unique<ResMgrDataContext>();
482     if (dataContext == nullptr) {
483         return nullptr;
484     }
485     int32_t state = InitIdResourceAddon(env, info, dataContext);
486     if (state != RState::SUCCESS) {
487         dataContext->SetErrorMsg("Failed to init para in GetNumber", true);
488         ResourceManagerNapiUtils::NapiThrow(env, state);
489         return nullptr;
490     }
491 
492     state = ProcessNumResource(env, info, dataContext);
493     if (state != RState::SUCCESS) {
494         dataContext->SetErrorMsg("Failed to process string in GetNumber", true);
495         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
496         return nullptr;
497     }
498 
499     return ResourceManagerNapiUtils::CreateJsNumber(env, *dataContext);
500 }
501 
ProcessBoolResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)502 int32_t ResourceManagerNapiSyncImpl::ProcessBoolResource(napi_env env, napi_callback_info info,
503     std::unique_ptr<ResMgrDataContext> &dataContext)
504 {
505     std::shared_ptr<ResourceManager> resMgr = nullptr;
506     uint32_t resId = 0;
507     bool ret2 = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
508     if (!ret2) {
509         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetBoolean");
510         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
511     }
512     RState state = resMgr->GetBooleanById(resId, dataContext->bValue_);
513     if (state != RState::SUCCESS) {
514         dataContext->SetErrorMsg("Failed to GetBoolean state", true);
515         return state;
516     }
517     return SUCCESS;
518 }
519 
GetBoolean(napi_env env,napi_callback_info info)520 napi_value ResourceManagerNapiSyncImpl::GetBoolean(napi_env env, napi_callback_info info)
521 {
522     GET_PARAMS(env, info, PARAMS_NUM_TWO);
523 
524     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
525 
526     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
527     if (state != RState::SUCCESS) {
528         dataContext->SetErrorMsg("Failed to init para in GetBoolean", true);
529         ResourceManagerNapiUtils::NapiThrow(env, state);
530         return nullptr;
531     }
532 
533     state = ProcessBoolResource(env, info, dataContext);
534     if (state != RState::SUCCESS) {
535         dataContext->SetErrorMsg("Failed to process bool resource in GetBoolean", true);
536         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
537         return nullptr;
538     }
539 
540     return ResourceManagerNapiUtils::CreateJsBool(env, *dataContext);
541 }
542 
ProcesstMediaContentBase64Resource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)543 int32_t ResourceManagerNapiSyncImpl::ProcesstMediaContentBase64Resource(napi_env env, napi_callback_info info,
544     std::unique_ptr<ResMgrDataContext> &dataContext)
545 {
546     std::shared_ptr<ResourceManager> resMgr = nullptr;
547     uint32_t resId = 0;
548     bool ret2 = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
549     if (!ret2) {
550         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetMediaContentBase64Sync");
551         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
552     }
553     RState state = resMgr->GetMediaBase64DataById(resId, dataContext->value_, dataContext->density_);
554     if (state != RState::SUCCESS) {
555         dataContext->SetErrorMsg("Failed to GetMediaContentBase64Sync state", true);
556         return state;
557     }
558     return SUCCESS;
559 }
560 
GetMediaContentBase64Sync(napi_env env,napi_callback_info info)561 napi_value ResourceManagerNapiSyncImpl::GetMediaContentBase64Sync(napi_env env, napi_callback_info info)
562 {
563     GET_PARAMS(env, info, PARAMS_NUM_TWO);
564 
565     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
566 
567     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
568     if (state != RState::SUCCESS) {
569         dataContext->SetErrorMsg("Failed to init para in GetMediaContentBase64Sync", true);
570         ResourceManagerNapiUtils::NapiThrow(env, state);
571         return nullptr;
572     }
573     // density optional parameters
574     if (ResourceManagerNapiUtils::GetDataType(env, argv[ARRAY_SUBCRIPTOR_ONE], dataContext->density_) != SUCCESS) {
575         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
576         return nullptr;
577     }
578     state = ProcesstMediaContentBase64Resource(env, info, dataContext);
579     if (state != RState::SUCCESS) {
580         dataContext->SetErrorMsg("Failed to process media base64 resource in GetMediaContentBase64Sync", true);
581         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
582         return nullptr;
583     }
584 
585     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
586 }
587 
ProcessMediaContentResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)588 int32_t ResourceManagerNapiSyncImpl::ProcessMediaContentResource(napi_env env, napi_callback_info info,
589     std::unique_ptr<ResMgrDataContext> &dataContext)
590 {
591     std::shared_ptr<ResourceManager> resMgr = nullptr;
592     uint32_t resId = 0;
593     bool ret2 = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
594     if (!ret2) {
595         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetMediaContentSync");
596         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
597     }
598     RState state = resMgr->GetMediaDataById(resId, dataContext->len_, dataContext->mediaData,
599         dataContext->density_);
600     if (state != RState::SUCCESS) {
601         dataContext->SetErrorMsg("Failed to GetMediaContentSync state", true);
602         return state;
603     }
604     return SUCCESS;
605 }
606 
GetMediaContentSync(napi_env env,napi_callback_info info)607 napi_value ResourceManagerNapiSyncImpl::GetMediaContentSync(napi_env env, napi_callback_info info)
608 {
609     GET_PARAMS(env, info, PARAMS_NUM_TWO);
610 
611     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
612 
613     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
614     if (state != RState::SUCCESS) {
615         dataContext->SetErrorMsg("Failed to init para in GetMediaContentSync", true);
616         ResourceManagerNapiUtils::NapiThrow(env, state);
617         return nullptr;
618     }
619     // density optional parameters
620     if (ResourceManagerNapiUtils::GetDataType(env, argv[ARRAY_SUBCRIPTOR_ONE], dataContext->density_) != SUCCESS) {
621         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
622         return nullptr;
623     }
624     state = ProcessMediaContentResource(env, info, dataContext);
625     if (state != RState::SUCCESS) {
626         dataContext->SetErrorMsg("Failed to process media resource in GetMediaContentSync", true);
627         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
628         return nullptr;
629     }
630 
631     return ResourceManagerNapiUtils::CreateJsUint8Array(env, *dataContext);
632 }
633 
ProcessPluralStringValueResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)634 int32_t ResourceManagerNapiSyncImpl::ProcessPluralStringValueResource(napi_env env, napi_callback_info info,
635     std::unique_ptr<ResMgrDataContext> &dataContext)
636 {
637     std::shared_ptr<ResourceManager> resMgr = nullptr;
638     uint32_t resId = 0;
639     bool ret2 = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
640     if (!ret2) {
641         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetPluralStringValueSync");
642         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
643     }
644     if (!InitNapiParameters(env, info, dataContext->jsParams_)) {
645         RESMGR_HILOGE(RESMGR_JS_TAG, "GetPluralStringValueSync formatting error");
646         return ERROR_CODE_RES_ID_FORMAT_ERROR;
647     }
648     RState state = resMgr->GetFormatPluralStringById(dataContext->value_, resId, dataContext->param_,
649         dataContext->jsParams_);
650     if (state != RState::SUCCESS) {
651         dataContext->SetErrorMsg("Failed to GetPluralStringValueSync state", true, state);
652         return state;
653     }
654     return SUCCESS;
655 }
656 
GetPluralStringValueSync(napi_env env,napi_callback_info info)657 napi_value ResourceManagerNapiSyncImpl::GetPluralStringValueSync(napi_env env, napi_callback_info info)
658 {
659     GET_PARAMS(env, info, PARAMS_NUM_TWO);
660 
661     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
662 
663     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
664     if (state != RState::SUCCESS) {
665         dataContext->SetErrorMsg("Failed to init para in GetPluralStringValueSync", true);
666         ResourceManagerNapiUtils::NapiThrow(env, state);
667         return nullptr;
668     }
669 
670     if (ResourceManagerNapiUtils::GetType(env, argv[ARRAY_SUBCRIPTOR_ONE]) != napi_number) {
671         RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number in GetPluralStringValueSync");
672         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
673         return nullptr;
674     }
675     napi_get_value_int32(env, argv[ARRAY_SUBCRIPTOR_ONE], &dataContext->param_);
676 
677     state = ProcessPluralStringValueResource(env, info, dataContext);
678     if (state != RState::SUCCESS) {
679         dataContext->SetErrorMsg("Failed to process plural string resource in GetPluralStringValueSync", true);
680         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
681         return nullptr;
682     }
683 
684     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
685 }
686 
ProcessStringArrayValueResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)687 int32_t ResourceManagerNapiSyncImpl::ProcessStringArrayValueResource(napi_env env, napi_callback_info info,
688     std::unique_ptr<ResMgrDataContext> &dataContext)
689 {
690     std::shared_ptr<ResourceManager> resMgr = nullptr;
691     uint32_t resId = 0;
692     bool ret2 = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
693     if (!ret2) {
694         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetStringArrayValueSync");
695         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
696     }
697     RState state = resMgr->GetStringArrayById(resId, dataContext->arrayValue_);
698     if (state != RState::SUCCESS) {
699         dataContext->SetErrorMsg("Failed to GetStringArrayValueSync state", true);
700         return state;
701     }
702     return SUCCESS;
703 }
704 
GetStringArrayValueSync(napi_env env,napi_callback_info info)705 napi_value ResourceManagerNapiSyncImpl::GetStringArrayValueSync(napi_env env, napi_callback_info info)
706 {
707     GET_PARAMS(env, info, PARAMS_NUM_TWO);
708 
709     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
710 
711     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
712     if (state != RState::SUCCESS) {
713         dataContext->SetErrorMsg("Failed to init para in GetStringArrayValueSync", true);
714         ResourceManagerNapiUtils::NapiThrow(env, state);
715         return nullptr;
716     }
717 
718     state = ProcessStringArrayValueResource(env, info, dataContext);
719     if (state != RState::SUCCESS) {
720         dataContext->SetErrorMsg("Failed to process string array resource in GetStringArrayValueSync", true);
721         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
722         return nullptr;
723     }
724 
725     return ResourceManagerNapiUtils::CreateJsArray(env, *dataContext);
726 }
727 
GetParamsFromArgv(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)728 RState ResourceManagerNapiSyncImpl::GetParamsFromArgv(napi_env env, napi_callback_info info,
729     std::unique_ptr<ResMgrDataContext> &dataContext)
730 {
731     GET_PARAMS(env, info, PARAMS_NUM_THREE);
732     // density optional parameters
733     if (ResourceManagerNapiUtils::GetDataType(env, argv[ARRAY_SUBCRIPTOR_ONE], dataContext->density_) != SUCCESS) {
734         return ERROR_CODE_INVALID_INPUT_PARAMETER;
735     }
736 
737     // data type optional parameters
738     if (ResourceManagerNapiUtils::GetDataType(env, argv[ARRAY_SUBCRIPTOR_TWO], dataContext->iconType_) != SUCCESS) {
739         return ERROR_CODE_INVALID_INPUT_PARAMETER;
740     }
741     return SUCCESS;
742 }
743 
GetDrawableDescriptor(napi_env env,napi_callback_info info)744 napi_value ResourceManagerNapiSyncImpl::GetDrawableDescriptor(napi_env env, napi_callback_info info)
745 {
746     GET_PARAMS(env, info, PARAMS_NUM_THREE);
747     auto dataContext = std::make_unique<ResMgrDataContext>();
748     if (dataContext == nullptr) {
749         return nullptr;
750     }
751     int32_t ret = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
752     if (ret != RState::SUCCESS) {
753         dataContext->SetErrorMsg("Failed to init para in GetDrawableDescriptor", true);
754         ResourceManagerNapiUtils::NapiThrow(env, ret);
755         return nullptr;
756     }
757 
758     if (GetParamsFromArgv(env, info, dataContext) != SUCCESS) {
759         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
760         return nullptr;
761     }
762 
763     std::shared_ptr<ResourceManager> resMgr = nullptr;
764     uint32_t resId = 0;
765     if (!ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId)) {
766         dataContext->SetErrorMsg("Failed to get GetHapResourceManager in GetDrawableDescriptor", true);
767         return nullptr;
768     }
769     RState state = SUCCESS;
770     Ace::Napi::DrawableDescriptor::DrawableType drawableType;
771     if (dataContext->iconType_ == 1) {
772         std::string themeMask = resMgr->GetThemeMask();
773         std::pair<std::unique_ptr<uint8_t[]>, size_t> foregroundInfo;
774         std::pair<std::unique_ptr<uint8_t[]>, size_t> backgroundInfo;
775         state = resMgr->GetThemeIcons(resId, foregroundInfo, backgroundInfo, dataContext->density_);
776         if (state == SUCCESS) {
777             return ProcessThemeIcon(env, dataContext, foregroundInfo, backgroundInfo, themeMask);
778         }
779     }
780     auto drawableDescriptor = Ace::Napi::DrawableDescriptorFactory::Create(resId, resMgr,
781         state, drawableType, dataContext->density_);
782     if (state != SUCCESS) {
783         dataContext->SetErrorMsg("Failed to Create drawableDescriptor", true);
784         ResourceManagerNapiUtils::NapiThrow(env, state, resId);
785         return nullptr;
786     }
787     return Ace::Napi::JsDrawableDescriptor::ToNapi(env, drawableDescriptor.release(), drawableType);
788 }
789 
InitNameAddon(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)790 int32_t ResourceManagerNapiSyncImpl::InitNameAddon(napi_env env, napi_callback_info info,
791     std::unique_ptr<ResMgrDataContext> &dataContext)
792 {
793     GET_PARAMS(env, info, PARAMS_NUM_TWO);
794     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
795     if (dataContext->addon_ == nullptr) {
796         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon in InitNameAddon");
797         return NOT_FOUND;
798     }
799     if (ResourceManagerNapiUtils::IsNapiString(env, info)) {
800         dataContext->resName_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
801     } else {
802         return ERROR_CODE_INVALID_INPUT_PARAMETER;
803     }
804     return SUCCESS;
805 }
806 
ProcessStrResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)807 int32_t ResourceManagerNapiSyncImpl::ProcessStrResourceByName(napi_env env, napi_callback_info info,
808     std::unique_ptr<ResMgrDataContext> &dataContext)
809 {
810     if (!InitNapiParameters(env, info, dataContext->jsParams_)) {
811         RESMGR_HILOGE(RESMGR_JS_TAG, "GetStringByNameSync formatting error");
812         return ERROR_CODE_RES_NAME_FORMAT_ERROR;
813     }
814 
815     RState state = dataContext->addon_->GetResMgr()->GetStringFormatByName(dataContext->resName_.c_str(),
816         dataContext->value_, dataContext->jsParams_);
817     return state;
818 }
819 
GetStringByNameSync(napi_env env,napi_callback_info info)820 napi_value ResourceManagerNapiSyncImpl::GetStringByNameSync(napi_env env, napi_callback_info info)
821 {
822     GET_PARAMS(env, info, PARAMS_NUM_TWO);
823 
824     auto dataContext = std::make_unique<ResMgrDataContext>();
825     if (dataContext == nullptr) {
826         return nullptr;
827     }
828     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
829     if (state != RState::SUCCESS) {
830         dataContext->SetErrorMsg("Failed to init para in GetStringByNameSync", false);
831         ResourceManagerNapiUtils::NapiThrow(env, state);
832         return nullptr;
833     }
834 
835     state = ProcessStrResourceByName(env, info, dataContext);
836     if (state != RState::SUCCESS) {
837         dataContext->SetErrorMsg("Failed to process string in GetStringByNameSync", false);
838         ResourceManagerNapiUtils::NapiThrow(env, state);
839         return nullptr;
840     }
841 
842     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
843 }
844 
ProcessSymbolResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)845 int32_t ResourceManagerNapiSyncImpl::ProcessSymbolResourceByName(napi_env env, napi_callback_info info,
846     std::unique_ptr<ResMgrDataContext> &dataContext)
847 {
848     RState state = dataContext->addon_->GetResMgr()->GetSymbolByName(dataContext->resName_.c_str(),
849         dataContext->symbolValue_);
850     return state;
851 }
852 
GetSymbolByName(napi_env env,napi_callback_info info)853 napi_value ResourceManagerNapiSyncImpl::GetSymbolByName(napi_env env, napi_callback_info info)
854 {
855     GET_PARAMS(env, info, PARAMS_NUM_TWO);
856 
857     auto dataContext = std::make_unique<ResMgrDataContext>();
858     if (dataContext == nullptr) {
859         return nullptr;
860     }
861     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
862     if (state != RState::SUCCESS) {
863         dataContext->SetErrorMsg("Failed to init para in GetSymbolByName", false);
864         ResourceManagerNapiUtils::NapiThrow(env, state);
865         return nullptr;
866     }
867 
868     state = ProcessSymbolResourceByName(env, info, dataContext);
869     if (state != RState::SUCCESS) {
870         dataContext->SetErrorMsg("Failed to process symbol in GetSymbolByName", false);
871         ResourceManagerNapiUtils::NapiThrow(env, state);
872         return nullptr;
873     }
874 
875     return ResourceManagerNapiUtils::CreateJsSymbol(env, *dataContext);
876 }
877 
878 
ProcessColorResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)879 int32_t ResourceManagerNapiSyncImpl::ProcessColorResourceByName(napi_env env, napi_callback_info info,
880     std::unique_ptr<ResMgrDataContext> &dataContext)
881 {
882     RState state = dataContext->addon_->GetResMgr()->GetColorByName(dataContext->resName_.c_str(),
883         dataContext->colorValue_);
884     return state;
885 }
886 
GetColorByNameSync(napi_env env,napi_callback_info info)887 napi_value ResourceManagerNapiSyncImpl::GetColorByNameSync(napi_env env, napi_callback_info info)
888 {
889     GET_PARAMS(env, info, PARAMS_NUM_TWO);
890 
891     auto dataContext = std::make_unique<ResMgrDataContext>();
892     if (dataContext == nullptr) {
893         return nullptr;
894     }
895     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
896     if (state != RState::SUCCESS) {
897         dataContext->SetErrorMsg("Failed to init para in GetColorByNameSync", false);
898         ResourceManagerNapiUtils::NapiThrow(env, state);
899         return nullptr;
900     }
901 
902     state = ProcessColorResourceByName(env, info, dataContext);
903     if (state != RState::SUCCESS) {
904         dataContext->SetErrorMsg("Failed to process color in GetColorByNameSync", false);
905         ResourceManagerNapiUtils::NapiThrow(env, state);
906         return nullptr;
907     }
908 
909     return ResourceManagerNapiUtils::CreateJsColor(env, *dataContext);
910 }
911 
ProcessNumResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)912 int32_t ResourceManagerNapiSyncImpl::ProcessNumResourceByName(napi_env env, napi_callback_info info,
913     std::unique_ptr<ResMgrDataContext> &dataContext)
914 {
915     auto resMgr = dataContext->addon_->GetResMgr();
916     RState state = resMgr->GetIntegerByName(dataContext->resName_.c_str(),
917         dataContext->iValue_);
918     if (state != RState::SUCCESS) {
919         state = resMgr->GetFloatByName(dataContext->resName_.c_str(), dataContext->fValue_);
920         return state;
921     }
922     return SUCCESS;
923 }
924 
GetNumberByName(napi_env env,napi_callback_info info)925 napi_value ResourceManagerNapiSyncImpl::GetNumberByName(napi_env env, napi_callback_info info)
926 {
927     GET_PARAMS(env, info, PARAMS_NUM_TWO);
928 
929     auto dataContext = std::make_unique<ResMgrDataContext>();
930     if (dataContext == nullptr) {
931         return nullptr;
932     }
933     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
934     if (state != RState::SUCCESS) {
935         dataContext->SetErrorMsg("Failed to init para in GetNumberByName", false);
936         ResourceManagerNapiUtils::NapiThrow(env, state);
937         return nullptr;
938     }
939 
940     state = ProcessNumResourceByName(env, info, dataContext);
941     if (state != RState::SUCCESS) {
942         dataContext->SetErrorMsg("Failed to process number in GetNumberByName", false);
943         ResourceManagerNapiUtils::NapiThrow(env, state);
944         return nullptr;
945     }
946 
947     return ResourceManagerNapiUtils::CreateJsNumber(env, *dataContext);
948 }
949 
GetBooleanByName(napi_env env,napi_callback_info info)950 napi_value ResourceManagerNapiSyncImpl::GetBooleanByName(napi_env env, napi_callback_info info)
951 {
952     GET_PARAMS(env, info, PARAMS_NUM_TWO);
953 
954     auto dataContext = std::make_unique<ResMgrDataContext>();
955     if (dataContext == nullptr) {
956         return nullptr;
957     }
958     int32_t ret = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
959     if (ret != RState::SUCCESS) {
960         dataContext->SetErrorMsg("Failed to init para in GetBooleanByName", false);
961         ResourceManagerNapiUtils::NapiThrow(env, ret);
962         return nullptr;
963     }
964 
965     RState state = dataContext->addon_->GetResMgr()->GetBooleanByName(dataContext->resName_.c_str(),
966         dataContext->bValue_);
967     if (state != RState::SUCCESS) {
968         dataContext->SetErrorMsg("GetBooleanByName failed state", false);
969         ResourceManagerNapiUtils::NapiThrow(env, state);
970         return nullptr;
971     }
972 
973     return ResourceManagerNapiUtils::CreateJsBool(env, *dataContext);
974 }
975 
ProcessThemeIcon(napi_env env,std::unique_ptr<ResMgrDataContext> & dataContext,std::pair<std::unique_ptr<uint8_t[]>,size_t> & foregroundInfo,std::pair<std::unique_ptr<uint8_t[]>,size_t> & backgroundInfo,std::string & themeMask)976 napi_value ResourceManagerNapiSyncImpl::ProcessThemeIcon(napi_env env, std::unique_ptr<ResMgrDataContext> &dataContext,
977     std::pair<std::unique_ptr<uint8_t[]>, size_t> &foregroundInfo,
978     std::pair<std::unique_ptr<uint8_t[]>, size_t> &backgroundInfo, std::string &themeMask)
979 {
980     Ace::Napi::DrawableDescriptor::DrawableType drawableType = Ace::Napi::DrawableDescriptor::DrawableType::BASE;
981     if (backgroundInfo.first == nullptr &&
982         Utils::GetSystemParameter("const.global.support_single_icon_theme") == "true") {
983         auto drawableDescriptor = std::make_unique<Ace::Napi::DrawableDescriptor>(std::move(foregroundInfo.first),
984             foregroundInfo.second);
985         return Ace::Napi::JsDrawableDescriptor::ToNapi(env, drawableDescriptor.release(), drawableType);
986     }
987     auto drawableDescriptor = Ace::Napi::DrawableDescriptorFactory::Create(foregroundInfo, backgroundInfo,
988         themeMask, drawableType, dataContext->addon_->GetResMgr());
989     return Ace::Napi::JsDrawableDescriptor::ToNapi(env, drawableDescriptor.release(), drawableType);
990 }
991 
GetDrawableDescriptorByName(napi_env env,napi_callback_info info)992 napi_value ResourceManagerNapiSyncImpl::GetDrawableDescriptorByName(napi_env env, napi_callback_info info)
993 {
994     GET_PARAMS(env, info, PARAMS_NUM_THREE);
995     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
996         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
997         return nullptr;
998     }
999     auto dataContext = std::make_unique<ResMgrDataContext>();
1000     if (dataContext == nullptr) {
1001         return nullptr;
1002     }
1003 
1004     if (GetParamsFromArgv(env, info, dataContext) != SUCCESS) {
1005         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1006         return nullptr;
1007     }
1008 
1009     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
1010     if (dataContext->addon_ == nullptr) {
1011         return nullptr;
1012     }
1013     dataContext->resName_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
1014     auto resMgr = dataContext->addon_->GetResMgr();
1015     RState state = SUCCESS;
1016     Ace::Napi::DrawableDescriptor::DrawableType drawableType = Ace::Napi::DrawableDescriptor::DrawableType::BASE;
1017     if (dataContext->iconType_ == 1) {
1018         std::string themeMask = resMgr->GetThemeMask();
1019         std::pair<std::unique_ptr<uint8_t[]>, size_t> foregroundInfo;
1020         std::pair<std::unique_ptr<uint8_t[]>, size_t> backgroundInfo;
1021         if (resMgr->GetThemeIcons(0, foregroundInfo, backgroundInfo, dataContext->density_) == SUCCESS) {
1022             return ProcessThemeIcon(env, dataContext, foregroundInfo, backgroundInfo, themeMask);
1023         }
1024     }
1025 
1026     if (dataContext->iconType_ == 2) { // 2 means get the dynamic icon from theme
1027         std::pair<std::unique_ptr<uint8_t[]>, size_t> iconInfo;
1028         if (resMgr->GetDynamicIcon(dataContext->resName_, iconInfo, dataContext->density_) == SUCCESS) {
1029             auto drawableDescriptor = std::make_unique<Ace::Napi::DrawableDescriptor>(std::move(iconInfo.first),
1030                 iconInfo.second);
1031             return Ace::Napi::JsDrawableDescriptor::ToNapi(env, drawableDescriptor.release(), drawableType);
1032         }
1033     }
1034 
1035     auto drawableDescriptor = Ace::Napi::DrawableDescriptorFactory::Create(dataContext->resName_.c_str(),
1036         resMgr, state, drawableType, dataContext->density_);
1037     if (state != SUCCESS) {
1038         dataContext->SetErrorMsg("Failed to Create drawableDescriptor ", false);
1039         ResourceManagerNapiUtils::NapiThrow(env, state);
1040         return nullptr;
1041     }
1042     return Ace::Napi::JsDrawableDescriptor::ToNapi(env, drawableDescriptor.release(), drawableType);
1043 }
1044 
GetNativeResoruceManager(napi_env env,napi_callback_info info)1045 std::shared_ptr<ResourceManager> GetNativeResoruceManager(napi_env env, napi_callback_info info)
1046 {
1047     auto addon = ResMgrDataContext::GetResourceManagerAddon(env, info);
1048     if (addon == nullptr) {
1049         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon_ in GetNativeResoruceManager");
1050         return nullptr;
1051     }
1052     return addon->GetResMgr();
1053 }
1054 
AddResource(napi_env env,napi_callback_info info)1055 napi_value ResourceManagerNapiSyncImpl::AddResource(napi_env env, napi_callback_info info)
1056 {
1057     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1058     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1059         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1060         return nullptr;
1061     }
1062     auto dataContext = std::make_unique<ResMgrDataContext>();
1063     if (dataContext == nullptr) {
1064         return nullptr;
1065     }
1066     dataContext->path_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
1067     auto resMgr = GetNativeResoruceManager(env, info);
1068     if (resMgr == nullptr) {
1069         RESMGR_HILOGE(RESMGR_JS_TAG, "resMgr is null, add overlay fail");
1070         return nullptr;
1071     }
1072     if (!resMgr->AddAppOverlay(dataContext->path_)) {
1073         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to add overlay");
1074         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_OVERLAY_RES_PATH_INVALID);
1075         return nullptr;
1076     }
1077     return nullptr;
1078 }
1079 
RemoveResource(napi_env env,napi_callback_info info)1080 napi_value ResourceManagerNapiSyncImpl::RemoveResource(napi_env env, napi_callback_info info)
1081 {
1082     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1083     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1084         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1085         return nullptr;
1086     }
1087     auto dataContext = std::make_unique<ResMgrDataContext>();
1088     if (dataContext == nullptr) {
1089         return nullptr;
1090     }
1091     dataContext->path_ = ResourceManagerNapiUtils::GetResNameOrPath(env, argc, argv);
1092     auto resMgr = GetNativeResoruceManager(env, info);
1093     if (resMgr == nullptr) {
1094         RESMGR_HILOGE(RESMGR_JS_TAG, "resMgr is null, remove overlay fail");
1095         return nullptr;
1096     }
1097     if (!resMgr->RemoveAppOverlay(dataContext->path_)) {
1098         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to remove overlay");
1099         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_OVERLAY_RES_PATH_INVALID);
1100         return nullptr;
1101     }
1102     return nullptr;
1103 }
1104 
ProcessPluralStrResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1105 int32_t ResourceManagerNapiSyncImpl::ProcessPluralStrResourceByName(napi_env env, napi_callback_info info,
1106     std::unique_ptr<ResMgrDataContext> &dataContext)
1107 {
1108     if (!InitNapiParameters(env, info, dataContext->jsParams_)) {
1109         RESMGR_HILOGE(RESMGR_JS_TAG, "GetPluralStringByNameSync formatting error");
1110         return ERROR_CODE_RES_NAME_FORMAT_ERROR;
1111     }
1112     RState state = dataContext->addon_->GetResMgr()->GetFormatPluralStringByName(dataContext->value_,
1113         dataContext->resName_.c_str(), dataContext->param_, dataContext->jsParams_);
1114     return state;
1115 }
1116 
GetPluralStringByNameSync(napi_env env,napi_callback_info info)1117 napi_value ResourceManagerNapiSyncImpl::GetPluralStringByNameSync(napi_env env, napi_callback_info info)
1118 {
1119     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1120     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1121         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1122         return nullptr;
1123     }
1124     auto dataContext = std::make_unique<ResMgrDataContext>();
1125     if (dataContext == nullptr) {
1126         return nullptr;
1127     }
1128     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
1129     if (state != RState::SUCCESS) {
1130         dataContext->SetErrorMsg("Failed to init para in GetPluralStringByNameSync", false);
1131         ResourceManagerNapiUtils::NapiThrow(env, state);
1132         return nullptr;
1133     }
1134 
1135     if (ResourceManagerNapiUtils::GetType(env, argv[ARRAY_SUBCRIPTOR_ONE]) != napi_number) {
1136         RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number in GetPluralStringByNameSync");
1137         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1138         return nullptr;
1139     }
1140     napi_get_value_int32(env, argv[ARRAY_SUBCRIPTOR_ONE], &dataContext->param_);
1141 
1142     state = ProcessPluralStrResourceByName(env, info, dataContext);
1143     if (state != RState::SUCCESS) {
1144         dataContext->SetErrorMsg("Failed to process plural string in GetPluralStringByNameSync", false);
1145         ResourceManagerNapiUtils::NapiThrow(env, state);
1146         return nullptr;
1147     }
1148 
1149     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
1150 }
1151 
ProcessMediaBase64ResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1152 int32_t ResourceManagerNapiSyncImpl::ProcessMediaBase64ResourceByName(napi_env env, napi_callback_info info,
1153     std::unique_ptr<ResMgrDataContext> &dataContext)
1154 {
1155     RState state = dataContext->addon_->GetResMgr()->GetMediaBase64DataByName(dataContext->resName_.c_str(),
1156         dataContext->value_, dataContext->density_);
1157     return state;
1158 }
1159 
GetMediaBase64ByNameSync(napi_env env,napi_callback_info info)1160 napi_value ResourceManagerNapiSyncImpl::GetMediaBase64ByNameSync(napi_env env, napi_callback_info info)
1161 {
1162     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1163     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1164         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1165         return nullptr;
1166     }
1167     auto dataContext = std::make_unique<ResMgrDataContext>();
1168     if (dataContext == nullptr) {
1169         return nullptr;
1170     }
1171     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
1172     if (state != RState::SUCCESS) {
1173         dataContext->SetErrorMsg("Failed to init para in GetMediaBase64ByNameSync", false);
1174         ResourceManagerNapiUtils::NapiThrow(env, state);
1175         return nullptr;
1176     }
1177 
1178     // density optional parameters
1179     if (ResourceManagerNapiUtils::GetDataType(env, argv[ARRAY_SUBCRIPTOR_ONE], dataContext->density_) != SUCCESS) {
1180         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1181         return nullptr;
1182     }
1183 
1184     state = ProcessMediaBase64ResourceByName(env, info, dataContext);
1185     if (state != RState::SUCCESS) {
1186         dataContext->SetErrorMsg("Failed to process media base64 resource in GetMediaBase64ByNameSync", false);
1187         ResourceManagerNapiUtils::NapiThrow(env, state);
1188         return nullptr;
1189     }
1190 
1191     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
1192 }
1193 
ProcessMediaResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1194 int32_t ResourceManagerNapiSyncImpl::ProcessMediaResourceByName(napi_env env, napi_callback_info info,
1195     std::unique_ptr<ResMgrDataContext> &dataContext)
1196 {
1197     RState state = dataContext->addon_->GetResMgr()->GetMediaDataByName(dataContext->resName_.c_str(),
1198         dataContext->len_, dataContext->mediaData, dataContext->density_);
1199     return state;
1200 }
1201 
GetMediaByNameSync(napi_env env,napi_callback_info info)1202 napi_value ResourceManagerNapiSyncImpl::GetMediaByNameSync(napi_env env, napi_callback_info info)
1203 {
1204     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1205     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1206         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1207         return nullptr;
1208     }
1209     auto dataContext = std::make_unique<ResMgrDataContext>();
1210     if (dataContext == nullptr) {
1211         return nullptr;
1212     }
1213     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
1214     if (state != RState::SUCCESS) {
1215         dataContext->SetErrorMsg("Failed to init para in GetMediaByNameSync", false);
1216         ResourceManagerNapiUtils::NapiThrow(env, state);
1217         return nullptr;
1218     }
1219 
1220     // density optional parameters
1221     if (ResourceManagerNapiUtils::GetDataType(env, argv[ARRAY_SUBCRIPTOR_ONE], dataContext->density_) != SUCCESS) {
1222         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1223         return nullptr;
1224     }
1225 
1226     state = ProcessMediaResourceByName(env, info, dataContext);
1227     if (state != RState::SUCCESS) {
1228         dataContext->SetErrorMsg("Failed to process media resource in GetMediaByNameSync", false);
1229         ResourceManagerNapiUtils::NapiThrow(env, state);
1230         return nullptr;
1231     }
1232 
1233     return ResourceManagerNapiUtils::CreateJsUint8Array(env, *dataContext);
1234 }
1235 
ProcessStringArrayResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1236 int32_t ResourceManagerNapiSyncImpl::ProcessStringArrayResourceByName(napi_env env, napi_callback_info info,
1237     std::unique_ptr<ResMgrDataContext> &dataContext)
1238 {
1239     RState state = dataContext->addon_->GetResMgr()->GetStringArrayByName(dataContext->resName_.c_str(),
1240         dataContext->arrayValue_);
1241     return state;
1242 }
1243 
GetStringArrayByNameSync(napi_env env,napi_callback_info info)1244 napi_value ResourceManagerNapiSyncImpl::GetStringArrayByNameSync(napi_env env, napi_callback_info info)
1245 {
1246     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1247     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1248         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1249         return nullptr;
1250     }
1251     auto dataContext = std::make_unique<ResMgrDataContext>();
1252     if (dataContext == nullptr) {
1253         return nullptr;
1254     }
1255     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
1256     if (state != RState::SUCCESS) {
1257         dataContext->SetErrorMsg("Failed to init para in GetStringArrayByNameSync", false);
1258         ResourceManagerNapiUtils::NapiThrow(env, state);
1259         return nullptr;
1260     }
1261 
1262     state = ProcessStringArrayResourceByName(env, info, dataContext);
1263     if (state != RState::SUCCESS) {
1264         dataContext->SetErrorMsg("Failed to process string array resource in GetStringArrayByNameSync", false);
1265         ResourceManagerNapiUtils::NapiThrow(env, state);
1266         return nullptr;
1267     }
1268     return ResourceManagerNapiUtils::CreateJsArray(env, *dataContext);
1269 }
1270 
GetConfigurationSync(napi_env env,napi_callback_info info)1271 napi_value ResourceManagerNapiSyncImpl::GetConfigurationSync(napi_env env, napi_callback_info info)
1272 {
1273     auto dataContext = std::make_unique<ResMgrDataContext>();
1274     if (dataContext == nullptr) {
1275         return nullptr;
1276     }
1277     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
1278     if (dataContext->addon_ == nullptr) {
1279         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon in GetConfigurationSync");
1280         return nullptr;
1281     }
1282     return ResourceManagerNapiUtils::CreateJsConfig(env, *dataContext);
1283 }
1284 
GetDeviceCapabilitySync(napi_env env,napi_callback_info info)1285 napi_value ResourceManagerNapiSyncImpl::GetDeviceCapabilitySync(napi_env env, napi_callback_info info)
1286 {
1287     auto dataContext = std::make_unique<ResMgrDataContext>();
1288     if (dataContext == nullptr) {
1289         return nullptr;
1290     }
1291     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
1292     if (dataContext->addon_ == nullptr) {
1293         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon in GetDeviceCapabilitySync");
1294         return nullptr;
1295     }
1296     return ResourceManagerNapiUtils::CreateJsDeviceCap(env, *dataContext);
1297 }
1298 
GetLocales(napi_env env,napi_callback_info info)1299 napi_value ResourceManagerNapiSyncImpl::GetLocales(napi_env env, napi_callback_info info)
1300 {
1301     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1302     auto dataContext = std::make_unique<ResMgrDataContext>();
1303     if (dataContext == nullptr) {
1304         return nullptr;
1305     }
1306     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
1307     if (dataContext->addon_ == nullptr) {
1308         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get addon in GetLocales");
1309         return nullptr;
1310     }
1311 
1312     // includeSystem optional parameters
1313     if (ResourceManagerNapiUtils::GetIncludeSystem(env, argv[ARRAY_SUBCRIPTOR_ZERO],
1314         dataContext->bValue_) != SUCCESS) {
1315         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1316         return nullptr;
1317     }
1318     dataContext->addon_->GetResMgr()->GetLocales(dataContext->arrayValue_, dataContext->bValue_);
1319     return ResourceManagerNapiUtils::CreateJsArray(env, *dataContext);
1320 }
1321 
IsRawDir(napi_env env,napi_callback_info info)1322 napi_value ResourceManagerNapiSyncImpl::IsRawDir(napi_env env, napi_callback_info info)
1323 {
1324     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1325     auto dataContext = std::make_unique<ResMgrDataContext>();
1326     if (dataContext == nullptr) {
1327         return nullptr;
1328     }
1329     int32_t ret = InitPathAddon(env, info, dataContext);
1330     if (ret != RState::SUCCESS) {
1331         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to init para in IsRawDir");
1332         ResourceManagerNapiUtils::NapiThrow(env, ret);
1333         return nullptr;
1334     }
1335 
1336     RState state = dataContext->addon_->GetResMgr()->IsRawDirFromHap(dataContext->path_,
1337         dataContext->bValue_);
1338     if (state != RState::SUCCESS) {
1339         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to determine the raw file is directory");
1340         ResourceManagerNapiUtils::NapiThrow(env, state);
1341         return nullptr;
1342     }
1343     return ResourceManagerNapiUtils::CreateJsBool(env, *dataContext);
1344 }
1345 
GetOverrideResourceManager(napi_env env,napi_callback_info info)1346 napi_value ResourceManagerNapiSyncImpl::GetOverrideResourceManager(napi_env env, napi_callback_info info)
1347 {
1348     auto dataContext = std::make_unique<ResMgrDataContext>();
1349     if (dataContext == nullptr) {
1350         return nullptr;
1351     }
1352     int32_t state = getAddonAndConfig(env, info, dataContext);
1353     if (state != RState::SUCCESS) {
1354         dataContext->SetErrorMsg("Failed to get param in GetOverrideResourceManager", false);
1355         ResourceManagerNapiUtils::NapiThrow(env, state);
1356         return nullptr;
1357     }
1358 
1359     std::shared_ptr<ResourceManager> resMgr = dataContext->addon_->GetResMgr();
1360     std::shared_ptr<ResourceManager> overrideResMgr = resMgr->GetOverrideResourceManager(
1361         dataContext->overrideResConfig_);
1362     if (overrideResMgr == nullptr) {
1363         dataContext->SetErrorMsg("GetOverrideResourceManager, overrideResMgr is null", false);
1364         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1365         return nullptr;
1366     }
1367 
1368     return dataContext->addon_->CreateOverrideAddon(env, overrideResMgr);
1369 }
1370 
getAddonAndConfig(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1371 RState ResourceManagerNapiSyncImpl::getAddonAndConfig(napi_env env, napi_callback_info info,
1372     std::unique_ptr<ResMgrDataContext> &dataContext)
1373 {
1374     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1375     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
1376     if (dataContext->addon_ == nullptr) {
1377         RESMGR_HILOGE(RESMGR_JS_TAG, "getAddonAndConfig failed to get addon");
1378         return ERROR_CODE_INVALID_INPUT_PARAMETER;
1379     }
1380     if (ResourceManagerNapiUtils::GetConfigObject(env, argv[ARRAY_SUBCRIPTOR_ZERO], dataContext) != SUCCESS) {
1381         RESMGR_HILOGE(RESMGR_JS_TAG, "getAddonAndConfig failed to get resConfig");
1382         return ERROR_CODE_INVALID_INPUT_PARAMETER;
1383     }
1384     return SUCCESS;
1385 }
1386 
GetOverrideConfiguration(napi_env env,napi_callback_info info)1387 napi_value ResourceManagerNapiSyncImpl::GetOverrideConfiguration(napi_env env, napi_callback_info info)
1388 {
1389     auto dataContext = std::make_unique<ResMgrDataContext>();
1390     if (dataContext == nullptr) {
1391         return nullptr;
1392     }
1393     dataContext->addon_ = ResMgrDataContext::GetResourceManagerAddon(env, info);
1394     if (dataContext->addon_ == nullptr) {
1395         RESMGR_HILOGE(RESMGR_JS_TAG, "GetOverrideConfiguration failed to get addon");
1396         return nullptr;
1397     }
1398     return ResourceManagerNapiUtils::CreateOverrideJsConfig(env, *dataContext);
1399 }
1400 
UpdateOverrideConfiguration(napi_env env,napi_callback_info info)1401 napi_value ResourceManagerNapiSyncImpl::UpdateOverrideConfiguration(napi_env env, napi_callback_info info)
1402 {
1403     auto dataContext = std::make_unique<ResMgrDataContext>();
1404     if (dataContext == nullptr) {
1405         return nullptr;
1406     }
1407     int32_t state = getAddonAndConfig(env, info, dataContext);
1408     if (state != RState::SUCCESS) {
1409         dataContext->SetErrorMsg("Failed to get param in GetOverrideResourceManager", false);
1410         ResourceManagerNapiUtils::NapiThrow(env, state);
1411         return nullptr;
1412     }
1413 
1414     std::shared_ptr<ResourceManager> resMgr = dataContext->addon_->GetResMgr();
1415     state = resMgr->UpdateOverrideResConfig(*dataContext->overrideResConfig_);
1416     if (state != RState::SUCCESS) {
1417         dataContext->SetErrorMsg("UpdateOverrideConfiguration failed due to invalid config", false);
1418         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1419     }
1420     return nullptr;
1421 }
1422 
InitOptionalParameters(napi_env env,napi_callback_info info,uint32_t startIndex,std::vector<std::tuple<ResourceManager::NapiValueType,std::string>> & jsParams)1423 bool ResourceManagerNapiSyncImpl::InitOptionalParameters(napi_env env, napi_callback_info info, uint32_t startIndex,
1424     std::vector<std::tuple<ResourceManager::NapiValueType, std::string>> &jsParams)
1425 {
1426     size_t size = startIndex;
1427     napi_get_cb_info(env, info, &size, nullptr, nullptr, nullptr);
1428     // one parameter: resId or resource or Name
1429     if (size <= startIndex || size > SIZE_MAX) {
1430         return true;
1431     }
1432     napi_value paramArray[size];
1433     napi_get_cb_info(env, info, &size, paramArray, nullptr, nullptr);
1434     if (size > SIZE_MAX) {
1435         return true;
1436     }
1437 
1438     for (size_t i = startIndex; i < size; ++i) {
1439         if (!InitParamsFromParamArray(env, paramArray[i], jsParams)) {
1440             return false;
1441         }
1442     }
1443     return true;
1444 }
1445 
ProcessPluralStringResource(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1446 int32_t ResourceManagerNapiSyncImpl::ProcessPluralStringResource(napi_env env, napi_callback_info info,
1447     std::unique_ptr<ResMgrDataContext> &dataContext)
1448 {
1449     std::shared_ptr<ResourceManager> resMgr = nullptr;
1450     uint32_t resId = 0;
1451     bool ret2 = ResourceManagerNapiUtils::GetHapResourceManager(dataContext.get(), resMgr, resId);
1452     if (!ret2) {
1453         RESMGR_HILOGE(RESMGR_JS_TAG, "Failed to get resMgr in GetHapResourceManager");
1454         return ERROR_CODE_RES_NOT_FOUND_BY_ID;
1455     }
1456     uint32_t startIndex = 2;
1457     if (!InitOptionalParameters(env, info, startIndex, dataContext->jsParams_)) {
1458         RESMGR_HILOGE(RESMGR_JS_TAG, "InitOptionalParameters formatting error");
1459         return ERROR_CODE_RES_ID_FORMAT_ERROR;
1460     }
1461     RState state = resMgr->GetFormatPluralStringById(dataContext->value_, resId, dataContext->quantity_,
1462         dataContext->jsParams_);
1463     if (state != RState::SUCCESS) {
1464         dataContext->SetErrorMsg("Failed to GetFormatPluralStringById state", true, state);
1465         return state;
1466     }
1467     return SUCCESS;
1468 }
1469 
GetIntPluralStringValueSync(napi_env env,napi_callback_info info)1470 napi_value ResourceManagerNapiSyncImpl::GetIntPluralStringValueSync(napi_env env, napi_callback_info info)
1471 {
1472     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1473 
1474     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
1475 
1476     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
1477     if (state != RState::SUCCESS) {
1478         dataContext->SetErrorMsg("Failed to init para in GetIntPluralStringValueSync", true);
1479         ResourceManagerNapiUtils::NapiThrow(env, state);
1480         return nullptr;
1481     }
1482 
1483     if (ResourceManagerNapiUtils::GetType(env, argv[ARRAY_SUBCRIPTOR_ONE]) != napi_number) {
1484         RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number in GetIntPluralStringValueSync");
1485         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1486         return nullptr;
1487     }
1488     double num =  0;
1489     napi_get_value_double(env, argv[ARRAY_SUBCRIPTOR_ONE], &num);
1490     if (num > INT_MAX) {
1491         num = INT_MAX;
1492     } else if (num < INT_MIN) {
1493         num = INT_MIN;
1494     }
1495     dataContext->quantity_ = { true, num, 0.0 };
1496 
1497     state = ProcessPluralStringResource(env, info, dataContext);
1498     if (state != RState::SUCCESS) {
1499         dataContext->SetErrorMsg("Failed to process plural string resource in GetIntPluralStringValueSync", true);
1500         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
1501         return nullptr;
1502     }
1503 
1504     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
1505 }
1506 
GetDoublePluralStringValueSync(napi_env env,napi_callback_info info)1507 napi_value ResourceManagerNapiSyncImpl::GetDoublePluralStringValueSync(napi_env env, napi_callback_info info)
1508 {
1509     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1510 
1511     std::unique_ptr<ResMgrDataContext> dataContext = std::make_unique<ResMgrDataContext>();
1512 
1513     int32_t state = ResourceManagerNapiSyncImpl::InitIdResourceAddon(env, info, dataContext);
1514     if (state != RState::SUCCESS) {
1515         dataContext->SetErrorMsg("Failed to init para in GetDoublePluralStringValueSync", true);
1516         ResourceManagerNapiUtils::NapiThrow(env, state);
1517         return nullptr;
1518     }
1519 
1520     if (ResourceManagerNapiUtils::GetType(env, argv[ARRAY_SUBCRIPTOR_ONE]) != napi_number) {
1521         RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number in GetDoublePluralStringValueSync");
1522         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1523         return nullptr;
1524     }
1525     double num =  0;
1526     napi_get_value_double(env, argv[ARRAY_SUBCRIPTOR_ONE], &num);
1527     dataContext->quantity_ = { false, 0, num };
1528 
1529     state = ProcessPluralStringResource(env, info, dataContext);
1530     if (state != RState::SUCCESS) {
1531         dataContext->SetErrorMsg("Failed to process plural string resource in GetDoublePluralStringValueSync", true);
1532         ResourceManagerNapiUtils::NapiThrow(env, state, dataContext->resId_);
1533         return nullptr;
1534     }
1535 
1536     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
1537 }
1538 
ProcessPluralStringResourceByName(napi_env env,napi_callback_info info,std::unique_ptr<ResMgrDataContext> & dataContext)1539 int32_t ResourceManagerNapiSyncImpl::ProcessPluralStringResourceByName(napi_env env, napi_callback_info info,
1540     std::unique_ptr<ResMgrDataContext> &dataContext)
1541 {
1542     uint32_t startIndex = 2;
1543     if (!InitOptionalParameters(env, info, startIndex, dataContext->jsParams_)) {
1544         RESMGR_HILOGE(RESMGR_JS_TAG, "InitOptionalParameters formatting error");
1545         return ERROR_CODE_RES_NAME_FORMAT_ERROR;
1546     }
1547     RState state = dataContext->addon_->GetResMgr()->GetFormatPluralStringByName(dataContext->value_,
1548         dataContext->resName_.c_str(), dataContext->quantity_, dataContext->jsParams_);
1549     return state;
1550 }
1551 
GetIntPluralStringByNameSync(napi_env env,napi_callback_info info)1552 napi_value ResourceManagerNapiSyncImpl::GetIntPluralStringByNameSync(napi_env env, napi_callback_info info)
1553 {
1554     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1555     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1556         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1557         return nullptr;
1558     }
1559     auto dataContext = std::make_unique<ResMgrDataContext>();
1560     if (dataContext == nullptr) {
1561         return nullptr;
1562     }
1563     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
1564     if (state != RState::SUCCESS) {
1565         dataContext->SetErrorMsg("Failed to init para in GetIntPluralStringByNameSync", false);
1566         ResourceManagerNapiUtils::NapiThrow(env, state);
1567         return nullptr;
1568     }
1569 
1570     if (ResourceManagerNapiUtils::GetType(env, argv[ARRAY_SUBCRIPTOR_ONE]) != napi_number) {
1571         RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number in GetIntPluralStringByNameSync");
1572         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1573         return nullptr;
1574     }
1575     double num =  0;
1576     napi_get_value_double(env, argv[ARRAY_SUBCRIPTOR_ONE], &num);
1577     if (num > INT_MAX) {
1578         num = INT_MAX;
1579     } else if (num < INT_MIN) {
1580         num = INT_MIN;
1581     }
1582     dataContext->quantity_ = { true, num, 0.0 };
1583 
1584     state = ProcessPluralStringResourceByName(env, info, dataContext);
1585     if (state != RState::SUCCESS) {
1586         dataContext->SetErrorMsg("Failed to process plural string in GetIntPluralStringByNameSync", false);
1587         ResourceManagerNapiUtils::NapiThrow(env, state);
1588         return nullptr;
1589     }
1590 
1591     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
1592 }
1593 
GetDoublePluralStringByNameSync(napi_env env,napi_callback_info info)1594 napi_value ResourceManagerNapiSyncImpl::GetDoublePluralStringByNameSync(napi_env env, napi_callback_info info)
1595 {
1596     GET_PARAMS(env, info, PARAMS_NUM_TWO);
1597     if (!ResourceManagerNapiUtils::IsNapiString(env, info)) {
1598         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1599         return nullptr;
1600     }
1601     auto dataContext = std::make_unique<ResMgrDataContext>();
1602     if (dataContext == nullptr) {
1603         return nullptr;
1604     }
1605     int32_t state = ResourceManagerNapiSyncImpl::InitNameAddon(env, info, dataContext);
1606     if (state != RState::SUCCESS) {
1607         dataContext->SetErrorMsg("Failed to init para in GetDoublePluralStringByNameSync", false);
1608         ResourceManagerNapiUtils::NapiThrow(env, state);
1609         return nullptr;
1610     }
1611 
1612     if (ResourceManagerNapiUtils::GetType(env, argv[ARRAY_SUBCRIPTOR_ONE]) != napi_number) {
1613         RESMGR_HILOGE(RESMGR_JS_TAG, "Parameter type is not napi_number in GetDoublePluralStringByNameSync");
1614         ResourceManagerNapiUtils::NapiThrow(env, ERROR_CODE_INVALID_INPUT_PARAMETER);
1615         return nullptr;
1616     }
1617     double num = 0.0;
1618     napi_get_value_double(env, argv[ARRAY_SUBCRIPTOR_ONE], &num);
1619     dataContext->quantity_ = { false, 0, num };
1620 
1621     state = ProcessPluralStringResourceByName(env, info, dataContext);
1622     if (state != RState::SUCCESS) {
1623         dataContext->SetErrorMsg("Failed to process plural string in GetDoublePluralStringByNameSync", false);
1624         ResourceManagerNapiUtils::NapiThrow(env, state);
1625         return nullptr;
1626     }
1627 
1628     return ResourceManagerNapiUtils::CreateJsString(env, *dataContext);
1629 }
1630 } // namespace Resource
1631 } // namespace Global
1632 } // namespace OHOS