diff options
| author | Kunal Mohan <kunalmohan99@gmail.com> | 2021-02-12 11:39:02 +0530 |
|---|---|---|
| committer | Kunal Mohan <kunalmohan99@gmail.com> | 2021-05-04 20:47:48 +0530 |
| commit | 7beb24625015b9713b617b2070cca495707edcee (patch) | |
| tree | 01938e7225d7c7d9dcbf0e719d48ad4a8940370c /src/server | |
| parent | Introduce IpcSenderWithContext (diff) | |
| download | sl0ppij-7beb24625015b9713b617b2070cca495707edcee.tar.gz sl0ppij-7beb24625015b9713b617b2070cca495707edcee.tar.xz sl0ppij-7beb24625015b9713b617b2070cca495707edcee.zip | |
try fixes
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/mod.rs | 149 |
1 files changed, 83 insertions, 66 deletions
diff --git a/src/server/mod.rs b/src/server/mod.rs index ada8826e..0ba19568 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -39,7 +39,7 @@ pub fn start_server( let default_layout = Some(PathBuf::from("default")); #[cfg(test)] let default_layout = None; - let maybe_layout = opts.layout.or(default_layout).map(Layout::new); + let maybe_layout = opts.layout.or(default_layout); let send_server_instructions = IpcSenderWithContext::new(); @@ -90,15 +90,15 @@ pub fn start_server( .unwrap(); } PtyInstruction::NewTab => { - if let Some(layout) = maybe_layout.clone() { - pty_bus.spawn_terminals_for_layout(layout, err_ctx); - } else { - let pid = pty_bus.spawn_terminal(None); - pty_bus - .send_server_instructions - .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) - .unwrap(); - } + //if let Some(layout) = maybe_layout.clone() { + // pty_bus.spawn_terminals_for_layout(layout, err_ctx); + //} else { + let pid = pty_bus.spawn_terminal(None); + pty_bus + .send_server_instructions + .send(ApiCommand::ToScreen(ScreenInstruction::NewTab(pid))) + .unwrap(); + //} } PtyInstruction::ClosePane(id) => { pty_bus.close_pane(id, err_ctx); @@ -120,64 +120,15 @@ pub fn start_server( .name("ipc_server".to_string()) .spawn({ move || { + let mut threads = vec![]; for stream in listener.incoming() { match stream { - Ok(mut stream) => { - let mut buffer = [0; 65535]; // TODO: more accurate - let _ = stream - .read(&mut buffer) - .expect("failed to parse ipc message"); - let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = - bincode::deserialize(&buffer) - .expect("failed to deserialize ipc message"); - err_ctx.add_call(ContextType::IPCServer); - send_pty_instructions.update(err_ctx); - send_app_instructions.update(err_ctx); - - match decoded { - ApiCommand::OpenFile(file_name) => { - let path = PathBuf::from(file_name); - send_pty_instructions - .send(PtyInstruction::SpawnTerminal(Some(path))) - .unwrap(); - } - ApiCommand::SplitHorizontally => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalHorizontally(None)) - .unwrap(); - } - ApiCommand::SplitVertically => { - send_pty_instructions - .send(PtyInstruction::SpawnTerminalVertically(None)) - .unwrap(); - } - ApiCommand::MoveFocus => { - send_app_instructions - .send(AppInstruction::ToScreen( - ScreenInstruction::MoveFocus, - )) - .unwrap(); - } - ApiCommand::ToPty(instruction) => { - send_pty_instructions.send(instruction).unwrap(); - } - ApiCommand::ToScreen(instruction) => { - send_app_instructions - .send(AppInstruction::ToScreen(instruction)) - .unwrap(); - } - ApiCommand::ClosePluginPane(pid) => { - send_app_instructions - .send(AppInstruction::ToPlugin(PluginInstruction::Unload( - pid, - ))) - .unwrap(); - } - ApiCommand::Quit => { - send_pty_instructions.send(PtyInstruction::Quit).unwrap(); - break; - } - } + Ok(stream) => { + let send_app_instructions = send_app_instructions.clone(); + let send_pty_instructions = send_pty_instructions.clone(); + threads.push(thread::spawn(move || { + handle_stream(send_pty_instructions, send_app_instructions, stream); + })); } Err(err) => { panic!("err {:?}", err); @@ -186,7 +137,73 @@ pub fn start_server( } let _ = pty_thread.join(); + for t in threads { + t.join(); + } } }) .unwrap() } + +fn handle_stream( + mut send_pty_instructions: SenderWithContext<PtyInstruction>, + mut send_app_instructions: SenderWithContext<AppInstruction>, + mut stream: std::os::unix::net::UnixStream, +) { + //let mut buffer = [0; 65535]; // TODO: more accurate + let mut buffer = String::new(); + loop { + let bytes = stream + .read_to_string(&mut buffer) + .expect("failed to parse ipc message"); + //let astream = stream.try_clone().unwrap(); + let (mut err_ctx, decoded): (ErrorContext, ApiCommand) = + bincode::deserialize(buffer.as_bytes()).expect("failed to deserialize ipc message"); + err_ctx.add_call(ContextType::IPCServer); + send_pty_instructions.update(err_ctx); + send_app_instructions.update(err_ctx); + + eprintln!("Server received {:?}", decoded); + + match decoded { + ApiCommand::OpenFile(file_name) => { + let path = PathBuf::from(file_name); + send_pty_instructions + .send(PtyInstruction::SpawnTerminal(Some(path))) + .unwrap(); + } + ApiCommand::SplitHorizontally => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalHorizontally(None)) + .unwrap(); + } + ApiCommand::SplitVertically => { + send_pty_instructions + .send(PtyInstruction::SpawnTerminalVertically(None)) + .unwrap(); + } + ApiCommand::MoveFocus => { + send_app_instructions + .send(AppInstruction::ToScreen(ScreenInstruction::MoveFocus)) + .unwrap(); + } + ApiCommand::ToPty(instruction) => { + send_pty_instructions.send(instruction).unwrap(); + } + ApiCommand::ToScreen(instruction) => { + send_app_instructions + .send(AppInstruction::ToScreen(instruction)) + .unwrap(); + } + ApiCommand::ClosePluginPane(pid) => { + send_app_instructions + .send(AppInstruction::ToPlugin(PluginInstruction::Unload(pid))) + .unwrap(); + } + ApiCommand::Quit => { + let _ = send_pty_instructions.send(PtyInstruction::Quit); + break; + } + } + } +} |
