|
|
|
@ -2,13 +2,15 @@ use std::collections::HashMap;
|
|
|
|
|
use std::io::Read;
|
|
|
|
|
use std::os::unix::prelude::OsStrExt;
|
|
|
|
|
use std::{collections::BTreeMap, path::Path};
|
|
|
|
|
use tokio::io::AsyncWriteExt;
|
|
|
|
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
|
|
|
|
use tokio::net::unix::OwnedWriteHalf;
|
|
|
|
|
use tokio::net::UnixStream;
|
|
|
|
|
use tokio::sync::oneshot;
|
|
|
|
|
|
|
|
|
|
use super::command::Command;
|
|
|
|
|
|
|
|
|
|
pub struct MpvCtl {
|
|
|
|
|
socket: UnixStream,
|
|
|
|
|
socket: OwnedWriteHalf,
|
|
|
|
|
next_request_id: u64,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -17,8 +19,27 @@ impl MpvCtl {
|
|
|
|
|
socket_path: P,
|
|
|
|
|
) -> Result<Self, Box<dyn std::error::Error>> {
|
|
|
|
|
let socket = UnixStream::connect(socket_path).await?;
|
|
|
|
|
let (mut socket_read, socket_write) = socket.into_split();
|
|
|
|
|
|
|
|
|
|
tokio::spawn(async move {
|
|
|
|
|
let mut buf = vec![0; 1024];
|
|
|
|
|
loop {
|
|
|
|
|
match socket_read.read(&mut buf).await {
|
|
|
|
|
// Remote has closed
|
|
|
|
|
Ok(0) => return,
|
|
|
|
|
Ok(n) => {
|
|
|
|
|
// TODO actually used the read value
|
|
|
|
|
}
|
|
|
|
|
Err(_) => {
|
|
|
|
|
// Ruh roh
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Ok(MpvCtl {
|
|
|
|
|
socket,
|
|
|
|
|
socket: socket_write,
|
|
|
|
|
next_request_id: 0,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
@ -32,6 +53,9 @@ impl MpvCtl {
|
|
|
|
|
async fn send_command(&mut self, cmd: Command) -> Result<(), Box<dyn std::error::Error>> {
|
|
|
|
|
let serialized = serde_json::to_string(&cmd)?;
|
|
|
|
|
println!("Sending {}", serialized);
|
|
|
|
|
let (response_tx, response_rx) = oneshot::channel::<serde_json::Value>();
|
|
|
|
|
// TODO: store one stream where the reading thread can get it? Then wait for response on this end and return it from this function.
|
|
|
|
|
|
|
|
|
|
self.socket.write_all(serialized.as_bytes()).await?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|