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