summaryrefslogtreecommitdiffhomepage
path: root/mullvad-jni/src/from_java.rs
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-22 18:43:49 +0000
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-05-23 10:30:03 +0000
commit2f40aca85164bf2aab597cb2b04ea877e3288723 (patch)
tree0d0e991dcb51e8e568aee9be1a9f142e8d4c9e24 /mullvad-jni/src/from_java.rs
parent276a5df145025567ef908173d9c692bb30422308 (diff)
downloadmullvadvpn-2f40aca85164bf2aab597cb2b04ea877e3288723.tar.xz
mullvadvpn-2f40aca85164bf2aab597cb2b04ea877e3288723.zip
Implement `FromJava` for `Constraint`
Diffstat (limited to 'mullvad-jni/src/from_java.rs')
-rw-r--r--mullvad-jni/src/from_java.rs47
1 files changed, 46 insertions, 1 deletions
diff --git a/mullvad-jni/src/from_java.rs b/mullvad-jni/src/from_java.rs
index 11b98ad753..7a87e10884 100644
--- a/mullvad-jni/src/from_java.rs
+++ b/mullvad-jni/src/from_java.rs
@@ -1,8 +1,10 @@
+use crate::get_class;
use jni::{
objects::{JObject, JString},
JNIEnv,
};
-use std::ops::Deref;
+use mullvad_types::relay_constraints::Constraint;
+use std::{fmt::Debug, ops::Deref};
pub trait FromJava<'env> {
type JavaType: 'env;
@@ -36,3 +38,46 @@ impl<'env> FromJava<'env> for String {
)
}
}
+
+impl<'env, T> FromJava<'env> for Constraint<T>
+where
+ T: Clone + Debug + Eq + FromJava<'env>,
+ T::JavaType: From<JObject<'env>>,
+{
+ type JavaType = JObject<'env>;
+
+ fn from_java(env: &JNIEnv<'env>, source: Self::JavaType) -> Self {
+ if is_instance_of(env, source, "net/mullvad/mullvadvpn/model/Constraint$Any") {
+ Constraint::Any
+ } else if is_instance_of(env, source, "net/mullvad/mullvadvpn/model/Constraint$Only") {
+ let value = get_object_field(env, source, "value", "Ljava/lang/Object;");
+
+ Constraint::Only(T::from_java(env, T::JavaType::from(value)))
+ } else {
+ panic!("Invalid Constraint Java sub-class");
+ }
+ }
+}
+
+fn is_instance_of<'env>(
+ env: &JNIEnv<'env>,
+ object: JObject<'env>,
+ class_name: &'static str,
+) -> bool {
+ let class = get_class(class_name);
+
+ env.is_instance_of(object, &class)
+ .expect("Failed to check if an object is an instance of a specified class")
+}
+
+fn get_object_field<'env>(
+ env: &JNIEnv<'env>,
+ object: JObject<'env>,
+ field_name: &str,
+ field_type: &str,
+) -> JObject<'env> {
+ env.get_field(object, field_name, field_type)
+ .expect("Failed to get field from object")
+ .l()
+ .expect("Field has incorrect Java type")
+}