refactor: Use new do_or_abort_file method
This commit is contained in:
parent
e23f676c40
commit
405d923d9d
1 changed files with 22 additions and 42 deletions
64
src/write.rs
64
src/write.rs
|
@ -579,7 +579,7 @@ impl<W: Write + Seek> Write for ZipWriter<W> {
|
||||||
if self.stats.bytes_written > spec::ZIP64_BYTES_THR
|
if self.stats.bytes_written > spec::ZIP64_BYTES_THR
|
||||||
&& !self.files.last_mut().unwrap().1.large_file
|
&& !self.files.last_mut().unwrap().1.large_file
|
||||||
{
|
{
|
||||||
self.abort_file().unwrap();
|
let _ = self.abort_file();
|
||||||
return Err(io::Error::new(
|
return Err(io::Error::new(
|
||||||
io::ErrorKind::Other,
|
io::ErrorKind::Other,
|
||||||
"Large file option has not been set",
|
"Large file option has not been set",
|
||||||
|
@ -739,10 +739,7 @@ impl<A: Read + Write + Seek> ZipWriter<A> {
|
||||||
|
|
||||||
self.writing_to_file = true;
|
self.writing_to_file = true;
|
||||||
self.writing_raw = true;
|
self.writing_raw = true;
|
||||||
if let Err(e) = self.write_all(©) {
|
self.do_or_abort_file(|| self.write_all(©))?;
|
||||||
self.abort_file().unwrap();
|
|
||||||
return Err(e.into());
|
|
||||||
}
|
|
||||||
self.finish_file()
|
self.finish_file()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -845,6 +842,14 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
&self.comment
|
&self.comment
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn do_or_abort_file<T, R: Into<ZipResult<T>>, F: FnOnce() -> R>(&mut self, method: F) -> ZipResult<T> {
|
||||||
|
let result = method();
|
||||||
|
if result.is_err() {
|
||||||
|
let _ = self.abort_file();
|
||||||
|
}
|
||||||
|
result.into()
|
||||||
|
}
|
||||||
|
|
||||||
/// Start a new file for with the requested options.
|
/// Start a new file for with the requested options.
|
||||||
fn start_entry<S, SToOwned, T: FileOptionExtension>(
|
fn start_entry<S, SToOwned, T: FileOptionExtension>(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
@ -910,21 +915,7 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
let index = self.insert_file_data(file)?;
|
let index = self.insert_file_data(file)?;
|
||||||
let file = &mut self.files[index];
|
let file = &mut self.files[index];
|
||||||
let writer = self.inner.get_plain();
|
let writer = self.inner.get_plain();
|
||||||
|
self.do_or_abort_file(|| file.local_block()?.write(writer))?;
|
||||||
let block = match file.local_block() {
|
|
||||||
Ok(block) => block,
|
|
||||||
Err(e) => {
|
|
||||||
let _ = self.abort_file();
|
|
||||||
return Err(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
match block.write(writer) {
|
|
||||||
Ok(()) => (),
|
|
||||||
Err(e) => {
|
|
||||||
let _ = self.abort_file();
|
|
||||||
return Err(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// file name
|
// file name
|
||||||
writer.write_all(&file.file_name_raw)?;
|
writer.write_all(&file.file_name_raw)?;
|
||||||
let zip64_start = writer.stream_position()?;
|
let zip64_start = writer.stream_position()?;
|
||||||
|
@ -955,21 +946,19 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
}
|
}
|
||||||
let extra_data_len = extra_data.len();
|
let extra_data_len = extra_data.len();
|
||||||
if extra_data_len > 0 {
|
if extra_data_len > 0 {
|
||||||
writer.write_all(&extra_data)?;
|
self.do_or_abort_file(|| {
|
||||||
extra_data_end = writer.stream_position()?;
|
writer.write_all(&extra_data)?;
|
||||||
debug_assert_eq!(extra_data_end % (options.alignment.max(1) as u64), 0);
|
extra_data_end = writer.stream_position()?;
|
||||||
self.stats.start = extra_data_end;
|
debug_assert_eq!(extra_data_end % (options.alignment.max(1) as u64), 0);
|
||||||
ExtendedFileOptions::validate_extra_data(&extra_data, header_end - zip64_start)?;
|
self.stats.start = extra_data_end;
|
||||||
|
ExtendedFileOptions::validate_extra_data(&extra_data, header_end - zip64_start)
|
||||||
|
})?;
|
||||||
file.extra_field = Some(extra_data.into());
|
file.extra_field = Some(extra_data.into());
|
||||||
} else {
|
} else {
|
||||||
self.stats.start = extra_data_end;
|
self.stats.start = extra_data_end;
|
||||||
}
|
}
|
||||||
if let Some(data) = central_extra_data {
|
if let Some(data) = central_extra_data {
|
||||||
let validation_result = ExtendedFileOptions::validate_extra_data(&data, extra_data_end - zip64_start);
|
self.do_or_abort_file(|| ExtendedFileOptions::validate_extra_data(&data, extra_data_end - zip64_start))?;
|
||||||
if validation_result.is_err() {
|
|
||||||
self.abort_file()?;
|
|
||||||
return validation_result;
|
|
||||||
}
|
|
||||||
file.central_extra_field = Some(data.clone());
|
file.central_extra_field = Some(data.clone());
|
||||||
}
|
}
|
||||||
debug_assert!(file.data_start.get().is_none());
|
debug_assert!(file.data_start.get().is_none());
|
||||||
|
@ -1062,10 +1051,7 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
writer.seek(SeekFrom::Start(file_end))?;
|
writer.seek(SeekFrom::Start(file_end))?;
|
||||||
}
|
}
|
||||||
if self.flush_on_finish_file {
|
if self.flush_on_finish_file {
|
||||||
if let Err(e) = writer.flush() {
|
self.do_or_abort_file(|| writer.flush())?;
|
||||||
self.abort_file()?;
|
|
||||||
return Err(e.into());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.writing_to_file = false;
|
self.writing_to_file = false;
|
||||||
|
@ -1142,10 +1128,7 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
options.zopfli_buffer_size,
|
options.zopfli_buffer_size,
|
||||||
)?;
|
)?;
|
||||||
self.start_entry(name, options, None)?;
|
self.start_entry(name, options, None)?;
|
||||||
if let Err(e) = self.inner.switch_to(make_new_self) {
|
self.do_or_abort_file(|| self.inner.switch_to(make_new_self))?;
|
||||||
self.abort_file().unwrap();
|
|
||||||
return Err(e);
|
|
||||||
}
|
|
||||||
self.writing_raw = false;
|
self.writing_raw = false;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -1421,10 +1404,7 @@ impl<W: Write + Seek> ZipWriter<W> {
|
||||||
|
|
||||||
self.start_entry(name, options, None)?;
|
self.start_entry(name, options, None)?;
|
||||||
self.writing_to_file = true;
|
self.writing_to_file = true;
|
||||||
if let Err(e) = self.write_all(target.into().as_bytes()) {
|
self.do_or_abort_file(|| self.write_all(target.into().as_bytes()))?;
|
||||||
self.abort_file().unwrap();
|
|
||||||
return Err(e.into());
|
|
||||||
}
|
|
||||||
self.writing_raw = false;
|
self.writing_raw = false;
|
||||||
self.finish_file()?;
|
self.finish_file()?;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue