extern crate alloc;
extern crate std;
use alloc::boxed::Box;
use std::ffi::CString;
use jni::EnvUnowned;
use jni::objects::{JClass, JString};
use jni::sys::{jint, jlong, jobject};
use super::convert::{jlong_to_ptr, jlong_to_ptr_mut, string_from_java, struct_to_java};
use super::with_env;
use crate::drag_drop::{WuiDraggable, WuiDropDestination};
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_WatcherJni_draggableGetData<'local>(
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
draggable_ptr: jlong,
) -> jobject {
with_env(&mut env, |env| {
let draggable = unsafe { jlong_to_ptr::<WuiDraggable>(draggable_ptr) };
let data = unsafe { crate::drag_drop::waterui_draggable_get_data(draggable) };
struct_to_java(env, data).into_raw()
})
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_WatcherJni_dropDraggable<'local>(
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
draggable_ptr: jlong,
) {
with_env(&mut env, |_env| {
let draggable = unsafe { jlong_to_ptr_mut::<WuiDraggable>(draggable_ptr) };
unsafe {
crate::drag_drop::waterui_drop_draggable(draggable);
drop(Box::from_raw(draggable));
}
});
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_WatcherJni_dropDestinationOnDrop<'local>(
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
destination_ptr: jlong,
env_ptr: jlong,
data_tag: jint,
data_value: JString<'local>,
) {
with_env(&mut env, |env| {
let value = string_from_java(env, &data_value);
let c_value = CString::new(value).expect("drop payload contained a NUL byte");
unsafe {
crate::drag_drop::waterui_call_drop_handler(
jlong_to_ptr::<WuiDropDestination>(destination_ptr),
jlong_to_ptr::<crate::WuiEnv>(env_ptr),
match data_tag {
1 => crate::drag_drop::WuiDragDataTag::Url,
_ => crate::drag_drop::WuiDragDataTag::Text,
},
c_value.as_ptr(),
);
}
});
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_WatcherJni_dropDestinationOnEnter<'local>(
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
destination_ptr: jlong,
env_ptr: jlong,
) {
with_env(&mut env, |_env| {
unsafe {
crate::drag_drop::waterui_call_drop_enter_handler(
jlong_to_ptr::<WuiDropDestination>(destination_ptr),
jlong_to_ptr::<crate::WuiEnv>(env_ptr),
);
}
});
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_WatcherJni_dropDestinationOnExit<'local>(
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
destination_ptr: jlong,
env_ptr: jlong,
) {
with_env(&mut env, |_env| {
unsafe {
crate::drag_drop::waterui_call_drop_exit_handler(
jlong_to_ptr::<WuiDropDestination>(destination_ptr),
jlong_to_ptr::<crate::WuiEnv>(env_ptr),
);
}
});
}
#[unsafe(no_mangle)]
extern "system" fn Java_dev_waterui_android_ffi_WatcherJni_dropDropDestination<'local>(
mut env: EnvUnowned<'local>,
_class: JClass<'local>,
destination_ptr: jlong,
) {
with_env(&mut env, |_env| {
let destination = unsafe { jlong_to_ptr_mut::<WuiDropDestination>(destination_ptr) };
unsafe {
crate::drag_drop::waterui_drop_drop_destination(destination);
drop(Box::from_raw(destination));
}
});
}