Merge pull request #2151 from Heap-Hop/send_raw_bug

fix: sending file from local to remote (keep send_raw)
This commit is contained in:
RustDesk 2022-11-16 20:26:40 +08:00 committed by GitHub
commit 6dc817b9b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 26 additions and 31 deletions

View File

@ -380,7 +380,7 @@ impl TransferJob {
} }
} }
pub async fn write(&mut self, block: FileTransferBlock, raw: Option<&[u8]>) -> ResultType<()> { pub async fn write(&mut self, block: FileTransferBlock) -> ResultType<()> {
if block.id != self.id { if block.id != self.id {
bail!("Wrong id"); bail!("Wrong id");
} }
@ -402,20 +402,15 @@ impl TransferJob {
let path = format!("{}.download", get_string(&path)); let path = format!("{}.download", get_string(&path));
self.file = Some(File::create(&path).await?); self.file = Some(File::create(&path).await?);
} }
let data = if let Some(data) = raw {
data
} else {
&block.data
};
if block.compressed { if block.compressed {
let tmp = decompress(data); let tmp = decompress(&block.data);
self.file.as_mut().unwrap().write_all(&tmp).await?; self.file.as_mut().unwrap().write_all(&tmp).await?;
self.finished_size += tmp.len() as u64; self.finished_size += tmp.len() as u64;
} else { } else {
self.file.as_mut().unwrap().write_all(data).await?; self.file.as_mut().unwrap().write_all(&block.data).await?;
self.finished_size += data.len() as u64; self.finished_size += block.data.len() as u64;
} }
self.transferred += data.len() as u64; self.transferred += block.data.len() as u64;
Ok(()) Ok(())
} }

View File

@ -915,13 +915,8 @@ impl<T: InvokeUiSession> Remote<T> {
} }
} }
Some(file_response::Union::Block(block)) => { Some(file_response::Union::Block(block)) => {
log::info!(
"file response block, file id:{}, file num: {}",
block.id,
block.file_num
);
if let Some(job) = fs::get_job(block.id, &mut self.write_jobs) { if let Some(job) = fs::get_job(block.id, &mut self.write_jobs) {
if let Err(_err) = job.write(block, None).await { if let Err(_err) = job.write(block).await {
// to-do: add "skip" for writing job // to-do: add "skip" for writing job
} }
self.update_jobs_status(); self.update_jobs_status();

View File

@ -1629,7 +1629,8 @@ async fn start_ipc(
file_num, file_num,
data, data,
compressed}) = data { compressed}) = data {
stream.send(&Data::FS(ipc::FS::WriteBlock{id, file_num, data, compressed})).await?; stream.send(&Data::FS(ipc::FS::WriteBlock{id, file_num, data: Bytes::new(), compressed})).await?;
stream.send_raw(data).await?;
} else { } else {
stream.send(&data).await?; stream.send(&data).await?;
} }

View File

@ -1,3 +1,5 @@
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
use std::iter::FromIterator;
#[cfg(windows)] #[cfg(windows)]
use std::sync::Arc; use std::sync::Arc;
use std::{ use std::{
@ -8,8 +10,6 @@ use std::{
RwLock, RwLock,
}, },
}; };
#[cfg(any(target_os = "android", target_os = "ios", feature = "flutter"))]
use std::iter::FromIterator;
#[cfg(windows)] #[cfg(windows)]
use clipboard::{cliprdr::CliprdrClientContext, empty_clipboard, set_conn_enabled, ContextSend}; use clipboard::{cliprdr::CliprdrClientContext, empty_clipboard, set_conn_enabled, ContextSend};
@ -343,8 +343,15 @@ impl<T: InvokeUiCM> IpcTaskRunner<T> {
Data::ChatMessage { text } => { Data::ChatMessage { text } => {
self.cm.new_message(self.conn_id, text); self.cm.new_message(self.conn_id, text);
} }
Data::FS(fs) => { Data::FS(mut fs) => {
handle_fs(fs, &mut write_jobs, &self.tx).await; if let ipc::FS::WriteBlock { id, file_num, data: _, compressed } = fs {
if let Ok(bytes) = self.stream.next_raw().await {
fs = ipc::FS::WriteBlock{id, file_num, data:bytes.into(), compressed};
handle_fs(fs, &mut write_jobs, &self.tx).await;
}
} else {
handle_fs(fs, &mut write_jobs, &self.tx).await;
}
} }
#[cfg(windows)] #[cfg(windows)]
Data::ClipbaordFile(_clip) => { Data::ClipbaordFile(_clip) => {
@ -597,16 +604,13 @@ async fn handle_fs(fs: ipc::FS, write_jobs: &mut Vec<fs::TransferJob>, tx: &Unbo
} => { } => {
if let Some(job) = fs::get_job(id, write_jobs) { if let Some(job) = fs::get_job(id, write_jobs) {
if let Err(err) = job if let Err(err) = job
.write( .write(FileTransferBlock {
FileTransferBlock { id,
id, file_num,
file_num, data,
data, compressed,
compressed, ..Default::default()
..Default::default() })
},
None,
)
.await .await
{ {
send_raw(fs::new_error(id, err, file_num), &tx); send_raw(fs::new_error(id, err, file_num), &tx);