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 "cj_avsession_utils.h"
17
18 #include "securec.h"
19 #include <cstdlib>
20 #include <vector>
21
22 #include "int_wrapper.h"
23 #include "double_wrapper.h"
24 #include "string_wrapper.h"
25 #include "bool_wrapper.h"
26 #include "long_wrapper.h"
27 #include "array_wrapper.h"
28 #include "want_params_wrapper.h"
29 #include "pixel_map_impl.h"
30 #include "cj_want_agent_ffi.h"
31 #include "avsession_pixel_map_adapter.h"
32 #include "avsession_errors.h"
33 #include "cj_avsession_media_description.h"
34
35 namespace OHOS::AVSession {
36
37 /* Common Methods ===========================================*/
CJExecMethod(std::function<int32_t ()> method,std::string methodName)38 int32_t CJExecMethod(std::function<int32_t()> method, std::string methodName)
39 {
40 int32_t ret = method();
41 if (ret != AVSESSION_SUCCESS) {
42 SLOGE("controller %{public}s failed:%{public}d", methodName.c_str(), ret);
43 }
44 return ret;
45 }
46
47 template<class T>
CJConverterMalloc(T * & obj,int64_t size)48 int32_t CJConverterMalloc(T*& obj, int64_t size)
49 {
50 if (size <= 0) {
51 obj = nullptr;
52 return CJNO_ERROR;
53 }
54 obj = static_cast<T *>(malloc(sizeof(T) * size));
55 if (obj == nullptr) {
56 return ERR_NO_MEMORY;
57 }
58 return CJNO_ERROR;
59 }
60
MallocCString(const std::string & origin)61 char *MallocCString(const std::string &origin)
62 {
63 char* cstr = nullptr;
64 int len = static_cast<int>(origin.length() + 1);
65 if (CJConverterMalloc<char>(cstr, len) != CJNO_ERROR) {
66 return cstr;
67 }
68 if (strcpy_s(cstr, len, origin.c_str()) != 0) {
69 free(cstr);
70 cstr = nullptr;
71 }
72 return cstr;
73 }
74
MallocCString(const std::string & origin,int32_t & code)75 char *MallocCString(const std::string &origin, int32_t &code)
76 {
77 char* result = MallocCString(origin);
78 if (result == nullptr) {
79 code = AVSESSION_ERROR;
80 } else {
81 code = CJNO_ERROR;
82 }
83 return result;
84 }
85
86 using Step = std::function<int32_t()>;
87 class CJUtilsChainCall {
88 public:
89
addStep(Step step)90 void addStep(Step step)
91 {
92 steps.push_back(step);
93 }
94
RunSteps(std::vector<Step> & funcs)95 static int32_t RunSteps(std::vector<Step> &funcs)
96 {
97 int code = CJNO_ERROR;
98 for (auto& step: funcs) {
99 int32_t code = step();
100 if (code != CJNO_ERROR) {
101 return code;
102 }
103 }
104 return code;
105 }
106
Run()107 int32_t Run()
108 {
109 int code = CJNO_ERROR;
110 for (auto& step: steps) {
111 int32_t code = step();
112 if (code != CJNO_ERROR) {
113 return code;
114 }
115 }
116 return code;
117 }
118
119 private:
120 std::vector<Step> steps;
121 };
122
123 /* WantParas <=> CArray<CParameters> ========================*/
124
125 const char *FD = "FD";
126 const char *REMOTE_OBJECT = "RemoteObject";
127 const char *TYPE_PROPERTY = "type";
128 const char *VALUE_PROPERTY = "value";
129
130 using WantParams = OHOS::AAFwk::WantParams;
131
charPtrToVector(char ** charPtr,int size,std::vector<std::string> & result)132 void charPtrToVector(char **charPtr, int size, std::vector<std::string> &result)
133 {
134 for (int i = 0; i < size; i++) {
135 result.push_back(std::string(charPtr[i]));
136 }
137 }
138
SetFdData(std::string key,int * value,WantParams & wantP)139 void SetFdData(std::string key, int *value, WantParams &wantP)
140 {
141 WantParams wp;
142 wp.SetParam(TYPE_PROPERTY, OHOS::AAFwk::String::Box(FD));
143 wp.SetParam(VALUE_PROPERTY, OHOS::AAFwk::Integer::Box(*value));
144 sptr<OHOS::AAFwk::IWantParams> pWantParams = OHOS::AAFwk::WantParamWrapper::Box(wp);
145 wantP.SetParam(key, pWantParams);
146 }
147
InnerSetWantParamsArrayString(CParameters * head,WantParams & wantParams)148 bool InnerSetWantParamsArrayString(CParameters* head, WantParams &wantParams)
149 {
150 char **strPtr = static_cast<char **>(head->value);
151 std::vector<std::string> strVec;
152 charPtrToVector(strPtr, head->size, strVec);
153 size_t size = strVec.size();
154 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IString);
155 if (ao != nullptr) {
156 for (size_t i = 0; i < size; i++) {
157 ao->Set(i, AAFwk::String::Box(strVec[i]));
158 }
159 wantParams.SetParam(std::string(head->key), ao);
160 return true;
161 } else {
162 return false;
163 }
164 }
165
InnerSetWantParamsArrayInt(CParameters * head,WantParams & wantParams)166 bool InnerSetWantParamsArrayInt(CParameters* head, WantParams &wantParams)
167 {
168 int *intArr = static_cast<int *>(head->value);
169 std::vector<int> intVec(intArr, intArr + head->size);
170 size_t size = intVec.size();
171 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IInteger);
172 if (ao != nullptr) {
173 for (size_t i = 0; i < size; i++) {
174 ao->Set(i, AAFwk::Integer::Box(intVec[i]));
175 }
176 wantParams.SetParam(std::string(head->key), ao);
177 return true;
178 } else {
179 return false;
180 }
181 }
182
InnerSetWantParamsArrayBool(CParameters * head,WantParams & wantParams)183 bool InnerSetWantParamsArrayBool(CParameters* head, WantParams &wantParams)
184 {
185 bool *boolArr = static_cast<bool *>(head->value);
186 std::vector<bool> boolVec(boolArr, boolArr + head->size);
187 size_t size = boolVec.size();
188 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IBoolean);
189 if (ao != nullptr) {
190 for (size_t i = 0; i < size; i++) {
191 ao->Set(i, AAFwk::Boolean::Box(boolVec[i]));
192 }
193 wantParams.SetParam(std::string(head->key), ao);
194 return true;
195 } else {
196 return false;
197 }
198 }
199
InnerSetWantParamsArrayDouble(CParameters * head,WantParams & wantParams)200 bool InnerSetWantParamsArrayDouble(CParameters* head, WantParams &wantParams)
201 {
202 double *doubleArr = static_cast<double *>(head->value);
203 std::vector<double> doubleVec(doubleArr, doubleArr + head->size);
204 size_t size = doubleVec.size();
205 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IDouble);
206 if (ao != nullptr) {
207 for (size_t i = 0; i < size; i++) {
208 ao->Set(i, AAFwk::Double::Box(doubleVec[i]));
209 }
210 wantParams.SetParam(std::string(head->key), ao);
211 return true;
212 } else {
213 return false;
214 }
215 }
216
InnerSetWantParamsArrayFD(CParameters * head,int64_t size,WantParams & wantParams)217 void InnerSetWantParamsArrayFD(CParameters* head, int64_t size, WantParams &wantParams)
218 {
219 sptr<AAFwk::IArray> ao = new (std::nothrow) AAFwk::Array(size, AAFwk::g_IID_IWantParams);
220 if (ao != nullptr) {
221 for (size_t i = 0; i < static_cast<size_t>(size); i++) {
222 WantParams wp;
223 SetFdData(std::string(head->key), static_cast<int *>(head->value) + i, wp);
224 wp.DumpInfo(0);
225 ao->Set(i, OHOS::AAFwk::WantParamWrapper::Box(wp));
226 }
227 wantParams.SetParam(std::string(head->key), ao);
228 }
229 return;
230 }
231
232 int32_t InnerSetWantParamsHashMap(CParameters* head, WantParams &wantParams);
233
SetDataParameters(const CArray & parameters,WantParams & wantP)234 int32_t SetDataParameters(const CArray& parameters, WantParams &wantP)
235 {
236 auto head = static_cast<CParameters*>(parameters.head);
237 if (head == nullptr) {
238 SLOGE("CParameters has nullptr head!");
239 return AVSESSION_ERROR;
240 }
241 for (uint64_t i = 0; i < parameters.size; i++, head++) {
242 auto key = std::string(head->key);
243 if (head->valueType == I32_TYPE) { // int32_t
244 wantP.SetParam(key, OHOS::AAFwk::Integer::Box(*static_cast<int32_t *>(head->value)));
245 } else if (head->valueType == DOUBLE_TYPE) { // double
246 wantP.SetParam(key, OHOS::AAFwk::Double::Box(*static_cast<double *>(head->value)));
247 } else if (head->valueType == STR_TYPE) { // std::string
248 wantP.SetParam(key, OHOS::AAFwk::String::Box(std::string(static_cast<char *>(head->value))));
249 } else if (head->valueType == BOOL_TYPE) { // bool
250 wantP.SetParam(key, OHOS::AAFwk::Boolean::Box(*static_cast<bool *>(head->value)));
251 } else if (head->valueType == FD_TYPE) { // "FD"
252 SetFdData(key, static_cast<int *>(head->value), wantP);
253 } else if (head->valueType == HASH_MAP_TYPE) { // hashmap
254 return InnerSetWantParamsHashMap(head, wantP);
255 } else if (head->valueType == STR_PTR_TYPE) { // char**
256 InnerSetWantParamsArrayString(head, wantP);
257 } else if (head->valueType == I32_PTR_TYPE) { // int32_t*
258 InnerSetWantParamsArrayInt(head, wantP);
259 } else if (head->valueType == BOOL_PTR_TYPE) { // bool*
260 InnerSetWantParamsArrayBool(head, wantP);
261 } else if (head->valueType == DOUBLE_PTR_TYPE) { // double*
262 InnerSetWantParamsArrayDouble(head, wantP);
263 } else if (head->valueType == FD_PTR_TYPE) { // FD*
264 InnerSetWantParamsArrayFD(head, head->size, wantP);
265 } else {
266 SLOGE("Wrong type!");
267 return AVSESSION_ERROR;
268 }
269 }
270 return CJNO_ERROR;
271 }
272
InnerSetWantParamsHashMap(CParameters * head,WantParams & wantParams)273 int32_t InnerSetWantParamsHashMap(CParameters* head, WantParams &wantParams)
274 {
275 WantParams wp;
276 CArray carr;
277 carr.head = head->value;
278 carr.size = static_cast<uint64_t>(head->size);
279 auto ret = SetDataParameters(carr, wp);
280 if (ret != CJNO_ERROR) {
281 return ret;
282 }
283 sptr<AAFwk::IWantParams> pWantParams = AAFwk::WantParamWrapper::Box(wp);
284 wantParams.SetParam(std::string(head->key), pWantParams);
285 return CJNO_ERROR;
286 }
287
288 // WantParameters -> CArrParameters
InnerWrapWantParamsString(const WantParams & wantParams,CParameters * p)289 int32_t InnerWrapWantParamsString(const WantParams &wantParams, CParameters *p)
290 {
291 int ret = CJNO_ERROR;
292 auto value = wantParams.GetParam(p->key);
293 AAFwk::IString *ao = AAFwk::IString::Query(value);
294 if (ao == nullptr) {
295 SLOGE("No value");
296 p->valueType = NONE_VALUE;
297 return AVSESSION_ERROR;
298 }
299 std::string natValue = OHOS::AAFwk::String::Unbox(ao);
300 p->value = MallocCString(natValue, ret);
301 p->size = 1;
302 p->valueType = STR_TYPE;
303 return ret;
304 }
305
306 template <class TBase, class T, class NativeT>
InnerWrapWantParamsT(const WantParams & wantParams,CParameters * p)307 int32_t InnerWrapWantParamsT(const WantParams &wantParams, CParameters *p)
308 {
309 auto value = wantParams.GetParam(p->key);
310 TBase *ao = TBase::Query(value);
311 if (ao == nullptr) {
312 SLOGE("No value");
313 p->valueType = NONE_VALUE;
314 return CJNO_ERROR;
315 }
316 NativeT natValue = T::Unbox(ao);
317 NativeT *ptr = static_cast<NativeT *>(malloc(sizeof(NativeT)));
318 if (ptr == nullptr) {
319 return ERR_NO_MEMORY;
320 }
321 *ptr = natValue;
322 p->value = static_cast<void*>(ptr);
323 p->size = 1;
324 return CJNO_ERROR;
325 }
326
InnerWrapWantParamsUnboxArrayString(sptr<AAFwk::IArray> & ao,int index,char * & strPtr)327 int32_t InnerWrapWantParamsUnboxArrayString(sptr<AAFwk::IArray>& ao, int index, char*& strPtr)
328 {
329 sptr<AAFwk::IInterface> iface = nullptr;
330 if (ao->Get(index, iface) == ERR_OK) {
331 AAFwk::IString *iValue = AAFwk::IString::Query(iface);
332 if (iValue != nullptr) {
333 auto val = AAFwk::String::Unbox(iValue);
334 strPtr = MallocCString(val);
335 if (strPtr == nullptr) { return ERR_NO_MEMORY; }
336 }
337 }
338 return CJNO_ERROR;
339 }
340
InnerWrapWantParamsArrayString(sptr<AAFwk::IArray> & ao,CParameters * p)341 int32_t InnerWrapWantParamsArrayString(sptr<AAFwk::IArray> &ao, CParameters *p)
342 {
343 long size = 0;
344 if (ao->GetLength(size) != ERR_OK) {
345 SLOGE("fail to get length");
346 return AVSESSION_ERROR;
347 }
348 if (size == 0) {
349 return AVSESSION_ERROR;
350 }
351 long mallocSize = sizeof(char *) * size;
352 char **arrP = static_cast<char **>(malloc(mallocSize));
353 if (arrP == nullptr) {
354 SLOGE("fail to malloc");
355 return ERR_NO_MEMORY;
356 }
357 int ret = CJNO_ERROR;
358 memset_s(arrP, mallocSize, 0, mallocSize);
359 for (long i = 0; i < size; i++) {
360 ret = InnerWrapWantParamsUnboxArrayString(ao, i, arrP[i]);
361 if (ret != CJNO_ERROR) {
362 break;
363 }
364 }
365 p->size = size;
366 p->value = static_cast<void *>(arrP);
367 return ret;
368 }
369
ClearParametersPtr(CParameters * & ptr,int count,bool isKey)370 void ClearParametersPtr(CParameters *&ptr, int count, bool isKey)
371 {
372 CParameters *p = ptr;
373 for (int i = 0; i < count; i++) {
374 free(p[i].key);
375 free(p[i].value);
376 p[i].key = nullptr;
377 p[i].value = nullptr;
378 }
379 if (!isKey) {
380 free(p[count].key);
381 p[count].key = nullptr;
382 }
383 free(ptr);
384 ptr = nullptr;
385 }
386
387 template <class TBase, class T, class NativeT>
InnerWrapWantParamsArrayT(sptr<AAFwk::IArray> & ao,CParameters * p)388 int32_t InnerWrapWantParamsArrayT(sptr<AAFwk::IArray> &ao, CParameters *p)
389 {
390 long size = 0;
391 if (ao->GetLength(size) != ERR_OK) {
392 SLOGE("fail to get length");
393 return AVSESSION_ERROR;
394 }
395 if (size == 0) {
396 return AVSESSION_ERROR;
397 }
398 NativeT *arrP = static_cast<NativeT *>(malloc(sizeof(NativeT) * size));
399 if (arrP == nullptr) {
400 SLOGE("fail to malloc");
401 return ERR_NO_MEMORY;
402 }
403 for (long i = 0; i < size; i++) {
404 sptr<AAFwk::IInterface> iface = nullptr;
405 if (ao->Get(i, iface) == ERR_OK) {
406 TBase *iValue = TBase::Query(iface);
407 if (iValue != nullptr) {
408 arrP[i] = T::Unbox(iValue);
409 }
410 }
411 }
412 p->size = size;
413 p->value = static_cast<void *>(arrP);
414 return CJNO_ERROR;
415 }
416
GetFDValue(const WantParams & wantParams,std::string key,int * ptr)417 int32_t GetFDValue(const WantParams &wantParams, std::string key, int *ptr)
418 {
419 auto value = wantParams.GetParam(key);
420 AAFwk::IWantParams *o = AAFwk::IWantParams::Query(value);
421 if (o == nullptr) {
422 SLOGE("No value");
423 return CJNO_ERROR;
424 }
425 AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o);
426 value = wp.GetParam(VALUE_PROPERTY);
427 AAFwk::IInteger *ao = AAFwk::IInteger::Query(value);
428 if (ao == nullptr) {
429 SLOGE("No value");
430 return CJNO_ERROR;
431 }
432 *ptr = OHOS::AAFwk::Integer::Unbox(ao);
433 return CJNO_ERROR;
434 }
435
InnerWrapWantParamsFd(const WantParams & wantParams,CParameters * p)436 int32_t InnerWrapWantParamsFd(const WantParams &wantParams, CParameters *p)
437 {
438 int *ptr = static_cast<int *>(malloc(sizeof(int)));
439 if (ptr == nullptr) {
440 return ERR_NO_MEMORY;
441 }
442 int error = GetFDValue(wantParams, std::string(p->key), ptr);
443 if (error != CJNO_ERROR) {
444 free(ptr);
445 return error;
446 }
447 p->value = static_cast<void*>(ptr);
448 p->size = 1;
449 p->valueType = FD_TYPE;
450 return CJNO_ERROR;
451 }
452
GetValue(const WantParams & wantParams,std::string key,CParameters * p)453 int32_t GetValue(const WantParams &wantParams, std::string key, CParameters *p)
454 {
455 auto value = wantParams.GetParam(key);
456 AAFwk::IWantParams *o = AAFwk::IWantParams::Query(value);
457 if (o == nullptr) {
458 SLOGE("No value!");
459 return CJNO_ERROR;
460 }
461
462 AAFwk::WantParams wp = AAFwk::WantParamWrapper::Unbox(o);
463 if (wp.GetParam(TYPE_PROPERTY)) { //FD
464 value = wp.GetParam(VALUE_PROPERTY);
465 AAFwk::IInteger *ao = AAFwk::IInteger::Query(value);
466 if (ao == nullptr) {
467 return CJNO_ERROR;
468 }
469 int* ptr = static_cast<int *>(malloc(sizeof(int)));
470 if (ptr == nullptr) {
471 SLOGE("fail to malloc");
472 return ERR_NO_MEMORY;
473 }
474 *ptr = AAFwk::Integer::Unbox(ao);
475 p->value = static_cast<void *>(ptr);
476 p->size = 1;
477 p->valueType = FD_TYPE;
478 } else { // HASHMAP
479 CArray carr{};
480 int32_t code = CJNO_ERROR;
481 ParseParameters(wp, carr, code);
482 if (code != CJNO_ERROR) {
483 return code;
484 }
485 p->value = carr.head;
486 p->size = static_cast<int64_t>(carr.size);
487 p->valueType = HASH_MAP_TYPE;
488 }
489 return CJNO_ERROR;
490 }
491
InnerWrapWantParams(const WantParams & wantParams,CParameters * p)492 int32_t InnerWrapWantParams(const WantParams &wantParams, CParameters *p)
493 {
494 return GetValue(wantParams, std::string(p->key), p);
495 }
496
InnerWrapWantParamsArrayFd(sptr<AAFwk::IArray> & ao,CParameters * p)497 int32_t InnerWrapWantParamsArrayFd(sptr<AAFwk::IArray> &ao, CParameters *p)
498 {
499 long size = 0;
500 if (ao->GetLength(size) != ERR_OK) {
501 SLOGE("fail to get length");
502 return AVSESSION_ERROR;
503 }
504 if (size == 0) {
505 return AVSESSION_ERROR;
506 }
507 int *arrP = static_cast<int *>(malloc(sizeof(int) * size));
508 if (arrP == nullptr) {
509 SLOGE("fail to malloc");
510 return ERR_NO_MEMORY;
511 }
512 for (long i = 0; i < size; i++) {
513 sptr<AAFwk::IInterface> iface = nullptr;
514 if (ao->Get(i, iface) == ERR_OK) {
515 AAFwk::IWantParams *iValue = AAFwk::IWantParams::Query(iface);
516 if (iValue == nullptr) {
517 free(arrP);
518 return AVSESSION_ERROR;
519 }
520 WantParams wantP = AAFwk::WantParamWrapper::Unbox(iValue);
521 int ret = GetFDValue(wantP, std::string(p->key), arrP + i);
522 if (ret != CJNO_ERROR) {
523 free(arrP);
524 return ret;
525 }
526 }
527 }
528 p->size = size;
529 p->value = arrP;
530 p->valueType = FD_PTR_TYPE;
531 return CJNO_ERROR;
532 }
533
InnerWrapWantParamsArray(const WantParams & wantParams,sptr<AAFwk::IArray> & ao,CParameters * p)534 int32_t InnerWrapWantParamsArray(const WantParams &wantParams, sptr<AAFwk::IArray> &ao, CParameters *p)
535 {
536 SLOGI("%{public}s called. key=%{public}s", __func__, p->key);
537 if (AAFwk::Array::IsStringArray(ao)) {
538 p->valueType = STR_PTR_TYPE;
539 return InnerWrapWantParamsArrayString(ao, p);
540 } else if (AAFwk::Array::IsBooleanArray(ao)) {
541 p->valueType = BOOL_PTR_TYPE;
542 return InnerWrapWantParamsArrayT<AAFwk::IBoolean, AAFwk::Boolean, bool>(ao, p);
543 } else if (AAFwk::Array::IsIntegerArray(ao)) {
544 p->valueType = I32_PTR_TYPE;
545 return InnerWrapWantParamsArrayT<AAFwk::IInteger, AAFwk::Integer, int>(ao, p);
546 } else if (AAFwk::Array::IsLongArray(ao)) {
547 p->valueType = I64_PTR_TYPE;
548 return InnerWrapWantParamsArrayT<AAFwk::ILong, AAFwk::Long, int64_t>(ao, p);
549 } else if (AAFwk::Array::IsDoubleArray(ao)) {
550 p->valueType = DOUBLE_PTR_TYPE;
551 return InnerWrapWantParamsArrayT<AAFwk::IDouble, AAFwk::Double, double>(ao, p);
552 } else {
553 p->valueType = FD_PTR_TYPE;
554 return InnerWrapWantParamsArrayFd(ao, p);
555 }
556 }
557
ParseParameters(const AAFwk::WantParams & wantP,CArray & cArray,int32_t & code)558 void ParseParameters(const AAFwk::WantParams &wantP, CArray &cArray, int32_t &code)
559 {
560 std::map<std::string, sptr<OHOS::AAFwk::IInterface>> paramsMap = wantP.GetParams();
561 int count = 0;
562 auto size = static_cast<uint64_t>(paramsMap.size());
563 SLOGD("paramsMap size = %{public}" PRId64, size);
564 if (size == 0) {
565 return;
566 }
567 cArray.head = malloc(sizeof(CParameters) * size);
568 if (cArray.head == nullptr) {
569 code = ERR_NO_MEMORY;
570 return;
571 }
572 cArray.size = size;
573 auto ptr = static_cast<CParameters *>(cArray.head);
574 for (auto iter = paramsMap.begin(); iter != paramsMap.end(); iter++, ptr++, count++) {
575 ptr->key = MallocCString(iter->first);
576 if (ptr->key == nullptr) {
577 code = ERR_NO_MEMORY;
578 return ClearParametersPtr(reinterpret_cast<CParameters *&>(cArray.head), count, true);
579 }
580 ptr->value = nullptr;
581 ptr->size = 0;
582 if (AAFwk::IString::Query(iter->second) != nullptr) {
583 code = InnerWrapWantParamsString(wantP, ptr);
584 } else if (AAFwk::IBoolean::Query(iter->second) != nullptr) {
585 ptr->valueType = BOOL_TYPE;
586 code = InnerWrapWantParamsT<AAFwk::IBoolean, AAFwk::Boolean, bool>(wantP, ptr);
587 } else if (AAFwk::IInteger::Query(iter->second) != nullptr) {
588 ptr->valueType = I32_TYPE;
589 code = InnerWrapWantParamsT<AAFwk::IInteger, AAFwk::Integer, int>(wantP, ptr);
590 } else if (AAFwk::ILong::Query(iter->second) != nullptr) {
591 ptr->valueType = I64_TYPE;
592 code = InnerWrapWantParamsT<AAFwk::ILong, AAFwk::Long, long>(wantP, ptr);
593 } else if (AAFwk::IDouble::Query(iter->second) != nullptr) {
594 ptr->valueType = DOUBLE_TYPE;
595 code = InnerWrapWantParamsT<AAFwk::IDouble, AAFwk::Double, double>(wantP, ptr);
596 } else if (AAFwk::IWantParams::Query(iter->second) != nullptr) {
597 code = InnerWrapWantParams(wantP, ptr);
598 } else if (AAFwk::IArray::Query(iter->second) != nullptr) {
599 AAFwk::IArray *ao = AAFwk::IArray::Query(iter->second);
600 sptr<AAFwk::IArray> array(ao);
601 code = InnerWrapWantParamsArray(wantP, array, ptr);
602 }
603 if (code == ERR_NO_MEMORY || code == AVSESSION_ERROR) {
604 return ClearParametersPtr(reinterpret_cast<CParameters *&>(cArray.head), count, false);
605 }
606 }
607 }
608
609 /* Converter ================================================*/
610 /* Native to Cangjie*/
ConvertNativeToCJStruct(const AVCallState & native,CAVCallState & cj)611 int32_t ConvertNativeToCJStruct(const AVCallState& native, CAVCallState& cj)
612 {
613 cj.state = native.GetAVCallState();
614 cj.muted = native.IsAVCallMuted();
615 return CJNO_ERROR;
616 }
617
ConvertNativeToCJStruct(const AVCallMetaData & native,CAVCallMetaData & cj)618 int32_t ConvertNativeToCJStruct(const AVCallMetaData& native, CAVCallMetaData& cj)
619 {
620 std::vector<Step> steps;
621 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetName(), cj.name); });
622 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetPhoneNumber(), cj.phoneNumber); });
623 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetMediaImage(), cj.avatar); });
624 return CJUtilsChainCall::RunSteps(steps);
625 }
626
ConvertNativeToCJStruct(const AVMetaData & native,CAVMetaData & cj)627 int32_t ConvertNativeToCJStruct(const AVMetaData& native, CAVMetaData& cj)
628 {
629 std::vector<Step> steps;
630 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAssetId(), cj.assetId); });
631 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetTitle(), cj.title); });
632 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetArtist(), cj.artist); });
633 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAuthor(), cj.author); });
634 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAVQueueName(), cj.avQueueName); });
635 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAVQueueId(), cj.avQueueId); });
636 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAlbum(), cj.album); });
637 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetWriter(), cj.writer); });
638 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetComposer(), cj.composer); });
639 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetSubTitle(), cj.subtitle); });
640 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetDescription(), cj.description); });
641 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetLyric(), cj.lyric); });
642 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetPreviousAssetId(), cj.previousAssetId); });
643 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetNextAssetId(), cj.nextAssetId); });
644 int32_t errCode = CJUtilsChainCall::RunSteps(steps);
645 if (errCode != CJNO_ERROR) {
646 return errCode;
647 }
648 cj.duration = native.GetDuration();
649 cj.publishDate = int64_t(native.GetPublishDate());
650 cj.skipIntervals = native.GetSkipIntervals();
651 cj.filter = native.GetFilter();
652 cj.displayTags = native.GetDisplayTags();
653 cj.mediaLength = native.GetMediaLength();
654 cj.avQueueLength = native.GetAVQueueLength();
655
656 if (native.GetMetaMask() == AVMetaData::META_KEY_AVQUEUE_IMAGE) {
657 errCode = ConvertNativeToCJStruct(native.GetAVQueueImage(), cj.avQueueImage);
658 } else {
659 errCode = ConvertNativeToCJStruct(native.GetAVQueueImageUri(), cj.avQueueImage);
660 }
661 if (errCode != CJNO_ERROR) { return errCode; }
662 if (native.GetMetaMask() == AVMetaData::META_KEY_MEDIA_IMAGE) {
663 errCode = ConvertNativeToCJStruct(native.GetMediaImage(), cj.mediaImage);
664 } else {
665 errCode = ConvertNativeToCJStruct(native.GetMediaImageUri(), cj.mediaImage);
666 }
667 if (errCode != CJNO_ERROR) { return errCode; }
668 return ConvertNativeToCJStruct(native.GetDrmSchemes(), cj.drmSchemes);
669 }
670
ConvertNativeToCJStruct(const std::shared_ptr<AVSessionPixelMap> & native,int64_t & cj)671 int32_t ConvertNativeToCJStruct(const std::shared_ptr<AVSessionPixelMap>& native, int64_t& cj)
672 {
673 cj = Media::PixelMapImpl(AVSessionPixelMapAdapter::ConvertFromInner(native)).GetID();
674 return CJNO_ERROR;
675 }
676
ConvertNativeToCJStruct(const std::shared_ptr<AVSessionPixelMap> & native,StringPixelMapParameter & cj)677 int32_t ConvertNativeToCJStruct(const std::shared_ptr<AVSessionPixelMap>& native, StringPixelMapParameter& cj)
678 {
679 cj.pixelMap = Media::PixelMapImpl(AVSessionPixelMapAdapter::ConvertFromInner(native)).GetID();
680 cj.kind = PIXEL_MAP_TYPE;
681 return CJNO_ERROR;
682 }
683
ConvertNativeToCJStruct(const std::string & native,StringPixelMapParameter & cj)684 int32_t ConvertNativeToCJStruct(const std::string& native, StringPixelMapParameter& cj)
685 {
686 ConvertNativeToCJStruct(native, cj.string);
687 cj.kind = STR_TYPE;
688 return CJNO_ERROR;
689 }
690
ConvertNativeToCJStruct(const std::vector<std::string> & native,CArray & cj)691 int32_t ConvertNativeToCJStruct(const std::vector<std::string>& native, CArray& cj)
692 {
693 int32_t ret = CJNO_ERROR;
694 char** &cjArrHead = reinterpret_cast<char**&>(cj.head);
695 ret = CJConverterMalloc<char*>(cjArrHead, native.size());
696 if (ret != CJNO_ERROR) {
697 return ret;
698 }
699 cj.size = 0;
700 for (size_t i = 0; i < native.size(); i++, cj.size++) {
701 int32_t errCode = ConvertNativeToCJStruct(native[i], cjArrHead[i]);
702 if (errCode != CJNO_ERROR) {
703 return errCode;
704 }
705 }
706 return ret;
707 }
708
ConvertNativeToCJStruct(const std::string & native,char * & cj)709 int32_t ConvertNativeToCJStruct(const std::string& native, char*& cj)
710 {
711 cj = MallocCString(native);
712 if (cj == nullptr) {
713 return AVSESSION_ERROR;
714 }
715 return CJNO_ERROR;
716 }
717
ConvertNativeToCJStruct(const OutputDeviceInfo & native,COutputDeviceInfo & cj)718 int32_t ConvertNativeToCJStruct(const OutputDeviceInfo& native, COutputDeviceInfo& cj)
719 {
720 int32_t ret = CJNO_ERROR;
721 CDeviceInfo* &cjArrHead = reinterpret_cast<CDeviceInfo*&>(cj.devices.head);
722 ret = CJConverterMalloc<CDeviceInfo>(cjArrHead, native.deviceInfos_.size());
723 if (ret != CJNO_ERROR) {
724 return ret;
725 }
726 cj.devices.size = 0;
727 for (uint32_t i = 0; i < native.deviceInfos_.size(); i++, cj.devices.size++) {
728 ret = ConvertNativeToCJStruct(native.deviceInfos_[i], cjArrHead[i]);
729 if (ret != CJNO_ERROR) {
730 return ret;
731 }
732 }
733 return ret;
734 }
735
ConvertNativeToCJStruct(const MMI::KeyEvent::KeyItem & native,CKey & cj)736 int32_t ConvertNativeToCJStruct(const MMI::KeyEvent::KeyItem& native, CKey& cj)
737 {
738 int32_t ret = CJNO_ERROR;
739 cj.code = native.GetKeyCode();
740 cj.pressedTime = native.GetDownTime();
741 cj.deviceId = native.GetDeviceId();
742 return ret;
743 }
744
ConvertNativeToCJStruct(const std::vector<MMI::KeyEvent::KeyItem> & native,CKey * & cj)745 int32_t ConvertNativeToCJStruct(const std::vector<MMI::KeyEvent::KeyItem>& native, CKey*& cj)
746 {
747 int32_t ret = CJNO_ERROR;
748 ret = CJConverterMalloc<CKey>(cj, native.size());
749 if (ret != CJNO_ERROR) {
750 return ret;
751 }
752 for (size_t i = 0; i < native.size(); i++) {
753 ConvertNativeToCJStruct(native[i], *(cj+i));
754 }
755 return ret;
756 }
757
ConvertNativeToCJStruct(const MMI::KeyEvent & native,CInputEvent & cj)758 int32_t ConvertNativeToCJStruct(const MMI::KeyEvent& native, CInputEvent& cj)
759 {
760 int32_t ret = CJNO_ERROR;
761 cj.id = native.GetId();
762 cj.deviceId = native.GetDeviceId();
763 cj.actionTime = native.GetActionTime();
764 cj.screenId = native.GetTargetDisplayId();
765 cj.windowId = native.GetTargetWindowId();
766 return ret;
767 }
768
ConvertNativeToCJStruct(const MMI::KeyEvent & native,CKeyEvent & cj)769 int32_t ConvertNativeToCJStruct(const MMI::KeyEvent& native, CKeyEvent& cj)
770 {
771 int32_t ret = CJNO_ERROR;
772 ret = ConvertNativeToCJStruct(native, cj.base);
773 if (ret != CJNO_ERROR) {
774 return ret;
775 }
776 cj.action = native.GetKeyAction();
777 if (native.GetKeyItem()) {
778 ret = ConvertNativeToCJStruct(native.GetKeyItem().value(), cj.key);
779 if (ret != CJNO_ERROR) {
780 return ret;
781 }
782 cj.unicodeChar = native.GetKeyItem().value().GetUnicode();
783 } else {
784 cj.key.code = MMI::KeyEvent::KEYCODE_UNKNOWN;
785 cj.unicodeChar = 0;
786 }
787 std::vector<MMI::KeyEvent::KeyItem> allKeys_ = native.GetKeyItems();
788 std::vector<MMI::KeyEvent::KeyItem> keys_;
789 cj.keysLength = 0;
790 for (const auto &item : allKeys_) {
791 if (item.IsPressed()) {
792 keys_.push_back(item);
793 cj.keysLength++;
794 }
795 }
796 ret = ConvertNativeToCJStruct(keys_, cj.keys);
797 if (ret != CJNO_ERROR) {
798 return ret;
799 }
800 auto isPressed = [&native](const int32_t keyCode) {
801 if (native.GetKeyItem(keyCode)) {
802 return native.GetKeyItem(keyCode).value().IsPressed();
803 } else {
804 return false;
805 }
806 };
807 cj.ctrlKey = isPressed(MMI::KeyEvent::KEYCODE_CTRL_LEFT) || isPressed(MMI::KeyEvent::KEYCODE_CTRL_RIGHT);
808 cj.altKey = isPressed(MMI::KeyEvent::KEYCODE_ALT_LEFT) || isPressed(MMI::KeyEvent::KEYCODE_ALT_RIGHT);
809 cj.shiftKey = isPressed(MMI::KeyEvent::KEYCODE_SHIFT_LEFT) || isPressed(MMI::KeyEvent::KEYCODE_SHIFT_RIGHT);
810 cj.logoKey = isPressed(MMI::KeyEvent::KEYCODE_ALT_LEFT) || isPressed(MMI::KeyEvent::KEYCODE_ALT_RIGHT);
811 cj.logoKey = isPressed(MMI::KeyEvent::KEYCODE_META_LEFT) || isPressed(MMI::KeyEvent::KEYCODE_META_RIGHT);
812 cj.fnKey = isPressed(MMI::KeyEvent::KEYCODE_FN);
813 cj.capsLock = isPressed(MMI::KeyEvent::KEYCODE_CAPS_LOCK);
814 cj.numLock = isPressed(MMI::KeyEvent::KEYCODE_NUM_LOCK);
815 cj.scrollLock = isPressed(MMI::KeyEvent::KEYCODE_SCROLL_LOCK);
816 return ret;
817 }
818
convertCJStructToNative(const CKeyEvent & cj,MMI::KeyEvent & native)819 int32_t convertCJStructToNative(const CKeyEvent& cj, MMI::KeyEvent& native)
820 {
821 int32_t ret = CJNO_ERROR;
822 native.SetKeyAction(cj.action);
823 MMI::KeyEvent::KeyItem nkey;
824 ret = convertCJStructToNative(cj.key, nkey);
825 if (ret != CJNO_ERROR) {
826 return ret;
827 }
828 native.SetKeyCode(nkey.GetKeyCode());
829 for (int64_t i = 0; i < cj.keysLength; i++) {
830 MMI::KeyEvent::KeyItem nitem;
831 ret = convertCJStructToNative(*(cj.keys+i), nitem);
832 if (ret != CJNO_ERROR) {
833 return ret;
834 }
835 if ((nkey.GetKeyCode() == nitem.GetKeyCode()) && (cj.action == MMI::KeyEvent::KEY_ACTION_UP)) {
836 nitem.SetPressed(false);
837 }
838 native.AddKeyItem(nitem);
839 }
840 return ret;
841 }
842
convertCJStructToNative(const CKey & cj,MMI::KeyEvent::KeyItem & native)843 int32_t convertCJStructToNative(const CKey& cj, MMI::KeyEvent::KeyItem& native)
844 {
845 int32_t ret = CJNO_ERROR;
846 native.SetKeyCode(cj.code);
847 native.SetDownTime(cj.pressedTime);
848 native.SetDeviceId(cj.deviceId);
849 native.SetPressed(true);
850 return ret;
851 }
852
ConvertNativeToCJStruct(const DeviceInfo & native,CDeviceInfo & cj)853 int32_t ConvertNativeToCJStruct(const DeviceInfo& native, CDeviceInfo& cj)
854 {
855 std::vector<Step> steps;
856 steps.push_back([&]() { return ConvertNativeToCJStruct(native.deviceId_, cj.deviceId); });
857 steps.push_back([&]() { return ConvertNativeToCJStruct(native.deviceName_, cj.deviceName); });
858 steps.push_back([&]() {
859 return ConvertNativeToCJStruct(native.supportedDrmCapabilities_, cj.supportedDrmCapabilities);
860 });
861 int32_t errCode = CJUtilsChainCall::RunSteps(steps);
862 if (errCode != CJNO_ERROR) {
863 return errCode;
864 }
865 cj.castCategory = native.castCategory_;
866 cj.deviceType = native.deviceType_;
867 cj.supportedProtocols = native.supportedProtocols_;
868 return CJNO_ERROR;
869 }
870
ConvertNativeToCJStruct(const int32_t & native,int32_t & cj)871 int32_t ConvertNativeToCJStruct(const int32_t& native, int32_t& cj)
872 {
873 cj = native;
874 return CJNO_ERROR;
875 }
876
ConvertNativeToCJStruct(const int64_t & native,int64_t & cj)877 int32_t ConvertNativeToCJStruct(const int64_t& native, int64_t& cj)
878 {
879 cj = native;
880 return CJNO_ERROR;
881 }
882
ConvertNativeToCJStruct(const bool & native,bool & cj)883 int32_t ConvertNativeToCJStruct(const bool& native, bool& cj)
884 {
885 cj = native;
886 return CJNO_ERROR;
887 }
888
ConvertNativeToCJStruct(const std::vector<int32_t> & native,CArray & cj)889 int32_t ConvertNativeToCJStruct(const std::vector<int32_t>& native, CArray&cj)
890 {
891 int32_t ret = CJNO_ERROR;
892 int32_t* &cjArrHead = reinterpret_cast<int32_t*&>(cj.head);
893 ret = CJConverterMalloc<int32_t>(cjArrHead, native.size());
894 if (ret != CJNO_ERROR) {
895 return ret;
896 }
897 cj.size = native.size();
898 for (size_t i = 0; i < native.size(); i++) {
899 cjArrHead[i] = native[i];
900 }
901 return ret;
902 }
903
ConvertNativeToCJStruct(const std::vector<uint8_t> & native,CArray & cj)904 int32_t ConvertNativeToCJStruct(const std::vector<uint8_t>& native, CArray& cj)
905 {
906 int32_t ret = CJNO_ERROR;
907 uint8_t* &cjArrHead = reinterpret_cast<uint8_t*&>(cj.head);
908 ret = CJConverterMalloc<uint8_t>(cjArrHead, native.size());
909 if (ret != CJNO_ERROR) {
910 return ret;
911 }
912 cj.size = native.size();
913 for (size_t i = 0; i < native.size(); i++) {
914 cjArrHead[i] = native[i];
915 }
916 return ret;
917 }
918
ConvertNativeToCJStruct(const std::vector<AVQueueItem> & native,CArray & cj)919 int32_t ConvertNativeToCJStruct(const std::vector<AVQueueItem>& native, CArray&cj)
920 {
921 int32_t ret = CJNO_ERROR;
922 CAVQueueItem* &cjArrHead = reinterpret_cast<CAVQueueItem*&>(cj.head);
923 ret = CJConverterMalloc<CAVQueueItem>(cjArrHead, native.size());
924 if (ret != CJNO_ERROR) {
925 return ret;
926 }
927 cj.size = 0;
928 for (size_t i = 0; i < native.size(); i++, cj.size++) {
929 int32_t errCode = ConvertNativeToCJStruct(native[i], cjArrHead[i]);
930 if (errCode != CJNO_ERROR) {
931 return errCode;
932 }
933 }
934 return ret;
935 }
936
ConvertNativeToCJStruct(const AVQueueItem & native,CAVQueueItem & cj)937 int32_t ConvertNativeToCJStruct(const AVQueueItem& native, CAVQueueItem& cj)
938 {
939 cj.itemId = native.GetItemId();
940 return ConvertNativeToCJStruct(*native.GetDescription(), cj.description);
941 }
942
ConvertNativeToCJStruct(const AVMediaDescription & native,CAVMediaDescription & cj)943 int32_t ConvertNativeToCJStruct(const AVMediaDescription& native, CAVMediaDescription& cj)
944 {
945 std::vector<Step> steps;
946 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetMediaId(), cj.mediaId); });
947 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetTitle(), cj.title); });
948 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetSubtitle(), cj.subtitle); });
949 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetDescription(), cj.description); });
950 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetMediaUri(), cj.mediaUri); });
951 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetMediaType(), cj.mediaType); });
952 steps.push_back([&]() { return ConvertNativeToCJStruct(*native.GetExtras(), cj.extras); });
953 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAlbumTitle(), cj.albumTitle); });
954 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAlbumCoverUri(), cj.albumCoverUri); });
955 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetLyricContent(), cj.lyricContent); });
956 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetLyricUri(), cj.lyricUri); });
957 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetArtist(), cj.artist); });
958 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetFdSrc(), cj.fdSrc); });
959 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetDrmScheme(), cj.drmScheme); });
960 steps.push_back([&]() { return ConvertNativeToCJStruct(native.GetAppName(), cj.appName); });
961 int32_t errCode = CJUtilsChainCall::RunSteps(steps);
962 if (errCode != CJNO_ERROR) {
963 return errCode;
964 }
965 FFI_MD_HELPER->GetMediaDescriptionDataSrc(cj);
966 cj.mediaSize = native.GetMediaSize();
967 cj.duration = native.GetDuration();
968 cj.startPosition = native.GetStartPosition();
969 cj.creditsPosition = native.GetCreditsPosition();
970 FFI_MD_HELPER->GetMediaDescriptionDisplayTags(cj);
971
972 return CJNO_ERROR;
973 }
974
ConvertNativeToCJStruct(const AAFwk::WantParams & native,CArray & cj)975 int32_t ConvertNativeToCJStruct(const AAFwk::WantParams& native, CArray& cj)
976 {
977 int32_t errCode = CJNO_ERROR;
978 ParseParameters(native, cj, errCode);
979 return errCode;
980 }
981
ConvertNativeToCJStruct(const AVFileDescriptor & native,CAVFileDescriptor & cj)982 int32_t ConvertNativeToCJStruct(const AVFileDescriptor& native, CAVFileDescriptor& cj)
983 {
984 cj.fd = native.fd_;
985 cj.offset = native.offset_;
986 cj.length = native.length_;
987 return CJNO_ERROR;
988 }
989
ConvertNativeToCJStruct(const AVPlaybackState::Position & native,CPlaybackPosition & cj)990 int32_t ConvertNativeToCJStruct(const AVPlaybackState::Position& native, CPlaybackPosition& cj)
991 {
992 cj.elapsedTime = native.elapsedTime_;
993 cj.updateTime = native.updateTime_;
994 return CJNO_ERROR;
995 }
996
ConvertNativeToCJStruct(const AVPlaybackState & native,CAVPlaybackState & cj)997 int32_t ConvertNativeToCJStruct(const AVPlaybackState& native, CAVPlaybackState& cj)
998 {
999 cj.state = native.GetState();
1000 cj.speed = native.GetSpeed();
1001 ConvertNativeToCJStruct(native.GetPosition(), cj.position);
1002 cj.bufferedTime = native.GetBufferedTime();
1003 cj.loopMode = native.GetLoopMode();
1004 cj.isFavorite = native.GetFavorite();
1005 cj.activeItemId = native.GetActiveItemId();
1006 cj.volume = native.GetVolume();
1007 cj.maxVolume = native.GetMaxVolume();
1008 cj.muted = native.GetMuted();
1009 cj.duration = native.GetDuration();
1010 cj.videoWidth = native.GetVideoWidth();
1011 cj.videoHeight = native.GetVideoHeight();
1012 return ConvertNativeToCJStruct(*native.GetExtras(), cj.extras);
1013 }
1014
ConvertNativeToCJStruct(const std::vector<CastDisplayInfo> & native,CArray & cj)1015 int32_t ConvertNativeToCJStruct(const std::vector<CastDisplayInfo>& native, CArray& cj)
1016 {
1017 CCastDisplayInfo* &cjArrHead = reinterpret_cast<CCastDisplayInfo*&>(cj.head);
1018 int32_t ret = CJConverterMalloc<CCastDisplayInfo>(cjArrHead, native.size());
1019 if (ret != CJNO_ERROR) {
1020 SLOGE("Convert std::vector<CastDisplayInfo> to CArray failed!");
1021 return ret;
1022 }
1023 cj.size = native.size();
1024 for (size_t i = 0; i < native.size(); i++) {
1025 ret = ConvertNativeToCJStruct(native[i], cjArrHead[i]);
1026 if (ret != CJNO_ERROR) {
1027 return ret;
1028 }
1029 }
1030 return ret;
1031 }
1032
ConvertNativeToCJStruct(const CastDisplayInfo & native,CCastDisplayInfo & cj)1033 int32_t ConvertNativeToCJStruct(const CastDisplayInfo& native, CCastDisplayInfo& cj)
1034 {
1035 cj.id = native.displayId;
1036 cj.displayState = native.displayState;
1037 cj.width = native.width;
1038 cj.height = native.height;
1039 return ConvertNativeToCJStruct(native.name, cj.name);
1040 }
1041
ConvertNativeToCJStruct(const AbilityRuntime::WantAgent::WantAgent & native,int64_t & cj)1042 int32_t ConvertNativeToCJStruct(const AbilityRuntime::WantAgent::WantAgent& native, int64_t& cj)
1043 {
1044 auto ptr = std::make_shared<AbilityRuntime::WantAgent::WantAgent>(native);
1045 cj = OHOS::FfiWantAgent::CJWantAgent(ptr).GetID();
1046 if (cj == 0) {
1047 SLOGE("Create CJWantAgent failed!");
1048 return AVSESSION_ERROR;
1049 } else {
1050 return CJNO_ERROR;
1051 }
1052 }
1053
1054 /* Cangjie to Native*/
1055
convertCJStructToNative(const int32_t & cj,int32_t & native)1056 int32_t convertCJStructToNative(const int32_t& cj, int32_t& native)
1057 {
1058 native = cj;
1059 return CJNO_ERROR;
1060 }
1061
convertCJStructToNative(const CArray & cj,AAFwk::WantParams & native)1062 int32_t convertCJStructToNative(const CArray& cj, AAFwk::WantParams &native)
1063 {
1064 if (cj.size > 0) {
1065 return SetDataParameters(cj, native);
1066 }
1067 return CJNO_ERROR;
1068 }
1069
convertCJStructToNative(const CAVMetaData & cj,AVMetaData & native)1070 int32_t convertCJStructToNative(const CAVMetaData& cj, AVMetaData &native)
1071 {
1072 int32_t ret = CJNO_ERROR;
1073 if (cj.assetId != nullptr) { native.SetAssetId(std::string(cj.assetId)); }
1074 if (cj.title != nullptr) { native.SetTitle(std::string(cj.title)); }
1075 if (cj.artist != nullptr) { native.SetArtist(std::string(cj.artist)); }
1076 if (cj.author != nullptr) { native.SetAuthor(std::string(cj.author)); }
1077 if (cj.avQueueName != nullptr) { native.SetAVQueueName(std::string(cj.avQueueName)); }
1078 if (cj.avQueueId != nullptr) { native.SetAVQueueId(std::string(cj.avQueueId)); }
1079 if (cj.avQueueImage.kind == STR_TYPE) {
1080 native.SetAVQueueImageUri(std::string(cj.avQueueImage.string));
1081 } else if (cj.avQueueImage.kind == PIXEL_MAP_TYPE) {
1082 auto pixelMap = FFI::FFIData::GetData<Media::PixelMapImpl>(
1083 cj.avQueueImage.pixelMap)->GetRealPixelMap();
1084 native.SetAVQueueImage(AVSessionPixelMapAdapter::ConvertToInner(pixelMap));
1085 }
1086 if (cj.album != nullptr) { native.SetAlbum(std::string(cj.album)); }
1087 if (cj.writer != nullptr) { native.SetWriter(std::string(cj.writer)); }
1088 if (cj.composer != nullptr) { native.SetComposer(std::string(cj.composer)); }
1089 native.SetDuration(cj.duration);
1090 if (cj.mediaImage.kind == STR_TYPE) {
1091 native.SetMediaImageUri(std::string(cj.mediaImage.string));
1092 } else if (cj.mediaImage.kind == PIXEL_MAP_TYPE) {
1093 auto pixelMap = FFI::FFIData::GetData<Media::PixelMapImpl>(
1094 cj.mediaImage.pixelMap)->GetRealPixelMap();
1095 native.SetMediaImage(AVSessionPixelMapAdapter::ConvertToInner(pixelMap));
1096 }
1097 native.SetPublishDate(cj.publishDate);
1098 if (cj.subtitle != nullptr) { native.SetSubTitle(std::string(cj.subtitle)); }
1099 if (cj.description != nullptr) { native.SetDescription(std::string(cj.description)); }
1100 if (cj.lyric != nullptr) { native.SetLyric(std::string(cj.lyric)); }
1101 if (cj.previousAssetId != nullptr) { native.SetPreviousAssetId(std::string(cj.previousAssetId)); }
1102 if (cj.nextAssetId != nullptr) { native.SetNextAssetId(std::string(cj.nextAssetId)); }
1103 native.SetFilter(cj.filter);
1104
1105 std::vector<std::string> drmS;
1106 ret = convertCJStructToNative(cj.drmSchemes, drmS);
1107 if (ret != CJNO_ERROR) {
1108 return CJNO_ERROR;
1109 }
1110 native.SetDrmSchemes(drmS);
1111
1112 native.SetSkipIntervals(cj.skipIntervals);
1113 native.SetDisplayTags(cj.displayTags);
1114 native.SetMediaLength(cj.mediaLength);
1115 native.SetAVQueueLength(cj.avQueueLength);
1116 return ret;
1117 }
1118
convertCJStructToNative(const CArray & cj,std::vector<std::string> & native)1119 int32_t convertCJStructToNative(const CArray& cj, std::vector<std::string>& native)
1120 {
1121 if (cj.size == 0) {
1122 return CJNO_ERROR;
1123 }
1124 auto ptr = reinterpret_cast<char**>(cj.head);
1125 for (uint64_t i = 0; i < cj.size; i++) {
1126 native.push_back(std::string(ptr[i]));
1127 }
1128 return CJNO_ERROR;
1129 }
1130
convertCJStructToNative(const CAVCallMetaData & cj,AVCallMetaData & native)1131 int32_t convertCJStructToNative(const CAVCallMetaData& cj, AVCallMetaData & native)
1132 {
1133 if (cj.name != nullptr) { native.SetName(std::string(cj.name)); }
1134 if (cj.phoneNumber != nullptr) { native.SetPhoneNumber(std::string(cj.phoneNumber)); }
1135 if (cj.avatar != 0) {
1136 auto pixelMap = FFI::FFIData::GetData<Media::PixelMapImpl>(
1137 cj.avatar)->GetRealPixelMap();
1138 native.SetMediaImage(AVSessionPixelMapAdapter::ConvertToInner(pixelMap));
1139 }
1140 return CJNO_ERROR;
1141 }
1142
convertCJStructToNative(const CAVCallState & cj,AVCallState & native)1143 int32_t convertCJStructToNative(const CAVCallState& cj, AVCallState& native)
1144 {
1145 native.SetAVCallState(cj.state);
1146 native.SetAVCallMuted(cj.muted);
1147 return CJNO_ERROR;
1148 }
1149
convertCJStructToNative(const CAVPlaybackState & cj,AVPlaybackState & native)1150 int32_t convertCJStructToNative(const CAVPlaybackState& cj, AVPlaybackState& native)
1151 {
1152 int32_t ret = CJNO_ERROR;
1153 native.SetState(cj.state);
1154 native.SetSpeed(cj.speed);
1155 AVPlaybackState::Position position;
1156 position.elapsedTime_ = cj.position.elapsedTime;
1157 position.updateTime_ = cj.position.updateTime;
1158 native.SetPosition(position);
1159 native.SetBufferedTime(cj.bufferedTime);
1160 native.SetLoopMode(cj.loopMode);
1161 native.SetFavorite(cj.isFavorite);
1162 native.SetActiveItemId(cj.activeItemId);
1163 native.SetVolume(cj.volume);
1164 native.SetMaxVolume(cj.maxVolume);
1165 native.SetMuted(cj.muted);
1166 native.SetDuration(cj.duration);
1167 native.SetVideoWidth(cj.videoWidth);
1168 native.SetVideoHeight(cj.videoHeight);
1169 auto wantP = std::make_shared<AAFwk::WantParams>();
1170 ret = convertCJStructToNative(cj.extras, *wantP);
1171 if (ret != CJNO_ERROR) {
1172 return ret;
1173 }
1174 native.SetExtras(wantP);
1175 return ret;
1176 }
1177
convertCJStructToNative(const CArray & cj,std::vector<AVQueueItem> & native)1178 int32_t convertCJStructToNative(const CArray& cj, std::vector<AVQueueItem>& native)
1179 {
1180 int32_t ret = CJNO_ERROR;
1181 auto ptr = reinterpret_cast<CAVQueueItem*>(cj.head);
1182 for (uint64_t i = 0; i < cj.size; i++) {
1183 AVQueueItem item;
1184 ret = convertCJStructToNative(ptr[i], item);
1185 if (ret != CJNO_ERROR) {
1186 return ret;
1187 }
1188 native.push_back(item);
1189 }
1190 return ret;
1191 }
1192
convertCJStructToNative(const CAVQueueItem & cj,AVQueueItem & native)1193 int32_t convertCJStructToNative(const CAVQueueItem& cj, AVQueueItem& native)
1194 {
1195 int32_t ret = CJNO_ERROR;
1196 native.SetItemId(cj.itemId);
1197 auto desc = std::make_shared<AVMediaDescription>();
1198 ret = convertCJStructToNative(cj.description, *desc);
1199 if (ret != CJNO_ERROR) {
1200 return ret;
1201 }
1202 native.SetDescription(desc);
1203 return ret;
1204 }
1205
convertCJStructToNative(const CAVMediaDescription & cj,AVMediaDescription & native)1206 int32_t convertCJStructToNative(const CAVMediaDescription& cj, AVMediaDescription& native)
1207 {
1208 int32_t ret = CJNO_ERROR;
1209 if (cj.mediaId != nullptr) { native.SetMediaId(std::string(cj.mediaId)); }
1210 if (cj.title != nullptr) { native.SetTitle(std::string(cj.title)); }
1211 if (cj.subtitle != nullptr) { native.SetSubtitle(std::string(cj.subtitle)); }
1212 if (cj.description != nullptr) { native.SetDescription(std::string(cj.description)); }
1213 if (cj.mediaUri != nullptr) { native.SetMediaUri(std::string(cj.mediaUri)); }
1214 if (cj.mediaImage.kind == STR_TYPE) {
1215 native.SetIconUri(std::string(cj.mediaImage.string));
1216 } else if (cj.mediaImage.kind == PIXEL_MAP_TYPE) {
1217 auto pixelMap = FFI::FFIData::GetData<Media::PixelMapImpl>(
1218 cj.mediaImage.pixelMap)->GetRealPixelMap();
1219 native.SetIcon(AVSessionPixelMapAdapter::ConvertToInner(pixelMap));
1220 }
1221 auto wantP = std::make_shared<AAFwk::WantParams>();
1222 ret = convertCJStructToNative(cj.extras, *wantP);
1223 if (ret != CJNO_ERROR) {
1224 return ret;
1225 }
1226 native.SetExtras(wantP);
1227 if (cj.mediaType != nullptr) { native.SetMediaType(std::string(cj.mediaType)); }
1228 native.SetMediaSize(cj.mediaSize);
1229 if (cj.albumTitle != nullptr) { native.SetAlbumTitle(std::string(cj.albumTitle)); }
1230 if (cj.albumCoverUri != nullptr) { native.SetAlbumCoverUri(std::string(cj.albumCoverUri)); }
1231 if (cj.lyricContent != nullptr) { native.SetLyricContent(std::string(cj.lyricContent)); }
1232 if (cj.lyricUri != nullptr) { native.SetLyricUri(std::string(cj.lyricUri)); }
1233 if (cj.artist != nullptr) { native.SetArtist(std::string(cj.artist)); }
1234 AVFileDescriptor fdSrc;
1235 fdSrc.fd_ = cj.fdSrc.fd;
1236 fdSrc.offset_ = cj.fdSrc.offset;
1237 fdSrc.length_ = cj.fdSrc.length;
1238 native.SetFdSrc(fdSrc);
1239 if (cj.drmScheme != nullptr) { native.SetDrmScheme(std::string(cj.drmScheme)); }
1240 native.SetDuration(cj.duration);
1241 native.SetStartPosition(cj.startPosition);
1242 native.SetCreditsPosition(cj.creditsPosition);
1243 if (cj.appName != nullptr) { native.SetAppName(std::string(cj.appName)); }
1244 FFI_MD_HELPER->SetMediaDescriptionDataSrc(cj);
1245 FFI_MD_HELPER->SetMediaDescriptionDataSrc(cj);
1246 return ret;
1247 }
1248
convertCJStructToNative(const CAVSessionCommand & cj,AVControlCommand & native)1249 int32_t convertCJStructToNative(const CAVSessionCommand& cj, AVControlCommand& native)
1250 {
1251 native.SetCommand(cj.command);
1252 switch (cj.command) {
1253 case AVControlCommand::SESSION_CMD_FAST_FORWARD:
1254 native.SetForwardTime(*static_cast<int32_t *>(cj.parameter.value));break;
1255 case AVControlCommand::SESSION_CMD_REWIND:
1256 native.SetRewindTime(*static_cast<int32_t *>(cj.parameter.value));break;
1257 case AVControlCommand::SESSION_CMD_SEEK:
1258 native.SetSeekTime(*static_cast<int32_t *>(cj.parameter.value));break;
1259 case AVControlCommand::SESSION_CMD_SET_SPEED:
1260 native.SetSpeed(*static_cast<double *>(cj.parameter.value));break;
1261 case AVControlCommand::SESSION_CMD_SET_LOOP_MODE:
1262 native.SetLoopMode(*static_cast<int32_t *>(cj.parameter.value));break;
1263 case AVControlCommand::SESSION_CMD_TOGGLE_FAVORITE:
1264 native.SetAssetId(std::string(static_cast<char *>(cj.parameter.value)));break;
1265 case AVControlCommand::SESSION_CMD_PLAY_FROM_ASSETID:
1266 native.SetPlayFromAssetId(*static_cast<int64_t *>(cj.parameter.value));break;
1267 default:
1268 break;
1269 }
1270 return CJNO_ERROR;
1271 }
1272
convertCJStructToNative(const CAVSessionCommand & cj,AVCastControlCommand & native)1273 int32_t convertCJStructToNative(const CAVSessionCommand& cj, AVCastControlCommand& native)
1274 {
1275 native.SetCommand(cj.command);
1276 switch (cj.command) {
1277 case AVCastControlCommand::CAST_CONTROL_CMD_FAST_FORWARD:
1278 native.SetForwardTime(*static_cast<int32_t *>(cj.parameter.value));break;
1279 case AVCastControlCommand::CAST_CONTROL_CMD_REWIND:
1280 native.SetRewindTime(*static_cast<int32_t *>(cj.parameter.value));break;
1281 case AVCastControlCommand::CAST_CONTROL_CMD_SEEK:
1282 native.SetSeekTime(*static_cast<int32_t *>(cj.parameter.value));break;
1283 case AVCastControlCommand::CAST_CONTROL_CMD_SET_VOLUME:
1284 native.SetVolume(*static_cast<int32_t *>(cj.parameter.value));break;
1285 case AVCastControlCommand::CAST_CONTROL_CMD_SET_SPEED:
1286 native.SetSpeed(*static_cast<int32_t *>(cj.parameter.value));break;
1287 case AVCastControlCommand::CAST_CONTROL_CMD_SET_LOOP_MODE:
1288 native.SetLoopMode(*static_cast<int32_t *>(cj.parameter.value));break;
1289 default:
1290 break;
1291 }
1292 return CJNO_ERROR;
1293 }
1294
convertCJStructToNative(const CArray & cj,std::vector<uint8_t> & native)1295 int32_t convertCJStructToNative(const CArray& cj, std::vector<uint8_t>& native)
1296 {
1297 for (uint64_t i = 0; i < cj.size; i++) {
1298 native.push_back(static_cast<uint8_t*>(cj.head)[i]);
1299 }
1300 return CJNO_ERROR;
1301 }
1302
convertCJStructToNative(const int64_t & cj,std::shared_ptr<AbilityRuntime::WantAgent::WantAgent> & native)1303 int32_t convertCJStructToNative(const int64_t& cj, std::shared_ptr<AbilityRuntime::WantAgent::WantAgent>& native)
1304 {
1305 auto cjWantAgent = OHOS::FFI::FFIData::GetData<OHOS::FfiWantAgent::CJWantAgent>(cj);
1306 if (cjWantAgent) {
1307 native = cjWantAgent->wantAgent_;
1308 return CJNO_ERROR;
1309 } else {
1310 SLOGE("Fail to get WantAgent from FFIData!");
1311 return AVSESSION_ERROR;
1312 }
1313 }
1314
1315 /* Free cjObject ============================================*/
cjStructHeapFree(CCastDisplayInfo & cj)1316 void cjStructHeapFree(CCastDisplayInfo& cj)
1317 {
1318 free(cj.name);
1319 cj.name = nullptr;
1320 }
1321
cjStructHeapFree(CDeviceInfo & cj)1322 void cjStructHeapFree(CDeviceInfo& cj)
1323 {
1324 free(cj.deviceId);
1325 cj.deviceId = nullptr;
1326 free(cj.deviceName);
1327 cj.deviceName = nullptr;
1328
1329 char** &cjArrHead = reinterpret_cast<char**&>(cj.supportedDrmCapabilities.head);
1330 if (cjArrHead) {
1331 for (size_t i = 0; i < cj.supportedDrmCapabilities.size; i++) {
1332 free(cjArrHead[i]);
1333 }
1334 free(cjArrHead);
1335 cjArrHead = nullptr;
1336 }
1337 }
1338
cjStructHeapFree(COutputDeviceInfo & cj)1339 void cjStructHeapFree(COutputDeviceInfo& cj)
1340 {
1341 CDeviceInfo* &cjArrHead = reinterpret_cast<CDeviceInfo*&>(cj.devices.head);
1342 if (cjArrHead) {
1343 for (size_t i = 0; i < cj.devices.size; i++) {
1344 cjStructHeapFree(cjArrHead[i]);
1345 }
1346 free(cjArrHead);
1347 cjArrHead = nullptr;
1348 }
1349 }
1350
cjStructHeapFree(CArray & cj)1351 void cjStructHeapFree(CArray& cj)
1352 {
1353 free(cj.head);
1354 cj.head = nullptr;
1355 cj.size = 0;
1356 }
1357
cjStructHeapFree(CAVCallMetaData & cj)1358 void cjStructHeapFree(CAVCallMetaData& cj)
1359 {
1360 free(cj.name);
1361 cj.name = nullptr;
1362 free(cj.phoneNumber);
1363 cj.phoneNumber = nullptr;
1364 }
1365
cjStructHeapFree(CAVPlaybackState & cj)1366 void cjStructHeapFree(CAVPlaybackState& cj)
1367 {
1368 cjStructHeapFreeWant(cj.extras);
1369 }
1370
cjStructHeapFree(CAVMetaData & cj)1371 void cjStructHeapFree(CAVMetaData& cj)
1372 {
1373 free(cj.assetId);
1374 cj.assetId = nullptr;
1375 free(cj.title);
1376 cj.title = nullptr;
1377 free(cj.artist);
1378 cj.artist = nullptr;
1379 free(cj.author);
1380 cj.author = nullptr;
1381 free(cj.avQueueName);
1382 cj.avQueueName = nullptr;
1383 free(cj.avQueueId);
1384 cj.avQueueId = nullptr;
1385 free(cj.album);
1386 cj.album = nullptr;
1387 free(cj.writer);
1388 cj.writer = nullptr;
1389 free(cj.composer);
1390 cj.composer = nullptr;
1391 free(cj.subtitle);
1392 cj.subtitle = nullptr;
1393 free(cj.description);
1394 cj.description = nullptr;
1395 free(cj.lyric);
1396 cj.lyric = nullptr;
1397 free(cj.previousAssetId);
1398 cj.previousAssetId = nullptr;
1399 free(cj.nextAssetId);
1400 cj.nextAssetId = nullptr;
1401 free(cj.avQueueImage.string);
1402 cj.avQueueImage.string = nullptr;
1403 free(cj.mediaImage.string);
1404 cj.mediaImage.string = nullptr;
1405
1406 if (cj.drmSchemes.head) {
1407 char** &cjArrHead = reinterpret_cast<char**&>(cj.drmSchemes.head);
1408 for (size_t i = 0; i < cj.drmSchemes.size; i++) {
1409 free(cjArrHead[i]);
1410 }
1411 free(cjArrHead);
1412 cjArrHead = nullptr;
1413 }
1414 }
1415
cjStructHeapFreeWant(CArray & cj)1416 void cjStructHeapFreeWant(CArray& cj)
1417 {
1418 auto head = static_cast<CParameters*>(cj.head);
1419 if (head == nullptr) {
1420 return;
1421 }
1422 ClearParametersPtr(head, cj.size, true);
1423 }
1424
cjStructHeapFree(CAVMediaDescription & cj)1425 void cjStructHeapFree(CAVMediaDescription& cj)
1426 {
1427 free(cj.mediaId);
1428 cj.mediaId = nullptr;
1429 free(cj.title);
1430 cj.title = nullptr;
1431 free(cj.subtitle);
1432 cj.subtitle = nullptr;
1433 free(cj.description);
1434 cj.description = nullptr;
1435 free(cj.mediaUri);
1436 cj.mediaUri = nullptr;
1437 free(cj.mediaType);
1438 cj.mediaType = nullptr;
1439 free(cj.albumTitle);
1440 cj.albumTitle = nullptr;
1441 free(cj.albumCoverUri);
1442 cj.albumCoverUri = nullptr;
1443 free(cj.lyricContent);
1444 cj.lyricContent = nullptr;
1445 free(cj.lyricUri);
1446 cj.lyricUri = nullptr;
1447 free(cj.artist);
1448 cj.artist = nullptr;
1449 free(cj.drmScheme);
1450 cj.drmScheme = nullptr;
1451 free(cj.appName);
1452 cj.appName = nullptr;
1453 cjStructHeapFreeWant(cj.extras);
1454 }
1455
cjStructHeapFreeAVQueueItem(CArray & cj)1456 void cjStructHeapFreeAVQueueItem(CArray& cj)
1457 {
1458 CAVQueueItem* &cjArrHead = reinterpret_cast<CAVQueueItem*&>(cj.head);
1459 if (cjArrHead) {
1460 for (size_t i = 0; i < cj.size; i++) {
1461 cjStructHeapFree(cjArrHead[i].description);
1462 }
1463 free(cjArrHead);
1464 cjArrHead = nullptr;
1465 }
1466 }
1467 } // namespace AVSession::OHOS