mirror of
https://github.com/veeso/termscp.git
synced 2026-09-26 05:51:20 -07:00
feat: update transfer loop to use unified TransferProgress
This commit is contained in:
@@ -37,8 +37,8 @@ impl FileTransferActivity {
|
|||||||
fn transfer_completed_msg(&self, payload: &TransferPayload) -> String {
|
fn transfer_completed_msg(&self, payload: &TransferPayload) -> String {
|
||||||
let transfer_stats = format!(
|
let transfer_stats = format!(
|
||||||
"took {} seconds; at {}/s",
|
"took {} seconds; at {}/s",
|
||||||
fmt_millis(self.transfer.partial.started().elapsed()),
|
fmt_millis(self.transfer.progress.started.elapsed()),
|
||||||
ByteSize(self.transfer.partial.calc_bytes_per_second()),
|
ByteSize(self.transfer.progress.calc_bytes_per_second()),
|
||||||
);
|
);
|
||||||
match payload {
|
match payload {
|
||||||
TransferPayload::File(file) => {
|
TransferPayload::File(file) => {
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ impl FileTransferActivity {
|
|||||||
// Reset states
|
// Reset states
|
||||||
self.transfer.reset();
|
self.transfer.reset();
|
||||||
// Single file = 1 entry
|
// Single file = 1 entry
|
||||||
self.transfer.full.init(1);
|
self.transfer.progress.init(1);
|
||||||
// Mount progress bar
|
// Mount progress bar
|
||||||
self.mount_progress_bar(format!("Uploading {}…", file.path.display()));
|
self.mount_progress_bar(format!("Uploading {}…", file.path.display()));
|
||||||
// Get remote path
|
// Get remote path
|
||||||
@@ -102,7 +102,7 @@ impl FileTransferActivity {
|
|||||||
// Send
|
// Send
|
||||||
let result = self.filetransfer_send_one(file, remote_path.as_path(), file_name);
|
let result = self.filetransfer_send_one(file, remote_path.as_path(), file_name);
|
||||||
if result.is_ok() {
|
if result.is_ok() {
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
// Umount progress bar
|
// Umount progress bar
|
||||||
self.umount_progress_bar();
|
self.umount_progress_bar();
|
||||||
@@ -118,8 +118,9 @@ impl FileTransferActivity {
|
|||||||
dst_name: Option<String>,
|
dst_name: Option<String>,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
self.transfer.reset();
|
self.transfer.reset();
|
||||||
|
self.transfer.progress.init(0);
|
||||||
if !entry.is_dir() {
|
if !entry.is_dir() {
|
||||||
self.transfer.full.init(1);
|
self.transfer.progress.set_files_total(1);
|
||||||
}
|
}
|
||||||
self.mount_progress_bar(format!("Uploading {}…", entry.path().display()));
|
self.mount_progress_bar(format!("Uploading {}…", entry.path().display()));
|
||||||
let result = self.filetransfer_send_recurse(entry, curr_remote_path, dst_name, true);
|
let result = self.filetransfer_send_recurse(entry, curr_remote_path, dst_name, true);
|
||||||
@@ -135,7 +136,7 @@ impl FileTransferActivity {
|
|||||||
// Reset states
|
// Reset states
|
||||||
self.transfer.reset();
|
self.transfer.reset();
|
||||||
// Total = number of queue entries
|
// Total = number of queue entries
|
||||||
self.transfer.full.init(entries.len());
|
self.transfer.progress.init(entries.len());
|
||||||
// Mount progress bar
|
// Mount progress bar
|
||||||
self.mount_progress_bar(format!("Uploading {} entries…", entries.len()));
|
self.mount_progress_bar(format!("Uploading {} entries…", entries.len()));
|
||||||
// Send each entry
|
// Send each entry
|
||||||
@@ -149,7 +150,7 @@ impl FileTransferActivity {
|
|||||||
result = r;
|
result = r;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
// Umount progress bar
|
// Umount progress bar
|
||||||
self.umount_progress_bar();
|
self.umount_progress_bar();
|
||||||
@@ -203,7 +204,7 @@ impl FileTransferActivity {
|
|||||||
match self.browser.local_pane_mut().fs.list_dir(entry.path()) {
|
match self.browser.local_pane_mut().fs.list_dir(entry.path()) {
|
||||||
Ok(entries) => {
|
Ok(entries) => {
|
||||||
if track_progress {
|
if track_progress {
|
||||||
self.transfer.full.init(entries.len());
|
self.transfer.progress.set_files_total(entries.len());
|
||||||
}
|
}
|
||||||
for entry in entries.iter() {
|
for entry in entries.iter() {
|
||||||
if self.transfer.aborted() {
|
if self.transfer.aborted() {
|
||||||
@@ -211,7 +212,7 @@ impl FileTransferActivity {
|
|||||||
}
|
}
|
||||||
self.filetransfer_send_recurse(entry, remote_path.as_path(), None, false)?;
|
self.filetransfer_send_recurse(entry, remote_path.as_path(), None, false)?;
|
||||||
if track_progress {
|
if track_progress {
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -269,7 +270,7 @@ impl FileTransferActivity {
|
|||||||
}
|
}
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
if track_progress {
|
if track_progress {
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -312,7 +313,9 @@ impl FileTransferActivity {
|
|||||||
host_bridge.path().display()
|
host_bridge.path().display()
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
self.transfer.add_bytes(metadata.size as usize);
|
self.transfer
|
||||||
|
.progress
|
||||||
|
.register_skipped_file(metadata.size as usize);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
// Upload file
|
// Upload file
|
||||||
@@ -352,7 +355,8 @@ impl FileTransferActivity {
|
|||||||
.map_err(TransferErrorReason::HostError)
|
.map_err(TransferErrorReason::HostError)
|
||||||
.map(|x| x.metadata().size as usize)?;
|
.map(|x| x.metadata().size as usize)?;
|
||||||
// Init transfer
|
// Init transfer
|
||||||
self.transfer.partial.init(file_size);
|
self.transfer.progress.register_file(file_size);
|
||||||
|
let file_started = Instant::now();
|
||||||
|
|
||||||
// Write remote file
|
// Write remote file
|
||||||
let mut total_bytes_written: usize = 0;
|
let mut total_bytes_written: usize = 0;
|
||||||
@@ -402,14 +406,13 @@ impl FileTransferActivity {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Increase progress
|
// Increase progress
|
||||||
self.transfer.partial.update_progress(delta);
|
self.transfer.progress.add_bytes(delta);
|
||||||
self.transfer.add_bytes(delta);
|
|
||||||
// Draw only if a significant progress has been made (performance improvement)
|
// Draw only if a significant progress has been made (performance improvement)
|
||||||
if last_progress_val < self.transfer.partial.calc_progress() - 0.01 {
|
if last_progress_val < self.transfer.progress.calc_progress() - 0.01 {
|
||||||
// Draw
|
// Draw
|
||||||
self.update_progress_bar(format!("Uploading \"{file_name}\"…"));
|
self.update_progress_bar(format!("Uploading \"{file_name}\"…"));
|
||||||
self.view();
|
self.view();
|
||||||
last_progress_val = self.transfer.partial.calc_progress();
|
last_progress_val = self.transfer.progress.calc_progress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Finalize stream
|
// Finalize stream
|
||||||
@@ -438,8 +441,8 @@ impl FileTransferActivity {
|
|||||||
"Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)",
|
"Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)",
|
||||||
host.path.display(),
|
host.path.display(),
|
||||||
remote.display(),
|
remote.display(),
|
||||||
fmt_millis(self.transfer.partial.started().elapsed()),
|
fmt_millis(file_started.elapsed()),
|
||||||
ByteSize(self.transfer.partial.calc_bytes_per_second()),
|
ByteSize(self.transfer.progress.calc_bytes_per_second()),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -485,8 +488,9 @@ impl FileTransferActivity {
|
|||||||
dst_name: Option<String>,
|
dst_name: Option<String>,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
self.transfer.reset();
|
self.transfer.reset();
|
||||||
|
self.transfer.progress.init(0);
|
||||||
if !entry.is_dir() {
|
if !entry.is_dir() {
|
||||||
self.transfer.full.init(1);
|
self.transfer.progress.set_files_total(1);
|
||||||
}
|
}
|
||||||
self.mount_progress_bar(format!("Downloading {}…", entry.path().display()));
|
self.mount_progress_bar(format!("Downloading {}…", entry.path().display()));
|
||||||
let result = self.filetransfer_recv_recurse(entry, host_path, dst_name, true);
|
let result = self.filetransfer_recv_recurse(entry, host_path, dst_name, true);
|
||||||
@@ -503,13 +507,13 @@ impl FileTransferActivity {
|
|||||||
// Reset states
|
// Reset states
|
||||||
self.transfer.reset();
|
self.transfer.reset();
|
||||||
// Single file = 1 entry
|
// Single file = 1 entry
|
||||||
self.transfer.full.init(1);
|
self.transfer.progress.init(1);
|
||||||
// Mount progress bar
|
// Mount progress bar
|
||||||
self.mount_progress_bar(format!("Downloading {}…", entry.path.display()));
|
self.mount_progress_bar(format!("Downloading {}…", entry.path.display()));
|
||||||
// Receive
|
// Receive
|
||||||
let result = self.filetransfer_recv_one(host_bridge_path, entry, entry.name());
|
let result = self.filetransfer_recv_one(host_bridge_path, entry, entry.name());
|
||||||
if result.is_ok() {
|
if result.is_ok() {
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
// Umount progress bar
|
// Umount progress bar
|
||||||
self.umount_progress_bar();
|
self.umount_progress_bar();
|
||||||
@@ -525,7 +529,7 @@ impl FileTransferActivity {
|
|||||||
// Reset states
|
// Reset states
|
||||||
self.transfer.reset();
|
self.transfer.reset();
|
||||||
// Total = number of queue entries
|
// Total = number of queue entries
|
||||||
self.transfer.full.init(entries.len());
|
self.transfer.progress.init(entries.len());
|
||||||
// Mount progress bar
|
// Mount progress bar
|
||||||
self.mount_progress_bar(format!("Downloading {} entries…", entries.len()));
|
self.mount_progress_bar(format!("Downloading {} entries…", entries.len()));
|
||||||
// Receive each entry
|
// Receive each entry
|
||||||
@@ -539,7 +543,7 @@ impl FileTransferActivity {
|
|||||||
result = r;
|
result = r;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
// Umount progress bar
|
// Umount progress bar
|
||||||
self.umount_progress_bar();
|
self.umount_progress_bar();
|
||||||
@@ -596,7 +600,7 @@ impl FileTransferActivity {
|
|||||||
match self.browser.remote_pane_mut().fs.list_dir(entry.path()) {
|
match self.browser.remote_pane_mut().fs.list_dir(entry.path()) {
|
||||||
Ok(entries) => {
|
Ok(entries) => {
|
||||||
if track_progress {
|
if track_progress {
|
||||||
self.transfer.full.init(entries.len());
|
self.transfer.progress.set_files_total(entries.len());
|
||||||
}
|
}
|
||||||
for entry in entries.iter() {
|
for entry in entries.iter() {
|
||||||
if self.transfer.aborted() {
|
if self.transfer.aborted() {
|
||||||
@@ -609,7 +613,7 @@ impl FileTransferActivity {
|
|||||||
false,
|
false,
|
||||||
)?;
|
)?;
|
||||||
if track_progress {
|
if track_progress {
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -688,7 +692,7 @@ impl FileTransferActivity {
|
|||||||
Err(err.to_string())
|
Err(err.to_string())
|
||||||
} else {
|
} else {
|
||||||
if track_progress {
|
if track_progress {
|
||||||
self.transfer.full.increment();
|
self.transfer.progress.increment();
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@@ -722,7 +726,9 @@ impl FileTransferActivity {
|
|||||||
remote.path().display()
|
remote.path().display()
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
self.transfer.add_bytes(remote.metadata().size as usize);
|
self.transfer
|
||||||
|
.progress
|
||||||
|
.register_skipped_file(remote.metadata().size as usize);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -755,7 +761,10 @@ impl FileTransferActivity {
|
|||||||
) -> Result<(), TransferErrorReason> {
|
) -> Result<(), TransferErrorReason> {
|
||||||
let mut total_bytes_written: usize = 0;
|
let mut total_bytes_written: usize = 0;
|
||||||
// Init transfer
|
// Init transfer
|
||||||
self.transfer.partial.init(remote.metadata.size as usize);
|
self.transfer
|
||||||
|
.progress
|
||||||
|
.register_file(remote.metadata.size as usize);
|
||||||
|
let file_started = Instant::now();
|
||||||
// Write host_bridge file
|
// Write host_bridge file
|
||||||
let mut last_progress_val: f64 = 0.0;
|
let mut last_progress_val: f64 = 0.0;
|
||||||
let mut last_input_event_fetch: Option<Instant> = None;
|
let mut last_input_event_fetch: Option<Instant> = None;
|
||||||
@@ -801,14 +810,13 @@ impl FileTransferActivity {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Set progress
|
// Set progress
|
||||||
self.transfer.partial.update_progress(delta);
|
self.transfer.progress.add_bytes(delta);
|
||||||
self.transfer.add_bytes(delta);
|
|
||||||
// Draw only if a significant progress has been made (performance improvement)
|
// Draw only if a significant progress has been made (performance improvement)
|
||||||
if last_progress_val < self.transfer.partial.calc_progress() - 0.01 {
|
if last_progress_val < self.transfer.progress.calc_progress() - 0.01 {
|
||||||
// Draw
|
// Draw
|
||||||
self.update_progress_bar(format!("Downloading \"{file_name}\""));
|
self.update_progress_bar(format!("Downloading \"{file_name}\""));
|
||||||
self.view();
|
self.view();
|
||||||
last_progress_val = self.transfer.partial.calc_progress();
|
last_progress_val = self.transfer.progress.calc_progress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If download was abrupted, return Error
|
// If download was abrupted, return Error
|
||||||
@@ -847,8 +855,8 @@ impl FileTransferActivity {
|
|||||||
"Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)",
|
"Saved file \"{}\" to \"{}\" (took {} seconds; at {}/s)",
|
||||||
remote.path.display(),
|
remote.path.display(),
|
||||||
host_bridge.display(),
|
host_bridge.display(),
|
||||||
fmt_millis(self.transfer.partial.started().elapsed()),
|
fmt_millis(file_started.elapsed()),
|
||||||
ByteSize(self.transfer.partial.calc_bytes_per_second()),
|
ByteSize(self.transfer.progress.calc_bytes_per_second()),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user