Compare commits
No commits in common. "29034e09d1773a4c777cfb10673ac734a4ef5138" and "ed58ddceb9dd46d0fa4c85ea3df711fa43d4dc6c" have entirely different histories.
29034e09d1
...
ed58ddceb9
10 changed files with 37 additions and 44 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -1150,7 +1150,7 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "jocalsend"
|
||||
name = "joecalsend"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"axum",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
[package]
|
||||
name = "jocalsend"
|
||||
name = "joecalsend"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ use std::{collections::BTreeMap, net::SocketAddr, time::Duration};
|
|||
|
||||
use crossterm::event::{Event, EventStream, KeyCode, KeyEvent, KeyEventKind};
|
||||
use futures::{FutureExt, StreamExt};
|
||||
use jocalsend::{JocalService, ReceiveDialog, ReceiveRequest, TransferEvent, error::Result};
|
||||
use joecalsend::{JoecalService, ReceiveDialog, ReceiveRequest, TransferEvent, error::Result};
|
||||
use julid::Julid;
|
||||
use log::{LevelFilter, debug, error, warn};
|
||||
use ratatui::{
|
||||
|
@ -23,7 +23,7 @@ pub struct Peer {
|
|||
}
|
||||
|
||||
pub struct App {
|
||||
pub service: JocalService,
|
||||
pub service: JoecalService,
|
||||
pub events: EventStream,
|
||||
// addr -> (alias, fingerprint)
|
||||
pub peers: Vec<Peer>,
|
||||
|
@ -56,7 +56,7 @@ pub enum SendingScreen {
|
|||
}
|
||||
|
||||
impl App {
|
||||
pub fn new(service: JocalService, event_listener: UnboundedReceiver<TransferEvent>) -> Self {
|
||||
pub fn new(service: JoecalService, event_listener: UnboundedReceiver<TransferEvent>) -> Self {
|
||||
App {
|
||||
service,
|
||||
event_listener,
|
||||
|
@ -126,7 +126,6 @@ impl App {
|
|||
KeyCode::Char('s') => self.send(),
|
||||
KeyCode::Char('r') => self.recv(),
|
||||
KeyCode::Char('l') => self.logs(),
|
||||
KeyCode::Char('m') => self.main(),
|
||||
_ => match mode {
|
||||
CurrentScreen::Logging => match code {
|
||||
KeyCode::Left => change_log_level(-1),
|
||||
|
@ -231,14 +230,6 @@ impl App {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn main(&mut self) {
|
||||
let last = self.screen.last();
|
||||
match last {
|
||||
Some(CurrentScreen::Main) => {}
|
||||
_ => self.screen.push(CurrentScreen::Main),
|
||||
}
|
||||
}
|
||||
|
||||
// accept a content receive request
|
||||
fn accept(&mut self) {
|
||||
let Some(idx) = self.receiving_state.selected() else {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use std::sync::LazyLock;
|
||||
|
||||
use jocalsend::ReceiveRequest;
|
||||
use joecalsend::ReceiveRequest;
|
||||
use log::LevelFilter;
|
||||
use ratatui::{
|
||||
buffer::Buffer,
|
||||
|
@ -217,7 +217,7 @@ impl Widget for &mut App {
|
|||
}
|
||||
|
||||
fn outer_frame(screen: &CurrentScreen, menu: &Line, area: Rect, buf: &mut Buffer) {
|
||||
let title = Line::from(" Jocalsend ".bold());
|
||||
let title = Line::from(" Joecalsend ".bold());
|
||||
let block = Block::bordered()
|
||||
.title(title.centered())
|
||||
.title_bottom(menu.clone().centered())
|
||||
|
@ -240,14 +240,14 @@ fn text_popup(text: &str, title: &str, area: Rect, buf: &mut Buffer) {
|
|||
block.render(area, buf);
|
||||
|
||||
let (_, len) = unicode_segmentation::UnicodeSegmentation::graphemes(text, true).size_hint();
|
||||
let len = len.unwrap_or(text.len()) as u16 + 2;
|
||||
let len = len.unwrap_or(text.len()) as u16;
|
||||
let area = centered_rect(area, Constraint::Length(len), Constraint::Length(1));
|
||||
|
||||
Paragraph::new(text).centered().yellow().render(area, buf);
|
||||
}
|
||||
|
||||
fn logger(area: Rect, buf: &mut Buffer) {
|
||||
let title = Line::from(format!(" {} logs ", log::max_level().as_str()));
|
||||
let title = Line::from(log::max_level().as_str());
|
||||
let logger = TuiLoggerWidget::default()
|
||||
.output_separator('|')
|
||||
.output_timestamp(Some("%H:%M:%S%.3f".to_string()))
|
||||
|
@ -257,7 +257,7 @@ fn logger(area: Rect, buf: &mut Buffer) {
|
|||
.output_line(false)
|
||||
.block(Block::bordered().title(title.centered()))
|
||||
.style(Style::default())
|
||||
.state(&TuiWidgetState::new().set_default_display_level(LevelFilter::Trace));
|
||||
.state(&TuiWidgetState::new().set_default_display_level(LevelFilter::Debug));
|
||||
logger.render(area, buf);
|
||||
}
|
||||
|
||||
|
@ -267,7 +267,7 @@ fn receive_requests(
|
|||
area: Rect,
|
||||
buf: &mut Buffer,
|
||||
) {
|
||||
let title = Line::from(" Incoming Transfer Requests ").bold();
|
||||
let title = Line::from(" Upload Requests ").bold();
|
||||
let block = Block::bordered().title(title.centered());
|
||||
|
||||
let mut rows = Vec::new();
|
||||
|
@ -311,7 +311,9 @@ fn receive_requests(
|
|||
|
||||
ratatui::widgets::StatefulWidget::render(table, area, buf, state);
|
||||
|
||||
if let Some(idx) = state.selected() {
|
||||
if let Some(idx) = state.selected()
|
||||
//&& let Some(area) = preview_area
|
||||
{
|
||||
let area = centered_rect(area, Constraint::Percentage(80), Constraint::Max(7));
|
||||
let request = requests[idx];
|
||||
if let Some(md) = request.files.values().next()
|
||||
|
@ -364,13 +366,13 @@ impl Widget for NetworkInfoWidget {
|
|||
{
|
||||
let udp = "UDP socket";
|
||||
let udp = udp.to_line().left_aligned();
|
||||
let uaddr = format!("{:?}", jocalsend::LISTENING_SOCKET_ADDR);
|
||||
let uaddr = format!("{:?}", joecalsend::LISTENING_SOCKET_ADDR);
|
||||
let udp = Row::new(vec![udp, uaddr.to_line().right_aligned()]).yellow();
|
||||
|
||||
let mip = format!(
|
||||
"{:?}:{:?}",
|
||||
jocalsend::MULTICAST_IP,
|
||||
jocalsend::DEFAULT_PORT
|
||||
joecalsend::MULTICAST_IP,
|
||||
joecalsend::DEFAULT_PORT
|
||||
);
|
||||
let multicast = "Multicast address";
|
||||
let multicast = Row::new(vec![
|
||||
|
@ -379,7 +381,7 @@ impl Widget for NetworkInfoWidget {
|
|||
])
|
||||
.yellow();
|
||||
|
||||
let haddr = format!("{:?}", jocalsend::LISTENING_SOCKET_ADDR);
|
||||
let haddr = format!("{:?}", joecalsend::LISTENING_SOCKET_ADDR);
|
||||
let http = "HTTP address";
|
||||
let http = Row::new(vec![
|
||||
http.to_line().left_aligned(),
|
||||
|
|
|
@ -11,9 +11,9 @@ use axum::{
|
|||
use log::{debug, error, trace, warn};
|
||||
use tokio::net::UdpSocket;
|
||||
|
||||
use crate::{Config, JocalService, RunningState, models::Device};
|
||||
use crate::{Config, JoecalService, RunningState, models::Device};
|
||||
|
||||
impl JocalService {
|
||||
impl JoecalService {
|
||||
pub async fn announce(&self, socket: Option<SocketAddr>) -> crate::error::Result<()> {
|
||||
trace!("announcing");
|
||||
announce_http(&self.device, socket, self.client.clone()).await?;
|
||||
|
@ -97,7 +97,7 @@ impl JocalService {
|
|||
|
||||
/// Axum request handler for receiving other devices' registration requests.
|
||||
pub async fn register_device(
|
||||
State(service): State<JocalService>,
|
||||
State(service): State<JoecalService>,
|
||||
ConnectInfo(addr): ConnectInfo<SocketAddr>,
|
||||
Json(device): Json<Device>,
|
||||
) -> Json<Device> {
|
||||
|
|
|
@ -9,12 +9,12 @@ use tokio::{net::TcpListener, sync::mpsc};
|
|||
use tower_http::limit::RequestBodyLimitLayer;
|
||||
|
||||
use crate::{
|
||||
JocalService,
|
||||
JoecalService,
|
||||
discovery::register_device,
|
||||
transfer::{prepare_upload, receive_upload},
|
||||
};
|
||||
|
||||
impl JocalService {
|
||||
impl JoecalService {
|
||||
pub async fn start_http_server(&self, stop_rx: mpsc::Receiver<()>) -> crate::error::Result<()> {
|
||||
let app = self.create_router();
|
||||
// TODO: make addr config
|
||||
|
|
|
@ -60,7 +60,7 @@ pub struct ReceiveRequest {
|
|||
|
||||
/// Contains the main network and backend state for an application session.
|
||||
#[derive(Clone)]
|
||||
pub struct JocalService {
|
||||
pub struct JoecalService {
|
||||
pub device: Device,
|
||||
pub peers: Arc<Mutex<BTreeMap<String, (SocketAddr, Device)>>>,
|
||||
pub sessions: Arc<Mutex<BTreeMap<String, Session>>>, // Session ID to Session
|
||||
|
@ -74,7 +74,7 @@ pub struct JocalService {
|
|||
transfer_event_tx: UnboundedSender<TransferEvent>,
|
||||
}
|
||||
|
||||
impl JocalService {
|
||||
impl JoecalService {
|
||||
pub async fn new(
|
||||
device: Device,
|
||||
config: Config,
|
||||
|
@ -190,7 +190,7 @@ pub struct Config {
|
|||
impl Default for Config {
|
||||
fn default() -> Self {
|
||||
let home = std::env::home_dir().unwrap_or("/tmp".into());
|
||||
let dd = home.join("jocalsend-downloads");
|
||||
let dd = home.join("joecalsend-downloads");
|
||||
Self {
|
||||
multicast_addr: SocketAddrV4::new(MULTICAST_IP, DEFAULT_PORT),
|
||||
port: DEFAULT_PORT,
|
||||
|
|
10
src/main.rs
10
src/main.rs
|
@ -1,4 +1,4 @@
|
|||
use jocalsend::{Config, JocalService, Listeners, error, models::Device};
|
||||
use joecalsend::{Config, JoecalService, Listeners, error, models::Device};
|
||||
use log::{error, info};
|
||||
use ratatui::DefaultTerminal;
|
||||
use tokio::{sync::mpsc::unbounded_channel, task::JoinSet};
|
||||
|
@ -12,10 +12,10 @@ fn main() -> error::Result<()> {
|
|||
|
||||
if std::env::var("RUST_LOG").is_err() {
|
||||
unsafe {
|
||||
std::env::set_var("RUST_LOG", "jocalsend");
|
||||
std::env::set_var("RUST_LOG", "joecalsend");
|
||||
}
|
||||
}
|
||||
init_logger(LevelFilter::Info).map_err(|e| std::io::Error::other(format!("{e}")))?;
|
||||
init_logger(LevelFilter::Debug).map_err(|e| std::io::Error::other(format!("{e}")))?;
|
||||
set_env_filter_from_env(None);
|
||||
|
||||
let config = Config::default();
|
||||
|
@ -35,9 +35,9 @@ async fn start_and_run(
|
|||
) -> error::Result<()> {
|
||||
let (event_tx, event_listener) = unbounded_channel();
|
||||
|
||||
let service = JocalService::new(device, config.clone(), event_tx)
|
||||
let service = JoecalService::new(device, config.clone(), event_tx)
|
||||
.await
|
||||
.expect("Could not create JocalService");
|
||||
.expect("Could not create JoecalService");
|
||||
|
||||
let mut app = App::new(service, event_listener);
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@ pub enum Protocol {
|
|||
impl Default for Device {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
alias: "Jocalsend".to_string(),
|
||||
alias: "Joecalsend".to_string(),
|
||||
version: "2.1".to_string(),
|
||||
device_model: None,
|
||||
device_type: Some(DeviceType::Headless),
|
||||
|
|
|
@ -13,7 +13,7 @@ use serde::{Deserialize, Serialize};
|
|||
use tokio::sync::mpsc::unbounded_channel;
|
||||
|
||||
use crate::{
|
||||
JocalService, ReceiveDialog, ReceiveRequest, TransferEvent,
|
||||
JoecalService, ReceiveDialog, ReceiveRequest, TransferEvent,
|
||||
error::{LocalSendError, Result},
|
||||
models::{Device, FileMetadata},
|
||||
};
|
||||
|
@ -52,7 +52,7 @@ pub struct PrepareUploadRequest {
|
|||
pub files: BTreeMap<String, FileMetadata>,
|
||||
}
|
||||
|
||||
impl JocalService {
|
||||
impl JoecalService {
|
||||
pub async fn prepare_upload(
|
||||
&self,
|
||||
peer: &str,
|
||||
|
@ -231,7 +231,7 @@ impl JocalService {
|
|||
}
|
||||
|
||||
pub async fn prepare_upload(
|
||||
State(service): State<JocalService>,
|
||||
State(service): State<JoecalService>,
|
||||
ConnectInfo(addr): ConnectInfo<SocketAddr>,
|
||||
Json(req): Json<PrepareUploadRequest>,
|
||||
) -> impl IntoResponse {
|
||||
|
@ -302,7 +302,7 @@ pub async fn prepare_upload(
|
|||
|
||||
pub async fn receive_upload(
|
||||
Query(params): Query<UploadParams>,
|
||||
State(service): State<JocalService>,
|
||||
State(service): State<JoecalService>,
|
||||
body: Bytes,
|
||||
) -> impl IntoResponse {
|
||||
// Extract query parameters
|
||||
|
@ -379,7 +379,7 @@ pub struct UploadParams {
|
|||
|
||||
pub async fn register_cancel(
|
||||
Query(params): Query<CancelParams>,
|
||||
State(service): State<JocalService>,
|
||||
State(service): State<JoecalService>,
|
||||
) -> impl IntoResponse {
|
||||
let mut sessions_lock = service.sessions.lock().await;
|
||||
let session = match sessions_lock.get_mut(¶ms.session_id) {
|
||||
|
|
Loading…
Reference in a new issue