1 /*
2 * Copyright (c) 2021-2024 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 "adapter/ohos/osal/resource_adapter_impl.h"
17
18 #include <dirent.h>
19
20 #include "drawable_descriptor.h"
21
22 #include "adapter/ohos/entrance/ace_container.h"
23 #include "adapter/ohos/osal/resource_convertor.h"
24 #include "adapter/ohos/osal/resource_theme_style.h"
25 namespace OHOS::Ace {
26 namespace {
27
28 constexpr uint32_t OHOS_THEME_ID = 125829872; // ohos_theme
29
CheckThemeId(int32_t & themeId)30 void CheckThemeId(int32_t& themeId)
31 {
32 if (themeId >= 0) {
33 return;
34 }
35 themeId = OHOS_THEME_ID;
36 }
37
38 const char* PATTERN_MAP[] = {
39 THEME_PATTERN_BUTTON,
40 THEME_PATTERN_CHECKBOX,
41 THEME_PATTERN_DATA_PANEL,
42 THEME_PATTERN_RADIO,
43 THEME_PATTERN_SWIPER,
44 THEME_PATTERN_SWITCH,
45 THEME_PATTERN_TOOLBAR,
46 THEME_PATTERN_TOGGLE,
47 THEME_PATTERN_TOAST,
48 THEME_PATTERN_DIALOG,
49 THEME_PATTERN_DRAG_BAR,
50 THEME_PATTERN_CLOSE_ICON,
51 THEME_PATTERN_SEMI_MODAL,
52 THEME_PATTERN_BADGE,
53 THEME_PATTERN_CALENDAR,
54 THEME_PATTERN_CAMERA,
55 THEME_PATTERN_CARD,
56 THEME_PATTERN_CLOCK,
57 THEME_PATTERN_COUNTER,
58 THEME_PATTERN_DIVIDER,
59 THEME_PATTERN_FOCUS_ANIMATION,
60 THEME_PATTERN_GRID,
61 THEME_PATTERN_HYPERLINK,
62 THEME_PATTERN_IMAGE,
63 THEME_PATTERN_LIST,
64 THEME_PATTERN_LIST_ITEM,
65 THEME_PATTERN_ARC_LIST,
66 THEME_PATTERN_ARC_LIST_ITEM,
67 THEME_PATTERN_MARQUEE,
68 THEME_PATTERN_NAVIGATION_BAR,
69 THEME_PATTERN_PICKER,
70 THEME_PATTERN_PIECE,
71 THEME_PATTERN_POPUP,
72 THEME_PATTERN_PROGRESS,
73 THEME_PATTERN_QRCODE,
74 THEME_PATTERN_RATING,
75 THEME_PATTERN_REFRESH,
76 THEME_PATTERN_SCROLL_BAR,
77 THEME_PATTERN_SEARCH,
78 THEME_PATTERN_SELECT,
79 THEME_PATTERN_SLIDER,
80 THEME_PATTERN_STEPPER,
81 THEME_PATTERN_TAB,
82 THEME_PATTERN_TEXT,
83 THEME_PATTERN_TEXTFIELD,
84 THEME_PATTERN_TEXT_OVERLAY,
85 THEME_PATTERN_VIDEO,
86 THEME_PATTERN_ICON,
87 THEME_PATTERN_INDEXER,
88 THEME_PATTERN_APP_BAR,
89 THEME_PATTERN_ADVANCED_PATTERN,
90 THEME_PATTERN_SECURITY_COMPONENT,
91 THEME_PATTERN_FORM,
92 THEME_PATTERN_SIDE_BAR,
93 THEME_PATTERN_RICH_EDITOR,
94 THEME_PATTERN_PATTERN_LOCK,
95 THEME_PATTERN_GAUGE,
96 THEME_PATTERN_SHEET,
97 THEME_BLUR_STYLE_COMMON,
98 THEME_PATTERN_SHADOW,
99 THEME_PATTERN_CONTAINER_MODAL,
100 THEME_PATTERN_SCROLLABLE,
101 THEME_PATTERN_APP
102 };
103
IsDirExist(const std::string & path)104 bool IsDirExist(const std::string& path)
105 {
106 char realPath[PATH_MAX] = { 0x00 };
107 CHECK_NULL_RETURN(realpath(path.c_str(), realPath), false);
108 DIR* dir = opendir(realPath);
109 CHECK_NULL_RETURN(dir, false);
110 closedir(dir);
111 return true;
112 }
113
ParseDimensionUnit(const std::string & unit)114 DimensionUnit ParseDimensionUnit(const std::string& unit)
115 {
116 if (unit == "px") {
117 return DimensionUnit::PX;
118 } else if (unit == "fp") {
119 return DimensionUnit::FP;
120 } else if (unit == "lpx") {
121 return DimensionUnit::LPX;
122 } else if (unit == "%") {
123 return DimensionUnit::PERCENT;
124 } else {
125 return DimensionUnit::VP;
126 }
127 };
128
129 } // namespace
130
Create()131 RefPtr<ResourceAdapter> ResourceAdapter::Create()
132 {
133 return AceType::MakeRefPtr<ResourceAdapterImpl>();
134 }
135
Init(const ResourceInfo & resourceInfo)136 void ResourceAdapterImpl::Init(const ResourceInfo& resourceInfo)
137 {
138 std::string resPath = resourceInfo.GetPackagePath();
139 std::string hapPath = resourceInfo.GetHapPath();
140 auto resConfig = ConvertConfigToGlobal(resourceInfo.GetResourceConfiguration());
141 std::shared_ptr<Global::Resource::ResourceManager> newResMgr(Global::Resource::CreateResourceManager());
142 std::string resIndexPath = hapPath.empty() ? (resPath + "resources.index") : hapPath;
143 auto resRet = newResMgr->AddResource(resIndexPath.c_str());
144
145 if (resConfig != nullptr) {
146 auto configRet = newResMgr->UpdateResConfig(*resConfig);
147 LOGI("AddRes result=%{public}d, UpdateResConfig result=%{public}d, ori=%{public}d, dpi=%{public}f, "
148 "device=%{public}d, colorMode=%{public}d, inputDevice=%{public}d",
149 resRet, configRet, resConfig->GetDirection(), resConfig->GetScreenDensity(), resConfig->GetDeviceType(),
150 resConfig->GetColorMode(), resConfig->GetInputDevice());
151 }
152 sysResourceManager_ = newResMgr;
153 {
154 std::unique_lock<std::shared_mutex> lock(resourceMutex_);
155 resourceManager_ = sysResourceManager_;
156 }
157 packagePathStr_ = (hapPath.empty() || IsDirExist(resPath)) ? resPath : std::string();
158 resConfig_ = resConfig;
159 }
160
UpdateConfig(const ResourceConfiguration & config,bool themeFlag)161 void ResourceAdapterImpl::UpdateConfig(const ResourceConfiguration& config, bool themeFlag)
162 {
163 auto resConfig = ConvertConfigToGlobal(config);
164 LOGI("UpdateConfig ori=%{public}d, dpi=%{public}f, device=%{public}d, "
165 "colorMode=%{public}d, inputDevice=%{public}d",
166 resConfig->GetDirection(), resConfig->GetScreenDensity(), resConfig->GetDeviceType(), resConfig->GetColorMode(),
167 resConfig->GetInputDevice());
168 if (sysResourceManager_ && resConfig != nullptr) {
169 sysResourceManager_->UpdateResConfig(*resConfig, themeFlag);
170 }
171 for (auto& resMgr : resourceManagers_) {
172 if (resConfig != nullptr) {
173 resMgr.second->UpdateResConfig(*resConfig, themeFlag);
174 }
175 }
176 resConfig_ = resConfig;
177 }
178
GetTheme(int32_t themeId)179 RefPtr<ThemeStyle> ResourceAdapterImpl::GetTheme(int32_t themeId)
180 {
181 CheckThemeId(themeId);
182 auto theme = AceType::MakeRefPtr<ResourceThemeStyle>(AceType::Claim(this));
183 constexpr char flag[] = "ohos_"; // fit with resource/base/theme.json and pattern.json
184 {
185 auto manager = GetResourceManager();
186 if (manager) {
187 auto ret = manager->GetThemeById(themeId, theme->rawAttrs_);
188 for (size_t i = 0; i < sizeof(PATTERN_MAP) / sizeof(PATTERN_MAP[0]); i++) {
189 ResourceThemeStyle::RawAttrMap attrMap;
190 std::string patternTag = PATTERN_MAP[i];
191 std::string patternName = std::string(flag) + PATTERN_MAP[i];
192 ret = manager->GetPatternByName(patternName.c_str(), attrMap);
193 if (attrMap.empty()) {
194 continue;
195 }
196 theme->patternAttrs_[patternTag] = attrMap;
197 }
198 LOGI("themeId=%{public}d, ret=%{public}d, attr size=%{public}zu, pattern size=%{public}zu", themeId, ret,
199 theme->rawAttrs_.size(), theme->patternAttrs_.size());
200 }
201 }
202
203 if (theme->patternAttrs_.empty() && theme->rawAttrs_.empty()) {
204 LOGW("theme resource get failed, use default theme config.");
205 return nullptr;
206 }
207
208 theme->ParseContent();
209 theme->patternAttrs_.clear();
210 return theme;
211 }
212
GetColor(uint32_t resId)213 Color ResourceAdapterImpl::GetColor(uint32_t resId)
214 {
215 uint32_t result = 0;
216 auto manager = GetResourceManager();
217 CHECK_NULL_RETURN(manager, Color(result));
218 auto state = manager->GetColorById(resId, result);
219 if (state != Global::Resource::SUCCESS) {
220 LOGE("GetColor error, id=%{public}u", resId);
221 }
222 return Color(result);
223 }
224
GetColorByName(const std::string & resName)225 Color ResourceAdapterImpl::GetColorByName(const std::string& resName)
226 {
227 uint32_t result = 0;
228 auto actualResName = GetActualResourceName(resName);
229 auto manager = GetResourceManager();
230 CHECK_NULL_RETURN(manager, Color(result));
231 auto state = manager->GetColorByName(actualResName.c_str(), result);
232 if (state != Global::Resource::SUCCESS) {
233 LOGE("GetColor error, resName=%{public}s", resName.c_str());
234 }
235 return Color(result);
236 }
237
GetDimension(uint32_t resId)238 Dimension ResourceAdapterImpl::GetDimension(uint32_t resId)
239 {
240 float dimensionFloat = 0.0f;
241 #ifdef NG_BUILD
242 std::string unit;
243 auto manager = GetResourceManager();
244 if (manager) {
245 auto state = manager->GetFloatById(resId, dimensionFloat, unit);
246 if (state != Global::Resource::SUCCESS) {
247 LOGE("NG: GetDimension error, id=%{public}u", resId);
248 }
249 }
250 return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
251 #else
252 if (Container::IsCurrentUseNewPipeline()) {
253 std::string unit;
254 auto manager = GetResourceManager();
255 if (manager) {
256 auto state = manager->GetFloatById(resId, dimensionFloat, unit);
257 if (state != Global::Resource::SUCCESS) {
258 LOGE("NG: GetDimension error, id=%{public}u", resId);
259 }
260 }
261 return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
262 }
263
264 auto manager = GetResourceManager();
265 CHECK_NULL_RETURN(manager, Dimension(static_cast<double>(dimensionFloat)));
266 auto state = manager->GetFloatById(resId, dimensionFloat);
267 if (state != Global::Resource::SUCCESS) {
268 LOGE("GetDimension error, id=%{public}u", resId);
269 }
270 return Dimension(static_cast<double>(dimensionFloat));
271 #endif
272 }
273
GetDimensionByName(const std::string & resName)274 Dimension ResourceAdapterImpl::GetDimensionByName(const std::string& resName)
275 {
276 float dimensionFloat = 0.0f;
277 auto actualResName = GetActualResourceName(resName);
278 auto manager = GetResourceManager();
279 CHECK_NULL_RETURN(manager, Dimension());
280 std::string unit;
281 auto state = manager->GetFloatByName(actualResName.c_str(), dimensionFloat, unit);
282 if (state != Global::Resource::SUCCESS) {
283 LOGE("GetDimension error, resName=%{public}s", resName.c_str());
284 }
285 return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
286 }
287
GetString(uint32_t resId)288 std::string ResourceAdapterImpl::GetString(uint32_t resId)
289 {
290 std::string strResult = "";
291 auto manager = GetResourceManager();
292 CHECK_NULL_RETURN(manager, strResult);
293 manager->GetStringById(resId, strResult);
294 return strResult;
295 }
296
GetStringByName(const std::string & resName)297 std::string ResourceAdapterImpl::GetStringByName(const std::string& resName)
298 {
299 std::string strResult = "";
300 auto actualResName = GetActualResourceName(resName);
301 auto manager = GetResourceManager();
302 CHECK_NULL_RETURN(manager, strResult);
303 manager->GetStringByName(actualResName.c_str(), strResult);
304 return strResult;
305 }
306
GetPluralString(uint32_t resId,int quantity)307 std::string ResourceAdapterImpl::GetPluralString(uint32_t resId, int quantity)
308 {
309 std::string strResult = "";
310 auto manager = GetResourceManager();
311 CHECK_NULL_RETURN(manager, strResult);
312 auto state = manager->GetPluralStringById(resId, quantity, strResult);
313 if (state != Global::Resource::SUCCESS) {
314 LOGE("GetPluralString error, id=%{public}u", resId);
315 }
316 return strResult;
317 }
318
GetPluralStringByName(const std::string & resName,int quantity)319 std::string ResourceAdapterImpl::GetPluralStringByName(const std::string& resName, int quantity)
320 {
321 std::string strResult = "";
322 auto actualResName = GetActualResourceName(resName);
323 auto manager = GetResourceManager();
324 CHECK_NULL_RETURN(manager, strResult);
325 auto state = manager->GetPluralStringByName(actualResName.c_str(), quantity, strResult);
326 if (state != Global::Resource::SUCCESS) {
327 LOGE("GetPluralString error, resName=%{public}s", resName.c_str());
328 }
329 return strResult;
330 }
331
GetStringArray(uint32_t resId) const332 std::vector<std::string> ResourceAdapterImpl::GetStringArray(uint32_t resId) const
333 {
334 std::vector<std::string> strResults;
335 auto manager = GetResourceManager();
336 CHECK_NULL_RETURN(manager, strResults);
337 manager->GetStringArrayById(resId, strResults);
338 return strResults;
339 }
340
GetStringArrayByName(const std::string & resName) const341 std::vector<std::string> ResourceAdapterImpl::GetStringArrayByName(const std::string& resName) const
342 {
343 std::vector<std::string> strResults;
344 auto actualResName = GetActualResourceName(resName);
345 auto manager = GetResourceManager();
346 CHECK_NULL_RETURN(manager, strResults);
347 auto state = manager->GetStringArrayByName(actualResName.c_str(), strResults);
348 if (state != Global::Resource::SUCCESS) {
349 LOGE("GetStringArray error, resName=%{public}s", resName.c_str());
350 }
351 return strResults;
352 }
353
GetDouble(uint32_t resId)354 double ResourceAdapterImpl::GetDouble(uint32_t resId)
355 {
356 float result = 0.0f;
357 auto manager = GetResourceManager();
358 CHECK_NULL_RETURN(manager, static_cast<double>(result));
359 auto state = manager->GetFloatById(resId, result);
360 if (state != Global::Resource::SUCCESS) {
361 LOGE("GetDouble error, id=%{public}u", resId);
362 }
363 return static_cast<double>(result);
364 }
365
GetDoubleByName(const std::string & resName)366 double ResourceAdapterImpl::GetDoubleByName(const std::string& resName)
367 {
368 float result = 0.0f;
369 auto actualResName = GetActualResourceName(resName);
370 auto manager = GetResourceManager();
371 CHECK_NULL_RETURN(manager, static_cast<double>(result));
372 auto state = manager->GetFloatByName(actualResName.c_str(), result);
373 if (state != Global::Resource::SUCCESS) {
374 LOGE("GetDouble error, resName=%{public}s", resName.c_str());
375 }
376 return static_cast<double>(result);
377 }
378
GetInt(uint32_t resId)379 int32_t ResourceAdapterImpl::GetInt(uint32_t resId)
380 {
381 int32_t result = 0;
382 auto manager = GetResourceManager();
383 CHECK_NULL_RETURN(manager, result);
384 auto state = manager->GetIntegerById(resId, result);
385 if (state != Global::Resource::SUCCESS) {
386 LOGE("GetInt error, id=%{public}u", resId);
387 }
388 return result;
389 }
390
GetIntByName(const std::string & resName)391 int32_t ResourceAdapterImpl::GetIntByName(const std::string& resName)
392 {
393 int32_t result = 0;
394 auto actualResName = GetActualResourceName(resName);
395 auto manager = GetResourceManager();
396 CHECK_NULL_RETURN(manager, result);
397 auto state = manager->GetIntegerByName(actualResName.c_str(), result);
398 if (state != Global::Resource::SUCCESS) {
399 LOGE("GetInt error, resName=%{public}s", resName.c_str());
400 }
401 return result;
402 }
403
GetIntArray(uint32_t resId) const404 std::vector<uint32_t> ResourceAdapterImpl::GetIntArray(uint32_t resId) const
405 {
406 std::vector<int> intVectorResult;
407 {
408 auto manager = GetResourceManager();
409 if (manager) {
410 auto state = manager->GetIntArrayById(resId, intVectorResult);
411 if (state != Global::Resource::SUCCESS) {
412 LOGE("GetIntArray error, id=%{public}u", resId);
413 }
414 }
415 }
416
417 std::vector<uint32_t> result(intVectorResult.size());
418 std::transform(
419 intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
420 return result;
421 }
422
GetIntArrayByName(const std::string & resName) const423 std::vector<uint32_t> ResourceAdapterImpl::GetIntArrayByName(const std::string& resName) const
424 {
425 std::vector<int> intVectorResult;
426 auto actualResName = GetActualResourceName(resName);
427 auto manager = GetResourceManager();
428 CHECK_NULL_RETURN(manager, {});
429 auto state = manager->GetIntArrayByName(actualResName.c_str(), intVectorResult);
430 if (state != Global::Resource::SUCCESS) {
431 LOGE("GetIntArray error, resName=%{public}s", resName.c_str());
432 }
433
434 std::vector<uint32_t> result(intVectorResult.size());
435 std::transform(
436 intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
437 return result;
438 }
439
GetBoolean(uint32_t resId) const440 bool ResourceAdapterImpl::GetBoolean(uint32_t resId) const
441 {
442 bool result = false;
443 auto manager = GetResourceManager();
444 CHECK_NULL_RETURN(manager, result);
445 auto state = manager->GetBooleanById(resId, result);
446 if (state != Global::Resource::SUCCESS) {
447 LOGE("GetBoolean error, id=%{public}u", resId);
448 }
449 return result;
450 }
451
GetBooleanByName(const std::string & resName) const452 bool ResourceAdapterImpl::GetBooleanByName(const std::string& resName) const
453 {
454 bool result = false;
455 auto actualResName = GetActualResourceName(resName);
456 auto manager = GetResourceManager();
457 CHECK_NULL_RETURN(manager, result);
458 auto state = manager->GetBooleanByName(actualResName.c_str(), result);
459 if (state != Global::Resource::SUCCESS) {
460 LOGE("GetBoolean error, resName=%{public}s", resName.c_str());
461 }
462 return result;
463 }
464
GetPixelMap(uint32_t resId)465 std::shared_ptr<Media::PixelMap> ResourceAdapterImpl::GetPixelMap(uint32_t resId)
466 {
467 auto manager = GetResourceManager();
468
469 CHECK_NULL_RETURN(manager, nullptr);
470 Napi::DrawableDescriptor::DrawableType drawableType;
471 Global::Resource::RState state;
472 auto drawableDescriptor = Napi::DrawableDescriptorFactory::Create(resId, resourceManager_, state, drawableType, 0);
473 if (state != Global::Resource::SUCCESS) {
474 LOGE("Failed to Create drawableDescriptor by %{public}d", resId);
475 return nullptr;
476 }
477 CHECK_NULL_RETURN(drawableDescriptor, nullptr);
478 return drawableDescriptor->GetPixelMap();
479 }
480
GetMediaPath(uint32_t resId)481 std::string ResourceAdapterImpl::GetMediaPath(uint32_t resId)
482 {
483 std::string mediaPath = "";
484 auto manager = GetResourceManager();
485 CHECK_NULL_RETURN(manager, "");
486 auto state = manager->GetMediaById(resId, mediaPath);
487 if (state != Global::Resource::SUCCESS) {
488 LOGE("GetMediaById error, id=%{public}u, errorCode=%{public}u", resId, state);
489 return "";
490 }
491 if (SystemProperties::GetUnZipHap()) {
492 return "file:///" + mediaPath;
493 }
494 auto pos = mediaPath.find_last_of('.');
495 if (pos == std::string::npos) {
496 LOGE("GetMediaById error, return mediaPath[%{private}s] format error", mediaPath.c_str());
497 return "";
498 }
499 return "resource:///" + std::to_string(resId) + mediaPath.substr(pos);
500 }
501
GetMediaPathByName(const std::string & resName)502 std::string ResourceAdapterImpl::GetMediaPathByName(const std::string& resName)
503 {
504 std::string mediaPath = "";
505 auto actualResName = GetActualResourceName(resName);
506 {
507 auto manager = GetResourceManager();
508 CHECK_NULL_RETURN(manager, "");
509 auto state = manager->GetMediaByName(actualResName.c_str(), mediaPath);
510 if (state != Global::Resource::SUCCESS) {
511 LOGE("GetMediaPathByName error, resName=%{public}s, errorCode=%{public}u", resName.c_str(), state);
512 return "";
513 }
514 }
515 if (SystemProperties::GetUnZipHap()) {
516 return "file:///" + mediaPath;
517 }
518 auto pos = mediaPath.find_last_of('.');
519 if (pos == std::string::npos) {
520 LOGE("GetMediaById error, return mediaPath[%{private}s] format error", mediaPath.c_str());
521 return "";
522 }
523 return "resource:///" + actualResName + mediaPath.substr(pos);
524 }
525
GetRawfile(const std::string & fileName)526 std::string ResourceAdapterImpl::GetRawfile(const std::string& fileName)
527 {
528 // as web component not support resource format: resource://RAWFILE/{fileName}, use old format
529 if (!packagePathStr_.empty()) {
530 std::string outPath;
531 auto manager = GetResourceManager();
532 CHECK_NULL_RETURN(manager, "");
533 // Adapt to the input like: "file:///index.html?a=1", before the new solution comes.
534 auto it = std::find_if(fileName.begin(), fileName.end(), [](char c) { return (c == '#') || (c == '?'); });
535 std::string params;
536 std::string newFileName = fileName;
537 if (it != fileName.end()) {
538 newFileName = std::string(fileName.begin(), it);
539 params = std::string(it, fileName.end());
540 }
541 auto state = manager->GetRawFilePathByName(newFileName, outPath);
542 if (state != Global::Resource::SUCCESS) {
543 LOGE("GetRawfile error, filename:%{public}s, error:%{public}u", fileName.c_str(), state);
544 return "";
545 }
546 return "file:///" + outPath + params;
547 }
548 return "resource://RAWFILE/" + fileName;
549 }
550
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest)551 bool ResourceAdapterImpl::GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)
552 {
553 auto manager = GetResourceManager();
554 CHECK_NULL_RETURN(manager, false);
555 auto state = manager->GetRawFileFromHap(rawFile, len, dest);
556 if (state != Global::Resource::SUCCESS || !dest) {
557 LOGW("GetRawFileFromHap error, raw filename:%{public}s, error:%{public}u", rawFile.c_str(), state);
558 return false;
559 }
560 return true;
561 }
562
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)563 bool ResourceAdapterImpl::GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest,
564 const std::string& bundleName, const std::string& moduleName)
565 {
566 UpdateResourceManager(bundleName, moduleName);
567 auto manager = GetResourceManager();
568 CHECK_NULL_RETURN(manager, false);
569 auto state = manager->GetRawFileFromHap(rawFile, len, dest);
570 if (state != Global::Resource::SUCCESS || !dest) {
571 LOGW("GetRawFileFromHap error, raw filename:%{public}s, bundleName:%{public}s, moduleName:%{public}s, "
572 "error:%{public}u",
573 rawFile.c_str(), bundleName.c_str(), moduleName.c_str(), state);
574 return false;
575 }
576 return true;
577 }
578
GetMediaData(uint32_t resId,size_t & len,std::unique_ptr<uint8_t[]> & dest)579 bool ResourceAdapterImpl::GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)
580 {
581 auto manager = GetResourceManager();
582 CHECK_NULL_RETURN(manager, false);
583 auto state = manager->GetMediaDataById(resId, len, dest);
584 if (state != Global::Resource::SUCCESS) {
585 LOGW("GetMediaDataById error, id=%{public}u, error:%{public}u", resId, state);
586 return false;
587 }
588 return true;
589 }
590
GetMediaData(uint32_t resId,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)591 bool ResourceAdapterImpl::GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest,
592 const std::string& bundleName, const std::string& moduleName)
593 {
594 UpdateResourceManager(bundleName, moduleName);
595 auto manager = GetResourceManager();
596 CHECK_NULL_RETURN(manager, false);
597 auto state = manager->GetMediaDataById(resId, len, dest);
598 if (state != Global::Resource::SUCCESS) {
599 LOGW("GetMediaDataById error, id=%{public}u, bundleName:%{public}s, moduleName:%{public}s, error:%{public}u",
600 resId, bundleName.c_str(), moduleName.c_str(), state);
601 return false;
602 }
603 return true;
604 }
605
GetMediaData(const std::string & resName,size_t & len,std::unique_ptr<uint8_t[]> & dest)606 bool ResourceAdapterImpl::GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest)
607 {
608 auto manager = GetResourceManager();
609 CHECK_NULL_RETURN(manager, false);
610 auto state = manager->GetMediaDataByName(resName.c_str(), len, dest);
611 if (state != Global::Resource::SUCCESS) {
612 LOGW("GetMediaDataByName error, res=%{public}s, error:%{public}u", resName.c_str(), state);
613 return false;
614 }
615 return true;
616 }
617
GetMediaData(const std::string & resName,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)618 bool ResourceAdapterImpl::GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest,
619 const std::string& bundleName, const std::string& moduleName)
620 {
621 UpdateResourceManager(bundleName, moduleName);
622 auto manager = GetResourceManager();
623 CHECK_NULL_RETURN(manager, false);
624 auto state = manager->GetMediaDataByName(resName.c_str(), len, dest);
625 if (state != Global::Resource::SUCCESS) {
626 LOGW("GetMediaDataByName error, res=%{public}s, bundleName:%{public}s, moduleName:%{public}s, error:%{public}u",
627 resName.c_str(), bundleName.c_str(), moduleName.c_str(), state);
628 return false;
629 }
630 return true;
631 }
632
UpdateResourceManager(const std::string & bundleName,const std::string & moduleName)633 void ResourceAdapterImpl::UpdateResourceManager(const std::string& bundleName, const std::string& moduleName)
634 {
635 std::unique_lock<std::shared_mutex> lcok(resourceMutex_);
636 if (bundleName.empty() || moduleName.empty()) {
637 resourceManager_ = sysResourceManager_;
638 return;
639 }
640
641 auto resourceMgrIter = resourceManagers_.find({ bundleName, moduleName });
642 if (resourceMgrIter != resourceManagers_.end()) {
643 resourceManager_ = resourceMgrIter->second;
644 return;
645 } else {
646 auto container = Container::Current();
647 CHECK_NULL_VOID(container);
648 auto aceContainer = AceType::DynamicCast<Platform::AceContainer>(container);
649 CHECK_NULL_VOID(aceContainer);
650 auto context = aceContainer->GetAbilityContextByModule(bundleName, moduleName);
651 CHECK_NULL_VOID(context);
652 resourceManagers_[{ bundleName, moduleName }] = context->GetResourceManager();
653 resourceManager_ = context->GetResourceManager();
654 if (resourceManager_ && resConfig_ != nullptr) {
655 resourceManager_->UpdateResConfig(*resConfig_);
656 }
657 }
658 }
659
GetRawFileDescription(const std::string & rawfileName,RawfileDescription & rawfileDescription) const660 bool ResourceAdapterImpl::GetRawFileDescription(
661 const std::string& rawfileName, RawfileDescription& rawfileDescription) const
662 {
663 OHOS::Global::Resource::ResourceManager::RawFileDescriptor descriptor;
664 auto manager = GetResourceManager();
665 CHECK_NULL_RETURN(manager, false);
666 auto state = manager->GetRawFileDescriptorFromHap(rawfileName, descriptor);
667 if (state != Global::Resource::SUCCESS) {
668 LOGE("GetRawfileDescription error, rawfileName=%{public}s, error:%{public}u", rawfileName.c_str(), state);
669 return false;
670 }
671 rawfileDescription.fd = descriptor.fd;
672 rawfileDescription.offset = descriptor.offset;
673 rawfileDescription.length = descriptor.length;
674 return true;
675 }
676
GetMediaById(const int32_t & resId,std::string & mediaPath) const677 bool ResourceAdapterImpl::GetMediaById(const int32_t& resId, std::string& mediaPath) const
678 {
679 auto manager = GetResourceManager();
680 CHECK_NULL_RETURN(manager, false);
681 auto state = manager->GetMediaById(resId, mediaPath);
682 if (state != Global::Resource::SUCCESS) {
683 LOGE("GetMediaById error, resId=%{public}d, error:%{public}u", resId, state);
684 return false;
685 }
686 return true;
687 }
688
GetActualResourceName(const std::string & resName) const689 std::string ResourceAdapterImpl::GetActualResourceName(const std::string& resName) const
690 {
691 auto index = resName.find_last_of('.');
692 if (index == std::string::npos) {
693 LOGE("GetActualResourceName error, incorrect resName format.");
694 return {};
695 }
696 return resName.substr(index + 1, resName.length() - index - 1);
697 }
698
GetResourceLimitKeys() const699 uint32_t ResourceAdapterImpl::GetResourceLimitKeys() const
700 {
701 auto manager = GetResourceManager();
702 CHECK_NULL_RETURN(manager, 0);
703 return manager->GetResourceLimitKeys();
704 }
705
GetSymbolById(uint32_t resId) const706 uint32_t ResourceAdapterImpl::GetSymbolById(uint32_t resId) const
707 {
708 uint32_t result = 0;
709 auto manager = GetResourceManager();
710 CHECK_NULL_RETURN(manager, -1);
711 manager->GetSymbolById(resId, result);
712 return result;
713 }
714
GetResId(const std::string & resTypeName) const715 uint32_t ResourceAdapterImpl::GetResId(const std::string &resTypeName) const
716 {
717 uint32_t resId = -1;
718 auto manager = GetResourceManager();
719 CHECK_NULL_RETURN(manager, -1);
720 manager->GetResId(resTypeName, resId);
721 return resId;
722 }
723
724 } // namespace OHOS::Ace
725