• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 
17 #include "serializer.h"
18 #include "serializer_inner.h"
19 
20 #include <stdlib.h>
21 #include <string.h>
22 #include "rpc_log.h"
23 #include "securec.h"
24 
25 #define ALIGN_SZ 4
26 #define IPC_IO_ALIGN(sz) (((sz) + ALIGN_SZ - 1) & (~(ALIGN_SZ - 1)))
27 
28 #define IPC_IO_RETURN_IF_FAIL(value)                                             \
29     do {                                                                         \
30         if (!(value)) {                                                          \
31             printf("IPC_CHECK failed: %s:%d\n", __FUNCTION__, __LINE__);        \
32             if (io != NULL) {                                                    \
33                 io->flag |= IPC_IO_OVERFLOW;                                     \
34             }                                                                    \
35             return NULL;                                                         \
36         }                                                                        \
37     } while (0)
38 
39 
IpcIoInit(IpcIo * io,void * buffer,size_t bufferSize,size_t maxobjects)40 void IpcIoInit(IpcIo *io, void *buffer, size_t bufferSize, size_t maxobjects)
41 {
42     if ((io == NULL) || (buffer == NULL) || (bufferSize == 0) ||
43         (bufferSize > MAX_IO_SIZE) || (maxobjects > MAX_OBJ_NUM)) {
44         return;
45     }
46     size_t objectsSize = maxobjects * sizeof(size_t);
47 
48     if (objectsSize > bufferSize) {
49         io->flag = IPC_IO_OVERFLOW;
50         io->bufferLeft = 0;
51         io->offsetsLeft = 0;
52         return;
53     }
54 
55     io->bufferCur = io->bufferBase = (char *)buffer + objectsSize;
56     io->offsetsCur = io->offsetsBase = (size_t *)buffer;
57     io->bufferLeft = bufferSize - objectsSize;
58     io->offsetsLeft = maxobjects;
59     io->flag = IPC_IO_INITIALIZED;
60 }
61 
IpcIoAvailable(IpcIo * io)62 static bool IpcIoAvailable(IpcIo *io)
63 {
64     bool ret = false;
65     if (io != NULL) {
66         ret = (io->flag & IPC_IO_INITIALIZED) && !(io->flag & IPC_IO_OVERFLOW);
67     }
68     return ret;
69 }
70 
IoPush(IpcIo * io,size_t size)71 void *IoPush(IpcIo *io, size_t size)
72 {
73     IPC_IO_RETURN_IF_FAIL(io != NULL);
74     IPC_IO_RETURN_IF_FAIL(IpcIoAvailable(io));
75     size = IPC_IO_ALIGN(size);
76     if (size > io->bufferLeft) {
77         io->flag |= IPC_IO_OVERFLOW;
78         RPC_LOG_ERROR("IoPush IPC_IO_OVERFLOW.");
79         return NULL;
80     } else {
81         void *ptr = io->bufferCur;
82         io->bufferCur += size;
83         io->bufferLeft -= size;
84         return ptr;
85     }
86 }
87 
IoPop(IpcIo * io,size_t size)88 void *IoPop(IpcIo *io, size_t size)
89 {
90     IPC_IO_RETURN_IF_FAIL(io != NULL);
91     IPC_IO_RETURN_IF_FAIL(IpcIoAvailable(io));
92     size = IPC_IO_ALIGN(size);
93 
94     if (io->bufferLeft < size) {
95         io->bufferLeft = 0;
96         io->flag |= IPC_IO_OVERFLOW;
97         return NULL;
98     } else {
99         void *ptr = io->bufferCur;
100         io->bufferCur += size;
101         io->bufferLeft -= size;
102         return ptr;
103     }
104 }
105 
IoPushUnaligned(IpcIo * io,size_t size)106 static void *IoPushUnaligned(IpcIo *io, size_t size)
107 {
108     IPC_IO_RETURN_IF_FAIL(io != NULL);
109     IPC_IO_RETURN_IF_FAIL(IpcIoAvailable(io));
110     if (size > io->bufferLeft) {
111         io->flag |= IPC_IO_OVERFLOW;
112         return NULL;
113     } else {
114         void *ptr = io->bufferCur;
115         io->bufferCur += size;
116         io->bufferLeft -= size;
117         return ptr;
118     }
119 }
120 
IpcIoAppend(IpcIo * dst,IpcIo * src)121 bool IpcIoAppend(IpcIo *dst, IpcIo *src)
122 {
123     if (!IpcIoAvailable(dst) || !IpcIoAvailable(src)) {
124         RPC_LOG_ERROR("IpcIo dst or src not available\n", __FUNCTION__, __LINE__);
125         return false;
126     }
127     size_t srcUsedBufferSize = src->bufferCur - src->bufferBase;
128     size_t srcUsedOffsetsNum = src->offsetsCur - src->offsetsBase;
129     if (srcUsedBufferSize == 0 && srcUsedOffsetsNum != 0) {
130         RPC_LOG_ERROR("IpcIo src not available\n", __FUNCTION__, __LINE__);
131         return false;
132     }
133     if (dst->bufferLeft < srcUsedBufferSize || dst->offsetsLeft < srcUsedOffsetsNum) {
134         RPC_LOG_ERROR("IpcIo dst buffer space is not enough\n", __FUNCTION__, __LINE__);
135         return false;
136     }
137     if (srcUsedBufferSize > 0) {
138         char *ptr = (uint8_t *)IoPush(dst, srcUsedBufferSize);
139         if (ptr == NULL) {
140             return false;
141         }
142         size_t offsetAdjust = ptr - dst->bufferBase;
143         if (memset_s(ptr, IPC_IO_ALIGN(srcUsedBufferSize), 0, IPC_IO_ALIGN(srcUsedBufferSize)) != EOK) {
144             dst->flag |= IPC_IO_OVERFLOW;
145             return false;
146         }
147         if (memcpy_s(ptr, IPC_IO_ALIGN(srcUsedBufferSize), src->bufferBase, srcUsedBufferSize) != EOK) {
148             dst->flag |= IPC_IO_OVERFLOW;
149             return false;
150         }
151         for (int i = 0; i < srcUsedOffsetsNum; i++) {
152             dst->offsetsLeft--;
153             *(dst->offsetsCur) = *(src->offsetsBase + i) + offsetAdjust;
154             dst->offsetsCur++;
155         }
156     }
157     return true;
158 }
159 
WriteInt32(IpcIo * io,int32_t value)160 bool WriteInt32(IpcIo *io, int32_t value)
161 {
162     if (io == NULL) {
163         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
164         return false;
165     }
166     int32_t *ptr = (int32_t *)IoPush(io, sizeof(value));
167     if (ptr != NULL) {
168         *ptr = value;
169         return true;
170     }
171     return false;
172 }
173 
WriteUint32(IpcIo * io,uint32_t value)174 bool WriteUint32(IpcIo *io, uint32_t value)
175 {
176     if (io == NULL) {
177         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
178         return false;
179     }
180     uint32_t *ptr = (uint32_t *)IoPush(io, sizeof(value));
181     if (ptr != NULL) {
182         *ptr = value;
183         return true;
184     }
185     return false;
186 }
187 
WriteBool(IpcIo * io,bool value)188 bool WriteBool(IpcIo *io, bool value)
189 {
190     if (io == NULL) {
191         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
192         return false;
193     }
194     return WriteInt32(io, (int32_t)value);
195 }
196 
WriteBoolUnaligned(IpcIo * io,bool value)197 bool WriteBoolUnaligned(IpcIo *io, bool value)
198 {
199     if (io == NULL) {
200         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
201         return false;
202     }
203     bool *ptr = (bool *)IoPushUnaligned(io, sizeof(value));
204     if (ptr != NULL) {
205         *ptr = value;
206         return true;
207     }
208     return false;
209 }
210 
WritePointer(IpcIo * io,uintptr_t value)211 bool WritePointer(IpcIo *io, uintptr_t value)
212 {
213     if (io == NULL) {
214         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
215         return false;
216     }
217     uintptr_t *ptr = (uintptr_t *)IoPush(io, sizeof(value));
218     if (ptr != NULL) {
219         *ptr = value;
220         return true;
221     }
222     return false;
223 }
224 
WriteInt8(IpcIo * io,int8_t value)225 bool WriteInt8(IpcIo *io, int8_t value)
226 {
227     if (io == NULL) {
228         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
229         return false;
230     }
231     return WriteInt32(io, (int32_t)value);
232 }
233 
WriteInt8Unaligned(IpcIo * io,int8_t value)234 bool WriteInt8Unaligned(IpcIo *io, int8_t value)
235 {
236     if (io == NULL) {
237         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
238         return false;
239     }
240     int8_t *ptr = (int8_t *)IoPushUnaligned(io, sizeof(value));
241     if (ptr != NULL) {
242         *ptr = value;
243         return true;
244     }
245     return false;
246 }
247 
WriteUint8(IpcIo * io,uint8_t value)248 bool WriteUint8(IpcIo *io, uint8_t value)
249 {
250     if (io == NULL) {
251         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
252         return false;
253     }
254     return WriteUint32(io, (uint32_t)value);
255 }
256 
WriteUint8Unaligned(IpcIo * io,uint8_t value)257 bool WriteUint8Unaligned(IpcIo *io,  uint8_t value)
258 {
259     if (io == NULL) {
260         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
261         return false;
262     }
263     uint8_t *ptr = (uint8_t *)IoPushUnaligned(io, sizeof(value));
264     if (ptr != NULL) {
265         *ptr = value;
266         return true;
267     }
268     return false;
269 }
270 
WriteInt16(IpcIo * io,int16_t value)271 bool WriteInt16(IpcIo *io, int16_t value)
272 {
273     if (io == NULL) {
274         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
275         return false;
276     }
277     return WriteInt32(io, (int32_t)value);
278 }
279 
WriteInt16Unaligned(IpcIo * io,int16_t value)280 bool WriteInt16Unaligned(IpcIo *io, int16_t value)
281 {
282     if (io == NULL) {
283         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
284         return false;
285     }
286     int16_t *ptr = (int16_t *)IoPushUnaligned(io, sizeof(value));
287     if (ptr != NULL) {
288         *ptr = value;
289         return true;
290     }
291     return false;
292 }
293 
WriteUint16(IpcIo * io,uint16_t value)294 bool WriteUint16(IpcIo *io, uint16_t value)
295 {
296     if (io == NULL) {
297         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
298         return false;
299     }
300     return WriteUint32(io, (uint32_t)value);
301 }
302 
WriteUint16Unaligned(IpcIo * io,uint16_t value)303 bool WriteUint16Unaligned(IpcIo *io, uint16_t value)
304 {
305     if (io == NULL) {
306         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
307         return false;
308     }
309     uint16_t *ptr = (uint16_t *)IoPushUnaligned(io, sizeof(value));
310     if (ptr != NULL) {
311         *ptr = value;
312         return true;
313     }
314     return false;
315 }
316 
WriteInt64(IpcIo * io,int64_t value)317 bool WriteInt64(IpcIo *io, int64_t value)
318 {
319     if (io == NULL) {
320         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
321         return false;
322     }
323     int64_t *ptr = (int64_t *)IoPush(io, sizeof(value));
324     if (ptr != NULL) {
325         *ptr = value;
326         return true;
327     }
328     return false;
329 }
330 
WriteUint64(IpcIo * io,uint64_t value)331 bool WriteUint64(IpcIo *io, uint64_t value)
332 {
333     if (io == NULL) {
334         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
335         return false;
336     }
337     uint64_t *ptr = (uint64_t *)IoPush(io, sizeof(value));
338     if (ptr != NULL) {
339         *ptr = value;
340         return true;
341     }
342     return false;
343 }
344 
WriteFloat(IpcIo * io,float value)345 bool WriteFloat(IpcIo *io, float value)
346 {
347     if (io == NULL) {
348         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
349         return false;
350     }
351     float *ptr = (float *)IoPush(io, sizeof(value));
352     if (ptr != NULL) {
353         *ptr = value;
354         return true;
355     }
356     return false;
357 }
358 
WriteDouble(IpcIo * io,double value)359 bool WriteDouble(IpcIo *io, double value)
360 {
361     if (io == NULL) {
362         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
363         return false;
364     }
365     double *ptr = (double *)IoPush(io, sizeof(value));
366     if (ptr != NULL) {
367         *ptr = value;
368         return true;
369     }
370     return false;
371 }
372 
WriteString(IpcIo * io,const char * value)373 bool WriteString(IpcIo *io, const char *value)
374 {
375     if (io == NULL || value == NULL) {
376         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
377         return false;
378     }
379     unsigned char *str = (unsigned char *)value;
380     size_t len;
381     uint8_t *ptr = NULL;
382 
383     len = strnlen(value, MAX_IO_SIZE);
384     if (len == MAX_IO_SIZE) {
385         io->flag |= IPC_IO_OVERFLOW;
386         return false;
387     }
388     /* Note: The payload will carry 32bit size instead of size_t */
389     if (!WriteUint32(io, (uint32_t)len)) {
390         return false;
391     }
392 
393     ptr = (uint8_t *)IoPush(io, len + 1);
394     if (ptr != NULL) {
395         if (memset_s(ptr, IPC_IO_ALIGN(len + 1), 0, IPC_IO_ALIGN(len + 1)) != EOK) {
396             io->flag |= IPC_IO_OVERFLOW;
397             return false;
398         }
399         if (memcpy_s(ptr, IPC_IO_ALIGN(len + 1), str, len + 1) != EOK) {
400             io->flag |= IPC_IO_OVERFLOW;
401             return false;
402         }
403         return true;
404     }
405     return false;
406 }
407 
IoPopUnaligned(IpcIo * io,size_t size)408 static void *IoPopUnaligned(IpcIo *io, size_t size)
409 {
410     IPC_IO_RETURN_IF_FAIL(io != NULL);
411     IPC_IO_RETURN_IF_FAIL(IpcIoAvailable(io));
412 
413     if (io->bufferLeft < size) {
414         io->bufferLeft = 0;
415         io->flag |= IPC_IO_OVERFLOW;
416         return NULL;
417     } else {
418         void *ptr = io->bufferCur;
419         io->bufferCur += size;
420         io->bufferLeft -= size;
421         return ptr;
422     }
423 }
424 
ReadBool(IpcIo * io,bool * value)425 bool ReadBool(IpcIo *io, bool *value)
426 {
427     if (io == NULL || value == NULL) {
428         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
429         return false;
430     }
431     bool *ptr = (bool *)IoPop(io, sizeof(*ptr));
432     if (ptr != NULL) {
433         *value = *ptr;
434         return true;
435     }
436     return false;
437 }
438 
ReadBoolUnaligned(IpcIo * io,bool * value)439 bool ReadBoolUnaligned(IpcIo *io, bool *value)
440 {
441     if (io == NULL || value == NULL) {
442         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
443         return false;
444     }
445     bool *ptr = (bool *)IoPopUnaligned(io, sizeof(*ptr));
446     if (ptr != NULL) {
447         *value = *ptr;
448         return true;
449     }
450     return false;
451 }
452 
ReadPointer(IpcIo * io)453 uintptr_t ReadPointer(IpcIo *io)
454 {
455     if (io == NULL) {
456         RPC_LOG_ERROR("IPC io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
457         return false;
458     }
459     uintptr_t *ptr = (uintptr_t *)IoPop(io, sizeof(*ptr));
460     return ptr ? *ptr : 0;
461 }
462 
ReadInt8(IpcIo * io,int8_t * value)463 bool ReadInt8(IpcIo *io, int8_t *value)
464 {
465     if (io == NULL || value == NULL) {
466         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
467         return false;
468     }
469     int8_t *ptr = (int8_t *)IoPop(io, sizeof(*ptr));
470     if (ptr != NULL) {
471         *value = *ptr;
472         return true;
473     }
474     return false;
475 }
476 
ReadInt8Unaligned(IpcIo * io,int8_t * value)477 bool ReadInt8Unaligned(IpcIo *io, int8_t *value)
478 {
479     if (io == NULL || value == NULL) {
480         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
481         return false;
482     }
483     int8_t *ptr = (int8_t *)IoPopUnaligned(io, sizeof(*ptr));
484     if (ptr != NULL) {
485         *value = *ptr;
486         return true;
487     }
488     return false;
489 }
490 
ReadUint8(IpcIo * io,uint8_t * value)491 bool ReadUint8(IpcIo *io, uint8_t *value)
492 {
493     if (io == NULL || value == NULL) {
494         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
495         return false;
496     }
497     uint8_t *ptr = (uint8_t *)IoPop(io, sizeof(*ptr));
498     if (ptr != NULL) {
499         *value = *ptr;
500         return true;
501     }
502     return false;
503 }
504 
ReadUInt8Unaligned(IpcIo * io,uint8_t * value)505 bool ReadUInt8Unaligned(IpcIo *io, uint8_t *value)
506 {
507     if (io == NULL || value == NULL) {
508         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
509         return false;
510     }
511     uint8_t *ptr = (uint8_t*)IoPopUnaligned(io, sizeof(*ptr));
512     if (ptr != NULL) {
513         *value = *ptr;
514         return true;
515     }
516     return false;
517 }
518 
ReadInt16(IpcIo * io,int16_t * value)519 bool ReadInt16(IpcIo *io, int16_t *value)
520 {
521     if (io == NULL || value == NULL) {
522         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
523         return false;
524     }
525     int16_t *ptr = (int16_t *)IoPop(io, sizeof(*ptr));
526     if (ptr != NULL) {
527         *value = *ptr;
528         return true;
529     }
530     return false;
531 }
532 
ReadInt16Unaligned(IpcIo * io,int16_t * value)533 bool ReadInt16Unaligned(IpcIo *io, int16_t *value)
534 {
535     if (io == NULL || value == NULL) {
536         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
537         return false;
538     }
539     int16_t *ptr = (int16_t *)IoPopUnaligned(io, sizeof(*ptr));
540     if (ptr != NULL) {
541         *value = *ptr;
542         return true;
543     }
544     return false;
545 }
546 
ReadUint16(IpcIo * io,uint16_t * value)547 bool ReadUint16(IpcIo *io, uint16_t *value)
548 {
549     if (io == NULL || value == NULL) {
550         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
551         return false;
552     }
553     uint16_t *ptr = (uint16_t *)IoPop(io, sizeof(*ptr));
554     if (ptr != NULL) {
555         *value = *ptr;
556         return true;
557     }
558     return false;
559 }
560 
ReadUInt16Unaligned(IpcIo * io,uint16_t * value)561 bool ReadUInt16Unaligned(IpcIo *io, uint16_t *value)
562 {
563     if (io == NULL || value == NULL) {
564         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
565         return false;
566     }
567     uint16_t *ptr = (uint16_t *)IoPopUnaligned(io, sizeof(*ptr));
568     if (ptr != NULL) {
569         *value = *ptr;
570         return true;
571     }
572     return false;
573 }
574 
ReadInt32(IpcIo * io,int32_t * value)575 bool ReadInt32(IpcIo *io, int32_t *value)
576 {
577     if (io == NULL || value == NULL) {
578         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
579         return false;
580     }
581     int32_t *ptr = (int32_t *)IoPop(io, sizeof(*ptr));
582     if (ptr != NULL) {
583         *value = *ptr;
584         return true;
585     }
586     return false;
587 }
588 
ReadUint32(IpcIo * io,uint32_t * value)589 bool ReadUint32(IpcIo *io, uint32_t *value)
590 {
591     if (io == NULL || value == NULL) {
592         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
593         return false;
594     }
595     uint32_t *ptr = (uint32_t *)IoPop(io, sizeof(*ptr));
596     if (ptr != NULL) {
597         *value = *ptr;
598         return true;
599     }
600     return false;
601 }
602 
ReadInt64(IpcIo * io,int64_t * value)603 bool ReadInt64(IpcIo *io, int64_t *value)
604 {
605     if (io == NULL || value == NULL) {
606         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
607         return false;
608     }
609     int64_t *ptr = (int64_t *)IoPop(io, sizeof(*ptr));
610     if (ptr != NULL) {
611         *value = *ptr;
612         return true;
613     }
614     return false;
615 }
616 
ReadUint64(IpcIo * io,uint64_t * value)617 bool ReadUint64(IpcIo *io, uint64_t *value)
618 {
619     if (io == NULL || value == NULL) {
620         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
621         return false;
622     }
623     uint64_t *ptr = (uint64_t*)IoPop(io, sizeof(*ptr));
624     if (ptr != NULL) {
625         *value = *ptr;
626         return true;
627     }
628     return false;
629 }
630 
ReadFloat(IpcIo * io,float * value)631 bool ReadFloat(IpcIo *io, float *value)
632 {
633     if (io == NULL || value == NULL) {
634         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
635         return false;
636     }
637     float *ptr = (float *)IoPop(io, sizeof(*ptr));
638     if (ptr != NULL) {
639         *value = *ptr;
640         return true;
641     }
642     return false;
643 }
644 
ReadDouble(IpcIo * io,double * value)645 bool ReadDouble(IpcIo *io, double *value)
646 {
647     if (io == NULL || value == NULL) {
648         RPC_LOG_ERROR("IPC io == NULL || value == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
649         return false;
650     }
651     double *ptr = (double *)IoPop(io, sizeof(*ptr));
652     if (ptr != NULL) {
653         *value = *ptr;
654         return true;
655     }
656     return false;
657 }
658 
ReadString(IpcIo * io,size_t * len)659 uint8_t *ReadString(IpcIo *io, size_t *len)
660 {
661     if (io == NULL || len == NULL) {
662         RPC_LOG_ERROR("IPC io == NULL || len == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
663         return false;
664     }
665     uint32_t value;
666     bool ret = ReadUint32(io, &value);
667     if (ret) {
668         *len = value;
669     }
670     if (value > MAX_IO_SIZE) {
671         return NULL;
672     }
673     return (uint8_t *)IoPop(io, value + 1);
674 }
675 
WriteBufferAddTerminator(IpcIo * io,const void * value,size_t size,size_t sizeType)676 static bool WriteBufferAddTerminator(IpcIo *io, const void *value, size_t size, size_t sizeType)
677 {
678     if (value == NULL || size < sizeType || io == NULL) {
679         RPC_LOG_ERROR("IPC value == NULL || size < sizeType || io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
680         return false;
681     }
682 
683     if (size > MAX_IO_SIZE) {
684         RPC_LOG_ERROR("IPC size > MAX_IO_SIZE failed: %s:%d\n", __FUNCTION__, __LINE__);
685         io->flag |= IPC_IO_OVERFLOW;
686         return false;
687     }
688 
689     size_t desireCapacity = IPC_IO_ALIGN(size);
690     uint8_t *ptr = (uint8_t *)IoPush(io, desireCapacity);
691     if (ptr != NULL) {
692         if (memcpy_s(ptr, desireCapacity, value, size - sizeType) != EOK) {
693             io->flag |= IPC_IO_OVERFLOW;
694             return false;
695         }
696         if (memset_s(ptr + (size - sizeType), desireCapacity - size + sizeType, 0,
697             desireCapacity - size + sizeType) != EOK) {
698             io->flag |= IPC_IO_OVERFLOW;
699             return false;
700         }
701 
702         return true;
703     }
704     return false;
705 }
706 
WriteString16(IpcIo * io,const uint16_t * value,size_t len)707 bool WriteString16(IpcIo *io, const uint16_t *value, size_t len)
708 {
709     if (io == NULL || value == NULL || len <= 0) {
710         RPC_LOG_ERROR("IPC io == NULL || value == NULL || len <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
711         return false;
712     }
713 
714     size_t typeSize = sizeof(uint16_t);
715     size_t desireCapacity = (len + 1) * typeSize;
716 
717     if (desireCapacity > MAX_IO_SIZE) {
718         io->flag |= IPC_IO_OVERFLOW;
719         RPC_LOG_ERROR("IPC desireCapacity > MAX_IO_SIZE failed: %s:%d\n", __FUNCTION__, __LINE__);
720         return false;
721     }
722 
723     /* Note: The payload will carry 32bit size instead of size_t */
724     bool ret = WriteUint32(io, (uint32_t)len);
725     if (ret) {
726         ret = WriteBufferAddTerminator(io, value, desireCapacity, typeSize);
727     }
728     return ret;
729 }
730 
WriteBuffer(IpcIo * io,const void * data,size_t size)731 bool WriteBuffer(IpcIo *io, const void *data, size_t size)
732 {
733     if (data == NULL || size <= 0 || io == NULL) {
734         RPC_LOG_ERROR("IPC data == NULL || size <= 0 || io == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
735         return false;
736     }
737 
738     if (size > MAX_IO_SIZE) {
739         RPC_LOG_ERROR("IPC size > MAX_IO_SIZE failed: %s:%d\n", __FUNCTION__, __LINE__);
740         io->flag |= IPC_IO_OVERFLOW;
741         return false;
742     }
743 
744     size_t desireCapacity = IPC_IO_ALIGN(size);
745     uint8_t *ptr = (uint8_t *)IoPush(io, desireCapacity);
746     if (ptr != NULL) {
747         if (memcpy_s(ptr, desireCapacity, data, size) != EOK) {
748             io->flag |= IPC_IO_OVERFLOW;
749             return false;
750         }
751         if (memset_s(ptr + size, desireCapacity - size, 0, desireCapacity - size) != EOK) {
752             io->flag |= IPC_IO_OVERFLOW;
753             return false;
754         }
755 
756         return true;
757     }
758     return false;
759 }
760 
WriteInterfaceToken(IpcIo * io,const uint16_t * name,size_t len)761 bool WriteInterfaceToken(IpcIo *io, const uint16_t *name, size_t len)
762 {
763     if (io == NULL || name == NULL || len <= 0) {
764         RPC_LOG_ERROR("IPC io == NULL || name == NULL || len <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
765         return false;
766     }
767 
768     size_t typeSize = sizeof(uint16_t);
769     size_t desireCapacity = (len + 1) * typeSize;
770 
771     if (desireCapacity > MAX_IO_SIZE) {
772         io->flag |= IPC_IO_OVERFLOW;
773         RPC_LOG_ERROR("IPC desireCapacity > MAX_IO_SIZE failed: %s:%d\n", __FUNCTION__, __LINE__);
774         return false;
775     }
776 
777     return  WriteString16(io, name, len);
778 }
779 
WriteRawData(IpcIo * io,const void * data,size_t size)780 bool WriteRawData(IpcIo *io, const void *data, size_t size)
781 {
782     if (io == NULL || data == NULL || size <= 0) {
783         RPC_LOG_ERROR("IPC io == NULL || data == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
784         return false;
785     }
786 
787     if (size > MAX_IO_SIZE) {
788         io->flag |= IPC_IO_OVERFLOW;
789         RPC_LOG_ERROR("IPC size > MAX_IO_SIZE failed: %s:%d\n", __FUNCTION__, __LINE__);
790         return false;
791     }
792 
793     bool ret = WriteUint32(io, (uint32_t)size);
794     if (ret) {
795         ret = WriteBuffer(io, data, size);
796     }
797     return ret;
798 }
799 
WriteBoolVector(IpcIo * io,const bool * val,size_t size)800 bool WriteBoolVector(IpcIo *io, const bool *val, size_t size)
801 {
802     if (io == NULL || val == NULL || size <= 0) {
803         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
804         return false;
805     }
806 
807     bool ret = WriteUint32(io, (uint32_t)size);
808     if (ret) {
809         for (int32_t i = 0; i != size; i++) {
810             ret = WriteBool(io, val[i]);
811             if (!ret) {
812                 return false;
813             }
814         }
815         return true;
816     }
817     return false;
818 }
819 
WriteInt8Vector(IpcIo * io,const int8_t * val,size_t size)820 bool WriteInt8Vector(IpcIo *io, const int8_t *val, size_t size)
821 {
822     if (io == NULL || val == NULL || size <= 0) {
823         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
824         return false;
825     }
826 
827     bool ret = WriteUint32(io, (uint32_t)size);
828     if (ret) {
829         size_t desireCapacity = size * sizeof(int8_t);
830         int8_t *ptr = (int8_t *)IoPushUnaligned(io, desireCapacity);
831         if (ptr == NULL) {
832             return false;
833         }
834 
835         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
836             io->flag |= IPC_IO_OVERFLOW;
837             return false;
838         }
839         return true;
840     }
841     return false;
842 }
843 
WriteInt16Vector(IpcIo * io,const int16_t * val,size_t size)844 bool WriteInt16Vector(IpcIo *io, const int16_t *val, size_t size)
845 {
846     if (io == NULL || val == NULL || size <= 0) {
847         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
848         return false;
849     }
850 
851     bool ret = WriteUint32(io, (uint32_t)size);
852     if (ret) {
853         for (int32_t i = 0; i != size; i++) {
854             ret = WriteInt16(io, val[i]);
855             if (!ret) {
856                 return false;
857             }
858         }
859         return true;
860     }
861     return false;
862 }
863 
WriteInt32Vector(IpcIo * io,const int32_t * val,size_t size)864 bool WriteInt32Vector(IpcIo *io, const int32_t *val, size_t size)
865 {
866     if (io == NULL || val == NULL || size <= 0) {
867         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
868         return false;
869     }
870 
871     bool ret = WriteUint32(io, (uint32_t)size);
872     if (ret) {
873         size_t desireCapacity = size * sizeof(int32_t);
874         int32_t *ptr = (int32_t *)IoPushUnaligned(io, desireCapacity);
875         if (ptr == NULL) {
876             return false;
877         }
878 
879         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
880             io->flag |= IPC_IO_OVERFLOW;
881             return false;
882         }
883         return true;
884     }
885     return false;
886 }
887 
WriteInt64Vector(IpcIo * io,const int64_t * val,size_t size)888 bool WriteInt64Vector(IpcIo *io, const int64_t *val, size_t size)
889 {
890     if (io == NULL || val == NULL || size <= 0) {
891         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
892         return false;
893     }
894 
895     bool ret = WriteUint32(io, (uint32_t)size);
896     if (ret) {
897         size_t desireCapacity = size * sizeof(int64_t);
898         int64_t *ptr = (int64_t *)IoPushUnaligned(io, desireCapacity);
899         if (ptr == NULL) {
900             return false;
901         }
902 
903         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
904             io->flag |= IPC_IO_OVERFLOW;
905             return false;
906         }
907         return true;
908     }
909     return false;
910 }
911 
WriteUInt8Vector(IpcIo * io,const uint8_t * val,size_t size)912 bool WriteUInt8Vector(IpcIo *io, const uint8_t *val, size_t size)
913 {
914     if (io == NULL || val == NULL || size <= 0) {
915         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
916         return false;
917     }
918 
919     bool ret = WriteUint32(io, (uint32_t)size);
920     if (ret) {
921         size_t desireCapacity = size * sizeof(uint8_t);
922         uint8_t *ptr = (uint8_t *)IoPushUnaligned(io, desireCapacity);
923         if (ptr == NULL) {
924             return false;
925         }
926 
927         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
928             io->flag |= IPC_IO_OVERFLOW;
929             return false;
930         }
931         return true;
932     }
933     return false;
934 }
935 
WriteUInt16Vector(IpcIo * io,const uint16_t * val,size_t size)936 bool WriteUInt16Vector(IpcIo *io, const uint16_t *val, size_t size)
937 {
938     if (io == NULL || val == NULL || size <= 0) {
939         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
940         return false;
941     }
942 
943     bool ret = WriteUint32(io, (uint32_t)size);
944     if (ret) {
945         size_t desireCapacity = size * sizeof(uint16_t);
946         uint16_t *ptr = (uint16_t *)IoPushUnaligned(io, desireCapacity);
947         if (ptr == NULL) {
948             return false;
949         }
950 
951         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
952             io->flag |= IPC_IO_OVERFLOW;
953             return false;
954         }
955         return true;
956     }
957     return false;
958 }
959 
WriteUInt32Vector(IpcIo * io,const uint32_t * val,size_t size)960 bool WriteUInt32Vector(IpcIo *io, const uint32_t *val, size_t size)
961 {
962     if (io == NULL || val == NULL || size <= 0) {
963         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
964         return false;
965     }
966 
967     bool ret = WriteUint32(io, (uint32_t)size);
968     if (ret) {
969         size_t desireCapacity = size * sizeof(uint32_t);
970         uint32_t *ptr = (uint32_t *)IoPushUnaligned(io, desireCapacity);
971         if (ptr == NULL) {
972             return false;
973         }
974 
975         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
976             io->flag |= IPC_IO_OVERFLOW;
977             return false;
978         }
979         return true;
980     }
981     return false;
982 }
983 
WriteUInt64Vector(IpcIo * io,const uint64_t * val,size_t size)984 bool WriteUInt64Vector(IpcIo *io, const uint64_t *val, size_t size)
985 {
986     if (io == NULL || val == NULL || size <= 0) {
987         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
988         return false;
989     }
990 
991     bool ret = WriteUint32(io, (uint32_t)size);
992     if (ret) {
993         size_t desireCapacity = size * sizeof(uint64_t);
994         uint64_t *ptr = (uint64_t *)IoPushUnaligned(io, desireCapacity);
995         if (ptr == NULL) {
996             return false;
997         }
998 
999         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
1000             io->flag |= IPC_IO_OVERFLOW;
1001             return false;
1002         }
1003         return true;
1004     }
1005     return false;
1006 }
1007 
WriteFloatVector(IpcIo * io,const float * val,size_t size)1008 bool WriteFloatVector(IpcIo *io, const float *val, size_t size)
1009 {
1010     if (io == NULL || val == NULL || size <= 0) {
1011         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
1012         return false;
1013     }
1014 
1015     bool ret = WriteUint32(io, (uint32_t)size);
1016     if (ret) {
1017         size_t desireCapacity = size * sizeof(float);
1018         float *ptr = (float *)IoPushUnaligned(io, desireCapacity);
1019         if (ptr == NULL) {
1020             return false;
1021         }
1022 
1023         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
1024             io->flag |= IPC_IO_OVERFLOW;
1025             return false;
1026         }
1027         return true;
1028     }
1029     return false;
1030 }
1031 
WriteDoubleVector(IpcIo * io,const double * val,size_t size)1032 bool WriteDoubleVector(IpcIo *io, const double *val, size_t size)
1033 {
1034     if (io == NULL || val == NULL || size <= 0) {
1035         RPC_LOG_ERROR("IPC io == NULL || val == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
1036         return false;
1037     }
1038 
1039     bool ret = WriteUint32(io, (uint32_t)size);
1040     if (ret) {
1041         size_t desireCapacity = size * sizeof(double);
1042         double *ptr = (double *)IoPushUnaligned(io, desireCapacity);
1043         if (ptr == NULL) {
1044             return false;
1045         }
1046 
1047         if (memcpy_s(ptr, desireCapacity, val, desireCapacity) != EOK) {
1048             io->flag |= IPC_IO_OVERFLOW;
1049             return false;
1050         }
1051         return true;
1052     }
1053     return false;
1054 }
1055 
ReadString16(IpcIo * io,size_t * len)1056 uint16_t *ReadString16(IpcIo *io, size_t *len)
1057 {
1058     if (io == NULL || len == NULL) {
1059         RPC_LOG_ERROR("IPC io == NULL || len == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1060         return NULL;
1061     }
1062     bool ret = ReadUint32(io, (uint32_t *)len);
1063     if (!ret) {
1064         return NULL;
1065     }
1066 
1067     size_t readCapacity = (*len + 1) * sizeof(uint16_t);
1068     uint16_t *ptr = (uint16_t *)IoPop(io, readCapacity);
1069     if (ptr[*len] == 0) {
1070         return ptr;
1071     } else {
1072         return NULL;
1073     }
1074 }
1075 
ReadInterfaceToken(IpcIo * io,size_t * len)1076 uint16_t *ReadInterfaceToken(IpcIo *io, size_t *len)
1077 {
1078     if (io == NULL || len == NULL) {
1079         RPC_LOG_ERROR("IPC io == NULL || len == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1080         return NULL;
1081     }
1082     bool ret = ReadUint32(io, (uint32_t *)len);
1083     if (!ret) {
1084         return NULL;
1085     }
1086 
1087     size_t readCapacity = (*len + 1) * sizeof(uint16_t);
1088     uint16_t *ptr = (uint16_t *)IoPop(io, readCapacity);
1089     if (ptr != NULL && ptr[*len] == 0) {
1090         return ptr;
1091     } else {
1092         return NULL;
1093     }
1094 }
1095 
ReadBuffer(IpcIo * io,size_t size)1096 const uint8_t *ReadBuffer(IpcIo *io, size_t size)
1097 {
1098     if (io == NULL || size <= 0) {
1099         RPC_LOG_ERROR("IPC io == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
1100         return NULL;
1101     }
1102     return (uint8_t *)IoPop(io, size);
1103 }
1104 
ReadRawData(IpcIo * io,size_t size)1105 void *ReadRawData(IpcIo *io, size_t size)
1106 {
1107     if (io == NULL || size <= 0) {
1108         RPC_LOG_ERROR("IPC io == NULL || size <= 0 failed: %s:%d\n", __FUNCTION__, __LINE__);
1109         return NULL;
1110     }
1111     uint32_t len = 0;
1112     ReadUint32(io, &len);
1113     if (len != (uint32_t)size) {
1114         return NULL;
1115     }
1116     return (void *)ReadBuffer(io, (size_t)len);
1117 }
1118 
ReadBoolVector(IpcIo * io,size_t * size)1119 bool *ReadBoolVector(IpcIo *io, size_t *size)
1120 {
1121     if (io == NULL || size == NULL) {
1122         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1123         return NULL;
1124     }
1125 
1126     bool ret = ReadUint32(io, (uint32_t *)size);
1127     if (!ret) {
1128         return NULL;
1129     }
1130 
1131     bool *val = (bool *)malloc((*size) * sizeof(bool));
1132     if (val == NULL) {
1133         RPC_LOG_ERROR("IPC malloc failed: %s:%d\n", __FUNCTION__, __LINE__);
1134         return NULL;
1135     }
1136 
1137     int32_t *ptr = NULL;
1138     for (int32_t i = 0; i != *size; i++) {
1139         ptr = (int32_t *)IoPop(io, sizeof(int32_t));
1140         if (ptr == NULL) {
1141             free(val);
1142             return NULL;
1143         }
1144         val[i] = (bool)(*ptr);
1145     }
1146     return val;
1147 }
1148 
ReadInt8Vector(IpcIo * io,size_t * size)1149 int8_t *ReadInt8Vector(IpcIo *io, size_t *size)
1150 {
1151     if (io == NULL || size == NULL) {
1152         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1153         return NULL;
1154     }
1155     bool ret = ReadUint32(io, (uint32_t *)size);
1156     if (!ret) {
1157         return NULL;
1158     }
1159 
1160     size_t readCapacity = *size * sizeof(int8_t);
1161     int8_t *ptr = (int8_t *)IoPopUnaligned(io, readCapacity);
1162     if (ptr == NULL) {
1163         return NULL;
1164     }
1165 
1166     return ptr;
1167 }
1168 
ReadInt16Vector(IpcIo * io,size_t * size)1169 int16_t *ReadInt16Vector(IpcIo *io, size_t *size)
1170 {
1171     if (io == NULL || size == NULL) {
1172         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1173         return NULL;
1174     }
1175     bool ret = ReadUint32(io, (uint32_t *)size);
1176     if (!ret) {
1177         return NULL;
1178     }
1179 
1180     int16_t *val = (int16_t *)malloc((*size) * sizeof(int16_t));
1181     if (val == NULL) {
1182         RPC_LOG_ERROR("IPC  malloc failed: %s:%d\n", __FUNCTION__, __LINE__);
1183         return NULL;
1184     }
1185     int32_t *ptr = NULL;
1186     for (int32_t i = 0; i != *size; i++) {
1187         ptr = (int32_t *)IoPop(io, sizeof(int32_t));
1188         if (ptr == NULL) {
1189             free(val);
1190             return NULL;
1191         }
1192         val[i] = (int16_t)(*ptr);
1193     }
1194     return val;
1195 }
1196 
ReadInt32Vector(IpcIo * io,size_t * size)1197 int32_t *ReadInt32Vector(IpcIo *io, size_t *size)
1198 {
1199     if (io == NULL || size == NULL) {
1200         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1201         return NULL;
1202     }
1203     bool ret = ReadUint32(io, (uint32_t *)size);
1204     if (!ret) {
1205         return NULL;
1206     }
1207 
1208     size_t readCapacity = *size * sizeof(int32_t);
1209     int32_t *ptr = (int32_t *)IoPopUnaligned(io, readCapacity);
1210     if (ptr == NULL) {
1211         return NULL;
1212     }
1213 
1214     return ptr;
1215 }
1216 
ReadInt64Vector(IpcIo * io,size_t * size)1217 int64_t *ReadInt64Vector(IpcIo *io, size_t *size)
1218 {
1219     if (io == NULL || size == NULL) {
1220         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1221         return NULL;
1222     }
1223     bool ret = ReadUint32(io, (uint32_t *)size);
1224     if (!ret) {
1225         return NULL;
1226     }
1227 
1228     size_t readCapacity = *size * sizeof(int64_t);
1229     int64_t *ptr = (int64_t *)IoPopUnaligned(io, readCapacity);
1230     if (ptr == NULL) {
1231         return NULL;
1232     }
1233 
1234     return ptr;
1235 }
1236 
ReadUInt8Vector(IpcIo * io,size_t * size)1237 uint8_t *ReadUInt8Vector(IpcIo *io, size_t *size)
1238 {
1239     if (io == NULL || size == NULL) {
1240         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1241         return NULL;
1242     }
1243     bool ret = ReadUint32(io, (uint32_t *)size);
1244     if (!ret) {
1245         return NULL;
1246     }
1247 
1248     size_t readCapacity = *size * sizeof(uint8_t);
1249     uint8_t *ptr = (uint8_t *)IoPopUnaligned(io, readCapacity);
1250     if (ptr == NULL) {
1251         return NULL;
1252     }
1253 
1254     return ptr;
1255 }
1256 
ReadUInt16Vector(IpcIo * io,size_t * size)1257 uint16_t *ReadUInt16Vector(IpcIo *io, size_t *size)
1258 {
1259     if (io == NULL || size == NULL) {
1260         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1261         return NULL;
1262     }
1263     bool ret = ReadUint32(io, (uint32_t *)size);
1264     if (!ret) {
1265         return NULL;
1266     }
1267 
1268     size_t readCapacity = *size * sizeof(uint16_t);
1269     uint16_t *ptr = (uint16_t *)IoPopUnaligned(io, readCapacity);
1270     if (ptr == NULL) {
1271         return NULL;
1272     }
1273 
1274     return ptr;
1275 }
1276 
ReadUInt32Vector(IpcIo * io,size_t * size)1277 uint32_t *ReadUInt32Vector(IpcIo *io, size_t *size)
1278 {
1279     if (io == NULL || size == NULL) {
1280         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1281         return NULL;
1282     }
1283     bool ret = ReadUint32(io, (uint32_t *)size);
1284     if (!ret) {
1285         return NULL;
1286     }
1287 
1288     size_t readCapacity = *size * sizeof(uint32_t);
1289     uint32_t *ptr = (uint32_t *)IoPopUnaligned(io, readCapacity);
1290     if (ptr == NULL) {
1291         return NULL;
1292     }
1293 
1294     return ptr;
1295 }
1296 
ReadUInt64Vector(IpcIo * io,size_t * size)1297 uint64_t *ReadUInt64Vector(IpcIo *io, size_t *size)
1298 {
1299     if (io == NULL || size == NULL) {
1300         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1301         return NULL;
1302     }
1303     bool ret = ReadUint32(io, (uint32_t *)size);
1304     if (!ret) {
1305         return NULL;
1306     }
1307 
1308     size_t readCapacity = *size * sizeof(uint64_t);
1309     uint64_t *ptr = (uint64_t *)IoPopUnaligned(io, readCapacity);
1310     if (ptr == NULL) {
1311         return NULL;
1312     }
1313 
1314     return ptr;
1315 }
1316 
ReadFloatVector(IpcIo * io,size_t * size)1317 float *ReadFloatVector(IpcIo *io, size_t *size)
1318 {
1319     if (io == NULL || size == NULL) {
1320         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1321         return NULL;
1322     }
1323     bool ret = ReadUint32(io, (uint32_t *)size);
1324     if (!ret) {
1325         return NULL;
1326     }
1327 
1328     size_t readCapacity = *size * sizeof(float);
1329     float *ptr = (float *)IoPopUnaligned(io, readCapacity);
1330     if (ptr == NULL) {
1331         return NULL;
1332     }
1333 
1334     return ptr;
1335 }
1336 
ReadDoubleVector(IpcIo * io,size_t * size)1337 double *ReadDoubleVector(IpcIo *io, size_t *size)
1338 {
1339     if (io == NULL || size == NULL) {
1340         RPC_LOG_ERROR("IPC io == NULL || size == NULL failed: %s:%d\n", __FUNCTION__, __LINE__);
1341         return NULL;
1342     }
1343     bool ret = ReadUint32(io, (uint32_t *)size);
1344     if (!ret) {
1345         return NULL;
1346     }
1347 
1348     size_t readCapacity = *size * sizeof(double);
1349     double *ptr = (double *)IoPopUnaligned(io, readCapacity);
1350     if (ptr == NULL) {
1351         return NULL;
1352     }
1353 
1354     return ptr;
1355 }
1356