The system program named DCM included in the KasperskyOS SDK is used to dynamically create IPC channels for C++ development. The API of this program is provided in the section titled Dynamically creating IPC channels using the DCM system program.
Dynamic creation of an IPC channel on the client side includes the following steps:
*.edl.cpp.h) in the client program.*.idl.cpp.h)./opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/application.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/make_application.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/unique_ptr.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/connect_dcm_publication.hkosipc::MakeApplicationAutodetect() function. (You can also use the kosipc::MakeApplication() and kosipc::MakeApplicationPureClient() functions.)MakeProxy<Interface>() function.kosipc::ConnectDcmPublication() function call as the input parameter of the MakeProxy<Interface>() function.kosipc::ConnectDcmPublication() function:std::nullopt so that the received notifications about endpoint publication on the server are not filtered by server name.std::nullopt so that the received notifications about endpoint publication on the server are not filtered based on the qualified name of the endpoint.std::nullopt so that the received notifications about endpoint publication on the server are not filtered based on a specific server.std::nullopt to define an unlimited timeout. Default value: std::nullopt.std::nullopt to define an unlimited timeout. Default value: std::nullopt.If none of the parameters are specified, the kosipc::ConnectDcmPublication() function will attempt to establish a connection with the server's first available endpoint that implements the required interface.
If the server-identifying handle and qualified name of the endpoint are defined during the function call, the request to create an IPC channel with the server to use the defined endpoint with the required interface will be sent immediately without searching for notifications about publishing or depublishing this endpoint.
After successful initialization of the proxy object, the client can call endpoint methods.
Example
// Create an application object
kosipc::Application app = kosipc::MakeApplicationAutodetect();
// Create a proxy object for the endpoint that implements the Writer interface.
// The kosipc::ConnectDcmPublication() function will establish a connection with the first
// endpoint implementing the required interface available on the server.
// The endpoint search timeout is limited to 10 minutes.
auto writer = app.MakeProxy<Writer>(kosipc::ConnectDcmPublication(10min));
// Call the endpoint method
writer->DoSomeWork();
Dynamic creation of an IPC channel on the server side includes the following steps:
*.edl.cpp.h) containing a description of the component structure of the server, including all provided endpoints, in the server program./opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/application.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/event_loop.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/make_application.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/root_component.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/serve_connection_requests.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/serve_dynamic_channel.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/service_list.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/simple_connection_acceptor.h/opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/kosipc/dcm_service_publisher.hkosipc::MakeApplicationAutodetect() function.kosipc::components::Root class object that describes the structure of components and endpoints of the server. This structure is generated from the descriptions in the CDL and EDL files.kosipc::components::Root class object to the class objects created at step 3.kosipc::EventLoop class object that implements a loop for dispatching incoming IPC messages by calling the MakeEventLoop() function. Use the ServeDynamicChannel() function call as an input parameter of the MakeEventLoop() function. Pass the kosipc::components::Root class object created at step 5 to the ServeDynamicChannel() function.kosipc::ServiceList class that contains a list of endpoints to be published on the server. To add endpoints to the list, use the AddServices() method. For example, use of an object of the kosipc::ServiceList class enables you to separate components and endpoints of the server into groups or publish endpoints under different names (see below for a code example).kosipc::DcmServicePublisher class that is intended for publishing endpoints on the server. Pass the following input parameters to the constructor:kosipc::components::Root class created at step 5, or the kosipc::ServiceList class object generated at step 8.The objects created at steps 9-11 must be created after the loop for dispatching incoming IPC messages is created (see step 7).
The kosipc library guarantees the following: when an object of the kosipc::DcmServicePublisher class is created, all endpoints passed to it are published to DCM, and they are unpublished when the object is destroyed.
When creating the object, you can use the kosipc::SimpleConnectionAcceptor class, which is a standard implementation of the kosipc::IConnectionAcceptor interface. (The kosipc::IConnectionAcceptor interface is defined in sysroot-*-kos/include/kosipc/connection_acceptor.h.) In this case, the handler will implement the following logic: if the endpoint requested by the client is published on the server, the request from the client is accepted. Otherwise, it is rejected.
If you need to create your own handler, you should implement your own request handling logic in the OnConnectionRequest() method inherited from the kosipc::IConnectionAcceptor interface. This method will be called by the server when it receives a request for dynamic IPC channel creation from the client.
kosipc::EventLoop class object that implements a loop for receiving incoming requests to dynamically create an IPC channel by calling the MakeEventLoop() function. Use the ServeConnectionRequests() function call as an input parameter of the MakeEventLoop() function. Pass the objects created at step 9 and 10 to the ServeConnectionRequests() function. Objects can be passed using smart pointers (std::shared_ptr) or ordinary pointers. In the first case, the kosipc library takes control of the lifetime of objects. In the second case, the responsibility remains with the developer to ensure that the objects created at steps 9 and 10 are not destroyed before the kosipc::EventLoop object finishes.After creating and starting loops, there is no need for synchronization between threads in which the loops are executed.
Run() method of the kosipc::EventLoop object.Run() method of the kosipc::EventLoop object. Prior to starting this loop, client processes are locked when a proxy object is created while waiting for the server to respond to the connection request.Example code for combining the set of components and endpoints of the server into a list of ServiceList-type objects using the AddServices() method:
// Create an application object
kosipc::Application app = kosipc::MakeApplicationAutodetect();
// Create and initialize the group_1 object
kosipc::components::Root group_1;
group_1.component1.endpoint1 = &impl_1;
group_1.component2.endpoint2 = &impl_2;
// Create a loop for dispatching incoming IPC messages
kosipc::EventLoop loop1 = app.MakeEventLoop(ServeDynamicChannel(group_1));
// Create and initialize the group_2 object
kosipc::components::Root group_2;
group_2.component3.endpoint1 = &impl_3;
group_2.component4.endpoint2 = &impl_4;
// Create a loop for dispatching incoming IPC messages
kosipc::EventLoop loop2 = app.MakeEventLoop(ServeDynamicChannel(group_2));
// Create and initialize the group_3 object
kosipc::components::Root group_3;
group_3.component5.endpoint1 = &impl_5;
// Create a loop for dispatching incoming IPC messages
kosipc::EventLoop loop3 = app.MakeEventLoop(ServeDynamicChannel(group_3));
// Create a list of objects
ServiceList endpoints;
endpoints.AddServices(group_1);
endpoints.AddServices(group_2);
endpoints.AddServices(group_3.component5.endpoint1, "SomeCustomEndpointName");
// Create an object that implements publication of endpoints on the server
kosipc::DcmServicePublisher publisher(app, endpoints);
// Create an object that implements the handler for receiving incoming requests
// to dynamically create an IPC channel
kosipc::SimpleConnectionAcceptor acceptor(app, endpoints);
// Create an object that implements a loop for receiving incoming requests
// to dynamically create an IPC channel
kosipc::EventLoop loopDynamicChannel = app.MakeEventLoop(ServeConnectionRequests(&acceptor, &publisher));
Page top