diff options
| author | 2020-08-11 14:47:29 -0700 | |
|---|---|---|
| committer | 2020-08-25 23:16:55 +0000 | |
| commit | 994a0f0d4492b6ea1f5cf46b6007a940fd4cb78b (patch) | |
| tree | 80cb6fd489e3b817c813f4b252f486ff81cdc686 | |
| parent | aae76385d09f51412da993bd08eb19e287a1fd67 (diff) | |
Add trait implementations for Rust binder crate
Implements Error for StatusCode in the bindgen generated bindings, which
makes usage simpler. Implements Eq for SpIBinder. Exposes a method to
promote weak binder references to strong ones.
Bug: 161559357
Test: m libbinder_rs
Change-Id: Ia2f891c2f0f84ed0454039169ed42ab20401c1a4
| -rw-r--r-- | libs/binder/rust/Android.bp | 22 | ||||
| -rw-r--r-- | libs/binder/rust/src/error.rs | 8 | ||||
| -rw-r--r-- | libs/binder/rust/src/lib.rs | 2 | ||||
| -rw-r--r-- | libs/binder/rust/src/proxy.rs | 20 | ||||
| -rw-r--r-- | libs/binder/rust/sys/BinderBindings.h (renamed from libs/binder/rust/BinderBindings.h) | 0 | ||||
| -rw-r--r-- | libs/binder/rust/sys/lib.rs | 38 |
6 files changed, 76 insertions, 14 deletions
diff --git a/libs/binder/rust/Android.bp b/libs/binder/rust/Android.bp index 16811eebe4..0234820b02 100644 --- a/libs/binder/rust/Android.bp +++ b/libs/binder/rust/Android.bp @@ -3,12 +3,24 @@ rust_library { crate_name: "binder", srcs: ["src/lib.rs"], shared_libs: [ - "libbinder_ndk", "libutils", ], rustlibs: [ "liblibc", - "libbinder_ndk_bindgen", + "libbinder_ndk_sys", + ], + host_supported: true, +} + +rust_library { + name: "libbinder_ndk_sys", + crate_name: "binder_ndk_sys", + srcs: [ + "sys/lib.rs", + ":libbinder_ndk_bindgen", + ], + shared_libs: [ + "libbinder_ndk", ], host_supported: true, } @@ -16,8 +28,8 @@ rust_library { rust_bindgen { name: "libbinder_ndk_bindgen", crate_name: "binder_ndk_bindgen", - wrapper_src: "BinderBindings.h", - source_stem: "ndk_bindings", + wrapper_src: "sys/BinderBindings.h", + source_stem: "bindings", cflags: [ "-x c++", ], @@ -69,6 +81,6 @@ rust_test { ], rustlibs: [ "liblibc", - "libbinder_ndk_bindgen", + "libbinder_ndk_sys", ], } diff --git a/libs/binder/rust/src/error.rs b/libs/binder/rust/src/error.rs index 289b1573db..4492cf72f4 100644 --- a/libs/binder/rust/src/error.rs +++ b/libs/binder/rust/src/error.rs @@ -43,14 +43,6 @@ pub fn status_result(status: status_t) -> Result<()> { } } -// impl Display for StatusCode { -// fn fmt(&self, f: &mut Formatter) -> FmtResult { -// write!(f, "StatusCode::{:?}", self) -// } -// } - -// impl error::Error for StatusCode {} - fn parse_status_code(code: i32) -> StatusCode { match code { e if e == StatusCode::OK as i32 => StatusCode::OK, diff --git a/libs/binder/rust/src/lib.rs b/libs/binder/rust/src/lib.rs index 4b9cccf41b..8ee6a62180 100644 --- a/libs/binder/rust/src/lib.rs +++ b/libs/binder/rust/src/lib.rs @@ -102,7 +102,7 @@ mod error; mod native; mod state; -use binder_ndk_bindgen as sys; +use binder_ndk_sys as sys; pub mod parcel; diff --git a/libs/binder/rust/src/proxy.rs b/libs/binder/rust/src/proxy.rs index f9519b4d01..13e5619237 100644 --- a/libs/binder/rust/src/proxy.rs +++ b/libs/binder/rust/src/proxy.rs @@ -122,6 +122,14 @@ impl AssociateClass for SpIBinder { } } +impl PartialEq for SpIBinder { + fn eq(&self, other: &Self) -> bool { + ptr::eq(self.0, other.0) + } +} + +impl Eq for SpIBinder {} + impl Clone for SpIBinder { fn clone(&self) -> Self { unsafe { @@ -363,6 +371,18 @@ impl WpIBinder { assert!(!ptr.is_null()); Self(ptr) } + + /// Promote this weak reference to a strong reference to the binder object. + pub fn promote(&self) -> Option<SpIBinder> { + unsafe { + // Safety: `WpIBinder` always contains a valid weak reference, so we + // can pass this pointer to `AIBinder_Weak_promote`. Returns either + // null or an AIBinder owned by the caller, both of which are valid + // to pass to `SpIBinder::from_raw`. + let ptr = sys::AIBinder_Weak_promote(self.0); + SpIBinder::from_raw(ptr) + } + } } /// Rust wrapper around DeathRecipient objects. diff --git a/libs/binder/rust/BinderBindings.h b/libs/binder/rust/sys/BinderBindings.h index c7a06d9a1c..c7a06d9a1c 100644 --- a/libs/binder/rust/BinderBindings.h +++ b/libs/binder/rust/sys/BinderBindings.h diff --git a/libs/binder/rust/sys/lib.rs b/libs/binder/rust/sys/lib.rs new file mode 100644 index 0000000000..9095af29e0 --- /dev/null +++ b/libs/binder/rust/sys/lib.rs @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +//! Generated Rust bindings to libbinder_ndk + +#![allow( + non_camel_case_types, + non_snake_case, + non_upper_case_globals, + unused, + improper_ctypes, + missing_docs +)] +use std::error::Error; +use std::fmt; + +include!(concat!(env!("OUT_DIR"), "/bindings.rs")); + +impl Error for android_c_interface_StatusCode {} + +impl fmt::Display for android_c_interface_StatusCode { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "StatusCode::{:?}", self) + } +} |