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