blob: fa982de4433851b19d629830ff9ee9d0ee05e3de [file] [log] [blame]
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
// use std::ffi::{CStr, CString};
// use std::os::raw::{c_char, c_uchar, c_ulong};
// #[no_mangle]
// pub extern "C" fn dlsmk_decode(
// key: *const c_uchar,
// qrcode: *const c_uchar,
// qrlen: c_ulong,
// ) -> *mut c_char {
// CString::new("Hello ".to_owned()).unwrap().into_raw()
// }
// #[cfg(target_os = "android")]
#[cfg(any(target_family = "unix", target_os = "android"))]
// #[cfg(target_family = "unix")]
#[allow(non_snake_case)]
pub mod android {
extern crate jni;
use self::jni::objects::{JClass, JMap, JObject, JString};
use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE};
use self::jni::JNIEnv;
// use super::*;
use libc;
use std::slice;
use dlqrcode::DaliQrCode;
fn put_data(env: &JNIEnv, map: &JMap, key: &str, value: &str) {
map.put(
*env.new_string(key).unwrap(),
*env.new_string(value).unwrap(),
)
.unwrap();
}
#[no_mangle]
pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_decode(
env: JNIEnv,
_: JClass,
key_hex: JString,
qrcode: JString,
offset: jlong,
result: JObject,
) -> jboolean {
let key = {
let s = env
.get_string(key_hex)
.expect("invalid key string")
.as_ptr();
let keylen = libc::strlen(s);
let mut k = Vec::new();
k.extend_from_slice(slice::from_raw_parts(s as *const u8, keylen));
k
};
let qrcode = {
let s = env
.get_string(qrcode)
.expect("invalid qrcode string")
.as_ptr();
let qrlen = libc::strlen(s);
let mut q = Vec::new();
q.extend_from_slice(slice::from_raw_parts(s as *const u8, qrlen));
q
};
let qrdata = env.get_map(result).expect("invalid qrdata map");
let key = {
let mut k = [0u8; 32];
if let Ok(v) = hex::decode(key.as_slice()) {
k.clone_from_slice(v.as_slice());
k
} else {
put_data(
&env,
&qrdata,
"error",
"key must be hex format and 64 characters",
);
return JNI_FALSE;
}
};
let decode = match DaliQrCode::new(key, None, None, None, None) {
Ok(d) => d,
Err(e) => {
let s = format!("invalid input parameter {:?}", e);
put_data(&env, &qrdata, "error", &s);
return JNI_FALSE;
}
};
match decode.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) {
Ok(d) => {
qrdata
.put(
*env.new_string("cardno").unwrap(),
*env.new_string(d.cardno).unwrap(),
)
.unwrap();
qrdata
.put(
*env.new_string("cardtype").unwrap(),
*env.new_string(d.cardtype).unwrap(),
)
.unwrap();
qrdata
.put(
*env.new_string("uid").unwrap(),
*env.new_string(d.uid).unwrap(),
)
.unwrap();
return JNI_TRUE;
}
Err(e) => {
let s = format!("{:?}", e);
put_data(&env, &qrdata, "error", &s);
return JNI_FALSE;
}
};
}
}