1 // Copyright (C) 2024 Huawei Device Co., Ltd.
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 #![allow(unused)]
15
16 use std::mem::size_of;
17 use std::pin::Pin;
18
19 use cxx::CxxVector;
20 pub use ffi::*;
21
22 use super::msg::MsgParcel;
23 use super::{Deserialize, Serialize};
24 use crate::{IpcResult, IpcStatusCode};
25
26 #[cxx::bridge(namespace = "OHOS::IpcRust")]
27 mod ffi {
28
29 unsafe extern "C++" {
30 include!("parcel_wrapper.h");
31 include!("message_option.h");
32 type IRemoteObjectWrapper = crate::remote::wrapper::IRemoteObjectWrapper;
33
34 #[namespace = "OHOS"]
35 type MessageParcel;
36 #[namespace = "OHOS"]
37 type MessageOption;
38 #[namespace = "OHOS"]
39 type Parcel;
40
NewMessageParcel() -> UniquePtr<MessageParcel>41 fn NewMessageParcel() -> UniquePtr<MessageParcel>;
NewMessageOption() -> UniquePtr<MessageOption>42 fn NewMessageOption() -> UniquePtr<MessageOption>;
43
ReadFileDescriptor(self: Pin<&mut MessageParcel>) -> i3244 fn ReadFileDescriptor(self: Pin<&mut MessageParcel>) -> i32;
WriteFileDescriptor(self: Pin<&mut MessageParcel>, fd: i32) -> bool45 fn WriteFileDescriptor(self: Pin<&mut MessageParcel>, fd: i32) -> bool;
46
AsParcel(MsgParcel: &MessageParcel) -> *const Parcel47 unsafe fn AsParcel(MsgParcel: &MessageParcel) -> *const Parcel;
AsParcelMut(msgParcel: Pin<&mut MessageParcel>) -> *mut Parcel48 unsafe fn AsParcelMut(msgParcel: Pin<&mut MessageParcel>) -> *mut Parcel;
49
WriteInterfaceToken(msgParcel: Pin<&mut MessageParcel>, name: &str) -> bool50 fn WriteInterfaceToken(msgParcel: Pin<&mut MessageParcel>, name: &str) -> bool;
ReadInterfaceToken(msgParcel: Pin<&mut MessageParcel>) -> String51 fn ReadInterfaceToken(msgParcel: Pin<&mut MessageParcel>) -> String;
52
WriteBuffer(msgParcel: Pin<&mut MessageParcel>, buffer: &[u8]) -> bool53 fn WriteBuffer(msgParcel: Pin<&mut MessageParcel>, buffer: &[u8]) -> bool;
54
ReadBuffer(msgParcel: Pin<&mut MessageParcel>, len: usize, buffer: &mut Vec<u8>) -> bool55 fn ReadBuffer(msgParcel: Pin<&mut MessageParcel>, len: usize, buffer: &mut Vec<u8>)
56 -> bool;
57
WriteRemoteObject( msgParcel: Pin<&mut MessageParcel>, value: UniquePtr<IRemoteObjectWrapper>, ) -> bool58 fn WriteRemoteObject(
59 msgParcel: Pin<&mut MessageParcel>,
60 value: UniquePtr<IRemoteObjectWrapper>,
61 ) -> bool;
62
ReadRemoteObject(msgParcel: Pin<&mut MessageParcel>) -> UniquePtr<IRemoteObjectWrapper>63 fn ReadRemoteObject(msgParcel: Pin<&mut MessageParcel>) -> UniquePtr<IRemoteObjectWrapper>;
64
ReadString(parcel: Pin<&mut Parcel>, val: &mut String) -> bool65 fn ReadString(parcel: Pin<&mut Parcel>, val: &mut String) -> bool;
WriteString(parcel: Pin<&mut Parcel>, val: &str) -> bool66 fn WriteString(parcel: Pin<&mut Parcel>, val: &str) -> bool;
67
ReadString16(parcel: Pin<&mut Parcel>) -> String68 fn ReadString16(parcel: Pin<&mut Parcel>) -> String;
WriteString16(parcel: Pin<&mut Parcel>, val: &str) -> bool69 fn WriteString16(parcel: Pin<&mut Parcel>, val: &str) -> bool;
70
WriteBool(self: Pin<&mut Parcel>, mut value: bool) -> bool71 fn WriteBool(self: Pin<&mut Parcel>, mut value: bool) -> bool;
WriteInt8(self: Pin<&mut Parcel>, mut value: i8) -> bool72 fn WriteInt8(self: Pin<&mut Parcel>, mut value: i8) -> bool;
WriteInt16(self: Pin<&mut Parcel>, mut value: i16) -> bool73 fn WriteInt16(self: Pin<&mut Parcel>, mut value: i16) -> bool;
WriteInt32(self: Pin<&mut Parcel>, mut value: i32) -> bool74 fn WriteInt32(self: Pin<&mut Parcel>, mut value: i32) -> bool;
WriteInt64(self: Pin<&mut Parcel>, mut value: i64) -> bool75 fn WriteInt64(self: Pin<&mut Parcel>, mut value: i64) -> bool;
76
WriteUint8(self: Pin<&mut Parcel>, mut value: u8) -> bool77 fn WriteUint8(self: Pin<&mut Parcel>, mut value: u8) -> bool;
WriteUint16(self: Pin<&mut Parcel>, mut value: u16) -> bool78 fn WriteUint16(self: Pin<&mut Parcel>, mut value: u16) -> bool;
WriteUint32(self: Pin<&mut Parcel>, mut value: u32) -> bool79 fn WriteUint32(self: Pin<&mut Parcel>, mut value: u32) -> bool;
WriteUint64(self: Pin<&mut Parcel>, mut value: u64) -> bool80 fn WriteUint64(self: Pin<&mut Parcel>, mut value: u64) -> bool;
81
WriteFloat(self: Pin<&mut Parcel>, mut value: f32) -> bool82 fn WriteFloat(self: Pin<&mut Parcel>, mut value: f32) -> bool;
WriteDouble(self: Pin<&mut Parcel>, mut value: f64) -> bool83 fn WriteDouble(self: Pin<&mut Parcel>, mut value: f64) -> bool;
WritePointer(self: Pin<&mut Parcel>, mut value: usize) -> bool84 fn WritePointer(self: Pin<&mut Parcel>, mut value: usize) -> bool;
85
ReadBool(self: Pin<&mut Parcel>, v: &mut bool) -> bool86 fn ReadBool(self: Pin<&mut Parcel>, v: &mut bool) -> bool;
ReadInt8(self: Pin<&mut Parcel>, v: &mut i8) -> bool87 fn ReadInt8(self: Pin<&mut Parcel>, v: &mut i8) -> bool;
ReadInt16(self: Pin<&mut Parcel>, v: &mut i16) -> bool88 fn ReadInt16(self: Pin<&mut Parcel>, v: &mut i16) -> bool;
ReadInt32(self: Pin<&mut Parcel>, v: &mut i32) -> bool89 fn ReadInt32(self: Pin<&mut Parcel>, v: &mut i32) -> bool;
ReadInt64(self: Pin<&mut Parcel>, v: &mut i64) -> bool90 fn ReadInt64(self: Pin<&mut Parcel>, v: &mut i64) -> bool;
ReadUint8(self: Pin<&mut Parcel>, v: &mut u8) -> bool91 fn ReadUint8(self: Pin<&mut Parcel>, v: &mut u8) -> bool;
ReadUint16(self: Pin<&mut Parcel>, v: &mut u16) -> bool92 fn ReadUint16(self: Pin<&mut Parcel>, v: &mut u16) -> bool;
ReadUint32(self: Pin<&mut Parcel>, v: &mut u32) -> bool93 fn ReadUint32(self: Pin<&mut Parcel>, v: &mut u32) -> bool;
ReadUint64(self: Pin<&mut Parcel>, v: &mut u64) -> bool94 fn ReadUint64(self: Pin<&mut Parcel>, v: &mut u64) -> bool;
ReadFloat(self: Pin<&mut Parcel>, v: &mut f32) -> bool95 fn ReadFloat(self: Pin<&mut Parcel>, v: &mut f32) -> bool;
ReadDouble(self: Pin<&mut Parcel>, v: &mut f64) -> bool96 fn ReadDouble(self: Pin<&mut Parcel>, v: &mut f64) -> bool;
ReadPointer(self: Pin<&mut Parcel>) -> usize97 fn ReadPointer(self: Pin<&mut Parcel>) -> usize;
98
GetDataSize(self: &Parcel) -> usize99 fn GetDataSize(self: &Parcel) -> usize;
GetWritableBytes(self: &Parcel) -> usize100 fn GetWritableBytes(self: &Parcel) -> usize;
GetReadableBytes(self: &Parcel) -> usize101 fn GetReadableBytes(self: &Parcel) -> usize;
GetOffsetsSize(self: &Parcel) -> usize102 fn GetOffsetsSize(self: &Parcel) -> usize;
GetDataCapacity(self: &Parcel) -> usize103 fn GetDataCapacity(self: &Parcel) -> usize;
GetMaxCapacity(self: &Parcel) -> usize104 fn GetMaxCapacity(self: &Parcel) -> usize;
105
SetDataCapacity(self: Pin<&mut Parcel>, size: usize) -> bool106 fn SetDataCapacity(self: Pin<&mut Parcel>, size: usize) -> bool;
SetDataSize(self: Pin<&mut Parcel>, size: usize) -> bool107 fn SetDataSize(self: Pin<&mut Parcel>, size: usize) -> bool;
SetMaxCapacity(self: Pin<&mut Parcel>, size: usize) -> bool108 fn SetMaxCapacity(self: Pin<&mut Parcel>, size: usize) -> bool;
109
GetReadPosition(self: Pin<&mut Parcel>) -> usize110 fn GetReadPosition(self: Pin<&mut Parcel>) -> usize;
GetWritePosition(self: Pin<&mut Parcel>) -> usize111 fn GetWritePosition(self: Pin<&mut Parcel>) -> usize;
112
SkipBytes(self: Pin<&mut Parcel>, size: usize)113 fn SkipBytes(self: Pin<&mut Parcel>, size: usize);
RewindRead(self: Pin<&mut Parcel>, size: usize) -> bool114 fn RewindRead(self: Pin<&mut Parcel>, size: usize) -> bool;
RewindWrite(self: Pin<&mut Parcel>, size: usize) -> bool115 fn RewindWrite(self: Pin<&mut Parcel>, size: usize) -> bool;
116
ReadUint8Unaligned(self: Pin<&mut Parcel>, val: &mut u8) -> bool117 fn ReadUint8Unaligned(self: Pin<&mut Parcel>, val: &mut u8) -> bool;
118
SetFlags(self: Pin<&mut MessageOption>, flag: i32)119 fn SetFlags(self: Pin<&mut MessageOption>, flag: i32);
GetFlags(self: &MessageOption) -> i32120 fn GetFlags(self: &MessageOption) -> i32;
121
WriteBoolVector(parcel: Pin<&mut Parcel>, val: &[bool]) -> bool122 fn WriteBoolVector(parcel: Pin<&mut Parcel>, val: &[bool]) -> bool;
WriteInt8Vector(parcel: Pin<&mut Parcel>, val: &[i8]) -> bool123 fn WriteInt8Vector(parcel: Pin<&mut Parcel>, val: &[i8]) -> bool;
WriteInt16Vector(parcel: Pin<&mut Parcel>, val: &[i16]) -> bool124 fn WriteInt16Vector(parcel: Pin<&mut Parcel>, val: &[i16]) -> bool;
WriteInt32Vector(parcel: Pin<&mut Parcel>, val: &[i32]) -> bool125 fn WriteInt32Vector(parcel: Pin<&mut Parcel>, val: &[i32]) -> bool;
WriteInt64Vector(parcel: Pin<&mut Parcel>, val: &[i64]) -> bool126 fn WriteInt64Vector(parcel: Pin<&mut Parcel>, val: &[i64]) -> bool;
WriteUInt8Vector(parcel: Pin<&mut Parcel>, val: &[u8]) -> bool127 fn WriteUInt8Vector(parcel: Pin<&mut Parcel>, val: &[u8]) -> bool;
WriteUInt16Vector(parcel: Pin<&mut Parcel>, val: &[u16]) -> bool128 fn WriteUInt16Vector(parcel: Pin<&mut Parcel>, val: &[u16]) -> bool;
WriteUInt32Vector(parcel: Pin<&mut Parcel>, val: &[u32]) -> bool129 fn WriteUInt32Vector(parcel: Pin<&mut Parcel>, val: &[u32]) -> bool;
WriteUInt64Vector(parcel: Pin<&mut Parcel>, val: &[u64]) -> bool130 fn WriteUInt64Vector(parcel: Pin<&mut Parcel>, val: &[u64]) -> bool;
WriteFloatVector(parcel: Pin<&mut Parcel>, val: &[f32]) -> bool131 fn WriteFloatVector(parcel: Pin<&mut Parcel>, val: &[f32]) -> bool;
WriteDoubleVector(parcel: Pin<&mut Parcel>, val: &[f64]) -> bool132 fn WriteDoubleVector(parcel: Pin<&mut Parcel>, val: &[f64]) -> bool;
WriteStringVector(parcel: Pin<&mut Parcel>, val: &[String]) -> bool133 fn WriteStringVector(parcel: Pin<&mut Parcel>, val: &[String]) -> bool;
WriteString16Vector(parcel: Pin<&mut Parcel>, val: &[String]) -> bool134 fn WriteString16Vector(parcel: Pin<&mut Parcel>, val: &[String]) -> bool;
135
ReadBoolVector(parcel: Pin<&mut Parcel>, v: &mut Vec<bool>) -> bool136 fn ReadBoolVector(parcel: Pin<&mut Parcel>, v: &mut Vec<bool>) -> bool;
ReadInt8Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i8>) -> bool137 fn ReadInt8Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i8>) -> bool;
ReadInt16Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i16>) -> bool138 fn ReadInt16Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i16>) -> bool;
ReadInt32Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i32>) -> bool139 fn ReadInt32Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i32>) -> bool;
ReadInt64Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i64>) -> bool140 fn ReadInt64Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<i64>) -> bool;
ReadUInt8Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u8>) -> bool141 fn ReadUInt8Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u8>) -> bool;
ReadUInt16Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u16>) -> bool142 fn ReadUInt16Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u16>) -> bool;
ReadUInt32Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u32>) -> bool143 fn ReadUInt32Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u32>) -> bool;
ReadUInt64Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u64>) -> bool144 fn ReadUInt64Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<u64>) -> bool;
ReadFloatVector(parcel: Pin<&mut Parcel>, v: &mut Vec<f32>) -> bool145 fn ReadFloatVector(parcel: Pin<&mut Parcel>, v: &mut Vec<f32>) -> bool;
ReadDoubleVector(parcel: Pin<&mut Parcel>, v: &mut Vec<f64>) -> bool146 fn ReadDoubleVector(parcel: Pin<&mut Parcel>, v: &mut Vec<f64>) -> bool;
ReadStringVector(parcel: Pin<&mut Parcel>, v: &mut Vec<String>) -> bool147 fn ReadStringVector(parcel: Pin<&mut Parcel>, v: &mut Vec<String>) -> bool;
ReadString16Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<String>) -> bool148 fn ReadString16Vector(parcel: Pin<&mut Parcel>, v: &mut Vec<String>) -> bool;
149 }
150 }
151
get_pad_size(size: usize) -> usize152 pub(crate) fn get_pad_size(size: usize) -> usize {
153 const SIZE_OFFSET: usize = 3;
154 (((size + SIZE_OFFSET) & (!SIZE_OFFSET)) - size)
155 }
156
157 trait Process: Sized {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool158 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool;
159
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>160 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>;
161
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool162 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool;
163
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>164 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>;
165 }
166
167 impl Process for bool {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool168 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
169 parcel.WriteBool(*self)
170 }
171
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>172 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
173 let mut v = Self::default();
174 match parcel.ReadBool(&mut v) {
175 true => Ok(v),
176 false => Err(IpcStatusCode::Failed),
177 }
178 }
179
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool180 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
181 WriteBoolVector(parcel, val)
182 }
183
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>184 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
185 let mut v = vec![];
186 match ReadBoolVector(parcel, &mut v) {
187 true => Ok(v),
188 false => Err(IpcStatusCode::Failed),
189 }
190 }
191 }
192
193 impl Process for i8 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool194 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
195 parcel.WriteInt8(*self)
196 }
197
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>198 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
199 let mut v = Self::default();
200 match parcel.ReadInt8(&mut v) {
201 true => Ok(v),
202 false => Err(IpcStatusCode::Failed),
203 }
204 }
205
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool206 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
207 WriteInt8Vector(parcel, val)
208 }
209
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>210 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
211 let mut v = vec![];
212 match ReadInt8Vector(parcel, &mut v) {
213 true => Ok(v),
214 false => Err(IpcStatusCode::Failed),
215 }
216 }
217 }
218
219 impl Process for i16 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool220 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
221 parcel.WriteInt16(*self)
222 }
223
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>224 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
225 let mut v = Self::default();
226 match parcel.ReadInt16(&mut v) {
227 true => Ok(v),
228 false => Err(IpcStatusCode::Failed),
229 }
230 }
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool231 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
232 WriteInt16Vector(parcel, val)
233 }
234
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>235 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
236 let mut v = vec![];
237 match ReadInt16Vector(parcel, &mut v) {
238 true => Ok(v),
239 false => Err(IpcStatusCode::Failed),
240 }
241 }
242 }
243
244 impl Process for i32 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool245 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
246 parcel.WriteInt32(*self)
247 }
248
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>249 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
250 let mut v = Self::default();
251 match parcel.ReadInt32(&mut v) {
252 true => Ok(v),
253 false => Err(IpcStatusCode::Failed),
254 }
255 }
256
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool257 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
258 WriteInt32Vector(parcel, val)
259 }
260
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>261 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
262 let mut v = vec![];
263 match ReadInt32Vector(parcel, &mut v) {
264 true => Ok(v),
265 false => Err(IpcStatusCode::Failed),
266 }
267 }
268 }
269
270 impl Process for i64 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool271 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
272 parcel.WriteInt64(*self)
273 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>274 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
275 let mut v = Self::default();
276 match parcel.ReadInt64(&mut v) {
277 true => Ok(v),
278 false => Err(IpcStatusCode::Failed),
279 }
280 }
281
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool282 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
283 WriteInt64Vector(parcel, val)
284 }
285
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>286 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
287 let mut v = vec![];
288 match ReadInt64Vector(parcel, &mut v) {
289 true => Ok(v),
290 false => Err(IpcStatusCode::Failed),
291 }
292 }
293 }
294
295 impl Process for u8 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool296 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
297 parcel.WriteUint8(*self)
298 }
299
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>300 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
301 let mut v = Self::default();
302 match parcel.ReadUint8(&mut v) {
303 true => Ok(v),
304 false => Err(IpcStatusCode::Failed),
305 }
306 }
307
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool308 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
309 WriteUInt8Vector(parcel, val)
310 }
311
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>312 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
313 let mut v = vec![];
314 match ReadUInt8Vector(parcel, &mut v) {
315 true => Ok(v),
316 false => Err(IpcStatusCode::Failed),
317 }
318 }
319 }
320
321 impl Process for u16 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool322 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
323 parcel.WriteUint16(*self)
324 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>325 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
326 let mut v = Self::default();
327 match parcel.ReadUint16(&mut v) {
328 true => Ok(v),
329 false => Err(IpcStatusCode::Failed),
330 }
331 }
332
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool333 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
334 WriteUInt16Vector(parcel, val)
335 }
336
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>337 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
338 let mut v = vec![];
339 match ReadUInt16Vector(parcel, &mut v) {
340 true => Ok(v),
341 false => Err(IpcStatusCode::Failed),
342 }
343 }
344 }
345
346 impl Process for u32 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool347 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
348 parcel.WriteUint32(*self)
349 }
350
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>351 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
352 let mut v = Self::default();
353 match parcel.ReadUint32(&mut v) {
354 true => Ok(v),
355 false => Err(IpcStatusCode::Failed),
356 }
357 }
358
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool359 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
360 WriteUInt32Vector(parcel, val)
361 }
362
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>363 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
364 let mut v = vec![];
365 match ReadUInt32Vector(parcel, &mut v) {
366 true => Ok(v),
367 false => Err(IpcStatusCode::Failed),
368 }
369 }
370 }
371
372 impl Process for u64 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool373 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
374 parcel.WriteUint64(*self)
375 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>376 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
377 let mut v = Self::default();
378 match parcel.ReadUint64(&mut v) {
379 true => Ok(v),
380 false => Err(IpcStatusCode::Failed),
381 }
382 }
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool383 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
384 WriteUInt64Vector(parcel, val)
385 }
386
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>387 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
388 let mut v = vec![];
389 match ReadUInt64Vector(parcel, &mut v) {
390 true => Ok(v),
391 false => Err(IpcStatusCode::Failed),
392 }
393 }
394 }
395 #[cfg(target_pointer_width = "64")]
396 impl Process for usize {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool397 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
398 parcel.WriteUint64(*self as u64)
399 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>400 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
401 let mut v: u64 = u64::default();
402 match parcel.ReadUint64(&mut v) {
403 true => Ok(v as usize),
404 false => Err(IpcStatusCode::Failed),
405 }
406 }
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool407 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
408 let v: Vec<u64> = val.iter().map(|i| *i as u64).collect();
409 WriteUInt64Vector(parcel, &v[..])
410 }
411
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>412 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
413 let mut v = vec![];
414 match ReadUInt64Vector(parcel, &mut v) {
415 true => Ok(v.into_iter().map(|i| i as usize).collect()),
416 false => Err(IpcStatusCode::Failed),
417 }
418 }
419 }
420
421 #[cfg(target_pointer_width = "32")]
422 impl Process for usize {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool423 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
424 parcel.WriteUint32(*self as u32)
425 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>426 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
427 let mut v: u32 = u32::default();
428 match parcel.ReadUint32(&mut v) {
429 true => Ok(v as usize),
430 false => Err(IpcStatusCode::Failed),
431 }
432 }
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool433 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
434 let v: Vec<u32> = val.iter().map(|i| *i as u32).collect();
435 WriteUInt32Vector(parcel, &v[..])
436 }
437
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>438 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
439 let mut v = vec![];
440 match ReadUInt32Vector(parcel, &mut v) {
441 true => Ok(v.into_iter().map(|i| i as usize).collect()),
442 false => Err(IpcStatusCode::Failed),
443 }
444 }
445 }
446
447 impl Process for f32 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool448 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
449 parcel.WriteFloat(*self)
450 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>451 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
452 let mut v = Self::default();
453 match parcel.ReadFloat(&mut v) {
454 true => Ok(v),
455 false => Err(IpcStatusCode::Failed),
456 }
457 }
458
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool459 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
460 WriteFloatVector(parcel, val)
461 }
462
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>463 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
464 let mut v = vec![];
465 match ReadFloatVector(parcel, &mut v) {
466 true => Ok(v),
467 false => Err(IpcStatusCode::Failed),
468 }
469 }
470 }
471
472 impl Process for f64 {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool473 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
474 parcel.WriteDouble(*self)
475 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>476 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
477 let mut v = Self::default();
478 match parcel.ReadDouble(&mut v) {
479 true => Ok(v),
480 false => Err(IpcStatusCode::Failed),
481 }
482 }
483
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool484 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
485 WriteDoubleVector(parcel, val)
486 }
487
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>488 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
489 let mut v = vec![];
490 match ReadDoubleVector(parcel, &mut v) {
491 true => Ok(v),
492 false => Err(IpcStatusCode::Failed),
493 }
494 }
495 }
496
497 impl Process for String {
write_process(&self, parcel: Pin<&mut Parcel>) -> bool498 fn write_process(&self, parcel: Pin<&mut Parcel>) -> bool {
499 WriteString(parcel, self.as_str())
500 }
read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self>501 fn read_process(parcel: Pin<&mut Parcel>) -> IpcResult<Self> {
502 let mut s = String::new();
503 match ReadString(parcel, &mut s) {
504 true => Ok(s),
505 false => Err(IpcStatusCode::Failed),
506 }
507 }
508
write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool509 fn write_process_vec(val: &[Self], parcel: Pin<&mut Parcel>) -> bool {
510 WriteStringVector(parcel, val)
511 }
512
read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>>513 fn read_process_vec(parcel: Pin<&mut Parcel>) -> IpcResult<Vec<Self>> {
514 let mut v = vec![];
515 match ReadStringVector(parcel, &mut v) {
516 true => Ok(v),
517 false => Err(IpcStatusCode::Failed),
518 }
519 }
520 }
521
522 impl<T: Process> Serialize for T {
serialize(&self, parcel: &mut MsgParcel) -> IpcResult<()>523 fn serialize(&self, parcel: &mut MsgParcel) -> IpcResult<()> {
524 fn write<T: Process>(parcel: Pin<&mut MessageParcel>, value: &T) -> bool {
525 unsafe {
526 let parcel = AsParcelMut(parcel);
527 value.write_process(Pin::new_unchecked(&mut *parcel))
528 }
529 }
530 parcel.write_process(self, write)
531 }
532 }
533
534 impl<T: Process> Deserialize for T {
deserialize(parcel: &mut MsgParcel) -> IpcResult<T>535 fn deserialize(parcel: &mut MsgParcel) -> IpcResult<T> {
536 fn read<T: Process>(parcel: Pin<&mut MessageParcel>) -> IpcResult<T> {
537 unsafe {
538 let parcel = AsParcelMut(parcel);
539 Process::read_process(Pin::new_unchecked(&mut *parcel))
540 }
541 }
542 parcel.read_process(read)
543 }
544 }
545
546 impl Serialize for str {
serialize(&self, parcel: &mut MsgParcel) -> crate::IpcResult<()>547 fn serialize(&self, parcel: &mut MsgParcel) -> crate::IpcResult<()> {
548 fn write(parcel: Pin<&mut MessageParcel>, value: &str) -> bool {
549 unsafe {
550 let parcel = AsParcelMut(parcel);
551 WriteString(Pin::new_unchecked(&mut *parcel), value)
552 }
553 }
554 parcel.write_process(self, write)
555 }
556 }
557
558 impl<T: Process> Serialize for [T] {
serialize(&self, parcel: &mut MsgParcel) -> IpcResult<()>559 fn serialize(&self, parcel: &mut MsgParcel) -> IpcResult<()> {
560 match T::write_process_vec(self, parcel.as_parcel_mut()) {
561 true => Ok(()),
562 false => Err(IpcStatusCode::Failed),
563 }
564 }
565 }
566
567 impl<T: Process> Deserialize for Vec<T> {
deserialize(parcel: &mut MsgParcel) -> IpcResult<Self>568 fn deserialize(parcel: &mut MsgParcel) -> IpcResult<Self> {
569 T::read_process_vec(parcel.as_parcel_mut())
570 }
571 }
572
573 impl<T: Process> Serialize for Vec<T> {
serialize(&self, parcel: &mut MsgParcel) -> crate::IpcResult<()>574 fn serialize(&self, parcel: &mut MsgParcel) -> crate::IpcResult<()> {
575 <[T]>::serialize(self, parcel)
576 }
577 }
578
579 #[cfg(test)]
580 mod test {
581 use std::fs;
582 use std::io::{Read, Seek, Write};
583
584 use crate::parcel::MsgParcel;
585
586 /// UT test cases for `MsgParcel`
587 ///
588 /// # Brief
589 /// 1. Create a MsgParcel
590 /// 2. Write a value to the MsgParcel and then read it out, check the
591 /// correctness.
592 /// 3. Check other types.
593 #[test]
primitive()594 fn primitive() {
595 let mut msg = MsgParcel::new();
596
597 msg.write_interface_token("test");
598 assert_eq!(msg.read_interface_token().unwrap(), "test");
599
600 msg.write_buffer("test".as_bytes());
601 assert_eq!(msg.read_buffer(msg.readable()).unwrap(), "test".as_bytes());
602
603 msg.write(&true).unwrap();
604 assert!(msg.read::<bool>().unwrap());
605
606 msg.write(&false).unwrap();
607 assert!(!msg.read::<bool>().unwrap());
608
609 msg.write(&i8::MAX).unwrap();
610 assert_eq!(i8::MAX, msg.read().unwrap());
611 msg.write(&i8::MIN).unwrap();
612 assert_eq!(i8::MIN, msg.read().unwrap());
613
614 msg.write(&i16::MAX).unwrap();
615 assert_eq!(i16::MAX, msg.read().unwrap());
616 msg.write(&i16::MIN).unwrap();
617 assert_eq!(i16::MIN, msg.read().unwrap());
618
619 msg.write(&i32::MAX).unwrap();
620 assert_eq!(i32::MAX, msg.read().unwrap());
621 msg.write(&i32::MIN).unwrap();
622 assert_eq!(i32::MIN, msg.read().unwrap());
623
624 msg.write(&i64::MAX).unwrap();
625 assert_eq!(i64::MAX, msg.read().unwrap());
626 msg.write(&i64::MIN).unwrap();
627 assert_eq!(i64::MIN, msg.read().unwrap());
628
629 msg.write(&u8::MAX).unwrap();
630 assert_eq!(u8::MAX, msg.read().unwrap());
631 msg.write(&u8::MIN).unwrap();
632 assert_eq!(u8::MIN, msg.read().unwrap());
633
634 msg.write(&u16::MAX).unwrap();
635 assert_eq!(u16::MAX, msg.read().unwrap());
636 msg.write(&u16::MIN).unwrap();
637 assert_eq!(u16::MIN, msg.read().unwrap());
638
639 msg.write(&u32::MAX).unwrap();
640 assert_eq!(u32::MAX, msg.read().unwrap());
641 msg.write(&u32::MIN).unwrap();
642 assert_eq!(u32::MIN, msg.read().unwrap());
643
644 msg.write(&u64::MAX).unwrap();
645 assert_eq!(u64::MAX, msg.read().unwrap());
646 msg.write(&u64::MIN).unwrap();
647 assert_eq!(u64::MIN, msg.read().unwrap());
648
649 msg.write(&usize::MAX).unwrap();
650 assert_eq!(usize::MAX, msg.read().unwrap());
651 msg.write(&usize::MIN).unwrap();
652 assert_eq!(usize::MIN, msg.read().unwrap());
653 }
654
655 #[test]
string()656 fn string() {
657 let mut msg = MsgParcel::new();
658 msg.write("hello ipc").unwrap();
659 assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
660
661 let s = String::from("hello ipc");
662 msg.write(&s).unwrap();
663 assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
664
665 let v = vec![1];
666 msg.write(&v).unwrap();
667 assert_eq!(vec![1], msg.read::<Vec<i32>>().unwrap());
668
669 let s = String::from("ipc hello");
670 let v = vec![s.clone(), s.clone(), s.clone(), s];
671 msg.write(&v).unwrap();
672 assert_eq!(v, msg.read::<Vec<String>>().unwrap());
673
674 msg.write("hello ipc").unwrap();
675 let s = String::from("hello ipc");
676 msg.write(&s).unwrap();
677 let v = vec![1];
678 msg.write(&v).unwrap();
679 let s = String::from("ipc hello");
680 let v = vec![s.clone(), s.clone(), s.clone(), s];
681 msg.write(&v).unwrap();
682 assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
683 assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
684 assert_eq!(vec![1], msg.read::<Vec<i32>>().unwrap());
685 assert_eq!(v, msg.read::<Vec<String>>().unwrap());
686 }
687
688 /// UT test cases for `MsgParcel`
689 ///
690 /// # Brief
691 /// 1. Create a MsgParcel
692 /// 2. Write a bunch of value to the MsgParcel and then read them out, check
693 /// the correctness.
694 #[test]
primitive_bunch()695 fn primitive_bunch() {
696 let mut msg = MsgParcel::new();
697 msg.write(&true).unwrap();
698 msg.write(&false).unwrap();
699 msg.write(&i8::MAX).unwrap();
700 msg.write(&i8::MIN).unwrap();
701 msg.write(&i16::MAX).unwrap();
702 msg.write(&i16::MIN).unwrap();
703 msg.write(&i32::MAX).unwrap();
704 msg.write(&i32::MIN).unwrap();
705 msg.write(&i64::MAX).unwrap();
706 msg.write(&i64::MIN).unwrap();
707 msg.write(&u8::MAX).unwrap();
708 msg.write(&u8::MIN).unwrap();
709
710 msg.write(&u16::MAX).unwrap();
711 msg.write(&u16::MIN).unwrap();
712 msg.write(&u32::MAX).unwrap();
713 msg.write(&u32::MIN).unwrap();
714 msg.write(&u64::MAX).unwrap();
715 msg.write(&u64::MIN).unwrap();
716 msg.write(&usize::MAX).unwrap();
717 msg.write(&usize::MIN).unwrap();
718
719 assert!(msg.read::<bool>().unwrap());
720 assert!(!msg.read::<bool>().unwrap());
721 assert_eq!(i8::MAX, msg.read().unwrap());
722 assert_eq!(i8::MIN, msg.read().unwrap());
723
724 assert_eq!(i16::MAX, msg.read().unwrap());
725 assert_eq!(i16::MIN, msg.read().unwrap());
726 assert_eq!(i32::MAX, msg.read().unwrap());
727 assert_eq!(i32::MIN, msg.read().unwrap());
728 assert_eq!(i64::MAX, msg.read().unwrap());
729 assert_eq!(i64::MIN, msg.read().unwrap());
730 assert_eq!(u8::MAX, msg.read().unwrap());
731 assert_eq!(u8::MIN, msg.read().unwrap());
732
733 assert_eq!(u16::MAX, msg.read().unwrap());
734 assert_eq!(u16::MIN, msg.read().unwrap());
735 assert_eq!(u32::MAX, msg.read().unwrap());
736 assert_eq!(u32::MIN, msg.read().unwrap());
737 assert_eq!(u64::MAX, msg.read().unwrap());
738 assert_eq!(u64::MIN, msg.read().unwrap());
739 assert_eq!(usize::MAX, msg.read().unwrap());
740 assert_eq!(usize::MIN, msg.read().unwrap());
741 }
742
743 /// UT test cases for `MsgParcel`
744 ///
745 /// # Brief
746 /// 1. Create a MsgParcel
747 /// 2. Write interface to the MsgParcel and then read them out, check the
748 /// correctness.
749 #[test]
interface()750 fn interface() {
751 let mut msg = MsgParcel::new();
752 msg.write_interface_token("test token").unwrap();
753 assert_eq!("test token", msg.read_interface_token().unwrap());
754 }
755
756 /// UT test cases for `MsgParcel`
757 ///
758 /// # Brief
759 /// 1. Create a MsgParcel
760 /// 2. Write a file descriptor to the MsgParcel and then read them out,
761 /// check the correctness.
762 #[test]
file_descriptor()763 fn file_descriptor() {
764 let mut msg = MsgParcel::new();
765
766 let mut file = std::fs::OpenOptions::new()
767 .read(true)
768 .write(true)
769 .create(true)
770 .truncate(true)
771 .open("ipc_rust_test_temp0")
772 .unwrap();
773 file.write_all(b"hello world").unwrap();
774 file.sync_all().unwrap();
775
776 msg.write_file(file).unwrap();
777 let mut f = msg.read_file().unwrap();
778 let mut buf = String::new();
779 f.rewind().unwrap();
780 f.read_to_string(&mut buf).unwrap();
781 fs::remove_file("ipc_rust_test_temp0").unwrap();
782 assert_eq!("hello world", buf);
783 }
784
785 /// UT test cases for `MsgParcel`
786 ///
787 /// # Brief
788 /// 1. Create a MsgParcel
789 /// 2. Write a i32 value to the MsgParcel in different position and then
790 /// read them out, check the correctness.
791 #[test]
position()792 fn position() {
793 let mut msg = MsgParcel::new();
794 assert_eq!(0, msg.write_position());
795 assert_eq!(0, msg.read_position());
796
797 msg.set_write_position(4).unwrap_err();
798 msg.set_read_position(4).unwrap_err();
799
800 msg.write(&1).unwrap();
801 msg.write(&2).unwrap();
802 assert_eq!(msg.size(), 8);
803
804 msg.set_capacity(4).unwrap_err();
805 msg.set_size(msg.capacity() + 1).unwrap_err();
806
807 msg.set_read_position(4).unwrap();
808 assert_eq!(2, msg.read().unwrap());
809
810 msg.set_write_position(0).unwrap();
811 msg.write(&2).unwrap();
812
813 assert_eq!(4, msg.size());
814
815 msg.set_read_position(0).unwrap();
816 assert_eq!(2, msg.read().unwrap());
817 msg.write(&1).unwrap();
818 msg.write(&2).unwrap();
819
820 assert_eq!(8, msg.readable() as u32);
821
822 msg.skip_read(4);
823 assert_eq!(2, msg.read().unwrap());
824 }
825 }
826