blob: fa982de4433851b19d629830ff9ee9d0ee05e3de [file] [log] [blame]
Tang Cheng88643892020-10-31 22:00:07 +08001#[cfg(test)]
2mod 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)]
25pub mod android {
26 extern crate jni;
27
Tang Cheng8d072502020-10-31 22:02:25 +080028 use self::jni::objects::{JClass, JMap, JObject, JString};
Tang Cheng88643892020-10-31 22:00:07 +080029 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 Cheng8d072502020-10-31 22:02:25 +080037 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 Cheng88643892020-10-31 22:00:07 +080045 #[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 Cheng88643892020-10-31 22:00:07 +080054 let key = {
Tang Cheng8d072502020-10-31 22:02:25 +080055 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 Cheng88643892020-10-31 22:00:07 +080083 } else {
Tang Cheng8d072502020-10-31 22:02:25 +080084 put_data(
85 &env,
86 &qrdata,
87 "error",
88 "key must be hex format and 64 characters",
89 );
Tang Cheng88643892020-10-31 22:00:07 +080090 return JNI_FALSE;
91 }
92 };
93
Tang Cheng88643892020-10-31 22:00:07 +080094 let decode = match DaliQrCode::new(key, None, None, None, None) {
95 Ok(d) => d,
Tang Cheng8d072502020-10-31 22:02:25 +080096 Err(e) => {
97 let s = format!("invalid input parameter {:?}", e);
98 put_data(&env, &qrdata, "error", &s);
99 return JNI_FALSE;
100 }
Tang Cheng88643892020-10-31 22:00:07 +0800101 };
102
Tang Cheng8d072502020-10-31 22:02:25 +0800103 match decode.decode(qrcode.as_ptr(), qrcode.len(), offset as i32) {
Tang Cheng88643892020-10-31 22:00:07 +0800104 Ok(d) => {
Tang Cheng88643892020-10-31 22:00:07 +0800105 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 Cheng8d072502020-10-31 22:02:25 +0800126 let s = format!("{:?}", e);
127 put_data(&env, &qrdata, "error", &s);
Tang Cheng88643892020-10-31 22:00:07 +0800128 return JNI_FALSE;
Tang Cheng8d072502020-10-31 22:02:25 +0800129 }
Tang Cheng88643892020-10-31 22:00:07 +0800130 };
131 }
132}