2024-09-18 18:22:45 +00:00
mod formats ;
2024-09-16 20:51:27 +00:00
mod notification ;
2024-09-18 11:23:39 +00:00
use notification ::to_notif ;
2024-09-16 11:19:08 +00:00
2024-09-16 20:51:27 +00:00
use futures_util ::stream ::TryStreamExt ;
use zbus ::{ Connection , Result } ;
2024-08-27 11:28:05 +00:00
2024-09-17 18:32:16 +00:00
const SERVER_NAME : & str = " SNot " ; // Server software name
2024-09-18 18:22:45 +00:00
const VENDOR : & str = " candifloss.cc " ; // Server software vendor
const VERSION : & str = " 0.1.0 " ; // Server software version
const SPEC_VERSION : & str = " 0.42 " ; // DBus specification version
2024-09-16 21:28:58 +00:00
2024-08-27 11:28:05 +00:00
#[ tokio::main ]
async fn main ( ) -> Result < ( ) > {
let connection = Connection ::session ( ) . await ? ;
2024-09-01 08:20:17 +00:00
connection
2024-09-18 18:22:45 +00:00
. request_name ( " org.freedesktop.Notifications " ) // Requesting dbus for this service name. Any other services/procs using this name should be stopped/disabled before this
2024-09-01 08:20:17 +00:00
. await ? ;
2024-08-25 21:10:15 +00:00
2024-09-15 15:43:09 +00:00
let mut stream = zbus ::MessageStream ::from ( & connection ) ; // Convert connection to a MessageStream, yields Message items
2024-09-01 11:31:19 +00:00
2024-09-18 18:22:45 +00:00
// Iterate on the message stream
2024-09-01 11:31:19 +00:00
while let Some ( msg ) = stream . try_next ( ) . await ? {
2024-09-18 18:22:45 +00:00
// Check the method calls in the received message's header
2024-09-16 20:51:27 +00:00
if let Some ( member ) = msg . header ( ) . member ( ) {
2024-09-18 18:22:45 +00:00
let member_name = member . as_str ( ) ; // Convert to &str for the match
2024-09-16 20:51:27 +00:00
match member_name {
2024-09-15 18:10:19 +00:00
" GetServerInformation " = > {
2024-09-18 18:22:45 +00:00
// Client requested server information. Respond with: (Server_name, author, software_version, dbus_spec_version)
2024-09-18 11:23:39 +00:00
let response = ( SERVER_NAME , VENDOR , VERSION , SPEC_VERSION ) ;
2024-09-15 18:10:19 +00:00
connection . reply ( & msg , & response ) . await ? ;
2024-09-18 11:23:39 +00:00
println! ( " Request received: {member} \n \t Name: {SERVER_NAME} , Vendor: {VENDOR} , Version: {VERSION} , DBus spec version: {SPEC_VERSION} " ) ;
2024-09-18 18:22:45 +00:00
// Remove this LATER
2024-09-15 18:10:19 +00:00
}
2024-09-16 20:51:27 +00:00
" GetCapabilities " = > {
2024-09-18 18:22:45 +00:00
// Client requested server capabilities. Respond with the supported capabilities
let capabilities = vec! [ " actions " , " body " , " body-hyperlinks " ] ; // Add more LATER
2024-09-16 20:51:27 +00:00
connection . reply ( & msg , & capabilities ) . await ? ;
println! ( " Request received: {member} \n \t Capabilities: {capabilities:?} " ) ;
2024-09-18 18:22:45 +00:00
// Remove this LATER
2024-09-16 20:51:27 +00:00
}
2024-09-15 18:10:19 +00:00
" Notify " = > {
2024-09-18 18:22:45 +00:00
// New notification received. Now, respond to the client with a notification ID
let notification_id : u32 = 1 ; // This could be incremented or generated. DO IT LATER
connection . reply ( & msg , & notification_id ) . await ? ; // The client waits for this response in order to disconnect
// Get the body of the message
2024-09-15 18:10:19 +00:00
let msg_body = msg . body ( ) ;
2024-09-18 18:22:45 +00:00
// Convert the msg body to a Notification object
2024-09-16 20:51:27 +00:00
let notif = to_notif ( & msg_body ) ? ;
2024-09-18 18:22:45 +00:00
// Handle the notif
println! ( " New notification! \n {} " , & notif . plain ( ) ) ; // Print the plain version
}
" CloseNotification " = > {
// Client sent a close signal. Extract notification ID of the notif to be closed from the message body
let notification_id : u32 = msg . body ( ) . deserialize ( ) ? ;
// Tracking notifications by their IDs, closing them, and other features may be implemented later
// close_notification(notification_id);
println! ( " Closing notification with ID: {notification_id} " ) ;
// Respond to the client, acknowledging the closure
connection . reply ( & msg , & ( ) ) . await ? ;
2024-09-15 18:10:19 +00:00
}
_ = > {
2024-09-18 18:22:45 +00:00
println! ( " Unhandled method: {member} " ) ; // Other methods are either irrelevant or unhandled at this stage of development
2024-09-15 18:10:19 +00:00
}
2024-09-16 20:51:27 +00:00
}
2024-09-14 10:33:40 +00:00
}
2024-09-01 11:31:19 +00:00
}
Ok ( ( ) )
}