mssf_core/runtime/
runtime_wrapper.rs1use crate::WString;
2use mssf_com::FabricRuntime::{
4 IFabricRuntime, IFabricStatefulServiceFactory, IFabricStatelessServiceFactory,
5};
6
7use super::{
8 create_com_runtime, executor::Executor, stateful_bridge::StatefulServiceFactoryBridge,
9 stateful_traits::IStatefulServiceFactory, stateless_bridge::StatelessServiceFactoryBridge,
10 stateless_traits::IStatelessServiceFactory,
11};
12pub struct Runtime<E>
13where
14 E: Executor,
15{
16 com_impl: IFabricRuntime,
17 rt: E,
18}
19
20impl<E> Runtime<E>
21where
22 E: Executor,
23{
24 pub fn create(rt: E) -> crate::Result<Runtime<E>> {
25 let com = create_com_runtime()?;
26 Ok(Runtime { com_impl: com, rt })
27 }
28
29 pub fn register_stateless_service_factory(
30 &self,
31 servicetypename: &WString,
32 factory: Box<dyn IStatelessServiceFactory>,
33 ) -> crate::Result<()> {
34 let rt_cp = self.rt.clone();
35 let bridge: IFabricStatelessServiceFactory =
36 StatelessServiceFactoryBridge::create(factory, rt_cp).into();
37 unsafe {
38 self.com_impl
39 .RegisterStatelessServiceFactory(servicetypename.as_pcwstr(), &bridge)
40 }
41 .map_err(crate::Error::from)
42 }
43
44 pub fn register_stateful_service_factory(
45 &self,
46 servicetypename: &WString,
47 factory: Box<dyn IStatefulServiceFactory>,
48 ) -> crate::Result<()> {
49 let rt_cp = self.rt.clone();
50 let bridge: IFabricStatefulServiceFactory =
51 StatefulServiceFactoryBridge::create(factory, rt_cp).into();
52 unsafe {
53 self.com_impl
54 .RegisterStatefulServiceFactory(servicetypename.as_pcwstr(), &bridge)
55 }
56 .map_err(crate::Error::from)
57 }
58}