Move sha1 to mod hash, use anyhow

Signed-off-by: GG Bond <whatever@tagkong.com>
This commit is contained in:
GG Bond authored and Vladimir Dostoyevskiy committed 2024-02-25 23:04:35 +08:00
1 parent 5c7a834342
commit 60532e2622
4 files changed
+43 -34

No files matched your search

+2 -1
View File
@@ -18,7 +18,8 @@ once_cell = { default-features = false, version = "1.19" }
serde_cbor = "0.11"
serde = { version = "1.0", features = ["derive"] }
sha1 = { version = "0.10", features = ["asm"] }
base16ct = { version = "0.2" }
base16ct = { version = "0.2", features = ["std"] }
anyhow = { version = "1.0" }
[profile.release]
panic = "abort"
+1
View File
@@ -0,0 +1 @@
mod sha1;
+35
View File
@@ -0,0 +1,35 @@
use anyhow::Result;
use base16ct::lower::encode_str;
use jni::objects::JClass;
use jni::sys::{jint, jstring};
use jni::JNIEnv;
use jni_fn::jni_fn;
use sha1::{Digest, Sha1};
use std::{fs::File, io::copy, os::fd::BorrowedFd};
use throw_msg;
pub fn file_sha1(mut file: File, digest: &mut [u8; 40]) -> Result<&str> {
let mut sha = Sha1::new();
copy(&mut file, &mut sha)?;
Ok(encode_str(&sha.finalize(), digest)?)
}
#[no_mangle]
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.jni.HashKt")]
pub fn sha1(mut env: JNIEnv, _class: JClass, fd: jint) -> jstring {
let borrowed_fd = unsafe { BorrowedFd::borrow_raw(fd) };
let owned_fd = match borrowed_fd.try_clone_to_owned() {
Ok(fd) => fd,
Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring,
};
let mut hex_digest = [0u8; 40];
let hex = match file_sha1(File::from(owned_fd), &mut hex_digest) {
Ok(str) => str,
Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring,
};
match env.new_string(hex) {
Ok(obj) => obj.into_raw(),
Err(err) => throw_msg(&mut env, &format!("{err}")) as jstring,
}
}
+5 -33
View File
@@ -1,6 +1,8 @@
mod hash;
mod parser;
extern crate android_logger;
extern crate anyhow;
extern crate base16ct;
extern crate jni;
extern crate jni_fn;
@@ -13,18 +15,13 @@ extern crate sha1;
extern crate tl;
use android_logger::Config;
use base16ct::lower::encode_str;
use jni::objects::{JByteBuffer, JClass};
use jni::sys::{jint, jstring, JavaVM, JNI_VERSION_1_6};
use jni::objects::JByteBuffer;
use jni::sys::{jint, JavaVM, JNI_VERSION_1_6};
use jni::JNIEnv;
use jni_fn::jni_fn;
use log::LevelFilter;
use serde::Serialize;
use sha1::{Digest, Sha1};
use std::ffi::c_void;
use std::fs::File;
use std::io::{copy, Cursor};
use std::os::fd::BorrowedFd;
use std::io::Cursor;
use std::ptr::slice_from_raw_parts_mut;
use std::str::from_utf8_unchecked;
use tl::{Bytes, Node, NodeHandle, Parser, VDom};
@@ -129,28 +126,3 @@ pub extern "system" fn JNI_OnLoad(_: JavaVM, _: *mut c_void) -> jint {
android_logger::init_once(Config::default().with_max_level(LevelFilter::Debug));
JNI_VERSION_1_6
}
#[no_mangle]
#[allow(non_snake_case)]
#[jni_fn("com.hippo.ehviewer.jni.HashKt")]
pub fn sha1(mut env: JNIEnv, _class: JClass, fd: jint) -> jstring {
let mut sha = Sha1::new();
let borrowed_fd = unsafe { BorrowedFd::borrow_raw(fd) };
let owned_fd = match borrowed_fd.try_clone_to_owned() {
Ok(fd) => fd,
Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring,
};
if let Err(err) = copy(&mut File::from(owned_fd), &mut sha) {
return throw_msg(&mut env, &format!("{err}")) as jstring;
};
let digest = sha.finalize();
let mut hex_digest = [0u8; 40];
let hex = match encode_str(&digest, &mut hex_digest) {
Ok(str) => str,
Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring,
};
match env.new_string(hex) {
Ok(obj) => obj.into_raw(),
Err(err) => throw_msg(&mut env, &format!("{err}")) as jstring,
}
}