pub struct Parcel { /* private fields */ }
Expand description
Represents a binder serializable parcel
Implementations§
Source§impl Parcel
impl Parcel
Sourcepub fn empty() -> Self
pub fn empty() -> Self
Create a new empty parcel.
Examples found in repository?
4fn main() {
5 let mut service_manager = &mut ServiceManager::new();
6
7 let mut package_manager = service_manager.get_service("myservice", "com.example.IMyService");
8
9 let mut parcel = Parcel::empty();
10 parcel.write_str16("Hello World");
11 let mut res = package_manager.call(1, &mut parcel);
12 println!("response: {:?}", res.read_str16());
13
14 let mut parcel = Parcel::empty();
15 parcel.write_str16("/data/local/tmp/testfile");
16 let mut res = package_manager.call(2, &mut parcel);
17 let fd = res.read_file_descriptor();
18 unsafe {
19 nix::libc::write(fd, "Hello world".as_ptr() as *const std::ffi::c_void, 11);
20 }
21}
More examples
23 fn process_request(&self, code: u32, data: &mut Parcel) -> Parcel {
24 println!("Got command: {} -> {:?}", code, MyServiceCommands::from_u32(code));
25 match MyServiceCommands::from_u32(code).unwrap() {
26 MyServiceCommands::GetFile => {
27 let filename = &std::ffi::CString::new(data.read_str16()).unwrap();
28 let fd = unsafe { open(filename.as_ptr(), O_RDWR | O_CREAT) };
29 println!("filename: {:?}, fd: {}", filename, fd);
30 let mut parcel = Parcel::empty();
31 parcel.write_u32(0);
32 parcel.write_file_descriptor(fd, false);
33 parcel
34 },
35 MyServiceCommands::Echo => {
36 let mut parcel = Parcel::empty();
37 parcel.write_u32(0); //status
38 parcel.write_str16(&data.read_str16());
39 parcel
40 }
41 }
42 }
Sourcepub fn from_slice(data: &[u8]) -> Self
pub fn from_slice(data: &[u8]) -> Self
Create a new empty parcel, with a reserved size
pub fn from_data_and_offsets( data: *mut u8, data_size: usize, offsets: *mut usize, offsets_size: usize, ) -> Self
pub fn reset(&mut self)
pub fn position(&self) -> u64
pub fn set_position(&mut self, pos: u64)
Sourcepub fn append_parcel(&mut self, other: &mut Parcel)
pub fn append_parcel(&mut self, other: &mut Parcel)
Append the contents of another parcel to this parcel
Sourcepub fn as_mut_ptr(&mut self) -> *mut u8
pub fn as_mut_ptr(&mut self) -> *mut u8
Retrieve the data of the parcel as a mutable pointer
Sourcepub fn offsets_len(&self) -> usize
pub fn offsets_len(&self) -> usize
Retrieve the number of object offsets
Sourcepub fn has_unread_data(&self) -> bool
pub fn has_unread_data(&self) -> bool
Check if the parcel has unread data
Sourcepub fn write_u32(&mut self, data: u32)
pub fn write_u32(&mut self, data: u32)
Write an u32 to the parcel
Examples found in repository?
23 fn process_request(&self, code: u32, data: &mut Parcel) -> Parcel {
24 println!("Got command: {} -> {:?}", code, MyServiceCommands::from_u32(code));
25 match MyServiceCommands::from_u32(code).unwrap() {
26 MyServiceCommands::GetFile => {
27 let filename = &std::ffi::CString::new(data.read_str16()).unwrap();
28 let fd = unsafe { open(filename.as_ptr(), O_RDWR | O_CREAT) };
29 println!("filename: {:?}, fd: {}", filename, fd);
30 let mut parcel = Parcel::empty();
31 parcel.write_u32(0);
32 parcel.write_file_descriptor(fd, false);
33 parcel
34 },
35 MyServiceCommands::Echo => {
36 let mut parcel = Parcel::empty();
37 parcel.write_u32(0); //status
38 parcel.write_str16(&data.read_str16());
39 parcel
40 }
41 }
42 }
Sourcepub fn write_bool(&mut self, data: bool)
pub fn write_bool(&mut self, data: bool)
Write a bool to the parcel
Sourcepub fn write_transaction_data(&mut self, data: &BinderTransactionData)
pub fn write_transaction_data(&mut self, data: &BinderTransactionData)
Write a BinderTransactionData struct into the parcel
Sourcepub fn read_usize(&mut self) -> usize
pub fn read_usize(&mut self) -> usize
Read an usize from the parcel
Sourcepub fn read_pointer(&mut self) -> *const c_void
pub fn read_pointer(&mut self) -> *const c_void
Read a void pointer from the parcel
Sourcepub fn read_without_alignment(&mut self, size: usize) -> Vec<u8> ⓘ
pub fn read_without_alignment(&mut self, size: usize) -> Vec<u8> ⓘ
Read a slice of size bytes from the parcel
Sourcepub fn read_transaction_data(&mut self) -> BinderTransactionData
pub fn read_transaction_data(&mut self) -> BinderTransactionData
Read a BinderTransactionData from the parcel
Sourcepub fn read_object<T>(&mut self) -> T
pub fn read_object<T>(&mut self) -> T
Read an object of type T from the parcel
pub fn write_object<T>(&mut self, object: T)
Sourcepub fn write_str16(&mut self, string: &str)
pub fn write_str16(&mut self, string: &str)
Write a string to the parcel
Examples found in repository?
4fn main() {
5 let mut service_manager = &mut ServiceManager::new();
6
7 let mut package_manager = service_manager.get_service("myservice", "com.example.IMyService");
8
9 let mut parcel = Parcel::empty();
10 parcel.write_str16("Hello World");
11 let mut res = package_manager.call(1, &mut parcel);
12 println!("response: {:?}", res.read_str16());
13
14 let mut parcel = Parcel::empty();
15 parcel.write_str16("/data/local/tmp/testfile");
16 let mut res = package_manager.call(2, &mut parcel);
17 let fd = res.read_file_descriptor();
18 unsafe {
19 nix::libc::write(fd, "Hello world".as_ptr() as *const std::ffi::c_void, 11);
20 }
21}
More examples
23 fn process_request(&self, code: u32, data: &mut Parcel) -> Parcel {
24 println!("Got command: {} -> {:?}", code, MyServiceCommands::from_u32(code));
25 match MyServiceCommands::from_u32(code).unwrap() {
26 MyServiceCommands::GetFile => {
27 let filename = &std::ffi::CString::new(data.read_str16()).unwrap();
28 let fd = unsafe { open(filename.as_ptr(), O_RDWR | O_CREAT) };
29 println!("filename: {:?}, fd: {}", filename, fd);
30 let mut parcel = Parcel::empty();
31 parcel.write_u32(0);
32 parcel.write_file_descriptor(fd, false);
33 parcel
34 },
35 MyServiceCommands::Echo => {
36 let mut parcel = Parcel::empty();
37 parcel.write_u32(0); //status
38 parcel.write_str16(&data.read_str16());
39 parcel
40 }
41 }
42 }
Sourcepub fn write_binder(&mut self, object: *const c_void)
pub fn write_binder(&mut self, object: *const c_void)
Write a Binder object into the parcel
Sourcepub fn write_file_descriptor(&mut self, fd: RawFd, take_ownership: bool)
pub fn write_file_descriptor(&mut self, fd: RawFd, take_ownership: bool)
Write a file descriptor into the parcel
Examples found in repository?
23 fn process_request(&self, code: u32, data: &mut Parcel) -> Parcel {
24 println!("Got command: {} -> {:?}", code, MyServiceCommands::from_u32(code));
25 match MyServiceCommands::from_u32(code).unwrap() {
26 MyServiceCommands::GetFile => {
27 let filename = &std::ffi::CString::new(data.read_str16()).unwrap();
28 let fd = unsafe { open(filename.as_ptr(), O_RDWR | O_CREAT) };
29 println!("filename: {:?}, fd: {}", filename, fd);
30 let mut parcel = Parcel::empty();
31 parcel.write_u32(0);
32 parcel.write_file_descriptor(fd, false);
33 parcel
34 },
35 MyServiceCommands::Echo => {
36 let mut parcel = Parcel::empty();
37 parcel.write_u32(0); //status
38 parcel.write_str16(&data.read_str16());
39 parcel
40 }
41 }
42 }
Sourcepub fn read_file_descriptor(&mut self) -> RawFd
pub fn read_file_descriptor(&mut self) -> RawFd
REad a file descriptor from the parcel
Examples found in repository?
4fn main() {
5 let mut service_manager = &mut ServiceManager::new();
6
7 let mut package_manager = service_manager.get_service("myservice", "com.example.IMyService");
8
9 let mut parcel = Parcel::empty();
10 parcel.write_str16("Hello World");
11 let mut res = package_manager.call(1, &mut parcel);
12 println!("response: {:?}", res.read_str16());
13
14 let mut parcel = Parcel::empty();
15 parcel.write_str16("/data/local/tmp/testfile");
16 let mut res = package_manager.call(2, &mut parcel);
17 let fd = res.read_file_descriptor();
18 unsafe {
19 nix::libc::write(fd, "Hello world".as_ptr() as *const std::ffi::c_void, 11);
20 }
21}
Sourcepub fn read_str16(&mut self) -> String
pub fn read_str16(&mut self) -> String
Read a string from the parcel
Examples found in repository?
4fn main() {
5 let mut service_manager = &mut ServiceManager::new();
6
7 let mut package_manager = service_manager.get_service("myservice", "com.example.IMyService");
8
9 let mut parcel = Parcel::empty();
10 parcel.write_str16("Hello World");
11 let mut res = package_manager.call(1, &mut parcel);
12 println!("response: {:?}", res.read_str16());
13
14 let mut parcel = Parcel::empty();
15 parcel.write_str16("/data/local/tmp/testfile");
16 let mut res = package_manager.call(2, &mut parcel);
17 let fd = res.read_file_descriptor();
18 unsafe {
19 nix::libc::write(fd, "Hello world".as_ptr() as *const std::ffi::c_void, 11);
20 }
21}
More examples
23 fn process_request(&self, code: u32, data: &mut Parcel) -> Parcel {
24 println!("Got command: {} -> {:?}", code, MyServiceCommands::from_u32(code));
25 match MyServiceCommands::from_u32(code).unwrap() {
26 MyServiceCommands::GetFile => {
27 let filename = &std::ffi::CString::new(data.read_str16()).unwrap();
28 let fd = unsafe { open(filename.as_ptr(), O_RDWR | O_CREAT) };
29 println!("filename: {:?}, fd: {}", filename, fd);
30 let mut parcel = Parcel::empty();
31 parcel.write_u32(0);
32 parcel.write_file_descriptor(fd, false);
33 parcel
34 },
35 MyServiceCommands::Echo => {
36 let mut parcel = Parcel::empty();
37 parcel.write_u32(0); //status
38 parcel.write_str16(&data.read_str16());
39 parcel
40 }
41 }
42 }
Sourcepub fn read_interface_token(&mut self) -> String
pub fn read_interface_token(&mut self) -> String
Read an interface token from the parcel
Sourcepub fn write_interface_token(&mut self, name: &str)
pub fn write_interface_token(&mut self, name: &str)
Write an interface token to the parcel