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