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