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, ¶m) != 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