From 98f011673e7adfc6c110fe044a1b3dc9b021263c Mon Sep 17 00:00:00 2001 From: Igor Katson Date: Mon, 14 Oct 2024 15:06:47 +0100 Subject: [PATCH] iter_file_details_ext update impl --- crates/librqbit/src/session.rs | 6 ++--- crates/librqbit/src/storage/filesystem/fs.rs | 1 + crates/librqbit_core/src/torrent_metainfo.rs | 28 +++++++++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index c96137e..5418982 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -1144,10 +1144,10 @@ impl Session { .iter_file_details_ext(&lengths)? .map(|fd| { Ok::<_, anyhow::Error>(FileInfo { - relative_filename: fd.filename.to_pathbuf()?, - offset_in_torrent: fd.offset, + relative_filename: fd.details.filename.to_pathbuf()?, + offset_in_torrent: fd.details.offset, piece_range: fd.pieces, - len: fd.len, + len: fd.details.len, }) }) .collect::>>()?; diff --git a/crates/librqbit/src/storage/filesystem/fs.rs b/crates/librqbit/src/storage/filesystem/fs.rs index e9de475..e2e6076 100644 --- a/crates/librqbit/src/storage/filesystem/fs.rs +++ b/crates/librqbit/src/storage/filesystem/fs.rs @@ -154,6 +154,7 @@ impl TorrentStorage for FilesystemStorage { for file_details in meta.info.iter_file_details_ext(&meta.lengths)? { let mut full_path = self.output_folder.clone(); let relative_path = file_details + .details .filename .to_pathbuf() .context("error converting file to path")?; diff --git a/crates/librqbit_core/src/torrent_metainfo.rs b/crates/librqbit_core/src/torrent_metainfo.rs index d4b7445..8a5bc0d 100644 --- a/crates/librqbit_core/src/torrent_metainfo.rs +++ b/crates/librqbit_core/src/torrent_metainfo.rs @@ -182,12 +182,23 @@ where pub struct FileDetails<'a, BufType> { pub filename: FileIteratorName<'a, BufType>, + // absolute offset in torrent if it was a flat blob of bytes pub offset: u64, pub len: u64, + + // bep-47 + pub attr: Option, + pub sha1: Option, + pub symlink_path: Option>, +} + +pub struct FileDetailsExt<'a, BufType> { + pub details: FileDetails<'a, BufType>, + // the pieces that contain this file pub pieces: std::ops::Range, } -impl<'a, BufType> FileDetails<'a, BufType> { +impl<'a, BufType> FileDetailsExt<'a, BufType> { pub fn pieces_usize(&self) -> std::ops::Range { self.pieces.start as usize..self.pieces.end as usize } @@ -243,17 +254,22 @@ impl> TorrentMetaV1Info { pub fn iter_file_details_ext<'a>( &'a self, lengths: &'a Lengths, - ) -> anyhow::Result> + 'a> { + ) -> anyhow::Result> + 'a> { Ok(self .iter_filenames_and_lengths()? .scan(0u64, |acc_offset, (filename, len)| { let offset = *acc_offset; *acc_offset += len; - Some(FileDetails { - filename, + Some(FileDetailsExt { + details: FileDetails { + filename, + offset, + len, + attr: None, + sha1: None, + symlink_path: None, + }, pieces: lengths.iter_pieces_within_offset(offset, len), - offset, - len, }) })) }