• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2024-2025 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     const TEST_STR_LEN: i32 = 2;
587     const TEST_INVALID_CHARACTER: i32 = 0xFFFF;
588 
589     /// UT test cases for `MsgParcel`
590     ///
591     /// # Brief
592     /// 1. Create a MsgParcel
593     /// 2. Write a value to the MsgParcel and then read it out, check the
594     ///    correctness.
595     /// 3. Check other types.
596     #[test]
primitive()597     fn primitive() {
598         let mut msg = MsgParcel::new();
599 
600         msg.write_interface_token("test");
601         assert_eq!(msg.read_interface_token().unwrap(), "test");
602 
603         msg.write_buffer("test".as_bytes());
604         assert_eq!(msg.read_buffer(msg.readable()).unwrap(), "test".as_bytes());
605 
606         msg.write(&true).unwrap();
607         assert!(msg.read::<bool>().unwrap());
608 
609         msg.write(&false).unwrap();
610         assert!(!msg.read::<bool>().unwrap());
611 
612         msg.write(&i8::MAX).unwrap();
613         assert_eq!(i8::MAX, msg.read().unwrap());
614         msg.write(&i8::MIN).unwrap();
615         assert_eq!(i8::MIN, msg.read().unwrap());
616 
617         msg.write(&i16::MAX).unwrap();
618         assert_eq!(i16::MAX, msg.read().unwrap());
619         msg.write(&i16::MIN).unwrap();
620         assert_eq!(i16::MIN, msg.read().unwrap());
621 
622         msg.write(&i32::MAX).unwrap();
623         assert_eq!(i32::MAX, msg.read().unwrap());
624         msg.write(&i32::MIN).unwrap();
625         assert_eq!(i32::MIN, msg.read().unwrap());
626 
627         msg.write(&i64::MAX).unwrap();
628         assert_eq!(i64::MAX, msg.read().unwrap());
629         msg.write(&i64::MIN).unwrap();
630         assert_eq!(i64::MIN, msg.read().unwrap());
631 
632         msg.write(&u8::MAX).unwrap();
633         assert_eq!(u8::MAX, msg.read().unwrap());
634         msg.write(&u8::MIN).unwrap();
635         assert_eq!(u8::MIN, msg.read().unwrap());
636 
637         msg.write(&u16::MAX).unwrap();
638         assert_eq!(u16::MAX, msg.read().unwrap());
639         msg.write(&u16::MIN).unwrap();
640         assert_eq!(u16::MIN, msg.read().unwrap());
641 
642         msg.write(&u32::MAX).unwrap();
643         assert_eq!(u32::MAX, msg.read().unwrap());
644         msg.write(&u32::MIN).unwrap();
645         assert_eq!(u32::MIN, msg.read().unwrap());
646 
647         msg.write(&u64::MAX).unwrap();
648         assert_eq!(u64::MAX, msg.read().unwrap());
649         msg.write(&u64::MIN).unwrap();
650         assert_eq!(u64::MIN, msg.read().unwrap());
651 
652         msg.write(&usize::MAX).unwrap();
653         assert_eq!(usize::MAX, msg.read().unwrap());
654         msg.write(&usize::MIN).unwrap();
655         assert_eq!(usize::MIN, msg.read().unwrap());
656     }
657 
658     #[test]
string()659     fn string() {
660         let mut msg = MsgParcel::new();
661         msg.write("hello ipc").unwrap();
662         assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
663 
664         let s = String::from("hello ipc");
665         msg.write(&s).unwrap();
666         assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
667 
668         let v = vec![1];
669         msg.write(&v).unwrap();
670         assert_eq!(vec![1], msg.read::<Vec<i32>>().unwrap());
671 
672         let s = String::from("ipc hello");
673         let v = vec![s.clone(), s.clone(), s.clone(), s];
674         msg.write(&v).unwrap();
675         assert_eq!(v, msg.read::<Vec<String>>().unwrap());
676 
677         msg.write("hello ipc").unwrap();
678         let s = String::from("hello ipc");
679         msg.write(&s).unwrap();
680         let v = vec![1];
681         msg.write(&v).unwrap();
682         let s = String::from("ipc hello");
683         let v = vec![s.clone(), s.clone(), s.clone(), s];
684         msg.write(&v).unwrap();
685         assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
686         assert_eq!(String::from("hello ipc"), msg.read::<String>().unwrap());
687         assert_eq!(vec![1], msg.read::<Vec<i32>>().unwrap());
688         assert_eq!(v, msg.read::<Vec<String>>().unwrap());
689     }
690 
691     /// UT test cases for `MsgParcel`
692     ///
693     /// # Brief
694     /// 1. Create a MsgParcel
695     /// 2. Write a bunch of value to the MsgParcel and then read them out, check
696     ///    the correctness.
697     #[test]
primitive_bunch()698     fn primitive_bunch() {
699         let mut msg = MsgParcel::new();
700         msg.write(&true).unwrap();
701         msg.write(&false).unwrap();
702         msg.write(&i8::MAX).unwrap();
703         msg.write(&i8::MIN).unwrap();
704         msg.write(&i16::MAX).unwrap();
705         msg.write(&i16::MIN).unwrap();
706         msg.write(&i32::MAX).unwrap();
707         msg.write(&i32::MIN).unwrap();
708         msg.write(&i64::MAX).unwrap();
709         msg.write(&i64::MIN).unwrap();
710         msg.write(&u8::MAX).unwrap();
711         msg.write(&u8::MIN).unwrap();
712 
713         msg.write(&u16::MAX).unwrap();
714         msg.write(&u16::MIN).unwrap();
715         msg.write(&u32::MAX).unwrap();
716         msg.write(&u32::MIN).unwrap();
717         msg.write(&u64::MAX).unwrap();
718         msg.write(&u64::MIN).unwrap();
719         msg.write(&usize::MAX).unwrap();
720         msg.write(&usize::MIN).unwrap();
721 
722         assert!(msg.read::<bool>().unwrap());
723         assert!(!msg.read::<bool>().unwrap());
724         assert_eq!(i8::MAX, msg.read().unwrap());
725         assert_eq!(i8::MIN, msg.read().unwrap());
726 
727         assert_eq!(i16::MAX, msg.read().unwrap());
728         assert_eq!(i16::MIN, msg.read().unwrap());
729         assert_eq!(i32::MAX, msg.read().unwrap());
730         assert_eq!(i32::MIN, msg.read().unwrap());
731         assert_eq!(i64::MAX, msg.read().unwrap());
732         assert_eq!(i64::MIN, msg.read().unwrap());
733         assert_eq!(u8::MAX, msg.read().unwrap());
734         assert_eq!(u8::MIN, msg.read().unwrap());
735 
736         assert_eq!(u16::MAX, msg.read().unwrap());
737         assert_eq!(u16::MIN, msg.read().unwrap());
738         assert_eq!(u32::MAX, msg.read().unwrap());
739         assert_eq!(u32::MIN, msg.read().unwrap());
740         assert_eq!(u64::MAX, msg.read().unwrap());
741         assert_eq!(u64::MIN, msg.read().unwrap());
742         assert_eq!(usize::MAX, msg.read().unwrap());
743         assert_eq!(usize::MIN, msg.read().unwrap());
744     }
745 
746     /// UT test cases for `MsgParcel`
747     ///
748     /// # Brief
749     /// 1. Create a MsgParcel
750     /// 2. Write interface to the MsgParcel and then read them out, check the
751     ///    correctness.
752     #[test]
interface()753     fn interface() {
754         let mut msg = MsgParcel::new();
755         msg.write_interface_token("test token").unwrap();
756         assert_eq!("test token", msg.read_interface_token().unwrap());
757     }
758 
759     /// UT test cases for `MsgParcel`
760     ///
761     /// # Brief
762     /// 1. Create a MsgParcel
763     /// 2. Write a file descriptor to the MsgParcel and then read them out,
764     ///    check the correctness.
765     #[test]
file_descriptor()766     fn file_descriptor() {
767         let mut msg = MsgParcel::new();
768 
769         let mut file = std::fs::OpenOptions::new()
770             .read(true)
771             .write(true)
772             .create(true)
773             .truncate(true)
774             .open("ipc_rust_test_temp0")
775             .unwrap();
776         file.write_all(b"hello world").unwrap();
777         file.sync_all().unwrap();
778 
779         msg.write_file(file).unwrap();
780         let mut f = msg.read_file().unwrap();
781         let mut buf = String::new();
782         f.rewind().unwrap();
783         f.read_to_string(&mut buf).unwrap();
784         fs::remove_file("ipc_rust_test_temp0").unwrap();
785         assert_eq!("hello world", buf);
786     }
787 
788     /// UT test cases for `MsgParcel`
789     ///
790     /// # Brief
791     /// 1. Create a MsgParcel
792     /// 2. Write a i32 value to the MsgParcel in different position and then
793     ///    read them out, check the correctness.
794     #[test]
position()795     fn position() {
796         let mut msg = MsgParcel::new();
797         assert_eq!(0, msg.write_position());
798         assert_eq!(0, msg.read_position());
799 
800         msg.set_write_position(4).unwrap_err();
801         msg.set_read_position(4).unwrap_err();
802 
803         msg.write(&1).unwrap();
804         msg.write(&2).unwrap();
805         assert_eq!(msg.size(), 8);
806 
807         msg.set_capacity(4).unwrap_err();
808         msg.set_size(msg.capacity() + 1).unwrap_err();
809 
810         msg.set_read_position(4).unwrap();
811         assert_eq!(2, msg.read().unwrap());
812 
813         msg.set_write_position(0).unwrap();
814         msg.write(&2).unwrap();
815 
816         assert_eq!(4, msg.size());
817 
818         msg.set_read_position(0).unwrap();
819         assert_eq!(2, msg.read().unwrap());
820         msg.write(&1).unwrap();
821         msg.write(&2).unwrap();
822 
823         assert_eq!(8, msg.readable() as u32);
824 
825         msg.skip_read(4);
826         assert_eq!(2, msg.read().unwrap());
827     }
828 
829     /// UT test cases for `MsgParcel`
830     ///
831     /// # Brief
832     /// 1. Create a MsgParcel
833     /// 2. Write invalid UTF-8 data to the MsgParcel, and expected read failure.
834     #[test]
invalid_string()835     fn invalid_string() {
836         let mut msg = MsgParcel::new();
837 
838         msg.write(&TEST_STR_LEN).unwrap();
839         msg.write(&TEST_INVALID_CHARACTER).unwrap();
840         msg.write("B").unwrap();
841 
842         // Read a string containing invalid UTF-8 data and expected read failure.
843         let result = msg.read::<String>();
844         let value = match result {
845             Ok(val) => val,
846             Err(..) => String::from("Failed to read")
847         };
848         assert_eq!(value, "Failed to read");
849     }
850 }
851