Update progress when checking incoming media too

This commit is contained in:
RumovZ 2022-04-22 21:22:56 +02:00
parent 6eb8aa0987
commit 8c1a4d0cdd
2 changed files with 33 additions and 6 deletions

View file

@ -32,20 +32,41 @@ pub(super) struct MediaUseMap {
unchecked: Vec<SafeMediaEntry>, unchecked: Vec<SafeMediaEntry>,
} }
struct ProgressHandler<F: FnMut(usize) -> Result<()>> {
progress_fn: F,
counter: usize,
}
impl<F: FnMut(usize) -> Result<()>> ProgressHandler<F> {
fn new(progress_fn: F) -> Self {
Self {
progress_fn,
counter: 0,
}
}
fn increment(&mut self) -> Result<()> {
self.counter += 1;
if self.counter % 17 == 0 {
(self.progress_fn)(self.counter)
} else {
Ok(())
}
}
}
impl Context<'_> { impl Context<'_> {
pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> { pub(super) fn prepare_media(&mut self) -> Result<MediaUseMap> {
let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok(); let progress_fn = |u| (&mut self.progress_fn)(ImportProgress::MediaCheck(u)).is_ok();
let existing_sha1s = self.target_col.all_existing_sha1s(progress_fn)?; let existing_sha1s = self.target_col.all_existing_sha1s(progress_fn)?;
prepare_media(&mut self.archive, &existing_sha1s) prepare_media(&mut self.archive, &existing_sha1s, &mut self.progress_fn)
} }
pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> { pub(super) fn copy_media(&mut self, media_map: &mut MediaUseMap) -> Result<()> {
let mut counter = 0; let mut progress =
ProgressHandler::new(|u| (&mut self.progress_fn)(ImportProgress::Media(u)));
for entry in media_map.used_entries() { for entry in media_map.used_entries() {
counter += 1; progress.increment()?;
if counter % 10 == 0 {
(self.progress_fn)(ImportProgress::Media(counter))?;
}
entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?; entry.copy_from_archive(&mut self.archive, &self.target_col.media_folder)?;
} }
Ok(()) Ok(())
@ -65,9 +86,14 @@ impl Collection {
fn prepare_media( fn prepare_media(
archive: &mut ZipArchive<File>, archive: &mut ZipArchive<File>,
existing_sha1s: &HashMap<String, [u8; 20]>, existing_sha1s: &HashMap<String, [u8; 20]>,
progress_fn: &mut impl FnMut(ImportProgress) -> Result<()>,
) -> Result<MediaUseMap> { ) -> Result<MediaUseMap> {
let mut media_map = MediaUseMap::default(); let mut media_map = MediaUseMap::default();
let mut progress = ProgressHandler::new(|u| progress_fn(ImportProgress::MediaCheck(u)));
for mut entry in extract_media_entries(&Meta::new_legacy(), archive)? { for mut entry in extract_media_entries(&Meta::new_legacy(), archive)? {
progress.increment()?;
if entry.is_static() { if entry.is_static() {
if !existing_sha1s.contains_key(&entry.name) { if !existing_sha1s.contains_key(&entry.name) {
media_map.unchecked.push(entry); media_map.unchecked.push(entry);

View file

@ -40,6 +40,7 @@ impl Collection {
path: impl AsRef<Path>, path: impl AsRef<Path>,
progress_fn: &mut ProgressFn, progress_fn: &mut ProgressFn,
) -> Result<OpOutput<NoteLog>> { ) -> Result<OpOutput<NoteLog>> {
progress_fn(ImportProgress::Collection)?;
let file = File::open(path)?; let file = File::open(path)?;
let archive = ZipArchive::new(file)?; let archive = ZipArchive::new(file)?;