Skip to content

Commit 476dc4e

Browse files
committed
Implemented TEST command.
1 parent cfa6d95 commit 476dc4e

File tree

6 files changed

+118
-14
lines changed

6 files changed

+118
-14
lines changed

crates/dizbase/src/file_base/mod.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,6 @@ impl FileBase {
140140
let header = if let Some(index) = self.name_map.get(&file_name).clone() {
141141
if self.file_headers[*index].metadata_offset() == u64::MAX {
142142
let res = self.create_header(*index, &path);
143-
self.save()?;
144143
return res;
145144
}
146145
&self.file_headers[*index]
@@ -204,25 +203,28 @@ impl FileBase {
204203

205204
pub fn get_hash(path: &Path) -> crate::Result<u64> {
206205
let data = fs::read(&path)?;
207-
Ok(XxHash3_64::oneshot(&data))
206+
let hash = XxHash3_64::oneshot(&data);
207+
Ok(hash)
208208
}
209209

210210
fn create_header(&mut self, index: usize, path: &Path) -> crate::Result<Vec<MetadataHeader>> {
211211
match scan_file(&path) {
212212
Ok(meta_data) => {
213213
let metadata_file_name = self.meta_data_path.with_extension(extensions::FILE_METADATA);
214+
let md_len = if let Ok(md) = fs::metadata(&metadata_file_name) { md.len() } else { 0 };
214215
let Ok(mut file) = OpenOptions::new().append(true).create(true).open(&metadata_file_name) else {
215216
log::error!("Error opening metadata file: {}", metadata_file_name.display());
216217
return Err(FileBaseError::CantOpenMetadata.into());
217218
};
218-
self.file_headers[index].metadata_offset = file.seek(std::io::SeekFrom::Current(0))?;
219+
self.file_headers[index].metadata_offset = md_len;
219220
file.write(&[meta_data.len() as u8])?;
220221
for meta in &meta_data {
221222
file.write(&[meta.get_type().to_data()])?;
222223
let len = meta.data.len() as u32;
223224
file.write(&len.to_le_bytes())?;
224225
file.write(&meta.data)?;
225226
}
227+
self.save()?;
226228
Ok(meta_data)
227229
}
228230
Err(err) => {
@@ -265,7 +267,7 @@ impl FileBase {
265267
for _ in 0..size {
266268
reader.read_exact(&mut data)?;
267269
let metadata_type = MetadataType::from_data(data[0]);
268-
let data_len = u32::from_le_bytes(data[1..].try_into().unwrap()) as usize;
270+
let data_len = u32::from_le_bytes(data[1..5].try_into().unwrap()) as usize;
269271

270272
let mut data = vec![0; data_len];
271273
reader.read_exact(&mut data)?;

crates/dizbase/src/file_base_scanner/mod.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,26 @@ use icy_sauce::SauceInformation;
99
use unrar::Archive;
1010

1111
use crate::file_base::{
12-
FileBase, FileBaseError,
12+
FileBase,
1313
metadata::{MetadataHeader, MetadataType},
1414
};
1515
pub mod repack;
1616

1717
pub mod bbstro_fingerprint;
1818

1919
pub fn scan_file(path: &Path) -> crate::Result<Vec<MetadataHeader>> {
20-
let Some(extension) = path.extension() else {
21-
return Err(FileBaseError::NoExtension.into());
22-
};
23-
let extension = extension.to_string_lossy().to_uppercase();
24-
2520
let mut info = Vec::new();
2621
let hash = FileBase::get_hash(path)?;
2722
info.push(MetadataHeader {
2823
metadata_type: MetadataType::Hash,
2924
data: hash.to_le_bytes().to_vec(),
3025
});
3126

27+
let Some(extension) = path.extension() else {
28+
return Ok(info);
29+
};
30+
let extension = extension.to_string_lossy().to_uppercase();
31+
3232
match extension.as_str() {
3333
"ZIP" => scan_zip(info, &path),
3434
"LHA" | "LZH" => scan_lha(info, path),
3.79 KB
Binary file not shown.

crates/icbsetup/src/tabs/general/msg_networking/qwk.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ impl QwkSettings {
2626
cfg_entry_text!("qwk_bbs_city_and_state", label_width, 25, qwk_settings, bbs_city_and_state, lock),
2727
cfg_entry_text!("qwk_bbs_phone_number", label_width, 25, qwk_settings, bbs_phone_number, lock),
2828
cfg_entry_text!("qwk_bbs_sysop_name", label_width, 25, qwk_settings, bbs_sysop_name, lock),
29-
cfg_entry_text!("qwk_bbs_id", label_width, 25, qwk_settings, bbs_id, lock),
29+
cfg_entry_text!("qwk_bbs_id", label_width, 8, qwk_settings, bbs_id, lock),
3030
ConfigEntry::Separator,
3131
ConfigEntry::Label(get_text("qwk_files_label")),
3232
cfg_entry_path!("qwk_welcome_screen", label_width, qwk_settings, welcome_screen, lock),
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,110 @@
1-
use crate::{Res, icy_board::state::IcyBoardState};
1+
use dizbase::file_base::{FileBase, metadata::MetadataType};
2+
use regex::Regex;
3+
4+
use crate::{
5+
Res,
6+
icy_board::{
7+
commands::CommandType,
8+
icb_text::IceText,
9+
state::{
10+
IcyBoardState,
11+
functions::{MASK_ASCII, display_flags},
12+
},
13+
},
14+
};
215

316
impl IcyBoardState {
417
pub async fn test_file_command(&mut self) -> Res<()> {
5-
// TODO
18+
if self.session.current_conference.directories.is_none() || self.session.current_conference.directories.as_ref().unwrap().is_empty() {
19+
self.display_text(IceText::NoDirectoriesAvailable, display_flags::NEWLINE | display_flags::LFBEFORE)
20+
.await?;
21+
return Ok(());
22+
}
23+
let mut found = false;
24+
25+
while !found {
26+
let search_pattern = if let Some(token) = self.session.tokens.pop_front() {
27+
token
28+
} else {
29+
self.input_field(
30+
IceText::TestFileName,
31+
40,
32+
&MASK_ASCII,
33+
CommandType::TestFile.get_help(),
34+
None,
35+
display_flags::NEWLINE | display_flags::UPCASE | display_flags::LFBEFORE | display_flags::HIGHASCII,
36+
)
37+
.await?
38+
};
39+
if search_pattern.is_empty() {
40+
return Ok(());
41+
}
42+
43+
let Ok(search_regex) = Regex::new(&search_pattern) else {
44+
self.display_text(IceText::PunctuationError, display_flags::NEWLINE | display_flags::LFBEFORE)
45+
.await?;
46+
return Ok(());
47+
};
48+
49+
self.session.push_tokens(&"A");
50+
let dir_numbers = self.get_dir_numbers().await?;
51+
self.session.disp_options.no_change();
52+
for (_num, _desc, path, metadata) in dir_numbers.numbers {
53+
let Ok(base) = self.get_filebase(&path, &metadata).await else {
54+
continue;
55+
};
56+
let header_count = base.lock().await.len();
57+
for file in 0..header_count {
58+
let file_name = base.lock().await[file].name().to_string();
59+
if !search_regex.is_match(&file_name) {
60+
continue;
61+
}
62+
found = true;
63+
self.session.op_text = file_name;
64+
self.display_text(IceText::VerifyingFile, display_flags::DEFAULT).await?;
65+
let full_path = path.join(&self.session.op_text);
66+
if !full_path.exists() {
67+
log::error!("TEST: File not found: {:?}", full_path);
68+
self.display_text(IceText::Failed, display_flags::NEWLINE).await?;
69+
continue;
70+
}
71+
72+
let hash = base.lock().await.read_metadata(&full_path)?;
73+
let mut found_metadata = false;
74+
for data in hash {
75+
if data.metadata_type == MetadataType::Hash {
76+
found_metadata = true;
77+
let hash = u64::from_le_bytes(data.data.as_slice().try_into().unwrap());
78+
let current_hash = FileBase::get_hash(&full_path)?;
79+
if hash == current_hash {
80+
self.display_text(IceText::Passed, display_flags::NEWLINE).await?;
81+
} else {
82+
log::error!(
83+
"TEST: File hash invalid: {:?} {:08X} != {:08X}",
84+
full_path,
85+
hash,
86+
FileBase::get_hash(&full_path)?
87+
);
88+
self.display_text(IceText::Failed, display_flags::NEWLINE).await?;
89+
}
90+
break;
91+
}
92+
}
93+
if !found_metadata {
94+
self.display_text(IceText::Passed, display_flags::NEWLINE).await?;
95+
}
96+
}
97+
98+
if self.session.disp_options.abort_printout {
99+
break;
100+
}
101+
}
102+
103+
if !found {
104+
self.session.op_text = search_pattern;
105+
self.display_text(IceText::NotFoundOnDisk, display_flags::NEWLINE).await?;
106+
}
107+
}
6108
Ok(())
7109
}
8110
}

docs/feature_parity.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ If something is missing just let me know.
8989
| BU/UB | Batch Upload | 0% |
9090
| RM | Read Message | 0% | Read remembered message
9191
| SELECT | Select Conference | 99% | Changes were needed due to message areas [^1]
92-
| TEST | Test File | 0% |
92+
| TEST | Test File | 💯 | Slight improvements - search for pattern
9393

9494
[^1]: PCBTEXT #586 changed to `Conference`,
9595
#587 changed to `# Name Flags`

0 commit comments

Comments
 (0)