use crate::com::{FromDispatch, SafeDispatch, SafeVariant};
use crate::errors::SageResult;
use windows::Win32::System::Com::IDispatch;
pub struct ILoggable {
pub dispatch: IDispatch,
}
impl ILoggable {
fn dispatch(&self) -> SafeDispatch<'_> {
SafeDispatch::new(&self.dispatch)
}
pub fn is_administrator(&self) -> SageResult<bool> {
self.dispatch()
.call_method_by_name("IsAdministrator", &[])?
.to_bool()
}
pub fn is_logged(&self) -> SageResult<bool> {
self.dispatch()
.call_method_by_name("IsLogged", &[])?
.to_bool()
}
pub fn get_user_name(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("UserName", &[])?
.to_string()
}
pub fn set_user_name(&self, username: &str) -> SageResult<()> {
let username_variant = SafeVariant::from_string(username);
self.dispatch()
.call_property_put("UserName", &[username_variant])?;
Ok(())
}
pub fn set_user_pwd(&self, password: &str) -> SageResult<()> {
let pwd_variant = SafeVariant::from_string(password);
self.dispatch()
.call_property_put("UserPwd", &[pwd_variant])?;
Ok(())
}
pub fn service_id(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("ServiceId", &[])?
.to_string()
}
pub fn service_name(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("ServiceName", &[])?
.to_string()
}
pub fn application_token(&self) -> SageResult<String> {
self.dispatch()
.call_method_by_name("ApplicationToken", &[])?
.to_string()
}
pub fn get_property(&self, name: &str) -> SageResult<SafeVariant> {
self.dispatch().call_method_by_name(name, &[])
}
pub fn user_info(&self) -> SageResult<String> {
let is_logged = self.is_logged().unwrap_or(false);
let is_admin = self.is_administrator().unwrap_or(false);
let username = self
.get_user_name()
.unwrap_or_else(|_| "Non disponible".to_string());
Ok(format!(
"Utilisateur: {} | Connecté: {} | Admin: {}",
username, is_logged, is_admin
))
}
}
impl FromDispatch for ILoggable {
fn from_dispatch(dispatch: IDispatch) -> SageResult<Self> {
Ok(ILoggable { dispatch })
}
}