feat: file transfer, resume (#12626)

Signed-off-by: fufesou <linlong1266@gmail.com>
This commit is contained in:
fufesou
2025-08-25 14:34:03 +08:00
committed by GitHub
parent 9e22f9639a
commit f4fb31d7a1
19 changed files with 88 additions and 37 deletions

View File

@@ -704,6 +704,7 @@ impl<T: InvokeUiSession> Remote<T> {
if is_remote {
if let Some(job) = get_job(id, &mut self.write_jobs) {
job.is_last_job = false;
job.is_resume = true;
allow_err!(
peer.send(&fs::new_send(
id,
@@ -718,12 +719,13 @@ impl<T: InvokeUiSession> Remote<T> {
} else {
if let Some(job) = get_job(id, &mut self.read_jobs) {
match &job.data_source {
fs::DataSource::FilePath(p) => {
fs::DataSource::FilePath(_p) => {
job.is_last_job = false;
job.is_resume = true;
allow_err!(
peer.send(&fs::new_receive(
id,
p.to_string_lossy().to_string(),
job.remote.clone(),
job.file_num,
job.files.clone(),
job.total_size(),
@@ -771,7 +773,8 @@ impl<T: InvokeUiSession> Remote<T> {
Some(file_transfer_send_confirm_request::Union::Skip(true))
},
..Default::default()
});
})
.await;
}
} else {
if let Some(job) = fs::get_job(id, &mut self.write_jobs) {
@@ -790,7 +793,7 @@ impl<T: InvokeUiSession> Remote<T> {
},
..Default::default()
};
job.confirm(&req);
job.confirm(&req).await;
file_action.set_send_confirm(req);
msg.set_file_action(file_action);
allow_err!(peer.send(&msg).await);
@@ -1471,14 +1474,21 @@ impl<T: InvokeUiSession> Remote<T> {
if let fs::DataSource::FilePath(p) = &job.data_source {
let read_path =
get_string(&fs::TransferJob::join(p, &file.name));
let overwrite_strategy =
let mut overwrite_strategy =
job.default_overwrite_strategy();
let mut offset = 0;
if digest.is_identical && job.is_resume {
if digest.transferred_size > 0 {
overwrite_strategy = Some(true);
offset = digest.transferred_size as _;
}
}
if let Some(overwrite) = overwrite_strategy {
let req = FileTransferSendConfirmRequest {
id: digest.id,
file_num: digest.file_num,
union: Some(if overwrite {
file_transfer_send_confirm_request::Union::OffsetBlk(0)
file_transfer_send_confirm_request::Union::OffsetBlk(offset)
} else {
file_transfer_send_confirm_request::Union::Skip(
true,
@@ -1486,7 +1496,7 @@ impl<T: InvokeUiSession> Remote<T> {
}),
..Default::default()
};
job.confirm(&req);
job.confirm(&req).await;
let msg = new_send_confirm(req);
allow_err!(peer.send(&msg).await);
} else {
@@ -1507,25 +1517,40 @@ impl<T: InvokeUiSession> Remote<T> {
if let fs::DataSource::FilePath(p) = &job.data_source {
let write_path =
get_string(&fs::TransferJob::join(p, &file.name));
let overwrite_strategy =
job.default_overwrite_strategy();
job.set_digest(digest.file_size, digest.last_modified);
let peer_ver = self.handler.lc.read().unwrap().version;
let is_support_resume =
crate::is_support_file_transfer_resume_num(
peer_ver,
);
match fs::is_write_need_confirmation(
is_support_resume && job.is_resume,
&write_path,
&digest,
) {
Ok(res) => match res {
DigestCheckResult::IsSame => {
let req = FileTransferSendConfirmRequest {
id: digest.id,
file_num: digest.file_num,
union: Some(file_transfer_send_confirm_request::Union::Skip(true)),
..Default::default()
};
job.confirm(&req);
id: digest.id,
file_num: digest.file_num,
union: Some(file_transfer_send_confirm_request::Union::Skip(true)),
..Default::default()
};
job.confirm(&req).await;
let msg = new_send_confirm(req);
allow_err!(peer.send(&msg).await);
}
DigestCheckResult::NeedConfirm(digest) => {
let mut overwrite_strategy =
job.default_overwrite_strategy();
let mut offset = 0;
if digest.is_identical
&& job.is_resume
&& digest.transferred_size > 0
{
overwrite_strategy = Some(true);
offset = digest.transferred_size as _;
}
if let Some(overwrite) = overwrite_strategy
{
let req =
@@ -1533,13 +1558,13 @@ impl<T: InvokeUiSession> Remote<T> {
id: digest.id,
file_num: digest.file_num,
union: Some(if overwrite {
file_transfer_send_confirm_request::Union::OffsetBlk(0)
file_transfer_send_confirm_request::Union::OffsetBlk(offset)
} else {
file_transfer_send_confirm_request::Union::Skip(true)
}),
..Default::default()
};
job.confirm(&req);
job.confirm(&req).await;
let msg = new_send_confirm(req);
allow_err!(peer.send(&msg).await);
} else {
@@ -1559,7 +1584,7 @@ impl<T: InvokeUiSession> Remote<T> {
union: Some(file_transfer_send_confirm_request::Union::OffsetBlk(0)),
..Default::default()
};
job.confirm(&req);
job.confirm(&req).await;
let msg = new_send_confirm(req);
allow_err!(peer.send(&msg).await);
}
@@ -1906,7 +1931,7 @@ impl<T: InvokeUiSession> Remote<T> {
},
Some(file_action::Union::SendConfirm(c)) => {
if let Some(job) = fs::get_job(c.id, &mut self.read_jobs) {
job.confirm(&c);
job.confirm(&c).await;
}
}
_ => {}