diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-11-21 13:49:22 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-11-22 15:16:53 +0000 |
| commit | b6aebf0ee007f2de15cf09abbc1fc9d098094a30 (patch) | |
| tree | 4e613685449b1dbd311e9245f4ffb1e7eb87a14f | |
| parent | 33f2328f097eb09d17bfaa24c9f06a4c35056d06 (diff) | |
| download | mullvadvpn-b6aebf0ee007f2de15cf09abbc1fc9d098094a30.tar.xz mullvadvpn-b6aebf0ee007f2de15cf09abbc1fc9d098094a30.zip | |
Return `AutoLocal` from `IntoJava` implementations
| -rw-r--r-- | mullvad-jni/src/into_java.rs | 387 | ||||
| -rw-r--r-- | mullvad-jni/src/jni_event_listener.rs | 10 | ||||
| -rw-r--r-- | mullvad-jni/src/lib.rs | 28 | ||||
| -rw-r--r-- | mullvad-jni/src/vpn_service_tun_provider.rs | 2 |
4 files changed, 237 insertions, 190 deletions
diff --git a/mullvad-jni/src/into_java.rs b/mullvad-jni/src/into_java.rs index e9cefeeafc..42cec028d9 100644 --- a/mullvad-jni/src/into_java.rs +++ b/mullvad-jni/src/into_java.rs @@ -2,7 +2,7 @@ use crate::daemon_interface; use ipnetwork::IpNetwork; use jnix::{ jni::{ - objects::{JList, JObject, JString, JValue}, + objects::{AutoLocal, JList, JObject, JValue}, signature::JavaType, sys::{jboolean, jint, jshort, jsize}, }, @@ -38,15 +38,14 @@ pub trait IntoJava<'borrow, 'env: 'borrow> { impl<'borrow, 'env, T> IntoJava<'borrow, 'env> for Option<T> where 'env: 'borrow, - T: IntoJava<'borrow, 'env>, - T::JavaType: From<JObject<'env>>, + T: IntoJava<'borrow, 'env, JavaType = AutoLocal<'env, 'borrow>>, { - type JavaType = T::JavaType; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { match self { Some(data) => data.into_java(env), - None => T::JavaType::from(JObject::null()), + None => env.auto_local(JObject::null()), } } } @@ -55,20 +54,19 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for String where 'env: 'borrow, { - type JavaType = JString<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { - env.new_string(&self).expect("Failed to create Java String") + env.auto_local(*env.new_string(&self).expect("Failed to create Java String")) } } impl<'borrow, 'env, T> IntoJava<'borrow, 'env> for Vec<T> where 'env: 'borrow, - T: IntoJava<'borrow, 'env>, - JObject<'env>: From<T::JavaType>, + T: IntoJava<'borrow, 'env, JavaType = AutoLocal<'env, 'borrow>>, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("java/util/ArrayList"); @@ -83,13 +81,13 @@ where JList::from_env(env, list_object).expect("Failed to create JList from ArrayList"); for element in self { - let java_element = env.auto_local(JObject::from(element.into_java(env))); + let java_element = element.into_java(env); list.add(java_element.as_obj()) .expect("Failed to add element to ArrayList"); } - list_object + env.auto_local(list_object) } } @@ -97,7 +95,7 @@ impl<'array, 'borrow, 'env> IntoJava<'borrow, 'env> for &'array [u8] where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let size = self.len(); @@ -110,11 +108,17 @@ where env.set_byte_array_region(array, 0, data) .expect("Failed to copy bytes to Java array"); - JObject::from(array) + env.auto_local(JObject::from(array)) } } -fn ipvx_addr_into_java<'env>(original_octets: &[u8], env: &JnixEnv<'env>) -> JObject<'env> { +fn ipvx_addr_into_java<'env, 'borrow>( + original_octets: &[u8], + env: &'borrow JnixEnv<'env>, +) -> AutoLocal<'env, 'borrow> +where + 'env: 'borrow, +{ let class = env.get_class("java/net/InetAddress"); let constructor = env @@ -144,7 +148,7 @@ fn ipvx_addr_into_java<'env>(original_octets: &[u8], env: &JnixEnv<'env>) -> JOb .expect("Failed to create InetAddress Java object"); match result { - JValue::Object(object) => JObject::from(object.into_inner()), + JValue::Object(object) => env.auto_local(JObject::from(object.into_inner())), value => { panic!( "InetAddress.getByAddress returned an invalid value: {:?}", @@ -158,7 +162,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for Ipv4Addr where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { ipvx_addr_into_java(self.octets().as_ref(), env) @@ -169,7 +173,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for Ipv6Addr where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { ipvx_addr_into_java(self.octets().as_ref(), env) @@ -180,7 +184,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for IpAddr where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { match self { @@ -194,16 +198,18 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for SocketAddr where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("java/net/InetSocketAddress"); - let ip_address = env.auto_local(self.ip().into_java(env)); + let ip_address = self.ip().into_java(env); let port = self.port() as jint; let parameters = [JValue::Object(ip_address.as_obj()), JValue::Int(port)]; - env.new_object(&class, "(Ljava/net/InetAddress;I)V", ¶meters) - .expect("Failed to create InetSocketAddress Java object") + env.auto_local( + env.new_object(&class, "(Ljava/net/InetAddress;I)V", ¶meters) + .expect("Failed to create InetSocketAddress Java object"), + ) } } @@ -211,19 +217,21 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for IpNetwork where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/talpid/tun_provider/InetNetwork"); - let address = env.auto_local(self.ip().into_java(env)); + let address = self.ip().into_java(env); let prefix_length = self.prefix() as jshort; let parameters = [ JValue::Object(address.as_obj()), JValue::Short(prefix_length), ]; - env.new_object(&class, "(Ljava/net/InetAddress;S)V", ¶meters) - .expect("Failed to create InetNetwork Java object") + env.auto_local( + env.new_object(&class, "(Ljava/net/InetAddress;S)V", ¶meters) + .expect("Failed to create InetNetwork Java object"), + ) } } @@ -231,19 +239,21 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for PublicKey where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/PublicKey"); - let key = env.auto_local(self.key.as_bytes().into_java(env)); - let date_created = env.auto_local(*self.created.to_string().into_java(env)); + let key = self.key.as_bytes().into_java(env); + let date_created = self.created.to_string().into_java(env); let parameters = [ JValue::Object(key.as_obj()), JValue::Object(date_created.as_obj()), ]; - env.new_object(&class, "([BLjava/lang/String;)V", ¶meters) - .expect("Failed to create PublicKey Java object") + env.auto_local( + env.new_object(&class, "([BLjava/lang/String;)V", ¶meters) + .expect("Failed to create PublicKey Java object"), + ) } } @@ -251,14 +261,14 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for AppVersionInfo where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/AppVersionInfo"); let current_is_supported = self.current_is_supported as jboolean; let current_is_outdated = self.current_is_outdated as jboolean; - let latest_stable = env.auto_local(*self.latest_stable.into_java(env)); - let latest = env.auto_local(*self.latest.into_java(env)); + let latest_stable = self.latest_stable.into_java(env); + let latest = self.latest.into_java(env); let parameters = [ JValue::Bool(current_is_supported), JValue::Bool(current_is_outdated), @@ -266,12 +276,14 @@ where JValue::Object(latest.as_obj()), ]; - env.new_object( - &class, - "(ZZLjava/lang/String;Ljava/lang/String;)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(ZZLjava/lang/String;Ljava/lang/String;)V", + ¶meters, + ) + .expect("Failed to create AppVersionInfo Java object"), ) - .expect("Failed to create AppVersionInfo Java object") } } @@ -279,15 +291,17 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for AccountData where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/AccountData"); - let account_expiry = env.auto_local(JObject::from(self.expiry.to_string().into_java(env))); + let account_expiry = self.expiry.to_string().into_java(env); let parameters = [JValue::Object(account_expiry.as_obj())]; - env.new_object(&class, "(Ljava/lang/String;)V", ¶meters) - .expect("Failed to create AccountData Java object") + env.auto_local( + env.new_object(&class, "(Ljava/lang/String;)V", ¶meters) + .expect("Failed to create AccountData Java object"), + ) } } @@ -295,13 +309,13 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for TunConfig where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/talpid/tun_provider/TunConfig"); - let addresses = env.auto_local(self.addresses.into_java(env)); - let dns_servers = env.auto_local(self.dns_servers.into_java(env)); - let routes = env.auto_local(self.routes.into_java(env)); + let addresses = self.addresses.into_java(env); + let dns_servers = self.dns_servers.into_java(env); + let routes = self.routes.into_java(env); let mtu = self.mtu as jint; let parameters = [ JValue::Object(addresses.as_obj()), @@ -310,12 +324,14 @@ where JValue::Int(mtu), ]; - env.new_object( - &class, - "(Ljava/util/List;Ljava/util/List;Ljava/util/List;I)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(Ljava/util/List;Ljava/util/List;Ljava/util/List;I)V", + ¶meters, + ) + .expect("Failed to create TunConfig Java object"), ) - .expect("Failed to create TunConfig Java object") } } @@ -323,7 +339,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for TransportProtocol where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class_name = match self { @@ -332,8 +348,10 @@ where }; let class = env.get_class(class_name); - env.new_object(&class, "()V", &[]) - .expect("Failed to create TransportProtocol sub-class variant Java object") + env.auto_local( + env.new_object(&class, "()V", &[]) + .expect("Failed to create TransportProtocol sub-class variant Java object"), + ) } } @@ -341,23 +359,25 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for Endpoint where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/talpid/net/Endpoint"); - let address = env.auto_local(self.address.into_java(env)); - let protocol = env.auto_local(self.protocol.into_java(env)); + let address = self.address.into_java(env); + let protocol = self.protocol.into_java(env); let parameters = [ JValue::Object(address.as_obj()), JValue::Object(protocol.as_obj()), ]; - env.new_object( - &class, - "(Ljava/net/InetSocketAddress;Lnet/mullvad/talpid/net/TransportProtocol;)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(Ljava/net/InetSocketAddress;Lnet/mullvad/talpid/net/TransportProtocol;)V", + ¶meters, + ) + .expect("Failed to create Endpoint sub-class variant Java object"), ) - .expect("Failed to create Endpoint sub-class variant Java object") } } @@ -365,15 +385,21 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for TunnelEndpoint where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/talpid/net/TunnelEndpoint"); - let endpoint = env.auto_local(self.endpoint.into_java(env)); + let endpoint = self.endpoint.into_java(env); let parameters = [JValue::Object(endpoint.as_obj())]; - env.new_object(&class, "(Lnet/mullvad/talpid/net/Endpoint;)V", ¶meters) - .expect("Failed to create TunnelEndpoint sub-class variant Java object") + env.auto_local( + env.new_object( + &class, + "(Lnet/mullvad/mullvadvpn/model/Endpoint;)V", + ¶meters, + ) + .expect("Failed to create TunnelEndpoint sub-class variant Java object"), + ) } } @@ -381,15 +407,15 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for GeoIpLocation where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/GeoIpLocation"); - let ipv4 = env.auto_local(self.ipv4.into_java(env)); - let ipv6 = env.auto_local(self.ipv6.into_java(env)); - let country = env.auto_local(JObject::from(self.country.into_java(env))); - let city = env.auto_local(JObject::from(self.city.into_java(env))); - let hostname = env.auto_local(JObject::from(self.hostname.into_java(env))); + let ipv4 = self.ipv4.into_java(env); + let ipv6 = self.ipv6.into_java(env); + let country = self.country.into_java(env); + let city = self.city.into_java(env); + let hostname = self.hostname.into_java(env); let parameters = [ JValue::Object(ipv4.as_obj()), JValue::Object(ipv6.as_obj()), @@ -398,12 +424,12 @@ where JValue::Object(hostname.as_obj()), ]; - env.new_object( + env.auto_local(env.new_object( &class, "(Ljava/net/InetAddress;Ljava/net/InetAddress;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", ¶meters, ) - .expect("Failed to create GeoIpLocation Java object") + .expect("Failed to create GeoIpLocation Java object")) } } @@ -411,15 +437,17 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for RelayList where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/RelayList"); - let relay_countries = env.auto_local(self.countries.into_java(env)); + let relay_countries = self.countries.into_java(env); let parameters = [JValue::Object(relay_countries.as_obj())]; - env.new_object(&class, "(Ljava/util/List;)V", ¶meters) - .expect("Failed to create RelayList Java object") + env.auto_local( + env.new_object(&class, "(Ljava/util/List;)V", ¶meters) + .expect("Failed to create RelayList Java object"), + ) } } @@ -427,25 +455,27 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for RelayListCountry where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/RelayListCountry"); - let name = env.auto_local(JObject::from(self.name.into_java(env))); - let code = env.auto_local(JObject::from(self.code.into_java(env))); - let relay_cities = env.auto_local(self.cities.into_java(env)); + let name = self.name.into_java(env); + let code = self.code.into_java(env); + let relay_cities = self.cities.into_java(env); let parameters = [ JValue::Object(name.as_obj()), JValue::Object(code.as_obj()), JValue::Object(relay_cities.as_obj()), ]; - env.new_object( - &class, - "(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V", + ¶meters, + ) + .expect("Failed to create RelayListCountry Java object"), ) - .expect("Failed to create RelayListCountry Java object") } } @@ -453,25 +483,27 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for RelayListCity where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/RelayListCity"); - let name = env.auto_local(JObject::from(self.name.into_java(env))); - let code = env.auto_local(JObject::from(self.code.into_java(env))); - let relays = env.auto_local(self.relays.into_java(env)); + let name = self.name.into_java(env); + let code = self.code.into_java(env); + let relays = self.relays.into_java(env); let parameters = [ JValue::Object(name.as_obj()), JValue::Object(code.as_obj()), JValue::Object(relays.as_obj()), ]; - env.new_object( - &class, - "(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V", + ¶meters, + ) + .expect("Failed to create RelayListCity Java object"), ) - .expect("Failed to create RelayListCity Java object") } } @@ -479,11 +511,11 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for Relay where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/Relay"); - let hostname = env.auto_local(JObject::from(self.hostname.into_java(env))); + let hostname = self.hostname.into_java(env); let has_wireguard_tunnels = (!self.tunnels.wireguard.is_empty()) as jboolean; let parameters = [ JValue::Object(hostname.as_obj()), @@ -491,21 +523,22 @@ where JValue::Bool(self.active as jboolean), ]; - env.new_object(&class, "(Ljava/lang/String;ZZ)V", ¶meters) - .expect("Failed to create Relay Java object") + env.auto_local( + env.new_object(&class, "(Ljava/lang/String;ZZ)V", ¶meters) + .expect("Failed to create Relay Java object"), + ) } } impl<'borrow, 'env, T> IntoJava<'borrow, 'env> for Constraint<T> where 'env: 'borrow, - T: Clone + Eq + Debug + IntoJava<'borrow, 'env>, - JObject<'env>: From<T::JavaType>, + T: Clone + Eq + Debug + IntoJava<'borrow, 'env, JavaType = AutoLocal<'env, 'borrow>>, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { - match self { + env.auto_local(match self { Constraint::Any => { let class = env.get_class("net/mullvad/mullvadvpn/model/Constraint$Any"); @@ -514,13 +547,13 @@ where } Constraint::Only(constraint) => { let class = env.get_class("net/mullvad/mullvadvpn/model/Constraint$Only"); - let value = env.auto_local(JObject::from(constraint.into_java(env))); + let value = constraint.into_java(env); let parameters = [JValue::Object(value.as_obj())]; env.new_object(&class, "(Ljava/lang/Object;)V", ¶meters) .expect("Failed to create Constraint.Only Java object") } - } + }) } } @@ -528,14 +561,14 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for LocationConstraint where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { - match self { + env.auto_local(match self { LocationConstraint::Country(country_code) => { let class = env.get_class("net/mullvad/mullvadvpn/model/LocationConstraint$Country"); - let country = env.auto_local(JObject::from(country_code.into_java(env))); + let country = country_code.into_java(env); let parameters = [JValue::Object(country.as_obj())]; env.new_object(&class, "(Ljava/lang/String;)V", ¶meters) @@ -543,8 +576,8 @@ where } LocationConstraint::City(country_code, city_code) => { let class = env.get_class("net/mullvad/mullvadvpn/model/LocationConstraint$City"); - let country = env.auto_local(JObject::from(country_code.into_java(env))); - let city = env.auto_local(JObject::from(city_code.into_java(env))); + let country = country_code.into_java(env); + let city = city_code.into_java(env); let parameters = [ JValue::Object(country.as_obj()), JValue::Object(city.as_obj()), @@ -560,9 +593,9 @@ where LocationConstraint::Hostname(country_code, city_code, hostname) => { let class = env.get_class("net/mullvad/mullvadvpn/model/LocationConstraint$Hostname"); - let country = env.auto_local(JObject::from(country_code.into_java(env))); - let city = env.auto_local(JObject::from(city_code.into_java(env))); - let hostname = env.auto_local(JObject::from(hostname.into_java(env))); + let country = country_code.into_java(env); + let city = city_code.into_java(env); + let hostname = hostname.into_java(env); let parameters = [ JValue::Object(country.as_obj()), JValue::Object(city.as_obj()), @@ -576,7 +609,7 @@ where ) .expect("Failed to create LocationConstraint.Hostname Java object") } - } + }) } } @@ -584,7 +617,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for RelaySettings where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { match self { @@ -598,14 +631,16 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for CustomTunnelEndpoint where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/RelaySettings$CustomTunnelEndpoint"); - env.new_object(&class, "()V", &[]) - .expect("Failed to create CustomTunnelEndpoint Java object") + env.auto_local( + env.new_object(&class, "()V", &[]) + .expect("Failed to create CustomTunnelEndpoint Java object"), + ) } } @@ -613,13 +648,13 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for KeygenEvent where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { - match self { + env.auto_local(match self { KeygenEvent::NewKey(public_key) => { let class = env.get_class("net/mullvad/mullvadvpn/model/KeygenEvent$NewKey"); - let java_public_key = env.auto_local(public_key.into_java(env)); + let java_public_key = public_key.into_java(env); let parameters = [ JValue::Object(java_public_key.as_obj()), @@ -665,7 +700,7 @@ where ) .expect("Failed to create KeygenEvent.GenerationFailure Java object") } - } + }) } } @@ -673,19 +708,21 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for RelayConstraints where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/RelaySettings$RelayConstraints"); - let location = env.auto_local(self.location.into_java(env)); + let location = self.location.into_java(env); let parameters = [JValue::Object(location.as_obj())]; - env.new_object( - &class, - "(Lnet/mullvad/mullvadvpn/model/Constraint;)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(Lnet/mullvad/mullvadvpn/model/Constraint;)V", + ¶meters, + ) + .expect("Failed to create RelaySettings.RelayConstraints Java object"), ) - .expect("Failed to create RelaySettings.RelayConstraints Java object") } } @@ -693,23 +730,25 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for Settings where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class = env.get_class("net/mullvad/mullvadvpn/model/Settings"); - let account_token = env.auto_local(JObject::from(self.get_account_token().into_java(env))); - let relay_settings = env.auto_local(self.get_relay_settings().into_java(env)); + let account_token = self.get_account_token().into_java(env); + let relay_settings = self.get_relay_settings().into_java(env); let parameters = [ JValue::Object(account_token.as_obj()), JValue::Object(relay_settings.as_obj()), ]; - env.new_object( - &class, - "(Ljava/lang/String;Lnet/mullvad/mullvadvpn/model/RelaySettings;)V", - ¶meters, + env.auto_local( + env.new_object( + &class, + "(Ljava/lang/String;Lnet/mullvad/mullvadvpn/model/RelaySettings;)V", + ¶meters, + ) + .expect("Failed to create Settings Java object"), ) - .expect("Failed to create Settings Java object") } } @@ -717,7 +756,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for ActionAfterDisconnect where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let variant = match self { @@ -731,8 +770,10 @@ where ); let class = env.get_class(&class_name); - env.new_object(&class, "()V", &[]) - .expect("Failed to create ActionAfterDisconnect sub-class variant Java object") + env.auto_local( + env.new_object(&class, "()V", &[]) + .expect("Failed to create ActionAfterDisconnect sub-class variant Java object"), + ) } } @@ -740,18 +781,19 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for BlockReason where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let variant = match self { BlockReason::AuthFailed(reason) => { let class = env.get_class("net/mullvad/talpid/tunnel/BlockReason$AuthFailed"); - let reason = env.auto_local(JObject::from(reason.into_java(env))); + let reason = reason.into_java(env); let parameters = [JValue::Object(reason.as_obj())]; - return env - .new_object(&class, "(Ljava/lang/String;)V", ¶meters) - .expect("Failed to create BlockReason.AuthFailed Java object"); + return env.auto_local( + env.new_object(&class, "(Ljava/lang/String;)V", ¶meters) + .expect("Failed to create BlockReason.AuthFailed Java object"), + ); } BlockReason::Ipv6Unavailable => "Ipv6Unavailable", BlockReason::SetFirewallPolicyError => "SetFirewallPolicyError", @@ -760,15 +802,16 @@ where BlockReason::TunnelParameterError(reason) => { let class = env.get_class("net/mullvad/talpid/tunnel/BlockReason$ParameterGeneration"); - let reason = env.auto_local(JObject::from(reason.into_java(env))); + let reason = reason.into_java(env); let parameters = [JValue::Object(reason.as_obj())]; - return env - .new_object( + return env.auto_local( + env.new_object( &class, "(Lnet/mullvad/talpid/tunnel/ParameterGenerationError;)V", ¶meters, ) - .expect("Failed to create BlockReason.ParameterGeneration Java object"); + .expect("Failed to create BlockReason.ParameterGeneration Java object"), + ); } BlockReason::IsOffline => "IsOffline", BlockReason::TapAdapterProblem => "TapAdapterProblem", @@ -776,8 +819,10 @@ where let class_name = format!("net/mullvad/talpid/tunnel/BlockReason${}", variant); let class = env.get_class(&class_name); - env.new_object(&class, "()V", &[]) - .expect("Failed to create BlockReason sub-class variant Java object") + env.auto_local( + env.new_object(&class, "()V", &[]) + .expect("Failed to create BlockReason sub-class variant Java object"), + ) } } @@ -785,7 +830,7 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for ParameterGenerationError where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { let class_variant = match self { @@ -801,8 +846,10 @@ where class_variant ); let class = env.get_class(&class_name); - env.new_object(&class, "()V", &[]) - .expect("Failed to create ParameterGenerationError sub-class variant Java object") + env.auto_local( + env.new_object(&class, "()V", &[]) + .expect("Failed to create ParameterGenerationError sub-class variant Java object"), + ) } } @@ -810,10 +857,10 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for TunnelState where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { - match self { + env.auto_local(match self { TunnelState::Disconnected => { let class = env.get_class("net/mullvad/mullvadvpn/model/TunnelState$Disconnected"); @@ -821,8 +868,8 @@ where } TunnelState::Connecting { endpoint, location } => { let class = env.get_class("net/mullvad/mullvadvpn/model/TunnelState$Connecting"); - let endpoint = env.auto_local(endpoint.into_java(env)); - let location = env.auto_local(location.into_java(env)); + let endpoint = endpoint.into_java(env); + let location = location.into_java(env); let parameters = [ JValue::Object(endpoint.as_obj()), JValue::Object(location.as_obj()), @@ -834,8 +881,8 @@ where } TunnelState::Connected { endpoint, location } => { let class = env.get_class("net/mullvad/mullvadvpn/model/TunnelState$Connected"); - let endpoint = env.auto_local(endpoint.into_java(env)); - let location = env.auto_local(location.into_java(env)); + let endpoint = endpoint.into_java(env); + let location = location.into_java(env); let parameters = [ JValue::Object(endpoint.as_obj()), JValue::Object(location.as_obj()), @@ -847,7 +894,7 @@ where } TunnelState::Disconnecting(action_after_disconnect) => { let class = env.get_class("net/mullvad/mullvadvpn/model/TunnelState$Disconnecting"); - let after_disconnect = env.auto_local(action_after_disconnect.into_java(env)); + let after_disconnect = action_after_disconnect.into_java(env); let parameters = [JValue::Object(after_disconnect.as_obj())]; let signature = "(Lnet/mullvad/talpid/tunnel/ActionAfterDisconnect;)V"; @@ -855,14 +902,14 @@ where } TunnelState::Blocked(block_reason) => { let class = env.get_class("net/mullvad/mullvadvpn/model/TunnelState$Blocked"); - let reason = env.auto_local(block_reason.into_java(env)); + let reason = block_reason.into_java(env); let parameters = [JValue::Object(reason.as_obj())]; let signature = "(Lnet/mullvad/talpid/tunnel/BlockReason;)V"; env.new_object(&class, signature, ¶meters) } } - .expect("Failed to create TunnelState sub-class variant Java object") + .expect("Failed to create TunnelState sub-class variant Java object")) } } @@ -870,13 +917,13 @@ impl<'borrow, 'env> IntoJava<'borrow, 'env> for Result<AccountData, daemon_inter where 'env: 'borrow, { - type JavaType = JObject<'env>; + type JavaType = AutoLocal<'env, 'borrow>; fn into_java(self, env: &'borrow JnixEnv<'env>) -> Self::JavaType { - match self { + env.auto_local(match self { Ok(data) => { let class = env.get_class("net/mullvad/mullvadvpn/model/GetAccountDataResult$Ok"); - let java_account_data = env.auto_local(data.into_java(&env)); + let java_account_data = data.into_java(&env); let parameters = [JValue::Object(java_account_data.as_obj())]; env.new_object( @@ -905,6 +952,6 @@ where env.new_object(&class, "()V", &[]) .expect("Failed to create a GetAccountDataResult error sub-class Java object") } - } + }) } } diff --git a/mullvad-jni/src/jni_event_listener.rs b/mullvad-jni/src/jni_event_listener.rs index 7db6f2cdbd..234fd30313 100644 --- a/mullvad-jni/src/jni_event_listener.rs +++ b/mullvad-jni/src/jni_event_listener.rs @@ -186,7 +186,7 @@ impl<'env> JniEventHandler<'env> { } fn handle_keygen_event(&self, event: KeygenEvent) { - let java_keygen_event = self.env.auto_local(event.into_java(&self.env)); + let java_keygen_event = event.into_java(&self.env); let result = self.env.call_method_unchecked( self.mullvad_ipc_client, @@ -204,7 +204,7 @@ impl<'env> JniEventHandler<'env> { } fn handle_relay_list_event(&self, relay_list: RelayList) { - let java_relay_list = self.env.auto_local(relay_list.into_java(&self.env)); + let java_relay_list = relay_list.into_java(&self.env); let result = self.env.call_method_unchecked( self.mullvad_ipc_client, @@ -222,7 +222,7 @@ impl<'env> JniEventHandler<'env> { } fn handle_settings(&self, settings: Settings) { - let java_settings = self.env.auto_local(settings.into_java(&self.env)); + let java_settings = settings.into_java(&self.env); let result = self.env.call_method_unchecked( self.mullvad_ipc_client, @@ -240,7 +240,7 @@ impl<'env> JniEventHandler<'env> { } fn handle_tunnel_event(&self, event: TunnelState) { - let java_tunnel_state = self.env.auto_local(event.into_java(&self.env)); + let java_tunnel_state = event.into_java(&self.env); let result = self.env.call_method_unchecked( self.mullvad_ipc_client, @@ -258,7 +258,7 @@ impl<'env> JniEventHandler<'env> { } fn handle_app_version_info_event(&self, app_version_info: AppVersionInfo) { - let java_app_version_info = self.env.auto_local(app_version_info.into_java(&self.env)); + let java_app_version_info = app_version_info.into_java(&self.env); let result = self.env.call_method_unchecked( self.mullvad_ipc_client, diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index dd6ee21a7a..4e8fc7d03e 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -189,7 +189,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_generateWiregua let env = JnixEnv::from(env); match DAEMON_INTERFACE.generate_wireguard_key() { - Ok(keygen_event) => keygen_event.into_java(&env), + Ok(keygen_event) => keygen_event.into_java(&env).forget(), Err(error) => { log::error!( "{}", @@ -244,7 +244,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getAccountData< ); } - result.into_java(&env) + result.into_java(&env).forget() } #[no_mangle] @@ -252,17 +252,17 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getAccountData< pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getWwwAuthToken<'env, 'this>( env: JNIEnv<'env>, _: JObject<'this>, -) -> JString<'env> { +) -> JObject<'env> { let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_www_auth_token() { - Ok(token) => token.into_java(&env), + Ok(token) => token.into_java(&env).forget(), Err(err) => { log::error!( "{}", err.display_chain_with_msg("Failed to get WWW auth token") ); - String::new().into_java(&env) + String::new().into_java(&env).forget() } } } @@ -276,7 +276,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getCurrentLocat let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_current_location() { - Ok(location) => location.into_java(&env), + Ok(location) => location.into_java(&env).forget(), Err(error) => { log::error!( "{}", @@ -292,17 +292,17 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getCurrentLocat pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getCurrentVersion<'env, 'this>( env: JNIEnv<'env>, _: JObject<'this>, -) -> JString<'env> { +) -> JObject<'env> { let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_current_version() { - Ok(location) => location.into_java(&env), + Ok(location) => location.into_java(&env).forget(), Err(error) => { log::error!( "{}", error.display_chain_with_msg("Failed to get current version") ); - String::new().into_java(&env) + String::new().into_java(&env).forget() } } } @@ -316,7 +316,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getRelayLocatio let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_relay_locations() { - Ok(relay_list) => relay_list.into_java(&env), + Ok(relay_list) => relay_list.into_java(&env).forget(), Err(error) => { log::error!( "{}", @@ -336,7 +336,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getSettings<'en let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_settings() { - Ok(settings) => settings.into_java(&env), + Ok(settings) => settings.into_java(&env).forget(), Err(error) => { log::error!("{}", error.display_chain_with_msg("Failed to get settings")); JObject::null() @@ -353,7 +353,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getState<'env, let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_state() { - Ok(state) => state.into_java(&env), + Ok(state) => state.into_java(&env).forget(), Err(error) => { log::error!("{}", error.display_chain_with_msg("Failed to get state")); JObject::null() @@ -370,7 +370,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getVersionInfo< let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_version_info() { - Ok(version_info) => version_info.into_java(&env), + Ok(version_info) => version_info.into_java(&env).forget(), Err(error) => { log::error!( "{}", @@ -390,7 +390,7 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_getWireguardKey let env = JnixEnv::from(env); match DAEMON_INTERFACE.get_wireguard_key() { - Ok(key) => key.into_java(&env), + Ok(key) => key.into_java(&env).forget(), Err(error) => { log::error!( "{}", diff --git a/mullvad-jni/src/vpn_service_tun_provider.rs b/mullvad-jni/src/vpn_service_tun_provider.rs index 9415087a1f..aecdee3786 100644 --- a/mullvad-jni/src/vpn_service_tun_provider.rs +++ b/mullvad-jni/src/vpn_service_tun_provider.rs @@ -119,7 +119,7 @@ impl VpnServiceTunProvider { ) .map_err(|cause| Error::FindMethod("createTun", cause))?; - let java_config = env.auto_local(config.clone().into_java(&env)); + let java_config = config.clone().into_java(&env); let result = env .call_method_unchecked( self.object.as_obj(), |
