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 }