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