Private
Public Access
1
0

xpc: implement rest of methods in kpcli except signals.

This commit is contained in:
2025-08-23 20:13:33 -07:00
parent 0b7b35b301
commit 16db2caacc
2 changed files with 265 additions and 9 deletions

View File

@@ -273,41 +273,138 @@ impl DaemonInterface for XpcDaemonInterface {
}
}
async fn sync_conversations(&mut self, _conversation_id: Option<String>) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
if let Some(id) = _conversation_id {
let mut args = HashMap::new();
args.insert(Self::key("conversation_id"), Message::String(CString::new(id).unwrap()));
let _ = self.call_method(&mut client, "SyncConversation", Some(args)).await?;
return Ok(());
}
let _ = self.call_method(&mut client, "SyncAllConversations", None).await?;
Ok(())
}
async fn sync_conversations_list(&mut self) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let _ = self.call_method(&mut client, "SyncConversationList", None).await?;
Ok(())
}
async fn print_messages(
&mut self,
_conversation_id: String,
_last_message_id: Option<String>,
) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let mut args = HashMap::new();
args.insert(Self::key("conversation_id"), Message::String(CString::new(_conversation_id).unwrap()));
if let Some(last) = _last_message_id {
args.insert(Self::key("last_message_id"), Message::String(CString::new(last).unwrap()));
}
let reply = self.call_method(&mut client, "GetMessages", Some(args)).await?;
match reply.get(&Self::key("messages")) {
Some(Message::Array(items)) => {
println!("Number of messages: {}", items.len());
for item in items {
if let Message::Dictionary(map) = item {
let guid = Self::get_string(map, "id").map(|s| s.to_string_lossy().into_owned()).unwrap_or_default();
let sender = Self::get_string(map, "sender").map(|s| s.to_string_lossy().into_owned()).unwrap_or_default();
let text = Self::get_string(map, "text").map(|s| s.to_string_lossy().into_owned()).unwrap_or_default();
let date_ts = Self::get_i64_from_str(map, "date").unwrap_or(0);
let msg = crate::printers::PrintableMessage {
guid,
date: time::OffsetDateTime::from_unix_timestamp(date_ts).unwrap_or_else(|_| time::OffsetDateTime::UNIX_EPOCH),
sender,
text,
file_transfer_guids: vec![],
attachment_metadata: None,
};
println!("{}", crate::printers::MessagePrinter::new(&msg));
}
}
Ok(())
}
_ => Err(anyhow::anyhow!("Unexpected messages payload")),
}
}
async fn enqueue_outgoing_message(
&mut self,
_conversation_id: String,
_text: String,
) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let mut args = HashMap::new();
args.insert(Self::key("conversation_id"), Message::String(CString::new(_conversation_id).unwrap()));
args.insert(Self::key("text"), Message::String(CString::new(_text).unwrap()));
let reply = self.call_method(&mut client, "SendMessage", Some(args)).await?;
if let Some(uuid) = Self::get_string(&reply, "uuid") { println!("Outgoing message ID: {}", uuid.to_string_lossy()); }
Ok(())
}
async fn wait_for_signals(&mut self) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
}
async fn config(&mut self, _cmd: ConfigCommands) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
match _cmd {
ConfigCommands::Print => {
let reply = self.call_method(&mut client, "GetAllSettings", None).await?;
let server_url = Self::get_string(&reply, "server_url").map(|s| s.to_string_lossy().into_owned()).unwrap_or_default();
let username = Self::get_string(&reply, "username").map(|s| s.to_string_lossy().into_owned()).unwrap_or_default();
let table = prettytable::table!([b->"Server URL", &server_url], [b->"Username", &username]);
table.printstd();
Ok(())
}
ConfigCommands::SetServerUrl { url } => {
let mut args = HashMap::new();
args.insert(Self::key("server_url"), Message::String(CString::new(url).unwrap()));
let _ = self.call_method(&mut client, "UpdateSettings", Some(args)).await?;
Ok(())
}
ConfigCommands::SetUsername { username } => {
let mut args = HashMap::new();
args.insert(Self::key("username"), Message::String(CString::new(username).unwrap()));
let _ = self.call_method(&mut client, "UpdateSettings", Some(args)).await?;
Ok(())
}
}
}
async fn delete_all_conversations(&mut self) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let _ = self.call_method(&mut client, "DeleteAllConversations", None).await?;
Ok(())
}
async fn download_attachment(&mut self, _attachment_id: String) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let mut args = HashMap::new();
args.insert(Self::key("attachment_id"), Message::String(CString::new(_attachment_id).unwrap()));
args.insert(Self::key("preview"), Message::String(CString::new("false").unwrap()));
let _ = self.call_method(&mut client, "DownloadAttachment", Some(args)).await?;
Ok(())
}
async fn upload_attachment(&mut self, _path: String) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let mut args = HashMap::new();
args.insert(Self::key("path"), Message::String(CString::new(_path).unwrap()));
let reply = self.call_method(&mut client, "UploadAttachment", Some(args)).await?;
if let Some(guid) = Self::get_string(&reply, "upload_guid") { println!("Upload GUID: {}", guid.to_string_lossy()); }
Ok(())
}
async fn mark_conversation_as_read(&mut self, _conversation_id: String) -> Result<()> {
Err(anyhow::anyhow!("Feature not implemented for XPC"))
let mach_port_name = Self::build_service_name()?;
let mut client = XPCClient::connect(&mach_port_name);
let mut args = HashMap::new();
args.insert(Self::key("conversation_id"), Message::String(CString::new(_conversation_id).unwrap()));
let _ = self.call_method(&mut client, "MarkConversationAsRead", Some(args)).await?;
Ok(())
}
}