crates/libs/core/src/runtime/node_context.rs (66 lines of code) (raw):
// ------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License (MIT). See License.txt in the repo root for license information.
// ------------------------------------------------------------
#[cfg(feature = "tokio_async")]
use std::time::Duration;
use crate::{Interface, WString};
use mssf_com::FabricRuntime::{IFabricNodeContextResult, IFabricNodeContextResult2};
use crate::{strings::WStringWrap, types::NodeId};
#[cfg(feature = "tokio_async")]
use crate::sync::{fabric_begin_end_proxy, CancellationToken};
#[cfg(feature = "tokio_async")]
pub fn get_com_node_context(
timeout_milliseconds: u32,
cancellation_token: Option<CancellationToken>,
) -> crate::sync::FabricReceiver<crate::WinResult<IFabricNodeContextResult>> {
fabric_begin_end_proxy(
move |callback| {
crate::API_TABLE.fabric_begin_get_node_context(timeout_milliseconds, callback)
},
move |ctx| crate::API_TABLE.fabric_end_get_node_context(ctx),
cancellation_token,
)
}
#[derive(Debug)]
pub struct NodeContext {
com: IFabricNodeContextResult,
pub node_name: WString,
pub node_type: WString,
pub ip_address_or_fqdn: WString,
pub node_instance_id: u64,
pub node_id: NodeId,
}
#[cfg(feature = "tokio_async")]
impl NodeContext {
// Get the node context from SF runtime
pub async fn get(
timeout: Duration,
cancellation_token: Option<CancellationToken>,
) -> crate::Result<Self> {
let com = get_com_node_context(timeout.as_millis().try_into().unwrap(), cancellation_token)
.await??;
Ok(Self::from(&com))
}
}
impl NodeContext {
// Get the node context synchronously
pub fn get_sync() -> crate::Result<Self> {
let com = crate::API_TABLE.fabric_get_node_context()?;
Ok(Self::from(&com))
}
// Retrieves the directory path for the directory at node level.
pub fn get_directory(&self, logical_directory_name: &WString) -> crate::Result<WString> {
let com2 = self.com.cast::<IFabricNodeContextResult2>()?;
let dir = unsafe { com2.GetDirectory(logical_directory_name.as_pcwstr()) }?;
Ok(WStringWrap::from(&dir).into())
}
}
impl From<&IFabricNodeContextResult> for NodeContext {
fn from(value: &IFabricNodeContextResult) -> Self {
let raw = unsafe { value.get_NodeContext() };
assert!(!raw.is_null());
let raw_ref = unsafe { raw.as_ref() }.unwrap();
Self {
com: value.clone(),
node_name: WStringWrap::from(raw_ref.NodeName).into(),
node_type: WStringWrap::from(raw_ref.NodeType).into(),
ip_address_or_fqdn: WStringWrap::from(raw_ref.IPAddressOrFQDN).into(),
node_instance_id: raw_ref.NodeInstanceId,
node_id: raw_ref.NodeId.into(),
}
}
}