• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "resource_manager_ffi.h"
17 #include <vector>
18 #include "utils.h"
19 
20 using namespace OHOS::FFI;
21 using namespace OHOS::Global::Resource;
22 
23 namespace OHOS {
24 namespace Resource {
25 extern "C" {
ClearCharPointer(char ** ptr,int count)26 void ClearCharPointer(char** ptr, int count)
27 {
28     for (int i = 0; i < count; i++) {
29         free(ptr[i]);
30     }
31 }
32 
VectorToCArrString(std::vector<std::string> & vec,int32_t & code)33 CArrString VectorToCArrString(std::vector<std::string>& vec, int32_t &code)
34 {
35     CArrString ret = { .head = nullptr, .size = 0};
36     if (vec.size() == 0) {
37         return ret;
38     }
39     char** result = reinterpret_cast<char**>(malloc(sizeof(char*) * vec.size()));
40     if (result == nullptr) {
41         code = RState::NOT_ENOUGH_MEM;
42         return ret;
43     }
44     for (size_t i = 0; i < vec.size(); i++) {
45         result[i] = ::Utils::MallocCString(vec[i]);
46         if (result[i] == nullptr) {
47             ClearCharPointer(result, i);
48             free(result);
49             code = RState::NOT_ENOUGH_MEM;
50             return ret;
51         }
52     }
53     ret.head = result;
54     ret.size = static_cast<int64_t>(vec.size());
55     return ret;
56 }
57 
CJ_GetResourceManagerStageMode(OHOS::AbilityRuntime::Context * context)58 int64_t CJ_GetResourceManagerStageMode(OHOS::AbilityRuntime::Context* context)
59 {
60     if (context == nullptr) {
61         return ERR_INVALID_INSTANCE_CODE;
62     }
63     auto nativeResMgrLibrary = FFIData::Create<ResourceManagerImpl>(context);
64     if (!nativeResMgrLibrary) {
65         return ERR_INVALID_INSTANCE_CODE;
66     }
67     return nativeResMgrLibrary->GetID();
68 }
69 
CJ_GetSystemResMgr()70 RetDataI64 CJ_GetSystemResMgr()
71 {
72     RetDataI64 ret = { .code = SUCCESS_CODE, .data = -1 };
73     auto resMgr = FFIData::Create<ResourceManagerImpl>();
74     if (resMgr->IsEmpty()) {
75         ret.code = ERROR_CODE_SYSTEM_RES_MANAGER_GET_FAILED;
76         return ret;
77     }
78     ret.data = resMgr->GetID();
79     return ret;
80 }
81 
CJ_CloseRawFd(int64_t id,const char * path)82 int32_t CJ_CloseRawFd(int64_t id, const char* path)
83 {
84     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
85     if (!instance) {
86         return ERR_INVALID_INSTANCE_CODE;
87     }
88     return instance->CloseRawFd(path);
89 }
90 
CJ_GetRawFd(int64_t id,const char * rawFileName,ResourceManager::RawFileDescriptor & descriptor)91 int32_t CJ_GetRawFd(int64_t id, const char* rawFileName, ResourceManager::RawFileDescriptor &descriptor)
92 {
93     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
94     if (!instance) {
95         return ERR_INVALID_INSTANCE_CODE;
96     }
97     return instance->GetRawFd(rawFileName, descriptor);
98 }
99 
CopyUI8Arr(RetDataCArrUI8 & ret,std::unique_ptr<uint8_t[]> & data,size_t len)100 void CopyUI8Arr(RetDataCArrUI8 &ret, std::unique_ptr<uint8_t[]> &data, size_t len)
101 {
102     if (len <= 0) {
103         LOGE("Wrong data size!")
104         return;
105     }
106     uint8_t* outValue = static_cast<uint8_t*>(malloc(sizeof(uint8_t) * len));
107     if (outValue == nullptr) {
108         ret.code = RState::ERROR;
109         return;
110     }
111     for (size_t i = 0; i < len; ++i) {
112         outValue[i] = data[i];
113     }
114     ret.data.size = static_cast<int64_t>(len);
115     ret.data.head = outValue;
116 }
117 
CJ_GetRawFileContent(int64_t id,const char * path)118 RetDataCArrUI8 CJ_GetRawFileContent(int64_t id, const char* path)
119 {
120     LOGI("CJ_GetRawFileContent start");
121     RetDataCArrUI8 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0} };
122     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
123     if (!instance) {
124         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
125         return ret;
126     }
127     size_t len = 0;
128     std::unique_ptr<uint8_t[]> data;
129     int32_t state = instance->GetRawFileContent(path, len, data);
130     ret.code = state;
131     if (state == SUCCESS_CODE) {
132         CopyUI8Arr(ret, data, len);
133     }
134     return ret;
135 }
136 
CJ_GetRawFileList(int64_t id,const char * path)137 RetDataCArrString CJ_GetRawFileList(int64_t id, const char* path)
138 {
139     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
140     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
141     if (!instance) {
142         return ret;
143     }
144     std::vector<std::string> value;
145     ret.code = instance->GetRawFileList(path, value);
146     if (ret.code != RState::SUCCESS) {
147         return ret;
148     }
149     ret.data = VectorToCArrString(value, ret.code);
150     return ret;
151 }
152 
CJ_AddResource(int64_t id,const char * path)153 int32_t CJ_AddResource(int64_t id, const char *path)
154 {
155     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
156     if (!instance) {
157         return ERR_INVALID_INSTANCE_CODE;
158     }
159     return instance->AddResource(path);
160 }
161 
CJ_RemoveResource(int64_t id,const char * path)162 int32_t CJ_RemoveResource(int64_t id, const char *path)
163 {
164     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
165     if (!instance) {
166         return ERR_INVALID_INSTANCE_CODE;
167     }
168     return instance->RemoveResource(path);
169 }
170 
CJ_GetPluralStringValue(int64_t id,uint32_t resId,int64_t num)171 RetDataCString CJ_GetPluralStringValue(int64_t id, uint32_t resId, int64_t num)
172 {
173     LOGI("CJ_GetPluralStringValue start");
174     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
175     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
176     if (!instance) {
177         return ret;
178     }
179     std::string value;
180     ret.code = instance->GetPluralStringValue(resId, num, value);
181     if (ret.code != RState::SUCCESS) {
182         return ret;
183     }
184     ret.data = ::Utils::MallocCString(value);
185     return ret;
186 }
187 
CJ_GetPluralStringValueByResource(int64_t id,CResource resource,int64_t num)188 RetDataCString CJ_GetPluralStringValueByResource(int64_t id, CResource resource, int64_t num)
189 {
190     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
191     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
192     if (!instance) {
193         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
194         return ret;
195     }
196     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
197         .moduleName = std::string(resource.moduleName), .id = resource.id };
198     std::shared_ptr<ResourceManager> resMgr = nullptr;
199     uint32_t resId = 0;
200     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
201         LOGE("ResourceManager CJ_GetPluralStringValueByResource failed at GetHapResourceManager");
202         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
203         return ret;
204     }
205     std::string value;
206     ret.code = resMgr->GetPluralStringByIdFormat(value, resId, num, num);
207     if (ret.code != RState::SUCCESS) {
208         LOGE("ResourceManagerImpl::GetPluralStringByIdFormat failed %{public}" PRIu32, ret.code);
209         return ret;
210     }
211     LOGI("ResourceManagerImpl::GetPluralStringByIdFormat success");
212     ret.data = ::Utils::MallocCString(value);
213     return ret;
214 }
215 
CJ_GetPluralStringByName(int64_t id,const char * name,int64_t quantity)216 RetDataCString CJ_GetPluralStringByName(int64_t id, const char *name, int64_t quantity)
217 {
218     LOGI("CJ_GetPluralStringValue start");
219     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
220     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
221     if (!instance) {
222         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
223         return ret;
224     }
225     std::string value;
226     ret.code = instance->GetPluralStringValue(name, quantity, value);
227     if (ret.code != RState::SUCCESS) {
228         return ret;
229     }
230     ret.data = ::Utils::MallocCString(value);
231     return ret;
232 }
233 
CJ_GetStringArrayValue(int64_t id,uint32_t resId)234 RetDataCArrString CJ_GetStringArrayValue(int64_t id, uint32_t resId)
235 {
236     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
237     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
238     if (!instance) {
239         return ret;
240     }
241     std::vector<std::string> value;
242     ret.code = instance->GetStringArrayValue(resId, value);
243     if (ret.code != RState::SUCCESS) {
244         return ret;
245     }
246     ret.data = VectorToCArrString(value, ret.code);
247     return ret;
248 }
249 
CJ_GetStringArrayValueByResource(int64_t id,CResource resource)250 RetDataCArrString CJ_GetStringArrayValueByResource(int64_t id, CResource resource)
251 {
252     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
253     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
254     if (!instance) {
255         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
256         return ret;
257     }
258     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
259         .moduleName = std::string(resource.moduleName), .id = resource.id };
260     std::shared_ptr<ResourceManager> resMgr = nullptr;
261     uint32_t resId = 0;
262     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
263         LOGE("ResourceManager CJ_GetStringArrayValueByResource failed at GetHapResourceManager");
264         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
265         return ret;
266     }
267     std::vector<std::string> value;
268     ret.code = resMgr->GetStringArrayById(resId, value);
269     if (ret.code != RState::SUCCESS) {
270         LOGE("ResourceManagerImpl::GetStringArrayById failed %{public}" PRIu32, ret.code);
271         return ret;
272     }
273     ret.data = VectorToCArrString(value, ret.code);
274     return ret;
275 }
276 
CJ_GetStringArrayByName(int64_t id,const char * name)277 RetDataCArrString CJ_GetStringArrayByName(int64_t id, const char *name)
278 {
279     LOGI("CJ_GetStringArrayByName start");
280     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
281     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
282     if (!instance) {
283         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
284         return ret;
285     }
286     std::vector<std::string> value;
287     ret.code = instance->GetStringArrayByName(name, value);
288     if (ret.code != RState::SUCCESS) {
289         return ret;
290     }
291     ret.data = VectorToCArrString(value, ret.code);
292     return ret;
293 }
294 
CJ_GetString(int64_t id,uint32_t resId)295 RetDataCString CJ_GetString(int64_t id, uint32_t resId)
296 {
297     LOGI("CJ_GetString start");
298     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
299     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
300     if (!instance) {
301         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
302         return ret;
303     }
304     std::string value;
305     ret.code = instance->GetString(resId, value);
306     if (ret.code != RState::SUCCESS) {
307         return ret;
308     }
309     ret.data = ::Utils::MallocCString(value);
310     return ret;
311 }
312 
CJ_GetStringByResource(int64_t id,CResource resource)313 RetDataCString CJ_GetStringByResource(int64_t id, CResource resource)
314 {
315     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
316     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
317     if (!instance) {
318         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
319         return ret;
320     }
321     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
322         .moduleName = std::string(resource.moduleName), .id = resource.id };
323     std::shared_ptr<ResourceManager> resMgr = nullptr;
324     uint32_t resId = 0;
325     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
326         LOGE("ResourceManager CJ_GetStringByResource failed at GetHapResourceManager");
327         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
328         return ret;
329     }
330     std::string value;
331     ret.code = resMgr->GetStringById(resId, value);
332     if (ret.code != RState::SUCCESS) {
333         LOGE("ResourceManagerImpl::GetStringById failed %{public}" PRIu32, ret.code);
334         return ret;
335     }
336     LOGI("ResourceManagerImpl::GetStringById success");
337     ret.data = ::Utils::MallocCString(value);
338     return ret;
339 }
340 
CJ_GetStringByName(int64_t id,const char * name)341 RetDataCString CJ_GetStringByName(int64_t id, const char* name)
342 {
343     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
344     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
345     if (!instance) {
346         ret.code = ERR_INVALID_INSTANCE_CODE;
347         return ret;
348     }
349     std::string value;
350     ret.code = instance->GetStringByName(name, value);
351     if (ret.code != RState::SUCCESS) {
352         return ret;
353     }
354     ret.data = ::Utils::MallocCString(value);
355     return ret;
356 }
357 
CJ_GetColorByName(int64_t id,const char * name,uint32_t & data)358 int32_t CJ_GetColorByName(int64_t id, const char* name, uint32_t &data)
359 {
360     LOGI("CJ_GetColorByName start");
361     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
362     if (!instance) {
363         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
364         return ERR_INVALID_INSTANCE_CODE;
365     }
366     return instance->GetColorByName(name, data);
367 }
368 
CJ_GetColor(int64_t id,uint32_t resId,uint32_t & data)369 int32_t CJ_GetColor(int64_t id, uint32_t resId, uint32_t &data)
370 {
371     LOGI("CJ_GetColor start");
372     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
373     if (!instance) {
374         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
375         return ERR_INVALID_INSTANCE_CODE;
376     }
377     return instance->GetColorById(resId, data);
378 }
379 
CJ_GetColorByResource(int64_t id,CResource resource,uint32_t & data)380 int32_t CJ_GetColorByResource(int64_t id, CResource resource, uint32_t &data)
381 {
382     LOGI("CJ_GetColorByResource start");
383     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
384     if (!instance) {
385         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
386         return ERR_INVALID_INSTANCE_CODE;
387     }
388     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
389         .moduleName = std::string(resource.moduleName), .id = resource.id };
390     std::shared_ptr<ResourceManager> resMgr = nullptr;
391     uint32_t resId = 0;
392     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
393         LOGE("ResourceManager CJ_GetColorByResource failed at GetHapResourceManager");
394         return RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
395     }
396     return resMgr->GetColorById(resId, data);
397 }
398 
CJ_GetBoolean(int64_t id,uint32_t resId,bool & data)399 int32_t CJ_GetBoolean(int64_t id, uint32_t resId, bool &data)
400 {
401     LOGI("CJ_GetBoolean start");
402     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
403     if (!instance) {
404         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
405         return ERR_INVALID_INSTANCE_CODE;
406     }
407     return instance->GetBooleanById(resId, data);
408 }
409 
CJ_GetBooleanByResource(int64_t id,CResource resource,bool & data)410 int32_t CJ_GetBooleanByResource(int64_t id, CResource resource, bool &data)
411 {
412     LOGI("CJ_GetBoolean start");
413     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
414     if (!instance) {
415         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
416         return ERR_INVALID_INSTANCE_CODE;
417     }
418     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
419         .moduleName = std::string(resource.moduleName), .id = resource.id };
420     std::shared_ptr<ResourceManager> resMgr = nullptr;
421     uint32_t resId = 0;
422     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
423         LOGE("ResourceManager CJ_GetBooleanByResource failed at GetHapResourceManager");
424         return RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
425     }
426     return resMgr->GetBooleanById(resId, data);
427 }
428 
CJ_GetBooleanByName(int64_t id,const char * name,bool & data)429 int32_t CJ_GetBooleanByName(int64_t id, const char* name, bool &data)
430 {
431     LOGI("CJ_GetBooleanByName start");
432     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
433     if (!instance) {
434         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
435         return ERR_INVALID_INSTANCE_CODE;
436     }
437     return instance->GetBooleanByName(name, data);
438 }
439 
CJ_GetNumber(int64_t id,uint32_t resId,RetGetNumber & data)440 int32_t CJ_GetNumber(int64_t id, uint32_t resId, RetGetNumber &data)
441 {
442     LOGI("CJ_GetNumber start");
443     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
444     if (!instance) {
445         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
446         return ERR_INVALID_INSTANCE_CODE;
447     }
448     data.isInt = true;
449     auto state = instance->GetIntegerById(resId, data.intValue);
450     if (state != SUCCESS_CODE) {
451         state = instance->GetFloatById(resId, data.floatValue);
452         data.isInt = false;
453     }
454     return state;
455 }
456 
CJ_GetNumberByResource(int64_t id,CResource resource,RetGetNumber & data)457 int32_t CJ_GetNumberByResource(int64_t id, CResource resource, RetGetNumber &data)
458 {
459     LOGI("CJ_GetNumber start");
460     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
461     if (!instance) {
462         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
463         return ERR_INVALID_INSTANCE_CODE;
464     }
465     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
466         .moduleName = std::string(resource.moduleName), .id = resource.id };
467     std::shared_ptr<ResourceManager> resMgr = nullptr;
468     uint32_t resId = 0;
469     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
470         LOGE("ResourceManager CJ_GetNumberByResource failed at GetHapResourceManager");
471         return RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
472     }
473     data.isInt = true;
474     auto state = instance->GetIntegerById(resId, data.intValue);
475     if (state != SUCCESS_CODE) {
476         state = instance->GetFloatById(resId, data.floatValue);
477         data.isInt = false;
478     }
479     return state;
480 }
481 
CJ_GetNumberByName(int64_t id,const char * name,RetGetNumber & data)482 int32_t CJ_GetNumberByName(int64_t id, const char* name, RetGetNumber &data)
483 {
484     LOGI("CJ_GetNumberByName start");
485     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
486     if (!instance) {
487         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
488         return ERR_INVALID_INSTANCE_CODE;
489     }
490     data.isInt = true;
491     auto state = instance->GetIntegerByName(name, data.intValue);
492     if (state != SUCCESS_CODE) {
493         state = instance->GetFloatByName(name, data.floatValue);
494         data.isInt = false;
495     }
496     return state;
497 }
498 
CJ_GetConfiguration(int64_t id,OHOS::Resource::Configuration & cfg)499 int32_t CJ_GetConfiguration(int64_t id, OHOS::Resource::Configuration &cfg)
500 {
501     LOGI("CJ_GetConfiguration start");
502     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
503     if (!instance) {
504         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
505         return ERR_INVALID_INSTANCE_CODE;
506     }
507     instance->GetConfiguration(cfg);
508     return SUCCESS_CODE;
509 }
510 
CJ_GetDeviceCapability(int64_t id,OHOS::Resource::DeviceCapability & deviceCapability)511 int32_t CJ_GetDeviceCapability(int64_t id, OHOS::Resource::DeviceCapability &deviceCapability)
512 {
513     LOGI("CJ_GetDeviceCapability start");
514     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
515     if (!instance) {
516         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
517         return ERR_INVALID_INSTANCE_CODE;
518     }
519     instance->GetDeviceCapability(deviceCapability);
520     return SUCCESS_CODE;
521 }
522 
CJ_GetMediaByName(int64_t id,const char * resName,uint32_t density)523 RetDataCArrUI8 CJ_GetMediaByName(int64_t id, const char* resName, uint32_t density)
524 {
525     LOGI("CJ_GetMediaByName start");
526     RetDataCArrUI8 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0} };
527     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
528     if (!instance) {
529         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
530         return ret;
531     }
532     size_t len = 0;
533     std::unique_ptr<uint8_t[]> data;
534     int32_t state = instance->GetMediaDataByName(resName, len, data, density);
535     ret.code = state;
536     if (state == SUCCESS_CODE) {
537         CopyUI8Arr(ret, data, len);
538     }
539     return ret;
540 }
541 
CJ_GetMediaContent(int64_t id,uint32_t resId,uint32_t density)542 RetDataCArrUI8 CJ_GetMediaContent(int64_t id, uint32_t resId, uint32_t density)
543 {
544     LOGI("CJ_GetMediaContent start");
545     RetDataCArrUI8 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0} };
546     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
547     if (!instance) {
548         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
549         return ret;
550     }
551     size_t len = 0;
552     std::unique_ptr<uint8_t[]> data;
553     int32_t state = instance->GetMediaDataById(resId, len, data, density);
554     ret.code = state;
555     if (state == SUCCESS_CODE) {
556         CopyUI8Arr(ret, data, len);
557     }
558     return ret;
559 }
560 
CJ_GetMediaContentByResource(int64_t id,CResource resource,uint32_t density)561 RetDataCArrUI8 CJ_GetMediaContentByResource(int64_t id, CResource resource, uint32_t density)
562 {
563     LOGI("CJ_GetMediaContent start");
564     RetDataCArrUI8 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0} };
565     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
566     if (!instance) {
567         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
568         return ret;
569     }
570     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
571         .moduleName = std::string(resource.moduleName), .id = resource.id };
572     std::shared_ptr<ResourceManager> resMgr = nullptr;
573     uint32_t resId = 0;
574     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
575         LOGE("ResourceManager CJ_GetMediaContentByResource failed at GetHapResourceManager");
576         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
577         return ret;
578     }
579     size_t len = 0;
580     std::unique_ptr<uint8_t[]> data;
581     int32_t state = resMgr->GetMediaDataById(resId, len, data, density);
582     ret.code = state;
583     if (state == SUCCESS_CODE) {
584         CopyUI8Arr(ret, data, len);
585     }
586     return ret;
587 }
588 
CJ_GetMediaContentBase64(int64_t id,uint32_t resId,uint32_t density)589 RetDataCString CJ_GetMediaContentBase64(int64_t id, uint32_t resId, uint32_t density)
590 {
591     LOGI("CJ_GetMediaContentBase64 start");
592     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
593     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
594     if (!instance) {
595         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
596         return ret;
597     }
598     std::string value;
599     ret.code = instance->GetMediaContentBase64ById(resId, value, density);
600     if (ret.code != RState::SUCCESS) {
601         return ret;
602     }
603     ret.data = ::Utils::MallocCString(value);
604     return ret;
605 }
606 
CJ_GetMediaContentBase64ByResource(int64_t id,CResource resource,uint32_t density)607 RetDataCString CJ_GetMediaContentBase64ByResource(int64_t id, CResource resource, uint32_t density)
608 {
609     LOGI("CJ_GetMediaContentBase64ByResource start");
610     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
611     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
612     if (!instance) {
613         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
614         return ret;
615     }
616     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
617         .moduleName = std::string(resource.moduleName), .id = resource.id };
618     std::shared_ptr<ResourceManager> resMgr = nullptr;
619     uint32_t resId = 0;
620     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
621         LOGE("ResourceManager CJ_GetMediaContentBase64ByResource failed at GetHapResourceManager");
622         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
623         return ret;
624     }
625     std::string value;
626     ret.code = resMgr->GetMediaBase64DataById(resId, value, density);
627     if (ret.code != RState::SUCCESS) {
628         return ret;
629     }
630     ret.data = ::Utils::MallocCString(value);
631     return ret;
632 }
633 
CJ_GetMediaContentBase64ByName(int64_t id,const char * resName,uint32_t density)634 RetDataCString CJ_GetMediaContentBase64ByName(int64_t id, const char* resName, uint32_t density)
635 {
636     LOGI("CJ_GetMediaContentBase64 start");
637     RetDataCString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = nullptr };
638     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
639     if (!instance) {
640         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
641         return ret;
642     }
643     std::string value;
644     ret.code = instance->GetMediaContentBase64ByName(resName, value, density);
645     if (ret.code != RState::SUCCESS) {
646         return ret;
647     }
648     ret.data = ::Utils::MallocCString(value);
649     return ret;
650 }
651 
CJ_GetDrawableDescriptor(int64_t id,uint32_t resId,uint32_t density)652 RetDataI64 CJ_GetDrawableDescriptor(int64_t id, uint32_t resId, uint32_t density)
653 {
654     LOGI("CJ_GetDrawableDescriptor start");
655     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = -1 };
656     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
657     if (!instance) {
658         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
659         return ret;
660     }
661     ret.code = instance->GetDrawableDescriptor(resId, ret.data, density);
662     if (ret.code != RState::SUCCESS) {
663         return ret;
664     }
665     return ret;
666 }
667 
CJ_GetDrawableDescriptorByResource(int64_t id,CResource resource,uint32_t density)668 RetDataI64 CJ_GetDrawableDescriptorByResource(int64_t id, CResource resource, uint32_t density)
669 {
670     LOGI("CJ_GetDrawableDescriptor start");
671     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = -1 };
672     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
673     if (!instance) {
674         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
675         return ret;
676     }
677     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
678         .moduleName = std::string(resource.moduleName), .id = resource.id };
679     std::shared_ptr<ResourceManager> resMgr = nullptr;
680     uint32_t resId = 0;
681     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
682         LOGE("ResourceManager CJ_GetDrawableDescriptorByResource failed at GetHapResourceManager");
683         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
684         return ret;
685     }
686     RState state;
687     auto drawableDescriptor = OHOS::Resource::GetDrawableDescriptorPtr(resId, resMgr, density, state);
688     ret.code = state;
689     if (ret.code != SUCCESS) {
690         LOGE("Failed to Create drawableDescriptor by %{public}" PRIu32, resId);
691         return ret;
692     }
693     auto ptr = FFIData::Create<DrawableDescriptorImpl>(drawableDescriptor);
694     if (!ptr) {
695         ret.code = ERR_INVALID_INSTANCE_CODE;
696         return ret;
697     }
698     ret.data = ptr->GetID();
699     return ret;
700 }
701 
CJ_GetDrawableDescriptorByName(int64_t id,const char * resName,uint32_t density)702 RetDataI64 CJ_GetDrawableDescriptorByName(int64_t id, const char* resName, uint32_t density)
703 {
704     LOGI("CJ_GetDrawableDescriptorByName start");
705     RetDataI64 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = -1 };
706     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
707     if (!instance) {
708         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
709         return ret;
710     }
711     ret.code = instance->GetDrawableDescriptorByName(resName, ret.data, density);
712     if (ret.code != RState::SUCCESS) {
713         return ret;
714     }
715     return ret;
716 }
717 
CJ_GetLocales(int64_t id,bool includeSystem)718 RetDataCArrString CJ_GetLocales(int64_t id, bool includeSystem)
719 {
720     LOGI("CJ_GetLocales start");
721     RetDataCArrString ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = { .head = nullptr, .size = 0 } };
722     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
723     if (!instance) {
724         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
725         return ret;
726     }
727     std::vector<std::string> value;
728     instance->GetLocales(includeSystem, value);
729     ret.code = RState::SUCCESS;
730     ret.data = VectorToCArrString(value, ret.code);
731     return ret;
732 }
733 
CJ_GetSymbol(int64_t id,uint32_t resId)734 RetDataU32 CJ_GetSymbol(int64_t id, uint32_t resId)
735 {
736     LOGI("CJ_GetSymbol start");
737     RetDataU32 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = -1 };
738     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
739     if (!instance) {
740         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
741         return ret;
742     }
743     ret.code = instance->GetSymbolById(resId, ret.data);
744     if (ret.code != RState::SUCCESS) {
745         return ret;
746     }
747     return ret;
748 }
749 
CJ_GetSymbolByResource(int64_t id,CResource resource)750 RetDataU32 CJ_GetSymbolByResource(int64_t id, CResource resource)
751 {
752     LOGI("CJ_GetSymbol start");
753     RetDataU32 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = -1 };
754     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
755     if (!instance) {
756         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
757         return ret;
758     }
759     OHOS::Global::Resource::ResourceManager::Resource res = { .bundleName = std::string(resource.bundleName),
760         .moduleName = std::string(resource.moduleName), .id = resource.id };
761     std::shared_ptr<ResourceManager> resMgr = nullptr;
762     uint32_t resId = 0;
763     if (!instance->GetHapResourceManager(res, resMgr, resId)) {
764         LOGE("ResourceManager CJ_GetSymbolByResource failed at GetHapResourceManager");
765         ret.code = RState::ERROR_CODE_RES_NOT_FOUND_BY_ID;
766         return ret;
767     }
768     ret.code = resMgr->GetSymbolById(resId, ret.data);
769     if (ret.code != RState::SUCCESS) {
770         LOGE("ResourceManagerImpl::GetSymbolByResource failed %{public}" PRIu32, ret.code);
771         return ret;
772     }
773     LOGI("ResourceManagerImpl::GetSymbolByResource success")
774     return ret;
775 }
776 
CJ_GetSymbolByName(int64_t id,const char * name)777 RetDataU32 CJ_GetSymbolByName(int64_t id, const char* name)
778 {
779     LOGI("CJ_GetSymbolByName start");
780     RetDataU32 ret = { .code = ERR_INVALID_INSTANCE_CODE, .data = -1 };
781     auto instance = FFIData::GetData<ResourceManagerImpl>(id);
782     if (!instance) {
783         LOGE("ResourceManager instance not exist %{public}" PRId64, id);
784         return ret;
785     }
786     ret.code = instance->GetSymbolByName(name, ret.data);
787     if (ret.code != RState::SUCCESS) {
788         return ret;
789     }
790     return ret;
791 }
792 }
793 }
794 }