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