use std::sync::LazyLock;
use super::{Handle, HandleStore};
use crate::fitz::cookie::Cookie;
pub static COOKIES: LazyLock<HandleStore<Cookie>> = LazyLock::new(HandleStore::new);
#[unsafe(no_mangle)]
pub extern "C" fn fz_new_cookie(_ctx: Handle) -> Handle {
let cookie = Cookie::new();
COOKIES.insert(cookie)
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_keep_cookie(_ctx: Handle, cookie: Handle) -> Handle {
cookie
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_drop_cookie(_ctx: Handle, cookie: Handle) {
COOKIES.remove(cookie);
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_should_abort(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return if guard.should_abort() { 1 } else { 0 };
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_abort(_ctx: Handle, cookie: Handle) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.abort();
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_reset_abort(_ctx: Handle, cookie: Handle) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.reset_abort();
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_get_progress(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return guard.progress();
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_set_progress(_ctx: Handle, cookie: Handle, value: i32) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.set_progress(value);
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_inc_progress(_ctx: Handle, cookie: Handle) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.inc_progress();
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_get_progress_max(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return guard.progress_max();
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_set_progress_max(_ctx: Handle, cookie: Handle, value: i32) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.set_progress_max(value);
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_get_errors(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return guard.errors();
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_inc_errors(_ctx: Handle, cookie: Handle) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.inc_errors();
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_is_incomplete(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return if guard.is_incomplete() { 1 } else { 0 };
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_set_incomplete(_ctx: Handle, cookie: Handle, value: i32) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.set_incomplete(value != 0);
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_progress_percent(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return guard.progress_percent() as i32;
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_reset(_ctx: Handle, cookie: Handle) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.reset();
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_set_errors(_ctx: Handle, cookie: Handle, count: i32) {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
guard.set_error(count);
}
}
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_has_errors(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
return if guard.errors() > 0 { 1 } else { 0 };
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_progress_float(_ctx: Handle, cookie: Handle) -> f32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
let prog = guard.progress();
let max = guard.progress_max();
if max > 0 {
return prog as f32 / max as f32;
}
}
}
0.0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_is_complete(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
let prog = guard.progress();
let max = guard.progress_max();
if max > 0 && prog >= max {
return 1;
}
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_progress_remaining(_ctx: Handle, cookie: Handle) -> i32 {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
let prog = guard.progress();
let max = guard.progress_max();
if max > prog {
return max - prog;
}
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_clone_cookie(_ctx: Handle, cookie: Handle) -> Handle {
if let Some(c) = COOKIES.get(cookie) {
if let Ok(guard) = c.lock() {
let new_cookie = Cookie::new();
new_cookie.set_progress(guard.progress());
new_cookie.set_progress_max(guard.progress_max());
new_cookie.set_error(guard.errors());
new_cookie.set_incomplete(guard.is_incomplete());
if guard.should_abort() {
new_cookie.abort();
}
return COOKIES.insert(new_cookie);
}
}
0
}
#[unsafe(no_mangle)]
pub extern "C" fn fz_cookie_is_valid(_ctx: Handle, cookie: Handle) -> i32 {
if COOKIES.get(cookie).is_some() { 1 } else { 0 }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_cookie() {
let cookie = fz_new_cookie(0);
assert_ne!(cookie, 0);
fz_drop_cookie(0, cookie);
}
#[test]
fn test_abort() {
let cookie = fz_new_cookie(0);
assert_eq!(fz_cookie_should_abort(0, cookie), 0);
fz_cookie_abort(0, cookie);
assert_eq!(fz_cookie_should_abort(0, cookie), 1);
fz_cookie_reset_abort(0, cookie);
assert_eq!(fz_cookie_should_abort(0, cookie), 0);
fz_drop_cookie(0, cookie);
}
#[test]
fn test_progress() {
let cookie = fz_new_cookie(0);
fz_cookie_set_progress_max(0, cookie, 100);
assert_eq!(fz_cookie_get_progress(0, cookie), 0);
assert_eq!(fz_cookie_progress_percent(0, cookie), 0);
fz_cookie_set_progress(0, cookie, 50);
assert_eq!(fz_cookie_get_progress(0, cookie), 50);
assert_eq!(fz_cookie_progress_percent(0, cookie), 50);
fz_cookie_inc_progress(0, cookie);
assert_eq!(fz_cookie_get_progress(0, cookie), 51);
fz_drop_cookie(0, cookie);
}
#[test]
fn test_errors() {
let cookie = fz_new_cookie(0);
assert_eq!(fz_cookie_get_errors(0, cookie), 0);
fz_cookie_inc_errors(0, cookie);
assert_eq!(fz_cookie_get_errors(0, cookie), 1);
fz_cookie_inc_errors(0, cookie);
assert_eq!(fz_cookie_get_errors(0, cookie), 2);
fz_drop_cookie(0, cookie);
}
#[test]
fn test_incomplete() {
let cookie = fz_new_cookie(0);
assert_eq!(fz_cookie_is_incomplete(0, cookie), 0);
fz_cookie_set_incomplete(0, cookie, 1);
assert_eq!(fz_cookie_is_incomplete(0, cookie), 1);
fz_cookie_set_incomplete(0, cookie, 0);
assert_eq!(fz_cookie_is_incomplete(0, cookie), 0);
fz_drop_cookie(0, cookie);
}
#[test]
fn test_reset() {
let cookie = fz_new_cookie(0);
fz_cookie_abort(0, cookie);
fz_cookie_set_progress(0, cookie, 50);
fz_cookie_set_progress_max(0, cookie, 100);
fz_cookie_inc_errors(0, cookie);
fz_cookie_set_incomplete(0, cookie, 1);
fz_cookie_reset(0, cookie);
assert_eq!(fz_cookie_should_abort(0, cookie), 0);
assert_eq!(fz_cookie_get_progress(0, cookie), 0);
assert_eq!(fz_cookie_get_progress_max(0, cookie), 0);
assert_eq!(fz_cookie_get_errors(0, cookie), 0);
assert_eq!(fz_cookie_is_incomplete(0, cookie), 0);
fz_drop_cookie(0, cookie);
}
#[test]
fn test_invalid_cookie() {
assert_eq!(fz_cookie_should_abort(0, 9999), 0);
assert_eq!(fz_cookie_get_progress(0, 9999), 0);
assert_eq!(fz_cookie_get_errors(0, 9999), 0);
fz_cookie_abort(0, 9999);
fz_cookie_set_progress(0, 9999, 50);
}
}