#![allow(dead_code)]
#![cfg(feature = "std")]
use crate::{
common::common::{QRC_SYSTEM_MAX_PATH, QRC_SYSTEM_OS_WINDOWS},
tools::{
intutils::qrc_intutils_clear_string,
stringutils::{
qrc_stringutils_copy_string, qrc_stringutils_reverse_sub_string,
qrc_stringutils_string_size,
},
},
};
use std::io::{
Read, Result, Seek,
SeekFrom::{Current, End, Start},
Write,
};
use std::{
fs::File,
fs::{metadata, remove_file},
};
pub const QRC_FILEUTILS_CHUNK_SIZE: usize = 4096;
pub const QRC_FILEUTILS_MAX_EXTENSION: usize = 16;
pub const QRC_FILEUTILS_MAX_FILENAME: usize = QRC_SYSTEM_MAX_PATH;
pub const QRC_FILEUTILS_MAX_PATH: usize = QRC_SYSTEM_MAX_PATH;
pub const QRC_FILEUTILS_DIRECTORY_SEPERATOR: &str = if QRC_SYSTEM_OS_WINDOWS { "\\" } else { "/" };
#[derive(PartialEq)]
pub enum QrcFileutilsMode {
QrcFileutilsModeNone = 0,
QrcFileutilsModeRead = 1,
QrcFileutilsModeReadUpdate = 2,
QrcFileutilsModeWrite = 3,
QrcFileutilsModeWriteUpdate = 4,
QrcFileutilsModeAppend = 5,
QrcFileutilsModeAppendUpdate = 6,
}
pub fn qrc_fileutils_copy_file_to_stream(path: &str, stream: &mut [u8]) -> usize {
let mut file = match File::open(path) {
Ok(file) => file,
Err(_) => return 0,
};
match file.read(stream) {
Ok(len) => len,
Err(_) => 0,
}
}
pub fn qrc_fileutils_copy_stream_to_file(path: &str, stream: &[u8]) -> bool {
match File::create(path) {
Ok(mut fp) => {
if let Err(_) = fp.write_all(stream) {
return false;
}
true
}
Err(_) => false,
}
}
pub fn qrc_fileutils_delete(path: &str) -> bool {
match remove_file(path) {
Ok(_) => return true,
Err(_) => return false,
};
}
pub fn qrc_fileutils_get_directory(directory: &mut String, dirlen: usize, path: &str) -> usize {
let mut pos = 0;
if dirlen > 0 {
qrc_intutils_clear_string(directory);
let pname = qrc_stringutils_reverse_sub_string(path, &QRC_FILEUTILS_DIRECTORY_SEPERATOR);
if qrc_stringutils_string_size(&pname) != 0 {
pos = qrc_stringutils_string_size(path) - qrc_stringutils_string_size(&pname);
if pos > 0 {
qrc_stringutils_copy_string(directory, pos, &path[..pos]);
}
}
}
return pos;
}
pub fn qrc_fileutils_get_extension(extension: &mut String, extlen: usize, path: &str) -> usize {
let mut len = 0;
let mut pos = 0;
if extlen > 0 {
qrc_intutils_clear_string(extension);
let pname = qrc_stringutils_reverse_sub_string(path, ".");
if qrc_stringutils_string_size(&pname) != 0 {
pos = qrc_stringutils_string_size(path) - qrc_stringutils_string_size(&pname) - 1;
len = qrc_stringutils_string_size(path);
if pos > 0 && extlen >= (len - pos) {
qrc_stringutils_copy_string(extension, len - pos, &path[pos..]);
}
}
}
return len - pos;
}
pub fn qrc_fileutils_get_name(name: &mut String, namelen: usize, path: &str) -> usize {
let mut len = 0;
let mut pos = 0;
if namelen > 0 {
qrc_intutils_clear_string(name);
let pname = qrc_stringutils_reverse_sub_string(path, &QRC_FILEUTILS_DIRECTORY_SEPERATOR);
if qrc_stringutils_string_size(&pname) != 0 {
len = qrc_stringutils_string_size(path);
pos = len - qrc_stringutils_string_size(&pname);
let pext = qrc_stringutils_reverse_sub_string(path, ".");
if qrc_stringutils_string_size(&pext) != 0 {
let elen = (len - qrc_stringutils_string_size(&pext)) - 1;
let slice_len = len - (pos + (len - elen));
if pos > 0 && namelen >= slice_len {
qrc_stringutils_copy_string(name, slice_len, &path[pos..elen]);
}
}
}
}
return len - pos;
}
pub fn qrc_fileutils_get_size(path: &str) -> usize {
let mut res = 0;
if qrc_stringutils_string_size(path) != 0 {
res = File::open(path).unwrap().metadata().unwrap().len() as usize;
}
return res;
}
pub fn qrc_fileutils_exists(path: &str) -> bool {
return metadata(path).is_ok();
}
pub fn qrc_fileutils_open(path: &str, mode: QrcFileutilsMode) -> Option<File> {
let mut read = false;
let mut write = false;
let mut truncate = false;
let mut append = false;
let mut create = false;
if mode == QrcFileutilsMode::QrcFileutilsModeRead {
read = true;
} else if mode == QrcFileutilsMode::QrcFileutilsModeReadUpdate {
read = true;
write = true;
} else if mode == QrcFileutilsMode::QrcFileutilsModeWrite {
write = true;
truncate = true;
create = true;
} else if mode == QrcFileutilsMode::QrcFileutilsModeWriteUpdate {
read = true;
write = true;
truncate = true;
create = true;
} else if mode == QrcFileutilsMode::QrcFileutilsModeAppend {
write = true;
append = true;
create = true;
} else {
read = true;
write = true;
append = true;
create = true;
}
return Some(
File::options()
.read(read)
.write(write)
.truncate(truncate)
.append(append)
.create(create)
.open(path)
.unwrap(),
);
}
pub fn qrc_fileutils_read(
output: &mut [u8],
outlen: usize,
position: usize,
fp: &mut File,
) -> Result<usize> {
qrc_fileutils_seekto(fp, position)?;
fp.read(&mut output[..outlen])
}
pub fn qrc_fileutils_seekto(fp: &mut File, position: usize) -> Result<()> {
return fp.seek(Start(position as u64)).map(|_| ());
}
pub fn qrc_fileutils_truncate_file(fp: &mut File, length: usize) -> bool {
let mut res = false;
fp.seek(End(0)).unwrap();
let flen = fp.seek(Current(0)).unwrap() as usize;
if length < flen {
if fp.set_len(length as u64).is_ok() {
res = true;
}
}
return res;
}
pub fn qrc_fileutils_valid_path(path: &str) -> bool {
let dir = &mut String::with_capacity(QRC_FILEUTILS_MAX_PATH);
let ext = &mut String::with_capacity(QRC_FILEUTILS_MAX_EXTENSION);
let name = &mut String::with_capacity(QRC_FILEUTILS_MAX_FILENAME);
let mut res = false;
if qrc_fileutils_get_directory(dir, QRC_FILEUTILS_MAX_PATH, path) > 0 {
if qrc_fileutils_get_name(name, QRC_FILEUTILS_MAX_EXTENSION, path) > 0 {
if qrc_fileutils_get_extension(ext, QRC_FILEUTILS_MAX_FILENAME, path) > 0 {
res = true;
}
}
}
return res;
}
pub fn qrc_fileutils_write(
input: &[u8],
inlen: usize,
position: usize,
fp: &mut File,
) -> Result<usize> {
qrc_fileutils_seekto(fp, position)?;
fp.write(&input[..inlen])
}