From 11c8f98b4f8c542874066d67298a7bef3fefc9c5 Mon Sep 17 00:00:00 2001 From: Jackson Coxson Date: Sat, 18 Oct 2025 11:16:41 -0600 Subject: [PATCH] Add read_with_callback to AFC --- idevice/src/services/afc/file.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/idevice/src/services/afc/file.rs b/idevice/src/services/afc/file.rs index e9bc424..4ce7a4b 100644 --- a/idevice/src/services/afc/file.rs +++ b/idevice/src/services/afc/file.rs @@ -118,6 +118,35 @@ impl FileDescriptor<'_> { Ok(collected_bytes) } + pub async fn read_with_callback( + &mut self, + callback: impl Fn(((usize, usize), S)) -> Fut, + state: S, + ) -> Result, IdeviceError> + where + Fut: std::future::Future, + S: Clone, + { + let seek_pos = self.seek_tell().await? as usize; + let file_info = self.client.get_file_info(&self.path).await?; + let mut bytes_left = file_info.size.saturating_sub(seek_pos); + let mut collected_bytes = Vec::with_capacity(bytes_left); + + while bytes_left > 0 { + let mut header_payload = self.fd.to_le_bytes().to_vec(); + header_payload.extend_from_slice(&MAX_TRANSFER.to_le_bytes()); + let res = self + .send_packet(AfcOpcode::Read, header_payload, Vec::new()) + .await?; + + bytes_left -= res.payload.len(); + collected_bytes.extend(res.payload); + callback(((file_info.size - bytes_left, file_info.size), state.clone())).await; + } + + Ok(collected_bytes) + } + /// Writes data to the file /// /// # Arguments