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