diff --git a/src/client.rs b/src/client.rs index 9ebdbc22..cccdcee3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -9,6 +9,9 @@ mod merge_known_chunks; mod http_client; pub use http_client::*; +mod remote_chunk_reader; +pub use remote_chunk_reader::*; + mod pxar_backup_stream; pub use pxar_backup_stream::*; diff --git a/src/client/remote_chunk_reader.rs b/src/client/remote_chunk_reader.rs new file mode 100644 index 00000000..f32a8d87 --- /dev/null +++ b/src/client/remote_chunk_reader.rs @@ -0,0 +1,41 @@ +use failure::*; +use futures::future::Future; +use std::sync::Arc; + +use super::BackupReader; +use crate::backup::{ReadChunk, DataChunk, CryptConfig}; + +/// Read chunks from remote host using ``BackupReader`` +pub struct RemoteChunkReader { + client: Arc, + crypt_config: Option>, +} + +impl RemoteChunkReader { + + pub fn new(client: Arc, crypt_config: Option>) -> Self { + Self { client, crypt_config } + } +} + +impl ReadChunk for RemoteChunkReader { + + fn read_chunk(&mut self, digest:&[u8; 32]) -> Result, Error> { + + let digest_str = proxmox::tools::digest_to_hex(digest); + + let writer = Vec::with_capacity(4*1024*1024); + + let chunk_data = self.client.download_chunk(&digest, writer).wait()?; + + let chunk = DataChunk::from_raw(chunk_data, *digest)?; + chunk.verify_crc()?; + + let raw_data = match self.crypt_config { + Some(ref crypt_config) => chunk.decode(Some(crypt_config))?, + None => chunk.decode(None)?, + }; + + Ok(raw_data) + } +}