Skip to main content

mssf_core/runtime/
runtime_wrapper.rs

1use crate::WString;
2/// safe wrapping for runtime
3use mssf_com::FabricRuntime::{
4    IFabricRuntime2, IFabricSelfReconfiguringServiceFactory, IFabricStatefulServiceFactory,
5    IFabricStatelessServiceFactory,
6};
7
8use super::{
9    create_com_runtime, executor::Executor,
10    self_reconfiguring_bridge::SelfReconfiguringServiceFactoryBridge,
11    self_reconfiguring_traits::ISelfReconfiguringServiceFactory,
12    stateful_bridge::StatefulServiceFactoryBridge, stateful_traits::IStatefulServiceFactory,
13    stateless_bridge::StatelessServiceFactoryBridge, stateless_traits::IStatelessServiceFactory,
14};
15pub struct Runtime<E>
16where
17    E: Executor,
18{
19    com_impl: IFabricRuntime2,
20    rt: E,
21}
22
23impl<E> Runtime<E>
24where
25    E: Executor,
26{
27    pub fn create(rt: E) -> crate::Result<Runtime<E>> {
28        let com = create_com_runtime()?;
29        Ok(Runtime { com_impl: com, rt })
30    }
31
32    pub fn register_stateless_service_factory(
33        &self,
34        servicetypename: &WString,
35        factory: Box<dyn IStatelessServiceFactory>,
36    ) -> crate::Result<()> {
37        let rt_cp = self.rt.clone();
38        let bridge: IFabricStatelessServiceFactory =
39            StatelessServiceFactoryBridge::create(factory, rt_cp).into();
40        unsafe {
41            self.com_impl
42                .RegisterStatelessServiceFactory(servicetypename.as_pcwstr(), &bridge)
43        }
44        .map_err(crate::Error::from)
45    }
46
47    pub fn register_stateful_service_factory(
48        &self,
49        servicetypename: &WString,
50        factory: Box<dyn IStatefulServiceFactory>,
51    ) -> crate::Result<()> {
52        let rt_cp = self.rt.clone();
53        let bridge: IFabricStatefulServiceFactory =
54            StatefulServiceFactoryBridge::create(factory, rt_cp).into();
55        unsafe {
56            self.com_impl
57                .RegisterStatefulServiceFactory(servicetypename.as_pcwstr(), &bridge)
58        }
59        .map_err(crate::Error::from)
60    }
61
62    pub fn register_self_reconfiguring_service_factory(
63        &self,
64        servicetypename: &WString,
65        factory: Box<dyn ISelfReconfiguringServiceFactory>,
66    ) -> crate::Result<()> {
67        let rt_cp = self.rt.clone();
68        let bridge: IFabricSelfReconfiguringServiceFactory =
69            SelfReconfiguringServiceFactoryBridge::create(factory, rt_cp).into();
70        unsafe {
71            self.com_impl
72                .RegisterSelfReconfiguringServiceFactory(servicetypename.as_pcwstr(), &bridge)
73        }
74        .map_err(crate::Error::from)
75    }
76}