mirror of
https://github.com/hexedtech/codemp.git
synced 2024-11-22 15:24:48 +01:00
feat: working glue
Co-authored-by: alemi <me@alemi.dev>
This commit is contained in:
parent
4bb35f1727
commit
84996489e1
10 changed files with 77 additions and 90 deletions
|
@ -1,7 +1,7 @@
|
|||
package mp.code;
|
||||
|
||||
import mp.code.data.TextChange;
|
||||
import mp.code.exceptions.CodeMPLibException;
|
||||
import mp.code.exceptions.CodeMPException;
|
||||
|
||||
public class BufferController {
|
||||
private final long ptr;
|
||||
|
@ -20,20 +20,20 @@ public class BufferController {
|
|||
return get_content(this.ptr);
|
||||
}
|
||||
|
||||
private static native TextChange try_recv(long self) throws CodeMPLibException;
|
||||
public TextChange tryRecv() throws CodeMPLibException {
|
||||
private static native TextChange try_recv(long self) throws CodeMPException;
|
||||
public TextChange tryRecv() throws CodeMPException {
|
||||
return try_recv(this.ptr);
|
||||
}
|
||||
|
||||
private static native void send(long self, TextChange change) throws CodeMPLibException;
|
||||
public void send(TextChange change) throws CodeMPLibException {
|
||||
private static native void send(long self, TextChange change) throws CodeMPException;
|
||||
public void send(TextChange change) throws CodeMPException {
|
||||
send(this.ptr, change);
|
||||
}
|
||||
|
||||
private static native void free(long self);
|
||||
@Override
|
||||
@SuppressWarnings("removal")
|
||||
protected void finalize() throws Throwable {
|
||||
protected void finalize() {
|
||||
free(this.ptr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +1,17 @@
|
|||
package mp.code;
|
||||
|
||||
import mp.code.data.Cursor;
|
||||
import mp.code.exceptions.CodeMPLibException;
|
||||
import mp.code.exceptions.CodeMPException;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
public class Client {
|
||||
private final long ptr;
|
||||
private final String url;
|
||||
|
||||
private static native long setup_tracing(String path);
|
||||
public static native long setup_tracing(String path);
|
||||
|
||||
private static native long connect(String url) throws CodeMPLibException;
|
||||
public Client(String url) throws CodeMPLibException {
|
||||
private static native long connect(String url) throws CodeMPException;
|
||||
public Client(String url) throws CodeMPException {
|
||||
this.ptr = connect(url);
|
||||
this.url = url;
|
||||
}
|
||||
|
@ -22,13 +20,13 @@ public class Client {
|
|||
return this.url;
|
||||
}
|
||||
|
||||
private static native void login(long self, String username, String password, String workspace) throws CodeMPLibException;
|
||||
public void login(String username, String password, String workspace) throws CodeMPLibException {
|
||||
private static native void login(long self, String username, String password, String workspace) throws CodeMPException;
|
||||
public void login(String username, String password, String workspace) throws CodeMPException {
|
||||
login(this.ptr, username, password, workspace);
|
||||
}
|
||||
|
||||
private static native long join_workspace(long self, String id) throws CodeMPLibException;
|
||||
public Workspace joinWorkspace(String id) throws CodeMPLibException {
|
||||
private static native long join_workspace(long self, String id) throws CodeMPException;
|
||||
public Workspace joinWorkspace(String id) throws CodeMPException {
|
||||
return new Workspace(join_workspace(this.ptr, id));
|
||||
}
|
||||
|
||||
|
@ -48,36 +46,5 @@ public class Client {
|
|||
protected void finalize() {
|
||||
free(this.ptr);
|
||||
}
|
||||
|
||||
// TODO - remove everything past this line
|
||||
public static void main(String[] args) throws CodeMPLibException, InterruptedException {
|
||||
Client c = new Client("http://alemi.dev:50053");
|
||||
c.login(UUID.randomUUID().toString(), "lmaodefaultpassword", "glue");
|
||||
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 {
|
||||
System.loadLibrary("codemp");
|
||||
setup_tracing(null);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package mp.code;
|
||||
|
||||
import mp.code.data.Cursor;
|
||||
import mp.code.data.TextChange;
|
||||
import mp.code.exceptions.CodeMPException;
|
||||
|
||||
public class CursorController {
|
||||
private final long ptr;
|
||||
|
@ -10,20 +10,20 @@ public class CursorController {
|
|||
this.ptr = ptr;
|
||||
}
|
||||
|
||||
private static native Cursor try_recv(long self);
|
||||
public Cursor tryRecv() {
|
||||
private static native Cursor try_recv(long self) throws CodeMPException;
|
||||
public Cursor tryRecv() throws CodeMPException {
|
||||
return try_recv(this.ptr);
|
||||
}
|
||||
|
||||
private static native void send(long self, Cursor cursor);
|
||||
public void send(TextChange change, Cursor cursor) {
|
||||
private static native void send(long self, Cursor cursor) throws CodeMPException;
|
||||
public void send(Cursor cursor) throws CodeMPException {
|
||||
send(this.ptr, cursor);
|
||||
}
|
||||
|
||||
private static native void free(long self);
|
||||
@Override
|
||||
@SuppressWarnings("removal")
|
||||
protected void finalize() throws Throwable {
|
||||
protected void finalize() {
|
||||
free(this.ptr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package mp.code;
|
||||
|
||||
import mp.code.exceptions.CodeMPLibException;
|
||||
import mp.code.exceptions.CodeMPException;
|
||||
|
||||
public class Workspace {
|
||||
private final long ptr;
|
||||
|
@ -24,47 +24,50 @@ public class Workspace {
|
|||
return new BufferController(get_buffer(this.ptr, path));
|
||||
}
|
||||
|
||||
private static native void get_file_tree(long self);
|
||||
public void getFileTree() {
|
||||
// TODO vector?
|
||||
private static native String[] get_file_tree(long self);
|
||||
public String[] getFileTree() {
|
||||
return get_file_tree(this.ptr);
|
||||
}
|
||||
|
||||
private static native long create_buffer(String path) throws CodeMPLibException;
|
||||
public BufferController createBuffer(String path) throws CodeMPLibException {
|
||||
private static native long create_buffer(String path) throws CodeMPException;
|
||||
public BufferController createBuffer(String path) throws CodeMPException {
|
||||
return new BufferController(create_buffer(path));
|
||||
}
|
||||
|
||||
private static native long attach_to_buffer(long self) throws CodeMPLibException;
|
||||
public BufferController attachToBuffer() throws CodeMPLibException {
|
||||
private static native long attach_to_buffer(long self) throws CodeMPException;
|
||||
public BufferController attachToBuffer() throws CodeMPException {
|
||||
return new BufferController(attach_to_buffer(ptr));
|
||||
}
|
||||
|
||||
private static native void fetch_buffers(long self) throws CodeMPLibException;
|
||||
public void fetchBuffers() throws CodeMPLibException {
|
||||
private static native void fetch_buffers(long self) throws CodeMPException;
|
||||
public void fetchBuffers() throws CodeMPException {
|
||||
fetch_buffers(this.ptr);
|
||||
}
|
||||
|
||||
private static native void fetch_users(long self) throws CodeMPLibException;
|
||||
public void fetchUsers() throws CodeMPLibException {
|
||||
private static native void fetch_users(long self) throws CodeMPException;
|
||||
public void fetchUsers() throws CodeMPException {
|
||||
fetch_buffers(this.ptr);
|
||||
}
|
||||
|
||||
private static native void list_buffer_users(long self, String path) throws CodeMPLibException;
|
||||
public void listBufferUsers(String path) throws CodeMPLibException {
|
||||
// TODO pass vector
|
||||
private static native String[] list_buffer_users(long self, String path) throws CodeMPException;
|
||||
public String[] listBufferUsers(String path) throws CodeMPException {
|
||||
return list_buffer_users(this.ptr, path);
|
||||
}
|
||||
|
||||
private static native void delete_buffer(long self, String path) throws CodeMPLibException;
|
||||
public void deleteBuffer(String path) throws CodeMPLibException {
|
||||
private static native void delete_buffer(long self, String path) throws CodeMPException;
|
||||
public void deleteBuffer(String path) throws CodeMPException {
|
||||
delete_buffer(this.ptr, path);
|
||||
}
|
||||
|
||||
// TODO select_buffer
|
||||
private static native BufferController select_buffer(long self, long timeout) throws CodeMPException;
|
||||
public BufferController selectBuffer(long timeout) throws CodeMPException {
|
||||
return select_buffer(this.ptr, timeout);
|
||||
}
|
||||
|
||||
private static native void free(long self);
|
||||
@Override
|
||||
@SuppressWarnings("removal")
|
||||
protected void finalize() throws Throwable {
|
||||
protected void finalize() {
|
||||
free(this.ptr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package mp.code.exceptions;
|
||||
|
||||
public class ChannelException extends CodeMPLibException {
|
||||
public class ChannelException extends CodeMPException {
|
||||
public ChannelException(String input) {
|
||||
super(input);
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@ package mp.code.exceptions;
|
|||
/**
|
||||
* A generic class for all our exceptions coming through the JNI from the library.
|
||||
*/
|
||||
public abstract class CodeMPLibException extends Exception {
|
||||
protected CodeMPLibException(String msg) {
|
||||
public abstract class CodeMPException extends Exception {
|
||||
protected CodeMPException(String msg) {
|
||||
super(msg);
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
package mp.code.exceptions;
|
||||
|
||||
public class DeadlockedException extends CodeMPLibException {
|
||||
public class DeadlockedException extends CodeMPException {
|
||||
public DeadlockedException(String s) {
|
||||
super(s);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package mp.code.exceptions;
|
||||
|
||||
public class InvalidStateException extends CodeMPLibException {
|
||||
public class InvalidStateException extends CodeMPException {
|
||||
public InvalidStateException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package mp.code.exceptions;
|
||||
|
||||
public class TransportException extends CodeMPLibException {
|
||||
public class TransportException extends CodeMPException {
|
||||
public TransportException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use jni::{objects::{JClass, JString}, sys::{jlong, jstring}, JNIEnv};
|
||||
use jni::{objects::{JClass, JObject, JString}, sys::{jlong, jobjectArray, jstring}, JNIEnv};
|
||||
use crate::Workspace;
|
||||
|
||||
use super::{util::JExceptable, RT};
|
||||
|
@ -62,13 +62,22 @@ pub extern "system" fn Java_mp_code_Workspace_create_1buffer<'local>(
|
|||
/// Gets the filetree.
|
||||
#[no_mangle]
|
||||
pub extern "system" fn Java_mp_code_Workspace_get_1file_1tree(
|
||||
_env: JNIEnv,
|
||||
mut env: JNIEnv,
|
||||
_class: JClass,
|
||||
self_ptr: jlong,
|
||||
) {
|
||||
) -> jobjectArray {
|
||||
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
|
||||
let _file_tree = workspace.filetree();
|
||||
todo!() // how to return Vec<String> ? []String ?
|
||||
let file_tree = workspace.filetree();
|
||||
let class = env.find_class("java/lang/String").expect("Failed to find class!");
|
||||
let arr = env.new_object_array(file_tree.len() as i32, class, JObject::null())
|
||||
.expect("failed creating array");
|
||||
for (idx, path) in file_tree.iter().enumerate() {
|
||||
let js = env.new_string(path).expect("Failed to create String!");
|
||||
env.set_object_array_element(&arr, idx as i32, js)
|
||||
.expect("Failed to set array element!")
|
||||
}
|
||||
|
||||
arr.as_raw()
|
||||
}
|
||||
|
||||
/// Attaches to a buffer and returns a pointer to its [crate::buffer::Controller].
|
||||
|
@ -115,15 +124,23 @@ pub extern "system" fn Java_mp_code_Workspace_list_1buffer_1users<'local>(
|
|||
_class: JClass<'local>,
|
||||
self_ptr: jlong,
|
||||
input: JString<'local>,
|
||||
) {
|
||||
) -> jobjectArray {
|
||||
let workspace = unsafe { Box::leak(Box::from_raw(self_ptr as *mut Workspace)) };
|
||||
let buffer = unsafe { env.get_string_unchecked(&input).expect("Couldn't get java string!") };
|
||||
let _users = RT.block_on(workspace.list_buffer_users(buffer.to_str().expect("Not UTF-8!")))
|
||||
.jexcept(&mut env)
|
||||
.into_iter()
|
||||
.map(|x| x.id.to_string())
|
||||
.collect::<Vec<String>>();
|
||||
todo!() // how to return Vec<String>?
|
||||
let users = RT.block_on(workspace.list_buffer_users(buffer.to_str().expect("Not UTF-8!")))
|
||||
.jexcept(&mut env);
|
||||
|
||||
let class = env.find_class("java/lang/String").expect("Failed to find class!");
|
||||
let arr = env.new_object_array(users.len() as i32, class, JObject::null())
|
||||
.expect("failed creating array");
|
||||
|
||||
for (idx, user) in users.iter().enumerate() {
|
||||
let js = env.new_string(&user.id).expect("Failed to create String!");
|
||||
env.set_object_array_element(&arr, idx as i32, js)
|
||||
.expect("Failed to set array element!")
|
||||
}
|
||||
|
||||
arr.as_raw()
|
||||
}
|
||||
|
||||
/// Deletes a buffer.
|
||||
|
|
Loading…
Reference in a new issue