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 #ifndef OHOS_IPC_RPC_SERIALIZER_H
17 #define OHOS_IPC_RPC_SERIALIZER_H
18 
19 #include <stdbool.h>
20 #include <stddef.h>
21 #include <stdint.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif /* __cplusplus */
26 
27 typedef struct {
28     char *bufferBase;
29     size_t *offsetsBase;
30     char *bufferCur;
31     size_t *offsetsCur;
32     size_t bufferLeft;
33     size_t offsetsLeft;
34     uint32_t flag;
35 } IpcIo;
36 
37 typedef struct {
38     int32_t handle;
39     uintptr_t token;
40     uintptr_t cookie;
41 } SvcIdentity;
42 
43 typedef enum {
44     SERVICE_TYPE_ANONYMOUS,
45     SERVICE_TYPE_NORMAL
46 } ServiceType;
47 
48 #define IPC_INVALID_HANDLE (-1)
49 #define IPC_IO_INITIALIZED 0x01 /* ipc flag indicates whether io is initialized */
50 #define IPC_IO_OVERFLOW    0x02 /* ipc flag indicates whether io is running out of space */
51 #define MAX_IO_SIZE 8192UL
52 #define MAX_OBJ_NUM 32UL
53 
54 void IpcIoInit(IpcIo* io, void* buffer, size_t bufferSize, size_t maxobjects);
55 bool IpcIoAppend(IpcIo *dst, IpcIo *src);
56 
57 bool WriteRemoteObject(IpcIo *io, const SvcIdentity *svc);
58 bool WriteFileDescriptor(IpcIo *io, uint32_t fd);
59 
60 bool ReadRemoteObject(IpcIo *io, SvcIdentity *svc);
61 int32_t ReadFileDescriptor(IpcIo *io);
62 
63 bool WriteBool(IpcIo *io, bool value);
64 bool WriteInt8(IpcIo *io, int8_t value);
65 bool WriteInt16(IpcIo *io, int16_t value);
66 bool WriteInt32(IpcIo *io, int32_t value);
67 bool WriteInt64(IpcIo *io, int64_t value);
68 bool WriteUint8(IpcIo *io, uint8_t value);
69 bool WriteUint16(IpcIo *io, uint16_t value);
70 bool WriteUint32(IpcIo *io, uint32_t value);
71 bool WriteUint64(IpcIo *io, uint64_t value);
72 bool WriteBoolUnaligned(IpcIo *io, bool value);
73 bool WriteInt8Unaligned(IpcIo *io, int8_t value);
74 bool WriteInt16Unaligned(IpcIo *io, int16_t value);
75 bool WriteUint8Unaligned(IpcIo *io, uint8_t value);
76 bool WriteUint16Unaligned(IpcIo *io, uint16_t value);
77 bool WriteFloat(IpcIo *io, float value);
78 bool WriteDouble(IpcIo *io, double value);
79 bool WritePointer(IpcIo *io, uintptr_t value);
80 bool WriteString(IpcIo *io, const char *value);
81 
82 bool ReadBool(IpcIo *io, bool *value);
83 bool ReadInt8(IpcIo *io, int8_t *value);
84 bool ReadInt16(IpcIo *io, int16_t *value);
85 bool ReadInt32(IpcIo *io, int32_t *value);
86 bool ReadInt64(IpcIo *io, int64_t *value);
87 bool ReadUint8(IpcIo *io, uint8_t *value);
88 bool ReadUint16(IpcIo *io, uint16_t *value);
89 bool ReadUint32(IpcIo *io, uint32_t *value);
90 bool ReadUint64(IpcIo *io, uint64_t *value);
91 bool ReadFloat(IpcIo *io, float *value);
92 bool ReadDouble(IpcIo *io, double *value);
93 uintptr_t ReadPointer(IpcIo *io);
94 bool ReadBoolUnaligned(IpcIo *io, bool *value);
95 bool ReadInt8Unaligned(IpcIo *io, int8_t *value);
96 bool ReadInt16Unaligned(IpcIo *io, int16_t *value);
97 bool ReadUInt8Unaligned(IpcIo *io, uint8_t *value);
98 bool ReadUInt16Unaligned(IpcIo *io, uint16_t *value);
99 uint8_t *ReadString(IpcIo *io, size_t *len);
100 
101 bool WriteString16(IpcIo *io, const uint16_t *value, size_t len);
102 bool WriteBuffer(IpcIo *io, const void *data, size_t size);
103 bool WriteInterfaceToken(IpcIo *io, const uint16_t *name, size_t len);
104 bool WriteRawData(IpcIo *io, const void *data, size_t size);
105 bool WriteBoolVector(IpcIo *io, const bool *val, size_t size);
106 bool WriteInt8Vector(IpcIo *io, const int8_t *val, size_t size);
107 bool WriteInt16Vector(IpcIo *io, const int16_t *val, size_t size);
108 bool WriteInt32Vector(IpcIo *io, const int32_t *val, size_t size);
109 bool WriteInt64Vector(IpcIo *io, const int64_t *val, size_t size);
110 bool WriteUInt8Vector(IpcIo *io, const uint8_t *val, size_t size);
111 bool WriteUInt16Vector(IpcIo *io, const uint16_t *val, size_t size);
112 bool WriteUInt32Vector(IpcIo *io, const uint32_t *val, size_t size);
113 bool WriteUInt64Vector(IpcIo *io, const uint64_t *val, size_t size);
114 bool WriteFloatVector(IpcIo *io, const float *val, size_t size);
115 bool WriteDoubleVector(IpcIo *io, const double *val, size_t size);
116 
117 uint16_t *ReadString16(IpcIo *io, size_t *size);
118 uint16_t *ReadInterfaceToken(IpcIo *io, size_t *size);
119 const uint8_t *ReadBuffer(IpcIo *io, size_t size);
120 void *ReadRawData(IpcIo *io, size_t size);
121 bool *ReadBoolVector(IpcIo *io, size_t *size);
122 int8_t *ReadInt8Vector(IpcIo *io, size_t *size);
123 int16_t *ReadInt16Vector(IpcIo *io, size_t *size);
124 int32_t *ReadInt32Vector(IpcIo *io, size_t *size);
125 int64_t *ReadInt64Vector(IpcIo *io, size_t *size);
126 uint8_t *ReadUInt8Vector(IpcIo *io, size_t *size);
127 uint16_t *ReadUInt16Vector(IpcIo *io, size_t *size);
128 uint32_t *ReadUInt32Vector(IpcIo *io, size_t *size);
129 uint64_t *ReadUInt64Vector(IpcIo *io, size_t *size);
130 float *ReadFloatVector(IpcIo *io, size_t *size);
131 double *ReadDoubleVector(IpcIo *io, size_t *size);
132 
133 #ifdef __cplusplus
134 }
135 #endif /* __cplusplus */
136 
137 #endif /* OHOS_IPC_RPC_SERIALIZER_H */
138