• 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     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