Rust refactor (#617)

* Introduce deref_direct_bytebuffer

* Cleanup

* Cleanup

* Cleanup

---------

Co-authored-by: GG Bond <whatever@tagkong.com>
This commit is contained in:
Vladimir DostoyevskiyandGG Bond authored and GitHub committed 2024-01-07 17:56:49 +00:00
1 parent 045c6abe40
commit 9a769cc7b6
5 files changed
+29 -32

No files matched your search

+21 -24
View File
@@ -18,7 +18,7 @@ use log::LevelFilter;
use serde::Serialize;
use std::ffi::c_void;
use std::io::Cursor;
use std::ptr::{slice_from_raw_parts, slice_from_raw_parts_mut};
use std::ptr::slice_from_raw_parts_mut;
use std::str::from_utf8_unchecked;
use tl::{Bytes, Node, NodeHandle, Parser, VDom};
@@ -62,39 +62,36 @@ where
handle.get(parser)
}
fn parse_marshal_inplace<F, R>(env: &mut JNIEnv, str: JByteBuffer, limit: jint, mut f: F) -> i32
fn deref_direct_bytebuffer<'a>(env: &JNIEnv, buffer: &JByteBuffer) -> &'a mut [u8] {
let ptr = env.get_direct_buffer_address(buffer).unwrap();
let cap = env.get_direct_buffer_capacity(buffer).unwrap();
unsafe { &mut *slice_from_raw_parts_mut(ptr, cap) }
}
fn throw_msg(env: &mut JNIEnv, msg: &str) -> i32 {
env.throw_new("java/lang/RuntimeException", msg).ok();
0
}
fn parse_marshal_inplace<F, R>(env: &mut JNIEnv, str: JByteBuffer, limit: jint, f: F) -> i32
where
F: FnMut(&VDom, &Parser, &str) -> Result<R, &'static str>,
F: Fn(&VDom, &str) -> Result<R, &'static str>,
R: Serialize,
{
let ptr = env.get_direct_buffer_address(&str).unwrap();
let html = unsafe {
let buff = slice_from_raw_parts(ptr, limit as usize);
from_utf8_unchecked(&*buff)
};
let mut f = || {
let buffer = deref_direct_bytebuffer(env, &str);
let html = unsafe { from_utf8_unchecked(&buffer[..limit as usize]) };
let f = || {
let dom = tl::parse(html, tl::ParserOptions::default()).map_err(|_| html)?;
let parser = dom.parser();
f(&dom, parser, html)
f(&dom, html)
};
match f() {
// Nothing to marshal
Err(err) => {
env.throw_new("java/lang/RuntimeException", err).ok();
0
}
Err(err) => throw_msg(env, err),
Ok(value) => {
let mut cursor = unsafe {
let slice = slice_from_raw_parts_mut(ptr, 0x80000);
Cursor::new(&mut *slice)
};
let mut cursor = Cursor::new(buffer);
match serde_cbor::to_writer(&mut cursor, &value) {
Ok(_) => cursor.position() as i32,
Err(err) => {
env.throw_new("java/lang/RuntimeException", format!("{}", err))
.ok();
0
}
Err(err) => throw_msg(env, &format!("{}", err)),
}
}
}
+2 -2
View File
@@ -57,7 +57,7 @@ fn parse_fav(dom: &VDom, parser: &Parser, html: &str) -> Result<FavResult, &'sta
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.client.parser.FavoritesParserKt")]
pub fn parseFav(mut env: JNIEnv, _class: JClass, input: JByteBuffer, limit: jint) -> jint {
parse_marshal_inplace(&mut env, input, limit, |dom, parser, html| {
parse_fav(dom, parser, html)
parse_marshal_inplace(&mut env, input, limit, |dom, html| {
parse_fav(dom, dom.parser(), html)
})
}
+2 -2
View File
@@ -33,7 +33,7 @@ fn parse_limit(dom: &VDom, parser: &Parser) -> Option<Limits> {
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.client.parser.HomeParserKt")]
pub fn parseLimit(mut env: JNIEnv, _class: JClass, input: JByteBuffer, limit: jint) -> jint {
parse_marshal_inplace(&mut env, input, limit, |dom, parser, _| {
parse_limit(dom, parser).ok_or("Can't parse Limit")
parse_marshal_inplace(&mut env, input, limit, |dom, _| {
parse_limit(dom, dom.parser()).ok_or("Can't parse Limit")
})
}
+2 -2
View File
@@ -241,7 +241,7 @@ pub fn parse_info_list(
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.client.parser.GalleryListParserKt")]
pub fn parseGalleryInfoList(mut env: JNIEnv, _: JClass, buffer: JByteBuffer, limit: jint) -> jint {
parse_marshal_inplace(&mut env, buffer, limit, |dom, parser, str| {
parse_info_list(dom, parser, str)
parse_marshal_inplace(&mut env, buffer, limit, |dom, str| {
parse_info_list(dom, dom.parser(), str)
})
}
+2 -2
View File
@@ -44,7 +44,7 @@ fn parse_torrent_list(dom: &VDom, parser: &Parser) -> Result<Vec<Torrent>, &'sta
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.client.parser.TorrentParserKt")]
pub fn parseTorrent(mut env: JNIEnv, _class: JClass, buffer: JByteBuffer, limit: jint) -> jint {
parse_marshal_inplace(&mut env, buffer, limit, |dom, parser, _html| {
parse_torrent_list(dom, parser)
parse_marshal_inplace(&mut env, buffer, limit, |dom, _| {
parse_torrent_list(dom, dom.parser())
})
}