feat: server connections

This commit is contained in:
kingtous 2022-04-26 16:21:34 +08:00 committed by Kingtous
parent f4c6c4f6c4
commit b08877031f
3 changed files with 70 additions and 12 deletions

View File

@ -1,4 +1,4 @@
use crate::{bail, message_proto::*, ResultType}; use crate::{bail, message_proto::*, ResultType, Stream};
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
// https://doc.rust-lang.org/std/os/windows/fs/trait.MetadataExt.html // https://doc.rust-lang.org/std/os/windows/fs/trait.MetadataExt.html
use crate::{ use crate::{
@ -198,6 +198,8 @@ pub struct TransferJob {
files: Vec<FileEntry>, files: Vec<FileEntry>,
file_num: i32, file_num: i32,
file: Option<File>, file: Option<File>,
file_confirmed: bool,
file_is_waiting: bool,
total_size: u64, total_size: u64,
finished_size: u64, finished_size: u64,
transferred: u64, transferred: u64,
@ -360,7 +362,7 @@ impl TransferJob {
} }
} }
pub async fn read(&mut self) -> ResultType<Option<FileTransferBlock>> { pub async fn read(&mut self, stream: &mut Stream) -> ResultType<Option<FileTransferBlock>> {
let file_num = self.file_num as usize; let file_num = self.file_num as usize;
if file_num >= self.files.len() { if file_num >= self.files.len() {
self.file.take(); self.file.take();
@ -371,13 +373,41 @@ impl TransferJob {
match File::open(self.join(&name)).await { match File::open(self.join(&name)).await {
Ok(file) => { Ok(file) => {
self.file = Some(file); self.file = Some(file);
self.file_confirmed = false;
self.file_is_waiting = false;
} }
Err(err) => { Err(err) => {
self.file_num += 1; self.file_num += 1;
self.file_confirmed = false;
self.file_is_waiting = false;
return Err(err.into()); return Err(err.into());
} }
} }
} }
if !self.file_confirmed() {
if !self.file_is_waiting() {
let mut msg = Message::new();
let mut resp = FileResponse::new();
let meta = self.file.as_ref().unwrap().metadata().await?;
let last_modified = meta
.modified()?
.duration_since(SystemTime::UNIX_EPOCH)?
.as_secs();
resp.set_digest(FileTransferDigest {
id: self.id,
file_num: self.file_num,
last_edit_timestamp: last_modified,
file_size: meta.len(),
unknown_fields: Default::default(),
cached_size: Default::default(),
});
self.set_file_is_waiting(true);
msg.set_file_response(resp);
stream.send(&msg);
println!("digest message is sent. waiting for confirm.");
}
return Ok(None);
}
const BUF_SIZE: usize = 128 * 1024; const BUF_SIZE: usize = 128 * 1024;
let mut buf: Vec<u8> = Vec::with_capacity(BUF_SIZE); let mut buf: Vec<u8> = Vec::with_capacity(BUF_SIZE);
unsafe { unsafe {
@ -390,6 +420,8 @@ impl TransferJob {
Err(err) => { Err(err) => {
self.file_num += 1; self.file_num += 1;
self.file = None; self.file = None;
self.file_confirmed = false;
self.file_is_waiting = false;
return Err(err.into()); return Err(err.into());
} }
Ok(n) => { Ok(n) => {
@ -404,6 +436,8 @@ impl TransferJob {
if offset == 0 { if offset == 0 {
self.file_num += 1; self.file_num += 1;
self.file = None; self.file = None;
self.file_confirmed = false;
self.file_is_waiting = false;
} else { } else {
self.finished_size += offset as u64; self.finished_size += offset as u64;
if !is_compressed_file(name) { if !is_compressed_file(name) {
@ -430,6 +464,30 @@ impl TransferJob {
pub fn default_overwrite_strategy(&self) -> Option<bool> { pub fn default_overwrite_strategy(&self) -> Option<bool> {
self.default_overwrite_strategy self.default_overwrite_strategy
} }
pub fn set_file_confirmed(&mut self, file_confirmed: bool) {
self.file_confirmed = file_confirmed;
}
pub fn set_file_is_waiting(&mut self, file_is_waiting: bool) {
self.file_is_waiting = file_is_waiting;
}
pub fn file_is_waiting(&self) -> bool {
self.file_is_waiting
}
pub fn file_confirmed(&self) -> bool {
self.file_confirmed
}
pub fn skip_current_file(&mut self) -> bool {
self.file.take();
self.set_file_confirmed(false);
self.set_file_is_waiting(false);
self.file_num += 1;
true
}
} }
#[inline] #[inline]
@ -527,7 +585,7 @@ pub async fn handle_read_jobs(
) -> ResultType<()> { ) -> ResultType<()> {
let mut finished = Vec::new(); let mut finished = Vec::new();
for job in jobs.iter_mut() { for job in jobs.iter_mut() {
match job.read().await { match job.read(stream).await {
Err(err) => { Err(err) => {
stream stream
.send(&new_error(job.id(), err, job.file_num())) .send(&new_error(job.id(), err, job.file_num()))
@ -537,8 +595,10 @@ pub async fn handle_read_jobs(
stream.send(&new_block(block)).await?; stream.send(&new_block(block)).await?;
} }
Ok(None) => { Ok(None) => {
finished.push(job.id()); if !job.file_confirmed && !job.file_is_waiting {
stream.send(&new_done(job.id(), job.file_num())).await?; finished.push(job.id());
stream.send(&new_done(job.id(), job.file_num())).await?;
}
} }
} }
} }

View File

@ -1323,7 +1323,6 @@ pub enum Data {
AddPortForward((i32, String, i32)), AddPortForward((i32, String, i32)),
ToggleClipboardFile, ToggleClipboardFile,
NewRDP, NewRDP,
// ConfirmOverrideFile((i32, String, String, bool, bool)),
SetConfirmOverrideFile((i32, i32, bool, bool)), SetConfirmOverrideFile((i32, i32, bool, bool)),
} }
@ -1334,12 +1333,6 @@ pub enum Key {
_Raw(u32), _Raw(u32),
} }
#[derive(Clone)]
pub enum OverrideStrategy {
Skip,
Overwrite,
}
lazy_static::lazy_static! { lazy_static::lazy_static! {
pub static ref KEY_MAP: HashMap<&'static str, Key> = pub static ref KEY_MAP: HashMap<&'static str, Key> =
[ [

View File

@ -6,6 +6,7 @@ use crate::common::update_clipboard;
use crate::ipc; use crate::ipc;
#[cfg(any(target_os = "android", target_os = "ios"))] #[cfg(any(target_os = "android", target_os = "ios"))]
use crate::{common::MOBILE_INFO2, mobile::connection_manager::start_channel}; use crate::{common::MOBILE_INFO2, mobile::connection_manager::start_channel};
use hbb_common::message_proto::file_transfer_send_confirm_request::Union;
use hbb_common::{ use hbb_common::{
config::Config, config::Config,
fs, fs,
@ -1018,6 +1019,10 @@ impl Connection {
self.send_fs(ipc::FS::CancelWrite { id: c.id }); self.send_fs(ipc::FS::CancelWrite { id: c.id });
fs::remove_job(c.id, &mut self.read_jobs); fs::remove_job(c.id, &mut self.read_jobs);
} }
Some(file_action::Union::send_confirm(r)) => {
//
println!("recv send confirm request");
}
_ => {} _ => {}
} }
} }