Files
termscp/src/ui/activities/filetransfer/actions/newfile.rs
T

120 lines
4.1 KiB
Rust

//! ## FileTransferActivity
//!
//! `filetransfer_activiy` is the module which implements the Filetransfer activity, which is the main activity afterall
// locals
use std::fs::File as StdFile;
use std::path::PathBuf;
use remotefs::fs::Metadata;
use super::{File, FileTransferActivity, LogLevel};
impl FileTransferActivity {
pub(crate) fn action_local_newfile(&mut self, input: String) {
// Check if file exists
let mut file_exists: bool = false;
for file in self.host_bridge().iter_files_all() {
if input == file.name() {
file_exists = true;
}
}
if file_exists {
self.log_and_alert(LogLevel::Warn, format!("File \"{input}\" already exists",));
return;
}
// Create file
let file_path: PathBuf = PathBuf::from(input.as_str());
let writer = match self
.host_bridge
.create_file(file_path.as_path(), &Metadata::default())
{
Ok(f) => f,
Err(err) => {
self.log_and_alert(
LogLevel::Error,
format!("Could not create file \"{}\": {}", file_path.display(), err),
);
return;
}
};
// finalize write
if let Err(err) = self.host_bridge.finalize_write(writer) {
self.log_and_alert(
LogLevel::Error,
format!("Could not write file \"{}\": {}", file_path.display(), err),
);
return;
}
self.log(
LogLevel::Info,
format!("Created file \"{}\"", file_path.display()),
);
}
pub(crate) fn action_remote_newfile(&mut self, input: String) {
// Check if file exists
let mut file_exists: bool = false;
for file in self.remote().iter_files_all() {
if input == file.name() {
file_exists = true;
}
}
if file_exists {
self.log_and_alert(LogLevel::Warn, format!("File \"{input}\" already exists",));
return;
}
// Get path on remote
let file_path: PathBuf = PathBuf::from(input.as_str());
// Create file (on local)
match tempfile::NamedTempFile::new() {
Err(err) => {
self.log_and_alert(LogLevel::Error, format!("Could not create tempfile: {err}"))
}
Ok(tfile) => {
// Stat tempfile
let local_file: File = match self.host_bridge.stat(tfile.path()) {
Err(err) => {
self.log_and_alert(
LogLevel::Error,
format!("Could not stat tempfile: {err}"),
);
return;
}
Ok(f) => f,
};
if local_file.is_file() {
// Create file
let reader = Box::new(match StdFile::open(tfile.path()) {
Ok(f) => f,
Err(err) => {
self.log_and_alert(
LogLevel::Error,
format!("Could not open tempfile: {err}"),
);
return;
}
});
match self
.client
.create_file(file_path.as_path(), &local_file.metadata, reader)
{
Err(err) => self.log_and_alert(
LogLevel::Error,
format!("Could not create file \"{}\": {}", file_path.display(), err),
),
Ok(_) => {
self.log(
LogLevel::Info,
format!("Created file \"{}\"", file_path.display()),
);
}
}
}
}
}
}
}