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