mssf_core/runtime/
runtime_wrapper.rs1use crate::WString;
2use 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}