mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-07-08 01:31:53 +08:00
Add detect support for pfs
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
use crate::ext::io::*;
|
use crate::ext::io::*;
|
||||||
use crate::scripts::base::*;
|
use crate::scripts::base::*;
|
||||||
|
use crate::try_option;
|
||||||
use crate::types::*;
|
use crate::types::*;
|
||||||
use crate::utils::struct_pack::*;
|
use crate::utils::struct_pack::*;
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
@@ -302,6 +303,16 @@ impl<T: Read + Seek> Seek for Entry<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn detect_script_type(buf: &[u8], buf_len: usize, filename: &str) -> Option<ScriptType> {
|
||||||
|
if buf_len >= 5 && buf.starts_with(b"ASB\0\0") {
|
||||||
|
return Some(ScriptType::ArtemisAsb);
|
||||||
|
}
|
||||||
|
if super::super::ast::is_this_format(filename, buf, buf_len) {
|
||||||
|
return Some(ScriptType::Artemis);
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
struct ArtemisArcIter<'a, T: Iterator<Item = &'a PfsEntryHeader>, R: Read + Seek + 'static> {
|
struct ArtemisArcIter<'a, T: Iterator<Item = &'a PfsEntryHeader>, R: Read + Seek + 'static> {
|
||||||
entries: T,
|
entries: T,
|
||||||
reader: Arc<Mutex<R>>,
|
reader: Arc<Mutex<R>>,
|
||||||
@@ -315,13 +326,17 @@ impl<'a, T: Iterator<Item = &'a PfsEntryHeader>, R: Read + Seek + 'static> Itera
|
|||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
if let Some(header) = self.entries.next() {
|
if let Some(header) = self.entries.next() {
|
||||||
let entry = Entry {
|
let mut entry = Entry {
|
||||||
header: header.clone(),
|
header: header.clone(),
|
||||||
reader: self.reader.clone(),
|
reader: self.reader.clone(),
|
||||||
pos: 0,
|
pos: 0,
|
||||||
script_type: None,
|
script_type: None,
|
||||||
xor_key: self.xor_key.clone(),
|
xor_key: self.xor_key.clone(),
|
||||||
};
|
};
|
||||||
|
let mut header = [0; 0x20];
|
||||||
|
let readed = try_option!(entry.read(&mut header));
|
||||||
|
entry.pos = 0;
|
||||||
|
entry.script_type = detect_script_type(&header, readed, &entry.header.name);
|
||||||
Some(Ok(Box::new(entry)))
|
Some(Ok(Box::new(entry)))
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|||||||
@@ -400,3 +400,8 @@ impl Script for AstScript {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_this_format(_filename: &str, buf: &[u8], buf_len: usize) -> bool {
|
||||||
|
let parser = parser::Parser::new(&buf[..buf_len], Encoding::Utf8);
|
||||||
|
parser.try_parse_header().is_ok()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user