Skip to content

Commit

Permalink
fix!: Corrected types
Browse files Browse the repository at this point in the history
  • Loading branch information
Le0X8 committed Jul 31, 2024
1 parent 9cce56e commit 09f79b1
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 142 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = 'acridotheres_core'
version = '0.1.0'
version = '0.1.1'
edition = '2021'

[lib]
Expand Down
120 changes: 63 additions & 57 deletions src/file.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::{
cmp::min,
fs::{FileTimes, OpenOptions},
io::{Read, Seek, Write},
time::SystemTime,
mem::drop
};

use chrono::{DateTime, Utc};
Expand All @@ -15,73 +15,78 @@ pub struct Times {
}

#[derive(Debug)]
pub struct FileReader<'a> {
path: &'a str,
pub struct FileReader {
path: String,
file: std::fs::File,
pos: u64,
}

impl<'a> FileReader<'a> {
pub fn new(path: &'a str) -> Self {
impl<'a> FileReader {
pub fn new(path: &'a String) -> Self {
let mut file = OpenOptions::new().read(true).open(path).unwrap();
file.rewind().unwrap();

Self { path, file, pos: 0 }
Self { path: path.to_owned(), file, pos: 0 }
}

pub fn close(self) {
self.file.sync_all().unwrap();
drop(self);
}

pub fn export(
&mut self,
offset: u64,
len: u64,
offset: &u64,
len: &u64,
target: &mut FileWriter,
modified: DateTime<Utc>,
buffer_size: u64,
modified: &DateTime<Utc>,
buffer_size: &u64,
) {
let pos_before = self.get_position();
self.seek(offset);
let mut buf = vec![0; buffer_size as usize];
let mut remaining = len;
let mut buf = vec![0; *buffer_size as usize];
let mut remaining = *len;

while remaining > 0 {
let to_read = min(buffer_size as u64, remaining) as usize;
let to_read = min(*buffer_size as u64, remaining) as usize;
let read = self.read(&mut buf[..to_read]);
target.write(read);
remaining -= to_read as u64;
}

let time = FileTimes::new().set_modified(modified.into());
target.set_times(time);
let time = FileTimes::new().set_modified(modified.to_owned().into());
target.set_times(&time);

self.seek(pos_before);
self.seek(&pos_before);
}

pub fn get_times(&self) -> Times {
let metadata = self.file.metadata().unwrap();
Times {
created: metadata
.created()
.unwrap_or_else(|_| SystemTime::now())
.unwrap_or_else(|_| metadata.modified().unwrap().into())
.into(),
accessed: metadata.accessed().unwrap().into(),
modified: metadata.modified().unwrap().into(),
}
}

pub fn get_path(&self) -> &str {
self.path
pub fn get_path(&self) -> &String {
&self.path
}

pub fn seek(&mut self, pos: u64) {
self.file.seek(std::io::SeekFrom::Start(pos)).unwrap();
self.pos = pos;
pub fn seek(&mut self, pos: &u64) {
self.file.seek(std::io::SeekFrom::Start(*pos)).unwrap();
self.pos = *pos;
}

pub fn rewind(&mut self) {
self.seek(0);
self.seek(&0);
}

pub fn jump(&mut self, offset: i128) {
self.seek((self.pos as i128 + offset) as u64);
pub fn jump(&mut self, offset: &i128) {
self.seek(&((self.pos as i128 + offset) as u64));
}

pub fn get_position(&self) -> u64 {
Expand All @@ -98,14 +103,14 @@ impl<'a> FileReader<'a> {
buf
}

pub fn read_utf8(&mut self, len: u64) -> String {
let mut buf = vec![0; len as usize];
pub fn read_utf8(&mut self, len: &u64) -> String {
let mut buf = vec![0; *len as usize];
self.read(&mut buf);
String::from_utf8(buf).unwrap()
}

pub fn read_u8array(&mut self, len: u64) -> Vec<u8> {
let mut buf = vec![0; len as usize];
pub fn read_u8array(&mut self, len: &u64) -> Vec<u8> {
let mut buf = vec![0; *len as usize];
self.read(&mut buf);
buf
}
Expand Down Expand Up @@ -166,15 +171,15 @@ impl<'a> FileReader<'a> {
}

#[derive(Debug)]
pub struct FileWriter<'a> {
path: &'a str,
pub struct FileWriter {
path: String,
file: std::fs::File,
pos: u64,
}

impl<'a> FileWriter<'a> {
pub fn new(path: &'a str, append: bool) -> Self {
if append {
impl<'a> FileWriter {
pub fn new(path: &'a String, append: &bool) -> Self {
if *append {
let mut file = OpenOptions::new()
.write(true)
.create(true)
Expand All @@ -183,7 +188,7 @@ impl<'a> FileWriter<'a> {
.unwrap();
file.rewind().unwrap();
return Self {
path,
path: path.to_owned(),
pos: file.metadata().unwrap().len(),
file,
};
Expand All @@ -196,32 +201,33 @@ impl<'a> FileWriter<'a> {
.unwrap();
file.rewind().unwrap();

Self { path, file, pos: 0 }
Self { path: path.to_owned(), file, pos: 0 }
}

pub fn close(&mut self) {
pub fn close(self) {
self.file.sync_all().unwrap();
drop(self);
}

pub fn set_times(&self, times: FileTimes) {
self.file.set_times(times).unwrap();
pub fn set_times(&self, times: &FileTimes) {
self.file.set_times(*times).unwrap();
}

pub fn get_path(&self) -> &str {
self.path
pub fn get_path(&self) -> &String {
&self.path
}

pub fn seek(&mut self, pos: u64) {
self.file.seek(std::io::SeekFrom::Start(pos)).unwrap();
self.pos = pos;
pub fn seek(&mut self, pos: &u64) {
self.file.seek(std::io::SeekFrom::Start(*pos)).unwrap();
self.pos = *pos;
}

pub fn rewind(&mut self) {
self.seek(0);
self.seek(&0);
}

pub fn jump(&mut self, offset: i128) {
self.seek((self.pos as i128 + offset) as u64);
pub fn jump(&mut self, offset: &i128) {
self.seek(&((self.pos as i128 + offset) as u64));
}

pub fn get_position(&self) -> u64 {
Expand All @@ -237,47 +243,47 @@ impl<'a> FileWriter<'a> {
self.pos += buf.len() as u64;
}

pub fn write_utf8(&mut self, s: &str) {
pub fn write_utf8(&mut self, s: &String) {
self.write(s.as_bytes());
}

pub fn write_u8array(&mut self, buf: &Vec<u8>) {
self.write(buf.as_slice());
}

pub fn write_u8(&mut self, n: u8) {
pub fn write_u8(&mut self, n: &u8) {
self.write(&n.to_le_bytes());
}

pub fn write_u16le(&mut self, n: u16) {
pub fn write_u16le(&mut self, n: &u16) {
self.write(&n.to_le_bytes());
}

pub fn write_u16be(&mut self, n: u16) {
pub fn write_u16be(&mut self, n: &u16) {
self.write(&n.to_be_bytes());
}

pub fn write_u32le(&mut self, n: u32) {
pub fn write_u32le(&mut self, n: &u32) {
self.write(&n.to_le_bytes());
}

pub fn write_u32be(&mut self, n: u32) {
pub fn write_u32be(&mut self, n: &u32) {
self.write(&n.to_be_bytes());
}

pub fn write_u64le(&mut self, n: u64) {
pub fn write_u64le(&mut self, n: &u64) {
self.write(&n.to_le_bytes());
}

pub fn write_u64be(&mut self, n: u64) {
pub fn write_u64be(&mut self, n: &u64) {
self.write(&n.to_be_bytes());
}

pub fn write_u128le(&mut self, n: u128) {
pub fn write_u128le(&mut self, n: &u128) {
self.write(&n.to_le_bytes());
}

pub fn write_u128be(&mut self, n: u128) {
pub fn write_u128be(&mut self, n: &u128) {
self.write(&n.to_be_bytes());
}
}
32 changes: 16 additions & 16 deletions src/formats/zip/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,25 @@ pub fn metadata<'a>(file: &mut FileReader) -> ZipArchiveMetadata<'a> {
}

pub fn get_file(file: &mut FileReader, entry: &ZipFileEntry) -> Vec<u8> {
file.seek(entry.file.offset);
file.read_u8array(entry.uncompressed_size as u64)
file.seek(&entry.file.offset);
file.read_u8array(&(entry.uncompressed_size as u64))
}

pub fn extract(
file: &mut FileReader,
entries: &Vec<ZipFileEntry>,
buffer_size: u64,
buffer_size: &u64,
path_rewriter: &dyn Fn(&str) -> String,
) {
for entry in entries {
let path = path_rewriter(&entry.file.path);
if !entry.file.is_directory {
let mut target = FileWriter::new(&path, false);
let mut target = FileWriter::new(&path, &false);
file.export(
entry.file.offset,
entry.file.size,
&entry.file.offset,
&entry.file.size,
&mut target,
entry.file.modified,
&entry.file.modified.into(),
buffer_size,
);
} else {
Expand Down Expand Up @@ -86,17 +86,17 @@ fn read_local_files<'a>(file: &mut FileReader) -> (Vec<ZipFileEntry<'a>>, u32) {
let lastmod_time = file.read_u16le();
let lastmod_date = file.read_u16le();
let crc32 = file.read_u32le();
let size_compressed = file.read_u32le();
let size_compressed = file.read_u32le() as i128;
let size_uncompressed = file.read_u32le();
let name_length = file.read_u16le();
let extra_length = file.read_u16le();
let name = file.read_utf8(name_length as u64);
let extra = file.read_u8array(extra_length as u64);
let name_length = file.read_u16le() as u64;
let extra_length = file.read_u16le() as u64;
let name = file.read_utf8(&name_length);
let extra = file.read_u8array(&extra_length);
files.push(ZipFileEntry {
file: FileEntry {
offset: file.get_position(),
size: size_compressed as u64,
modified: msdos::parse(lastmod_date, lastmod_time),
modified: msdos::parse(&lastmod_date, &lastmod_time).into(),
is_directory: name.ends_with('/'),
path: name,
},
Expand All @@ -107,14 +107,14 @@ fn read_local_files<'a>(file: &mut FileReader) -> (Vec<ZipFileEntry<'a>>, u32) {
checksum: crc32,
extra_field: extra,
});
file.jump(size_compressed as i128);
file.jump(&size_compressed);
signature = file.read_u32le();
}

(files, signature)
}

pub fn check_integrity(source: &mut FileReader, file: &ZipFileEntry, buffer_size: u64) -> bool {
let hash = crc32::hash(source, file.file.offset, file.file.size, buffer_size);
pub fn check_integrity(source: &mut FileReader, file: &ZipFileEntry, buffer_size: &u64) -> bool {
let hash = crc32::hash(source, &file.file.offset, &file.file.size, buffer_size);
hash == file.checksum
}
Loading

0 comments on commit 09f79b1

Please sign in to comment.