fix: skip issue
This commit is contained in:
parent
cdecb3589a
commit
74b3cb1c58
@ -191,6 +191,7 @@ pub fn is_file_exists(file_path: &str) -> bool {
|
|||||||
return Path::new(file_path).exists();
|
return Path::new(file_path).exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
pub fn can_enable_overwrite_detection(version: i64) -> bool {
|
pub fn can_enable_overwrite_detection(version: i64) -> bool {
|
||||||
version >= get_version_number("1.2.0")
|
version >= get_version_number("1.2.0")
|
||||||
}
|
}
|
||||||
@ -525,14 +526,14 @@ impl TransferJob {
|
|||||||
match r.union {
|
match r.union {
|
||||||
Some(file_transfer_send_confirm_request::Union::skip(s)) => {
|
Some(file_transfer_send_confirm_request::Union::skip(s)) => {
|
||||||
if s {
|
if s {
|
||||||
log::info!("skip file id:{}, file_num:{}", r.id, r.file_num);
|
log::debug!("skip file id:{}, file_num:{}", r.id, r.file_num);
|
||||||
self.skip_current_file();
|
self.skip_current_file();
|
||||||
} else {
|
} else {
|
||||||
self.set_file_confirmed(true);
|
self.set_file_confirmed(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(file_transfer_send_confirm_request::Union::offset_blk(offset)) => {
|
Some(file_transfer_send_confirm_request::Union::offset_blk(offset)) => {
|
||||||
log::info!("file confirmed");
|
log::debug!("file confirmed");
|
||||||
self.set_file_confirmed(true);
|
self.set_file_confirmed(true);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@ -702,11 +703,17 @@ pub fn create_dir(dir: &str) -> ResultType<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum DigestCheckResult {
|
||||||
|
IsSame,
|
||||||
|
NeedConfirm(FileTransferDigest),
|
||||||
|
NoSuchFile,
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn is_write_need_confirmation(
|
pub fn is_write_need_confirmation(
|
||||||
file_path: &str,
|
file_path: &str,
|
||||||
digest: &FileTransferDigest,
|
digest: &FileTransferDigest,
|
||||||
) -> ResultType<Option<FileTransferDigest>> {
|
) -> ResultType<DigestCheckResult> {
|
||||||
let path = Path::new(file_path);
|
let path = Path::new(file_path);
|
||||||
if path.exists() && path.is_file() {
|
if path.exists() && path.is_file() {
|
||||||
let metadata = std::fs::metadata(path)?;
|
let metadata = std::fs::metadata(path)?;
|
||||||
@ -722,9 +729,9 @@ pub fn is_write_need_confirmation(
|
|||||||
metadata.len()
|
metadata.len()
|
||||||
);
|
);
|
||||||
if remote_mt == local_mt && digest.file_size == metadata.len() {
|
if remote_mt == local_mt && digest.file_size == metadata.len() {
|
||||||
return Ok(None);
|
return Ok(DigestCheckResult::IsSame);
|
||||||
}
|
}
|
||||||
Ok(Some(FileTransferDigest {
|
Ok(DigestCheckResult::NeedConfirm(FileTransferDigest {
|
||||||
id: digest.id,
|
id: digest.id,
|
||||||
file_num: digest.file_num,
|
file_num: digest.file_num,
|
||||||
last_edit_timestamp: local_mt.as_secs(),
|
last_edit_timestamp: local_mt.as_secs(),
|
||||||
@ -732,6 +739,6 @@ pub fn is_write_need_confirmation(
|
|||||||
..Default::default()
|
..Default::default()
|
||||||
}))
|
}))
|
||||||
} else {
|
} else {
|
||||||
Ok(None)
|
Ok(DigestCheckResult::NoSuchFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -275,7 +275,7 @@ impl Connection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ipc::Data::RawMessage(bytes) => {
|
ipc::Data::RawMessage(bytes) => {
|
||||||
conn.stream.send_raw(bytes).await;
|
allow_err!(conn.stream.send_raw(bytes).await);
|
||||||
}
|
}
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
ipc::Data::ClipbaordFile(_clip) => {
|
ipc::Data::ClipbaordFile(_clip) => {
|
||||||
|
37
src/ui/cm.rs
37
src/ui/cm.rs
@ -6,6 +6,7 @@ use clipboard::{
|
|||||||
};
|
};
|
||||||
use hbb_common::fs::{
|
use hbb_common::fs::{
|
||||||
can_enable_overwrite_detection, get_string, is_write_need_confirmation, new_send_confirm,
|
can_enable_overwrite_detection, get_string, is_write_need_confirmation, new_send_confirm,
|
||||||
|
DigestCheckResult,
|
||||||
};
|
};
|
||||||
use hbb_common::log::log;
|
use hbb_common::log::log;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
@ -211,23 +212,29 @@ impl ConnectionManager {
|
|||||||
if let Some(file) = job.files().get(file_num as usize) {
|
if let Some(file) = job.files().get(file_num as usize) {
|
||||||
let path = get_string(&job.join(&file.name));
|
let path = get_string(&job.join(&file.name));
|
||||||
match is_write_need_confirmation(&path, &digest) {
|
match is_write_need_confirmation(&path, &digest) {
|
||||||
Ok(digest) => {
|
Ok(digest_result) => {
|
||||||
if let Some(mut digest) = digest {
|
match digest_result {
|
||||||
// upload to server, but server has the same file, request
|
DigestCheckResult::IsSame => {
|
||||||
digest.is_upload = is_upload;
|
req.set_skip(true);
|
||||||
log::info!(
|
let msg_out = new_send_confirm(req);
|
||||||
|
Self::send(msg_out, conn).await;
|
||||||
|
}
|
||||||
|
DigestCheckResult::NeedConfirm(mut digest) => {
|
||||||
|
// upload to server, but server has the same file, request
|
||||||
|
digest.is_upload = is_upload;
|
||||||
|
log::info!(
|
||||||
"server has the same file, send server digest to local"
|
"server has the same file, send server digest to local"
|
||||||
);
|
);
|
||||||
let mut msg_out = Message::new();
|
let mut msg_out = Message::new();
|
||||||
let mut fr = FileResponse::new();
|
let mut fr = FileResponse::new();
|
||||||
fr.set_digest(digest);
|
fr.set_digest(digest);
|
||||||
msg_out.set_file_response(fr);
|
msg_out.set_file_response(fr);
|
||||||
Self::send(msg_out, conn).await;
|
Self::send(msg_out, conn).await;
|
||||||
} else {
|
}
|
||||||
log::info!("skip job {}, file_num {}", id, file_num);
|
DigestCheckResult::NoSuchFile => {
|
||||||
req.set_skip(true);
|
let msg_out = new_send_confirm(req);
|
||||||
let msg_out = new_send_confirm(req);
|
Self::send(msg_out, conn).await;
|
||||||
Self::send(msg_out, conn).await;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
207
src/ui/remote.rs
207
src/ui/remote.rs
@ -12,7 +12,7 @@ use clipboard::{
|
|||||||
};
|
};
|
||||||
use enigo::{self, Enigo, KeyboardControllable};
|
use enigo::{self, Enigo, KeyboardControllable};
|
||||||
use hbb_common::fs::{
|
use hbb_common::fs::{
|
||||||
can_enable_overwrite_detection, get_string, is_file_exists, new_send_confirm,
|
can_enable_overwrite_detection, get_string, is_file_exists, new_send_confirm, DigestCheckResult,
|
||||||
};
|
};
|
||||||
use hbb_common::log::log;
|
use hbb_common::log::log;
|
||||||
use hbb_common::{
|
use hbb_common::{
|
||||||
@ -1849,104 +1849,141 @@ impl Remote {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Some(message::Union::file_response(fr)) => match fr.union {
|
Some(message::Union::file_response(fr)) => {
|
||||||
Some(file_response::Union::dir(fd)) => {
|
match fr.union {
|
||||||
let entries = fd.entries.to_vec();
|
Some(file_response::Union::dir(fd)) => {
|
||||||
let mut m = make_fd(fd.id, &entries, fd.id > 0);
|
let entries = fd.entries.to_vec();
|
||||||
if fd.id <= 0 {
|
let mut m = make_fd(fd.id, &entries, fd.id > 0);
|
||||||
m.set_item("path", fd.path);
|
if fd.id <= 0 {
|
||||||
}
|
m.set_item("path", fd.path);
|
||||||
self.handler.call("updateFolderFiles", &make_args!(m));
|
|
||||||
if let Some(job) = fs::get_job(fd.id, &mut self.write_jobs) {
|
|
||||||
job.set_files(entries);
|
|
||||||
} else if let Some(job) = self.remove_jobs.get_mut(&fd.id) {
|
|
||||||
job.files = entries;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Some(file_response::Union::digest(digest)) => {
|
|
||||||
if digest.is_upload {
|
|
||||||
if let Some(job) = fs::get_job(digest.id, &mut self.read_jobs) {
|
|
||||||
if let Some(file) = job.files().get(digest.file_num as usize) {
|
|
||||||
let read_path = get_string(&job.join(&file.name));
|
|
||||||
self.handler.call(
|
|
||||||
"overrideFileConfirm",
|
|
||||||
&make_args!(digest.id, digest.file_num, read_path, true),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
self.handler.call("updateFolderFiles", &make_args!(m));
|
||||||
if let Some(job) = fs::get_job(digest.id, &mut self.write_jobs) {
|
if let Some(job) = fs::get_job(fd.id, &mut self.write_jobs) {
|
||||||
if let Some(file) = job.files().get(digest.file_num as usize) {
|
job.set_files(entries);
|
||||||
let write_path = get_string(&job.join(&file.name));
|
} else if let Some(job) = self.remove_jobs.get_mut(&fd.id) {
|
||||||
let overwrite_strategy = job.default_overwrite_strategy();
|
job.files = entries;
|
||||||
match fs::is_write_need_confirmation(&write_path, &digest) {
|
}
|
||||||
Ok(res) => {
|
}
|
||||||
if res.is_some() {
|
Some(file_response::Union::digest(digest)) => {
|
||||||
// need confirm
|
if digest.is_upload {
|
||||||
if overwrite_strategy.is_none() {
|
if let Some(job) = fs::get_job(digest.id, &mut self.read_jobs) {
|
||||||
self.handler.call(
|
if let Some(file) = job.files().get(digest.file_num as usize) {
|
||||||
"overrideFileConfirm",
|
let read_path = get_string(&job.join(&file.name));
|
||||||
&make_args!(
|
let overwrite_strategy = job.default_overwrite_strategy();
|
||||||
digest.id,
|
if let Some(overwrite) = overwrite_strategy {
|
||||||
digest.file_num,
|
let req = FileTransferSendConfirmRequest {
|
||||||
write_path,
|
|
||||||
false
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
let msg = new_send_confirm(
|
|
||||||
FileTransferSendConfirmRequest {
|
|
||||||
id: digest.id,
|
|
||||||
file_num: digest.file_num,
|
|
||||||
union: if overwrite_strategy.unwrap() {
|
|
||||||
Some(file_transfer_send_confirm_request::Union::offset_blk(0))
|
|
||||||
} else {
|
|
||||||
Some(file_transfer_send_confirm_request::Union::skip(true))
|
|
||||||
},
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
);
|
|
||||||
allow_err!(peer.send(&msg).await);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let msg= new_send_confirm(FileTransferSendConfirmRequest {
|
|
||||||
id: digest.id,
|
id: digest.id,
|
||||||
file_num: digest.file_num,
|
file_num: digest.file_num,
|
||||||
union: Some(file_transfer_send_confirm_request::Union::skip(true)),
|
union: Some(if overwrite {
|
||||||
|
file_transfer_send_confirm_request::Union::offset_blk(0)
|
||||||
|
} else {
|
||||||
|
file_transfer_send_confirm_request::Union::skip(
|
||||||
|
true,
|
||||||
|
)
|
||||||
|
}),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
});
|
};
|
||||||
allow_err!(peer.send(&msg).await);
|
job.confirm(&req);
|
||||||
}
|
let msg = new_send_confirm(req);
|
||||||
|
allow_err!(peer.send(&msg).await);
|
||||||
|
} else {
|
||||||
|
self.handler.call(
|
||||||
|
"overrideFileConfirm",
|
||||||
|
&make_args!(
|
||||||
|
digest.id,
|
||||||
|
digest.file_num,
|
||||||
|
read_path,
|
||||||
|
true
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
Err(err) => {
|
}
|
||||||
println!("error recving digest: {}", err);
|
}
|
||||||
|
} else {
|
||||||
|
if let Some(job) = fs::get_job(digest.id, &mut self.write_jobs) {
|
||||||
|
if let Some(file) = job.files().get(digest.file_num as usize) {
|
||||||
|
let write_path = get_string(&job.join(&file.name));
|
||||||
|
let overwrite_strategy = job.default_overwrite_strategy();
|
||||||
|
match fs::is_write_need_confirmation(&write_path, &digest) {
|
||||||
|
Ok(res) => match res {
|
||||||
|
DigestCheckResult::IsSame => {
|
||||||
|
let msg= new_send_confirm(FileTransferSendConfirmRequest {
|
||||||
|
id: digest.id,
|
||||||
|
file_num: digest.file_num,
|
||||||
|
union: Some(file_transfer_send_confirm_request::Union::skip(true)),
|
||||||
|
..Default::default()
|
||||||
|
});
|
||||||
|
allow_err!(peer.send(&msg).await);
|
||||||
|
}
|
||||||
|
DigestCheckResult::NeedConfirm(digest) => {
|
||||||
|
if let Some(overwrite) = overwrite_strategy {
|
||||||
|
let msg = new_send_confirm(
|
||||||
|
FileTransferSendConfirmRequest {
|
||||||
|
id: digest.id,
|
||||||
|
file_num: digest.file_num,
|
||||||
|
union: Some(if overwrite {
|
||||||
|
file_transfer_send_confirm_request::Union::offset_blk(0)
|
||||||
|
} else {
|
||||||
|
file_transfer_send_confirm_request::Union::skip(true)
|
||||||
|
}),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
allow_err!(peer.send(&msg).await);
|
||||||
|
} else {
|
||||||
|
self.handler.call(
|
||||||
|
"overrideFileConfirm",
|
||||||
|
&make_args!(
|
||||||
|
digest.id,
|
||||||
|
digest.file_num,
|
||||||
|
write_path,
|
||||||
|
false
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DigestCheckResult::NoSuchFile => {
|
||||||
|
let msg = new_send_confirm(
|
||||||
|
FileTransferSendConfirmRequest {
|
||||||
|
id: digest.id,
|
||||||
|
file_num: digest.file_num,
|
||||||
|
union: Some(file_transfer_send_confirm_request::Union::offset_blk(0)),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
);
|
||||||
|
allow_err!(peer.send(&msg).await);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Err(err) => {
|
||||||
|
println!("error recving digest: {}", err);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
Some(file_response::Union::block(block)) => {
|
||||||
Some(file_response::Union::block(block)) => {
|
log::info!("file response block, file num: {}", block.file_num);
|
||||||
log::info!("file response block, file num: {}", 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, None).await {
|
// to-do: add "skip" for writing job
|
||||||
// to-do: add "skip" for writing job
|
}
|
||||||
|
self.update_jobs_status();
|
||||||
}
|
}
|
||||||
self.update_jobs_status();
|
|
||||||
}
|
}
|
||||||
}
|
Some(file_response::Union::done(d)) => {
|
||||||
Some(file_response::Union::done(d)) => {
|
if let Some(job) = fs::get_job(d.id, &mut self.write_jobs) {
|
||||||
if let Some(job) = fs::get_job(d.id, &mut self.write_jobs) {
|
job.modify_time();
|
||||||
job.modify_time();
|
fs::remove_job(d.id, &mut self.write_jobs);
|
||||||
fs::remove_job(d.id, &mut self.write_jobs);
|
}
|
||||||
|
self.handle_job_status(d.id, d.file_num, None);
|
||||||
}
|
}
|
||||||
self.handle_job_status(d.id, d.file_num, None);
|
Some(file_response::Union::error(e)) => {
|
||||||
|
self.handle_job_status(e.id, e.file_num, Some(e.error));
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
Some(file_response::Union::error(e)) => {
|
}
|
||||||
self.handle_job_status(e.id, e.file_num, Some(e.error));
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
},
|
|
||||||
Some(message::Union::misc(misc)) => match misc.union {
|
Some(message::Union::misc(misc)) => match misc.union {
|
||||||
Some(misc::Union::audio_format(f)) => {
|
Some(misc::Union::audio_format(f)) => {
|
||||||
self.audio_sender.send(MediaData::AudioFormat(f)).ok();
|
self.audio_sender.send(MediaData::AudioFormat(f)).ok();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user