fix: skip issue

This commit is contained in:
Kingtous 2022-04-29 00:42:06 +08:00
parent cdecb3589a
commit 74b3cb1c58
4 changed files with 158 additions and 107 deletions

View File

@ -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)
} }
} }

View File

@ -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) => {

View File

@ -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,8 +212,14 @@ 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 {
DigestCheckResult::IsSame => {
req.set_skip(true);
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 // upload to server, but server has the same file, request
digest.is_upload = is_upload; digest.is_upload = is_upload;
log::info!( log::info!(
@ -223,13 +230,13 @@ impl ConnectionManager {
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) => {
Self::send(fs::new_error(id, err, file_num), conn).await; Self::send(fs::new_error(id, err, file_num), conn).await;
} }

View File

@ -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,7 +1849,8 @@ impl Remote {
} }
} }
} }
Some(message::Union::file_response(fr)) => match fr.union { Some(message::Union::file_response(fr)) => {
match fr.union {
Some(file_response::Union::dir(fd)) => { Some(file_response::Union::dir(fd)) => {
let entries = fd.entries.to_vec(); let entries = fd.entries.to_vec();
let mut m = make_fd(fd.id, &entries, fd.id > 0); let mut m = make_fd(fd.id, &entries, fd.id > 0);
@ -1868,22 +1869,68 @@ impl Remote {
if let Some(job) = fs::get_job(digest.id, &mut self.read_jobs) { 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) { if let Some(file) = job.files().get(digest.file_num as usize) {
let read_path = get_string(&job.join(&file.name)); let read_path = get_string(&job.join(&file.name));
let overwrite_strategy = job.default_overwrite_strategy();
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::offset_blk(0)
} else {
file_transfer_send_confirm_request::Union::skip(
true,
)
}),
..Default::default()
};
job.confirm(&req);
let msg = new_send_confirm(req);
allow_err!(peer.send(&msg).await);
} else {
self.handler.call( self.handler.call(
"overrideFileConfirm", "overrideFileConfirm",
&make_args!(digest.id, digest.file_num, read_path, true), &make_args!(
digest.id,
digest.file_num,
read_path,
true
),
); );
} }
} }
}
} else { } else {
if let Some(job) = fs::get_job(digest.id, &mut self.write_jobs) { 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) { if let Some(file) = job.files().get(digest.file_num as usize) {
let write_path = get_string(&job.join(&file.name)); let write_path = get_string(&job.join(&file.name));
let overwrite_strategy = job.default_overwrite_strategy(); let overwrite_strategy = job.default_overwrite_strategy();
match fs::is_write_need_confirmation(&write_path, &digest) { match fs::is_write_need_confirmation(&write_path, &digest) {
Ok(res) => { Ok(res) => match res {
if res.is_some() { DigestCheckResult::IsSame => {
// need confirm let msg= new_send_confirm(FileTransferSendConfirmRequest {
if overwrite_strategy.is_none() { 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( self.handler.call(
"overrideFileConfirm", "overrideFileConfirm",
&make_args!( &make_args!(
@ -1893,31 +1940,20 @@ impl Remote {
false false
), ),
); );
} else { }
}
DigestCheckResult::NoSuchFile => {
let msg = new_send_confirm( let msg = new_send_confirm(
FileTransferSendConfirmRequest { FileTransferSendConfirmRequest {
id: digest.id, id: digest.id,
file_num: digest.file_num, file_num: digest.file_num,
union: if overwrite_strategy.unwrap() { union: Some(file_transfer_send_confirm_request::Union::offset_blk(0)),
Some(file_transfer_send_confirm_request::Union::offset_blk(0))
} else {
Some(file_transfer_send_confirm_request::Union::skip(true))
},
..Default::default() ..Default::default()
}, },
); );
allow_err!(peer.send(&msg).await); allow_err!(peer.send(&msg).await);
} }
} else { },
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);
}
}
Err(err) => { Err(err) => {
println!("error recving digest: {}", err); println!("error recving digest: {}", err);
} }
@ -1946,7 +1982,8 @@ impl Remote {
self.handle_job_status(e.id, e.file_num, Some(e.error)); 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();