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