use futures::StreamExt;
use msft::service::message::{Arguments, ServiceMessageStream};
use msft::service::status::{CurrentState, ServiceControlAccept, ServiceType, StatusHandle};
use tracing::info;
use tracing::trace;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::{filter::LevelFilter, fmt, prelude::*};
use win_etw_tracing::TracelogSubscriber;
fn main() {
let guid = make_guid();
let etw = TracelogSubscriber::new(guid, "Altronix Service Tracelog").unwrap();
let file_appender =
tracing_appender::rolling::daily("C:\\Users\\Tom\\Documents", "demo-service.log");
let (non_blocking, _guard) = tracing_appender::non_blocking(file_appender);
let fmt = fmt::layer().with_target(false).with_writer(non_blocking);
tracing_subscriber::registry()
.with(fmt)
.with(etw)
.with(LevelFilter::TRACE)
.init();
info!("Application service starting...");
msft::service::start_service_ctrl_dispatcher![
("Altronix ZDK Device Service", svc_dev),
("Altronix ZDK Update Service", svc_update),
];
}
#[msft::service::service(name = "Altronix ZDK Device Service", mt = true)]
async fn svc_dev(mut hstatus: StatusHandle, mut stream: ServiceMessageStream, _arg: Arguments) {
info!("Starting Altronix ZDK Device Service...");
hstatus
.set_service_type(ServiceType::UserShareProcess)
.set_current_state(CurrentState::ServiceRunning)
.set_control_accept(ServiceControlAccept::all())
.set_status()?;
info!("Register Altronix ZDK Device Service StatusHandle Ok");
while let Some(msg) = stream.next().await {
trace!(?msg, "Received a SCM msg");
}
info!("Altronix ZDK Device Service Stopping");
hstatus
.set_current_state(CurrentState::ServiceStopped)
.set_status()?;
info!("Altronix ZDK Device Service Stopped");
std::io::Result::Ok(())
}
#[msft::service::service(name = "Altronix ZDK Update Service")]
async fn svc_update(mut hstatus: StatusHandle, mut stream: ServiceMessageStream, _arg: Arguments) {
info!("Starting Altronix ZDK Update Service...");
hstatus
.set_service_type(ServiceType::UserShareProcess)
.set_current_state(CurrentState::ServiceRunning)
.set_control_accept(ServiceControlAccept::all())
.set_status()?;
info!("Register Altronix ZDK Update Service StatusHandle Ok");
while let Some(msg) = stream.next().await {
trace!(?msg, "Received a SCM msg");
}
info!("Altronix ZDK Update Service Stopping");
hstatus
.set_current_state(CurrentState::ServiceStopped)
.set_status()?;
info!("Altronix ZDK Device Service Stopped");
std::io::Result::Ok(())
}
fn make_guid() -> win_etw_provider::GUID {
let guid = msft::service::util::guid::new("a9214533-3f5f-475b-8140-cb96b289270b");
win_etw_provider::GUID {
data1: guid.0.data1,
data2: guid.0.data2,
data3: guid.0.data3,
data4: guid.0.data4,
}
}