use std::env; use std::io::{Cursor, Seek, Read}; use std::path::{Components, Path, PathBuf}; use flate2::read::GzDecoder; use tar::Archive; use crate::system_dirs::get_local_data_directory; use crate::ftp::{self, ftp_get_size}; use crate::util; fn check_java(version: u8) -> bool { let dir = get_local_data_directory().join("java").join(format!("java-{}-{}", version, if env::consts::OS == "windows" { "win" } else {"lin"})); dir.exists() } pub fn install_java(version: u8) { if check_java(version) { return; } let ftp_dir = PathBuf::new().join("java").join(format!("java-{}-{}", version, if env::consts::OS == "windows" { "win.zip" } else {"lin.tar.gz"})); let mut buff = Cursor::new(vec![]); let mut total: usize = 0; let size = ftp_get_size(ftp_dir.clone()).unwrap(); ftp::ftp_retr(ftp_dir, &mut buff, |data| util::download_callback(data, &mut total, size)).unwrap(); std::fs::create_dir_all(get_local_data_directory().join("java").join(format!("java-{}-{}", version, if env::consts::OS == "windows" { "win" } else {"lin"}))).unwrap(); buff.rewind().unwrap(); if env::consts::OS != "windows" { let tar = GzDecoder::new(buff); let mut archive = Archive::new(tar); if !unpack_archive(archive, get_local_data_directory().join("java").join(format!("java-{}-lin", version))).is_ok() { std::fs::remove_dir_all(get_local_data_directory().join("java").join(format!("java-{}-lin", version))).unwrap(); } } else { if !zip_extract::extract(buff, get_local_data_directory().join("java").join(format!("java-{}-win", version)).as_path(), true).is_ok() { std::fs::remove_dir_all(get_local_data_directory().join("java").join(format!("java-{}-win", version))).unwrap(); } } } fn unpack_archive(mut archive: Archive, dst: PathBuf) -> Result<(), Box> { for file in archive.entries()? { let path = PathBuf::new().join(dst.clone()); let mut file = file?; let file_path = file.path()?; let mut file_path = file_path.components(); let _ = file_path.next(); let file_path = file_path.as_path(); file.unpack(path.join(file_path))?; } Ok(()) }