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