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