use core::fmt;
use core::str::from_utf8;
use crate::descriptors::EventDataDescriptor;
use crate::descriptors::EventDescriptor;
use crate::enums::Level;
use crate::guid::Guid;
use crate::native::ProviderContext;
use crate::native::ProviderEnableCallback;
#[allow(unused_imports)] #[cfg(feature = "macros")]
use crate::define_provider;
#[allow(unused_imports)] #[cfg(feature = "macros")]
use crate::write_event;
pub struct Provider {
context: ProviderContext,
meta: &'static [u8], id: Guid,
}
impl Provider {
pub fn current_thread_activity_id() -> Guid {
let mut activity_id = Guid::default();
ProviderContext::activity_id_control(
1, &mut activity_id,
);
return activity_id;
}
pub fn set_current_thread_activity_id(value: &Guid) -> Guid {
let mut activity_id = *value;
ProviderContext::activity_id_control(
4, &mut activity_id,
);
return activity_id;
}
pub fn create_activity_id() -> Guid {
let mut activity_id = Guid::default();
ProviderContext::activity_id_control(
3, &mut activity_id,
);
return activity_id;
}
pub fn guid_from_name(name: &str) -> Guid {
return Guid::from_name(name);
}
pub const fn raw_meta(&self) -> &[u8] {
return self.meta;
}
pub fn name(&self) -> &str {
let mut name_end = 2;
while self.meta[name_end] != 0 {
name_end += 1;
}
return from_utf8(&self.meta[2..name_end]).unwrap();
}
pub const fn id(&self) -> &Guid {
return &self.id;
}
#[inline(always)]
pub const fn enabled(&self, level: Level, keyword: u64) -> bool {
return self.context.enabled(level, keyword);
}
pub fn unregister(&self) -> u32 {
return self.context.unregister();
}
pub unsafe fn register(&self) -> u32 {
return self.register_impl(None, 0);
}
pub unsafe fn register_with_callback(
&self,
callback_fn: ProviderEnableCallback,
callback_context: usize,
) -> u32 {
return self.register_impl(Some(callback_fn), callback_context);
}
fn register_impl(
&self,
callback_fn: Option<ProviderEnableCallback>,
callback_context: usize,
) -> u32 {
let result = unsafe {
self.context
.register(&self.id, callback_fn, callback_context)
};
if result == 0 {
self.context.set_information(2, self.meta);
}
return result;
}
}
impl fmt::Debug for Provider {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
return write!(
f,
"Provider {{ name: \"{}\", id: {}, enabled: {}, reg_handle: {:x} }}",
self.name(),
from_utf8(&self.id.to_utf8_bytes()).unwrap(),
self.enabled(Level::LogAlways, 0),
self.context.reg_handle()
);
}
}
pub const unsafe fn provider_new(meta: &'static [u8], id: &Guid) -> Provider {
return Provider {
context: ProviderContext::new(),
meta,
id: *id,
};
}
pub fn provider_write_transfer(
provider: &Provider,
descriptor: &EventDescriptor,
activity_id: Option<&Guid>,
related_id: Option<&Guid>,
dd: &[EventDataDescriptor],
) -> u32 {
return provider
.context
.write_transfer(descriptor, activity_id, related_id, dd);
}