Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 1 | #[cfg(test)] |
| 2 | mod tests { |
| 3 | #[test] |
| 4 | fn it_works() { |
| 5 | assert_eq!(2 + 2, 4); |
| 6 | } |
| 7 | } |
| 8 | |
| 9 | // use std::ffi::{CStr, CString}; |
| 10 | // use std::os::raw::{c_char, c_uchar, c_ulong}; |
| 11 | |
| 12 | // #[no_mangle] |
| 13 | // pub extern "C" fn dlsmk_decode( |
| 14 | // key: *const c_uchar, |
| 15 | // qrcode: *const c_uchar, |
| 16 | // qrlen: c_ulong, |
| 17 | // ) -> *mut c_char { |
| 18 | // CString::new("Hello ".to_owned()).unwrap().into_raw() |
| 19 | // } |
| 20 | |
| 21 | // #[cfg(target_os = "android")] |
| 22 | #[cfg(any(target_family = "unix", target_os = "android"))] |
| 23 | // #[cfg(target_family = "unix")] |
| 24 | #[allow(non_snake_case)] |
| 25 | pub mod android { |
| 26 | extern crate jni; |
| 27 | |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 28 | use self::jni::objects::{JClass, JMap, JObject, JString}; |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 29 | use self::jni::sys::{jboolean, jlong, JNI_FALSE, JNI_TRUE}; |
| 30 | use self::jni::JNIEnv; |
| 31 | // use super::*; |
| 32 | use libc; |
| 33 | use std::slice; |
| 34 | |
| 35 | use dlqrcode::DaliQrCode; |
| 36 | |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 37 | fn put_data(env: &JNIEnv, map: &JMap, key: &str, value: &str) { |
| 38 | map.put( |
| 39 | *env.new_string(key).unwrap(), |
| 40 | *env.new_string(value).unwrap(), |
| 41 | ) |
| 42 | .unwrap(); |
| 43 | } |
| 44 | |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 45 | #[no_mangle] |
| 46 | pub unsafe extern "C" fn Java_com_supwisdom_dlsmk_DLSMKQrCode_decode( |
| 47 | env: JNIEnv, |
| 48 | _: JClass, |
| 49 | key_hex: JString, |
| 50 | qrcode: JString, |
| 51 | offset: jlong, |
| 52 | result: JObject, |
| 53 | ) -> jboolean { |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 54 | let key = { |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 55 | let s = env |
| 56 | .get_string(key_hex) |
| 57 | .expect("invalid key string") |
| 58 | .as_ptr(); |
| 59 | let keylen = libc::strlen(s); |
| 60 | let mut k = Vec::new(); |
| 61 | k.extend_from_slice(slice::from_raw_parts(s as *const u8, keylen)); |
| 62 | k |
| 63 | }; |
| 64 | |
| 65 | let qrcode = { |
| 66 | let s = env |
| 67 | .get_string(qrcode) |
| 68 | .expect("invalid qrcode string") |
| 69 | .as_ptr(); |
| 70 | let qrlen = libc::strlen(s); |
| 71 | let mut q = Vec::new(); |
| 72 | q.extend_from_slice(slice::from_raw_parts(s as *const u8, qrlen)); |
| 73 | q |
| 74 | }; |
| 75 | |
| 76 | let qrdata = env.get_map(result).expect("invalid qrdata map"); |
| 77 | |
| 78 | let key = { |
| 79 | let mut k = [0u8; 32]; |
| 80 | if let Ok(v) = hex::decode(key.as_slice()) { |
| 81 | k.clone_from_slice(v.as_slice()); |
| 82 | k |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 83 | } else { |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 84 | put_data( |
| 85 | &env, |
| 86 | &qrdata, |
| 87 | "error", |
| 88 | "key must be hex format and 64 characters", |
| 89 | ); |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 90 | return JNI_FALSE; |
| 91 | } |
| 92 | }; |
| 93 | |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 94 | let decode = match DaliQrCode::new(key, None, None, None, None) { |
| 95 | Ok(d) => d, |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 96 | Err(e) => { |
| 97 | let s = format!("invalid input parameter {:?}", e); |
| 98 | put_data(&env, &qrdata, "error", &s); |
| 99 | return JNI_FALSE; |
| 100 | } |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 101 | }; |
| 102 | |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 103 | match decode.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) { |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 104 | Ok(d) => { |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 105 | qrdata |
| 106 | .put( |
| 107 | *env.new_string("cardno").unwrap(), |
| 108 | *env.new_string(d.cardno).unwrap(), |
| 109 | ) |
| 110 | .unwrap(); |
| 111 | qrdata |
| 112 | .put( |
| 113 | *env.new_string("cardtype").unwrap(), |
| 114 | *env.new_string(d.cardtype).unwrap(), |
| 115 | ) |
| 116 | .unwrap(); |
| 117 | qrdata |
| 118 | .put( |
| 119 | *env.new_string("uid").unwrap(), |
| 120 | *env.new_string(d.uid).unwrap(), |
| 121 | ) |
| 122 | .unwrap(); |
| 123 | return JNI_TRUE; |
| 124 | } |
| 125 | Err(e) => { |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 126 | let s = format!("{:?}", e); |
| 127 | put_data(&env, &qrdata, "error", &s); |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 128 | return JNI_FALSE; |
Tang Cheng | 8d07250 | 2020-10-31 22:02:25 +0800 | [diff] [blame^] | 129 | } |
Tang Cheng | 8864389 | 2020-10-31 22:00:07 +0800 | [diff] [blame] | 130 | }; |
| 131 | } |
| 132 | } |