• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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