diff --git a/java/src/mp/code/Client.java b/java/src/mp/code/Client.java index aa3ea97..d17a463 100644 --- a/java/src/mp/code/Client.java +++ b/java/src/mp/code/Client.java @@ -1,5 +1,6 @@ package mp.code; +import mp.code.data.Cursor; import mp.code.exceptions.CodeMPLibException; import java.util.Optional; @@ -49,11 +50,29 @@ public class Client { } // TODO - remove everything past this line - public static void main(String[] args) throws CodeMPLibException { + public static void main(String[] args) throws CodeMPLibException, InterruptedException { Client c = new Client("http://alemi.dev:50053"); c.login(UUID.randomUUID().toString(), "lmaodefaultpassword", "glue"); - c.joinWorkspace("glue"); - System.out.println("Done!"); + Workspace workspace = c.joinWorkspace("glue"); + System.out.println(workspace.getWorkspaceId()); + while(true) { + Cursor cursor = workspace.getCursor().tryRecv(); + if(cursor == null) System.out.println("null!"); + else { + System.out.printf( + "sr: %d, sc: %d, er: %d, ec: %d, cursor: %s, buffer: %s\n", + cursor.startRow, + cursor.startCol, + cursor.endRow, + cursor.endCol, + cursor.user, + cursor.buffer + ); + } + Thread.sleep(100); + } + + //System.out.println("Done!"); } static { diff --git a/java/src/mp/code/CursorController.java b/java/src/mp/code/CursorController.java index 352bc53..5b3be95 100644 --- a/java/src/mp/code/CursorController.java +++ b/java/src/mp/code/CursorController.java @@ -10,9 +10,9 @@ public class CursorController { this.ptr = ptr; } - private static native Cursor recv(long self); - public Cursor recv() { - return recv(this.ptr); + private static native Cursor try_recv(long self); + public Cursor tryRecv() { + return try_recv(this.ptr); } private static native void send(long self, Cursor cursor); diff --git a/src/ffi/java/buffer_controller.rs b/src/ffi/java/buffer_controller.rs index 6e1dc69..da40fa1 100644 --- a/src/ffi/java/buffer_controller.rs +++ b/src/ffi/java/buffer_controller.rs @@ -1,6 +1,6 @@ use jni::{objects::{JClass, JObject}, sys::{jlong, jobject, jstring}, JNIEnv}; -use crate::{api::Controller, buffer::Controller}; +use crate::api::Controller; use super::util::JExceptable; @@ -82,6 +82,6 @@ pub extern "system" fn Java_mp_code_BufferController_free<'local>( _class: JClass<'local>, self_ptr: jlong, ) { - unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) }; + let _ = unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) }; } diff --git a/src/ffi/java/cursor_controller.rs b/src/ffi/java/cursor_controller.rs index 04e1f35..fd22ea4 100644 --- a/src/ffi/java/cursor_controller.rs +++ b/src/ffi/java/cursor_controller.rs @@ -1,4 +1,5 @@ -use jni::{objects::{JClass, JObject}, sys::{jlong, jobject}, JNIEnv}; +use jni::{objects::{JClass, JObject, JValueGen}, sys::{jlong, jobject}, JNIEnv}; +use crate::{api::Controller, ffi::java::util::JExceptable}; /* * Class: mp_code_CursorController @@ -6,13 +7,32 @@ use jni::{objects::{JClass, JObject}, sys::{jlong, jobject}, JNIEnv}; * Signature: (J)Lmp/code/data/Cursor; */ #[no_mangle] -pub extern "system" fn Java_mp_code_CursorController_recv<'local>( +pub extern "system" fn Java_mp_code_CursorController_try_1recv( mut env: JNIEnv, - _class: JClass<'local>, + _class: JClass, self_ptr: jlong, ) -> jobject { - todo!() + let controller = unsafe { Box::leak(Box::from_raw(self_ptr as *mut crate::cursor::Controller)) }; + match controller.try_recv().jexcept(&mut env) { + None => JObject::null().as_raw(), + Some(event) => { + let class = env.find_class("mp/code/data/Cursor").expect("Couldn't find class!"); + env.new_object( + class, + "(IIIILjava/lang/String;Ljava/lang/String;)V", + &[ + JValueGen::Int(event.start.0), + JValueGen::Int(event.start.1), + JValueGen::Int(event.end.0), + JValueGen::Int(event.end.1), + JValueGen::Object(&env.new_string(event.buffer).expect("Failed to create String!")), + JValueGen::Object(&env.new_string(event.user.map(|x| x.to_string()).unwrap_or_default()).expect("Failed to create String!")) + ] + ).expect("failed creating object").into_raw() + } + } } +// public Cursor(int startRow, int startCol, int endRow, int endCol, String buffer, String user) { /* * Class: mp_code_CursorController @@ -26,7 +46,7 @@ pub extern "system" fn Java_mp_code_CursorController_send<'local>( self_ptr: jlong, input: JObject<'local>, ) { - + todo!() } /* @@ -40,5 +60,5 @@ pub extern "system" fn Java_mp_code_CursorController_free<'local>( _class: JClass<'local>, self_ptr: jlong, ) { - unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) }; + let _ = unsafe { Box::from_raw(self_ptr as *mut crate::cursor::Controller) }; } diff --git a/src/ffi/java/workspace.rs b/src/ffi/java/workspace.rs index f42c147..3599f69 100644 --- a/src/ffi/java/workspace.rs +++ b/src/ffi/java/workspace.rs @@ -11,7 +11,7 @@ pub extern "system" fn Java_mp_code_Workspace_free(_env: JNIEnv, _class: JClass, /// Gets the workspace id. #[no_mangle] -pub extern "system" fn Java_mp_code_Client_get_1workspace_1id<'local>( +pub extern "system" fn Java_mp_code_Workspace_get_1workspace_1id<'local>( env: JNIEnv<'local>, _class: JClass<'local>, self_ptr: jlong @@ -24,7 +24,7 @@ pub extern "system" fn Java_mp_code_Client_get_1workspace_1id<'local>( /// Gets a cursor controller by name and returns a pointer to it. #[no_mangle] -pub extern "system" fn Java_mp_code_Client_get_1cursor<'local>( +pub extern "system" fn Java_mp_code_Workspace_get_1cursor<'local>( _env: JNIEnv<'local>, _class: JClass<'local>, self_ptr: jlong @@ -35,7 +35,7 @@ pub extern "system" fn Java_mp_code_Client_get_1cursor<'local>( /// Gets a buffer controller by name and returns a pointer to it. #[no_mangle] -pub extern "system" fn Java_mp_code_Client_get_1buffer<'local>( +pub extern "system" fn Java_mp_code_Workspace_get_1buffer<'local>( env: JNIEnv<'local>, _class: JClass<'local>, self_ptr: jlong,