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