From b15a242665ea97151201af966837b9855ec4b541 Mon Sep 17 00:00:00 2001 From: ori raisfeld Date: Wed, 24 Apr 2024 21:51:37 +0300 Subject: [PATCH] aaaaahhhhhhhhh --- src-tauri/Cargo.lock | 148 ++++++++++++++++++ src-tauri/Cargo.toml | 1 + src-tauri/src/data/json.rs | 1 + src-tauri/src/fs/utilities.rs | 15 +- src-tauri/src/main.rs | 2 +- .../apps/image_viewer/image_viewer.tsx | 10 +- .../apps/text_viewer/text_viewer.tsx | 2 +- 7 files changed, 172 insertions(+), 7 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 5f6f24a..8dbf5d4 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -9,6 +9,7 @@ dependencies = [ "base64 0.13.1", "dirs", "embed-resource", + "image", "once_cell", "rust-crypto", "serde", @@ -135,6 +136,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -456,6 +463,12 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -640,6 +653,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + [[package]] name = "embed-resource" version = "2.4.1" @@ -685,6 +704,22 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "exr" +version = "1.71.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.0.1" @@ -732,6 +767,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -987,6 +1031,16 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.28.1" @@ -1153,6 +1207,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "half" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +dependencies = [ + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1297,7 +1360,13 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", + "exr", + "gif", + "jpeg-decoder", "num-traits", + "png", + "qoi", + "tiff", ] [[package]] @@ -1395,6 +1464,15 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + [[package]] name = "js-sys" version = "0.3.68" @@ -1435,6 +1513,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.153" @@ -2029,6 +2113,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + [[package]] name = "quick-xml" version = "0.31.0" @@ -2172,6 +2265,26 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "rdrand" version = "0.4.0" @@ -2573,6 +2686,15 @@ dependencies = [ "system-deps 5.0.0", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2988,6 +3110,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.1.45" @@ -3488,6 +3621,12 @@ dependencies = [ "windows-metadata", ] +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "winapi" version = "0.3.9" @@ -3894,3 +4033,12 @@ dependencies = [ "linux-raw-sys", "rustix", ] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index fe12605..0557fb7 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -21,6 +21,7 @@ rust-crypto ="*" serde_json = "1" dirs = "*" once_cell = "*" +image = "*" [features] # This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! diff --git a/src-tauri/src/data/json.rs b/src-tauri/src/data/json.rs index bddd3a7..40ab960 100644 --- a/src-tauri/src/data/json.rs +++ b/src-tauri/src/data/json.rs @@ -75,6 +75,7 @@ pub fn gather_type(file: &str) -> &str { if file_extension.is_none(){return "Unknown";} match file_extension.unwrap(){ "png" => {return "Image"} + "jpg" => {return "Image"} "txt" => {return "Text"} "html" => {return "HTML"} "mp4" => {return "Video"} diff --git a/src-tauri/src/fs/utilities.rs b/src-tauri/src/fs/utilities.rs index 6c2b0f3..38347b4 100644 --- a/src-tauri/src/fs/utilities.rs +++ b/src-tauri/src/fs/utilities.rs @@ -2,6 +2,7 @@ use std::fs::read_dir; use std::path::PathBuf; use dirs::data_dir; pub use base64::{decode_config, encode_config, URL_SAFE}; +use serde_json::Value; pub use tauri::Runtime; use crate::data::auth::{init_dir, Encodable}; use crate::data::json::init_user_data; @@ -37,6 +38,19 @@ pub fn bytes_to_string(bytes: Vec) -> Result { else {return Ok(result.unwrap());} } +#[tauri::command] +pub fn image_to_string(bytes: Vec) -> Result<(String, String), Value> { + let reader = image::io::Reader::new(std::io::Cursor::new(bytes)); + let reader = reader.with_guessed_format(); + if reader.is_err(){return Err(Value::Null)} + let reader = reader.unwrap(); + let format = reader.format(); + let result = reader.decode(); + if result.is_err() || format.is_none() {return Err(Value::Null)} + let result = base64::encode(result.unwrap().as_bytes()); + return Ok((result, format.unwrap().to_mime_type().to_string())); +} + #[test] fn test_general(){ let name = "test"; @@ -53,7 +67,6 @@ pub fn first_init(app: tauri::AppHandle, window: tauri::Window unsafe{FS.init_fs()}; Ok(()) } - #[tauri::command] pub fn console(value: String) {println!("{}", value)} #[tauri::command] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index ebffce0..c7699fd 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -12,6 +12,6 @@ fn main() { tauri::Builder::default().invoke_handler(tauri::generate_handler![ first_init, console, user_get, authenticate_user, save_user, user_exists, load_user, ls, pwd, cd, create_user, read_file, create_value, mkdir, system_get, system_make, user_make, close_app, mk, upload_file, cd_back, rm, file_exists, gather_type, - bytes_to_string + bytes_to_string, image_to_string ]).run(tauri::generate_context!()).expect("failed to run the code"); } diff --git a/src/pages/main_page/internal_apps/apps/image_viewer/image_viewer.tsx b/src/pages/main_page/internal_apps/apps/image_viewer/image_viewer.tsx index 5f75038..617befe 100644 --- a/src/pages/main_page/internal_apps/apps/image_viewer/image_viewer.tsx +++ b/src/pages/main_page/internal_apps/apps/image_viewer/image_viewer.tsx @@ -10,18 +10,20 @@ export default function image_viewer(file_selected: string | null) : AppInterfac if (file_selected == null) {return;} let name: string = await invoke('system_get', {key: 'name'}); let password: string = await invoke('system_get', {key: 'password'}); - let bytes: string = await invoke('read_file', {name, password,file: file_selected}); + let bytes = await invoke('read_file', {name, password,file: file_selected}); if (bytes == null) {return;} - set_image(bytes); + let data: [string, string] = await invoke('image_to_string', {bytes: bytes}); + let data_blob = new Blob([data[0]], {type: data[1]}); + let url = URL.createObjectURL(data_blob); + set_image(url); } let context_menu =
let html =
- {/*for now, this is readonly, cause it would take a while to remake this as a text editor*/}
- let [screen, set_display, fullscreen] = App(html, 'text editor'); + let [screen, set_display, fullscreen] = App(html, 'image viewer'); return {screen, set_display, fullscreen, context_menu, update}; } \ No newline at end of file diff --git a/src/pages/main_page/internal_apps/apps/text_viewer/text_viewer.tsx b/src/pages/main_page/internal_apps/apps/text_viewer/text_viewer.tsx index b3fbf6e..a631cae 100644 --- a/src/pages/main_page/internal_apps/apps/text_viewer/text_viewer.tsx +++ b/src/pages/main_page/internal_apps/apps/text_viewer/text_viewer.tsx @@ -24,6 +24,6 @@ export default function text_viewer(file_selected: string | null) : AppInterface - let [screen, set_display, fullscreen] = App(html, 'text editor'); + let [screen, set_display, fullscreen] = App(html, 'text viewer'); return {screen, set_display, fullscreen, context_menu, update}; } \ No newline at end of file