Rust refactor (#617)
* Introduce deref_direct_bytebuffer * Cleanup * Cleanup * Cleanup --------- Co-authored-by: GG Bond <whatever@tagkong.com>
This commit is contained in:
1 parent
045c6abe40
commit
9a769cc7b6
5 files changed
+29
-32
No files matched your search
@@ -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)),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
@@ -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")
|
||||
})
|
||||
}
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
@@ -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())
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user