feat: buffer controller, cleanup

This commit is contained in:
zaaarf 2024-08-07 01:44:27 +02:00
parent 329287df53
commit 4bb35f1727
No known key found for this signature in database
GPG key ID: 102E445F4C3F829B
4 changed files with 102 additions and 114 deletions

View file

@ -1,18 +1,13 @@
use jni::{objects::{JClass, JObject}, sys::{jlong, jobject, jstring}, JNIEnv}; use jni::{objects::{JClass, JObject, JValueGen}, sys::{jlong, jobject, jstring}, JNIEnv};
use crate::api::Controller; use crate::api::Controller;
use super::util::JExceptable; use super::util::JExceptable;
/*
* Class: mp_code_BufferController
* Method: get_name
* Signature: (J)Ljava/lang/String;
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_BufferController_get_1name<'local>( pub extern "system" fn Java_mp_code_BufferController_get_1name(
env: JNIEnv, env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) -> jstring { ) -> jstring {
let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) }; let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) };
@ -22,15 +17,10 @@ pub extern "system" fn Java_mp_code_BufferController_get_1name<'local>(
.as_raw() .as_raw()
} }
/*
* Class: mp_code_BufferController
* Method: get_content
* Signature: (J)Ljava/lang/String;
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_BufferController_get_1content<'local>( pub extern "system" fn Java_mp_code_BufferController_get_1content(
env: JNIEnv, env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) -> jstring { ) -> jstring {
let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) }; let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) };
@ -40,27 +30,30 @@ pub extern "system" fn Java_mp_code_BufferController_get_1content<'local>(
.as_raw() .as_raw()
} }
/*
* Class: mp_code_BufferController
* Method: try_recv
* Signature: (J)Lmp/code/data/TextChange;
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_BufferController_try_1recv<'local>( pub extern "system" fn Java_mp_code_BufferController_try_1recv(
mut env: JNIEnv, mut env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) -> jobject { ) -> jobject {
let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) }; let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) };
let change = controller.try_recv().jexcept(&mut env); match controller.try_recv().jexcept(&mut env) {
todo!() None => JObject::null().as_raw(),
Some(event) => {
let class = env.find_class("mp/code/data/TextChange").expect("Couldn't find class!");
env.new_object(
class,
"(JJLjava/lang/String;)V",
&[
JValueGen::Long(event.span.start.try_into().unwrap()),
JValueGen::Long(event.span.end.try_into().unwrap()),
JValueGen::Object(&env.new_string(event.content).expect("Failed to create String!")),
]
).expect("failed creating object").into_raw()
}
}
} }
/*
* Class: mp_code_BufferController
* Method: send
* Signature: (JLmp/code/data/TextChange;)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_BufferController_send<'local>( pub extern "system" fn Java_mp_code_BufferController_send<'local>(
mut env: JNIEnv, mut env: JNIEnv,
@ -68,18 +61,26 @@ pub extern "system" fn Java_mp_code_BufferController_send<'local>(
self_ptr: jlong, self_ptr: jlong,
input: JObject<'local> input: JObject<'local>
) { ) {
todo!() let start = env.get_field(&input, "start", "J").expect("could not get field").j().expect("field was not of expected type");
let end = env.get_field(&input, "end", "J").expect("could not get field").j().expect("field was not of expected type");
let content = env.get_field(&input, "content", "Ljava/lang/String;")
.expect("could not get field")
.l()
.expect("field was not of expected type")
.into();
let content = env.get_string(&content).expect("Failed to get String!").into();
let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::buffer::Controller)) };
controller.send(crate::api::TextChange {
span: (start as usize)..(end as usize),
content
}).jexcept(&mut env);
} }
/*
* Class: mp_code_BufferController
* Method: free
* Signature: (J)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_BufferController_free<'local>( pub extern "system" fn Java_mp_code_BufferController_free(
_env: JNIEnv, _env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) { ) {
let _ = unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) }; let _ = unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) };

View file

@ -1,11 +1,6 @@
use jni::{objects::{JClass, JObject, JValueGen}, sys::{jlong, jobject}, JNIEnv}; use jni::{objects::{JClass, JObject, JString, JValueGen}, sys::{jlong, jobject}, JNIEnv};
use crate::{api::Controller, ffi::java::util::JExceptable}; use crate::{api::Controller, ffi::java::util::JExceptable};
/*
* Class: mp_code_CursorController
* Method: recv
* Signature: (J)Lmp/code/data/Cursor;
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_CursorController_try_1recv( pub extern "system" fn Java_mp_code_CursorController_try_1recv(
mut env: JNIEnv, mut env: JNIEnv,
@ -32,13 +27,7 @@ pub extern "system" fn Java_mp_code_CursorController_try_1recv(
} }
} }
} }
// public Cursor(int startRow, int startCol, int endRow, int endCol, String buffer, String user) {
/*
* Class: mp_code_CursorController
* Method: send
* Signature: (JLmp/code/data/Cursor;)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_CursorController_send<'local>( pub extern "system" fn Java_mp_code_CursorController_send<'local>(
mut env: JNIEnv, mut env: JNIEnv,
@ -46,18 +35,43 @@ pub extern "system" fn Java_mp_code_CursorController_send<'local>(
self_ptr: jlong, self_ptr: jlong,
input: JObject<'local>, input: JObject<'local>,
) { ) {
todo!() let start_row = env.get_field(&input, "startRow", "I").expect("could not get field").i().expect("field was not of expected type");
let start_col = env.get_field(&input, "startCol", "I").expect("could not get field").i().expect("field was not of expected type");
let end_row = env.get_field(&input, "endRow", "I").expect("could not get field").i().expect("field was not of expected type");
let end_col = env.get_field(&input, "endCol", "I").expect("could not get field").i().expect("field was not of expected type");
let buffer = env.get_field(&input, "buffer", "Ljava/lang/String;")
.expect("could not get field")
.l()
.expect("field was not of expected type")
.into();
let buffer = env.get_string(&buffer).expect("Failed to get String!").into();
let user: JString = env.get_field(&input, "user", "Ljava/lang/String;")
.expect("could not get field")
.l()
.expect("field was not of expected type")
.into();
let user = if user.is_null() {
None
} else {
let jstring = env.get_string(&user).expect("Failed to get String!");
Some(uuid::Uuid::parse_str(jstring.to_str().expect("Not valid UTF-8")).expect("Invalid UUI!"))
};
let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::cursor::Controller)) };
controller.send(crate::api::Cursor {
start: (start_row, start_col),
end: (end_row, end_col),
buffer,
user
}).jexcept(&mut env);
} }
/*
* Class: mp_code_CursorController
* Method: free
* Signature: (J)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_CursorController_free<'local>( pub extern "system" fn Java_mp_code_CursorController_free(
_env: JNIEnv, _env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) { ) {
let _ = unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) }; let _ = unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) };

View file

@ -1,4 +1,4 @@
use jni::{JNIEnv, sys::jlong}; use jni::JNIEnv;
/// A trait meant for our [crate::Result] type to make converting it to Java easier. /// A trait meant for our [crate::Result] type to make converting it to Java easier.
pub(crate) trait JExceptable<T> { pub(crate) trait JExceptable<T> {

View file

@ -46,7 +46,7 @@ pub extern "system" fn Java_mp_code_Workspace_get_1buffer<'local>(
Box::into_raw(Box::new(workspace.buffer_by_name(path.to_str().expect("Not UTF-8")))) as jlong Box::into_raw(Box::new(workspace.buffer_by_name(path.to_str().expect("Not UTF-8")))) as jlong
} }
/// Creates a [Buffer] /// Creates a new buffer.
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_create_1buffer<'local>( pub extern "system" fn Java_mp_code_Workspace_create_1buffer<'local>(
mut env: JNIEnv, mut env: JNIEnv,
@ -59,71 +59,56 @@ pub extern "system" fn Java_mp_code_Workspace_create_1buffer<'local>(
RT.block_on(ws.create(path.to_str().expect("Not UTF-8"))).jexcept(&mut env); RT.block_on(ws.create(path.to_str().expect("Not UTF-8"))).jexcept(&mut env);
} }
/* /// Gets the filetree.
* Class: mp_code_Workspace
* Method: get_file_tree
* Signature: (J)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_get_1file_1tree<'local>( pub extern "system" fn Java_mp_code_Workspace_get_1file_1tree(
mut env: JNIEnv, _env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) { ) {
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) }; let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
let file_tree = workspace.filetree(); let _file_tree = workspace.filetree();
todo!() // how to return Vec<String> ? []String ? todo!() // how to return Vec<String> ? []String ?
} }
/* /// Attaches to a buffer and returns a pointer to its [crate::buffer::Controller].
* Class: mp_code_Workspace
* Method: attach_to_buffer
* Signature: (J)J
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_attach_1to_1buffer<'local>( pub extern "system" fn Java_mp_code_Workspace_attach_1to_1buffer<'local>(
mut env: JNIEnv, mut env: JNIEnv,
_class: JClass<'local>, _class: JClass<'local>,
_self_ptr: jlong, self_ptr: jlong,
input: JString<'local>
) -> jlong { ) -> jlong {
todo!() let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
let path = unsafe { env.get_string_unchecked(&input).expect("Couldn't get java string!") };
RT.block_on(workspace.attach(path.to_str().expect("Not UTF-8!")))
.map(|buffer| Box::into_raw(Box::new(buffer)) as jlong)
.jexcept(&mut env)
} }
/* /// Updates the local buffer list.
* Class: mp_code_Workspace
* Method: fetch_buffers
* Signature: (J)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_fetch_1buffers<'local>( pub extern "system" fn Java_mp_code_Workspace_fetch_1buffers(
mut env: JNIEnv, mut env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) { ) {
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) }; let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
RT.block_on(workspace.fetch_buffers()).jexcept(&mut env); RT.block_on(workspace.fetch_buffers()).jexcept(&mut env);
} }
/* /// Updates the local user list.
* Class: mp_code_Workspace
* Method: fetch_users
* Signature: (J)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_fetch_1users<'local>( pub extern "system" fn Java_mp_code_Workspace_fetch_1users(
mut env: JNIEnv, mut env: JNIEnv,
_class: JClass<'local>, _class: JClass,
self_ptr: jlong, self_ptr: jlong,
) { ) {
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) }; let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
RT.block_on(workspace.fetch_users()).jexcept(&mut env); RT.block_on(workspace.fetch_users()).jexcept(&mut env);
} }
/* /// Lists users attached to a buffer.
* Class: mp_code_Workspace
* Method: list_buffer_users
* Signature: (JLjava/lang/String;)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_list_1buffer_1users<'local>( pub extern "system" fn Java_mp_code_Workspace_list_1buffer_1users<'local>(
mut env: JNIEnv, mut env: JNIEnv,
@ -132,12 +117,8 @@ pub extern "system" fn Java_mp_code_Workspace_list_1buffer_1users<'local>(
input: JString<'local>, input: JString<'local>,
) { ) {
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) }; let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
let buffer : String = unsafe { let buffer = unsafe { env.get_string_unchecked(&input).expect("Couldn't get java string!") };
env.get_string_unchecked(&input) let _users = RT.block_on(workspace.list_buffer_users(buffer.to_str().expect("Not UTF-8!")))
.expect("Couldn't get java string!")
.into()
};
let users = RT.block_on(workspace.list_buffer_users(&buffer))
.jexcept(&mut env) .jexcept(&mut env)
.into_iter() .into_iter()
.map(|x| x.id.to_string()) .map(|x| x.id.to_string())
@ -145,11 +126,7 @@ pub extern "system" fn Java_mp_code_Workspace_list_1buffer_1users<'local>(
todo!() // how to return Vec<String>? todo!() // how to return Vec<String>?
} }
/* /// Deletes a buffer.
* Class: mp_code_Workspace
* Method: delete_buffer
* Signature: (JLjava/lang/String;)V
*/
#[no_mangle] #[no_mangle]
pub extern "system" fn Java_mp_code_Workspace_delete_1buffer<'local>( pub extern "system" fn Java_mp_code_Workspace_delete_1buffer<'local>(
mut env: JNIEnv, mut env: JNIEnv,
@ -157,11 +134,7 @@ pub extern "system" fn Java_mp_code_Workspace_delete_1buffer<'local>(
self_ptr: jlong, self_ptr: jlong,
input: JString<'local>, input: JString<'local>,
) { ) {
let buffer : String = unsafe { let buffer = unsafe { env.get_string_unchecked(&input).expect("Couldn't get java string!") };
env.get_string_unchecked(&input)
.expect("Couldn't get java string!")
.into()
};
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) }; let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
RT.block_on(workspace.delete(&buffer)).jexcept(&mut env); RT.block_on(workspace.delete(buffer.to_str().expect("Not UTF-8!"))).jexcept(&mut env);
} }