| 385 | } |
| 386 | |
| 387 | pub async fn write(&mut self, block: FileTransferBlock) -> ResultType<()> { |
| 388 | if block.id != self.id { |
| 389 | bail!("Wrong id"); |
| 390 | } |
| 391 | let file_num = block.file_num as usize; |
| 392 | if file_num >= self.files.len() { |
| 393 | bail!("Wrong file number"); |
| 394 | } |
| 395 | if file_num != self.file_num as usize || self.file.is_none() { |
| 396 | self.modify_time(); |
| 397 | if let Some(file) = self.file.as_mut() { |
| 398 | file.sync_all().await?; |
| 399 | } |
| 400 | self.file_num = block.file_num; |
| 401 | let entry = &self.files[file_num]; |
| 402 | let path = self.join(&entry.name); |
| 403 | if let Some(p) = path.parent() { |
| 404 | std::fs::create_dir_all(p).ok(); |
| 405 | } |
| 406 | let path = format!("{}.download", get_string(&path)); |
| 407 | self.file = Some(File::create(&path).await?); |
| 408 | } |
| 409 | if block.compressed { |
| 410 | let tmp = decompress(&block.data); |
| 411 | self.file |
| 412 | .as_mut() |
| 413 | .ok_or(anyhow!("file is None"))? |
| 414 | .write_all(&tmp) |
| 415 | .await?; |
| 416 | self.finished_size += tmp.len() as u64; |
| 417 | } else { |
| 418 | self.file |
| 419 | .as_mut() |
| 420 | .ok_or(anyhow!("file is None"))? |
| 421 | .write_all(&block.data) |
| 422 | .await?; |
| 423 | self.finished_size += block.data.len() as u64; |
| 424 | } |
| 425 | self.transferred += block.data.len() as u64; |
| 426 | Ok(()) |
| 427 | } |
| 428 | |
| 429 | #[inline] |
| 430 | pub fn join(&self, name: &str) -> PathBuf { |