55 lines
2.2 KiB
Rust
55 lines
2.2 KiB
Rust
|
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<T: Read>(mut archive: Archive<T>, dst: PathBuf) -> Result<(), Box<dyn std::error::Error>> {
|
||
|
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(())
|
||
|
}
|