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-<version>/sysroot-*-kos/include/kosipc/application.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/make_application.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/connect_dynamic_channel.h
NameServer
program. To do so, you must connect to the name server by calling the NsCreate()
function and find the server that provides the required endpoint by using the NsEnumServices()
function. For more details, refer to Dynamically creating IPC channels (cm_api.h, ns_api.h).kosipc::MakeApplicationAutodetect()
function. (You can also use the kosipc::MakeApplication()
and kosipc::MakeApplicationPureClient()
functions.)MakeProxy()
function. Use the kosipc::ConnectDynamicChannel()
function call as the input parameter of the MakeProxy()
function. Pass the pointers for the server name and qualified name of the endpoint obtained at step 4 to the kosipc::ConnectDynamicChannel()
function.After successful initialization of the proxy object, the client can call methods of the required endpoint.
Example
NsHandle ns;
// Connect to a name server
Retcode rc = NsCreate(RTL_NULL, INFINITE_TIMEOUT, &ns);
char serverName[kl_core_Types_UCoreStringSize];
char endpointName[kl_core_Types_UCoreStringSize];
// Get pointers to the server name and qualified name of the endpoint
rc = NsEnumServices(
ns, interfaceName, 0,
serverName, kl_core_Types_UCoreStringSize,
endpointName, kl_core_Types_UCoreStringSize);
// Create and initialize the application object
kosipc::Application app = kosipc::MakeApplicationAutodetect();
// Create and initialize the proxy object
auto proxy = app.MakeProxy<IDLInterface>(
kosipc::ConnectDynamicChannel(serverName, endpointName))
// Call the method of the required endpoint
proxy->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-<version>/sysroot-*-kos/include/kosipc/application.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/event_loop.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/make_application.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/root_component.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/serve_dynamic_channel.h
/opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/simple_connection_acceptor.h
kosipc::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.Run()
method of the kosipc::EventLoop
object.When creating an object, you can use the kosipc::SimpleConnectionAcceptor
class, which is the standard implementation of the kosipc::IConnectionAcceptor
interface. (The kosipc::IConnectionAcceptor
interface is defined in the file named /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/kosipc/connection_acceptor.h
.) In this case, the handler will implement the following logic: if the endpoint requested by the client was published on the server, the request from the client will be accepted. Otherwise, it will be 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 object created at step 9 to the ServeConnectionRequests()
function.There can only be one loop for receiving incoming requests to dynamically create an IPC channel. The loop must work in one thread. The loop for receiving incoming requests to dynamically create an IPC channel must be created after the loop for dispatching incoming IPC channels is created (see step 7).
Run()
method of the kosipc::EventLoop
object.Example
// Create class objects that implement interfaces
// provided by the server as endpoints
MyIDLInterfaceImp_1 impl_1;
MyIDLInterfaceImp_2 impl_2;
// Create and initialize the application object
kosipc::Application app = kosipc::MakeApplicationAutodetect();
// Create and initialize the root object that describes
// the components and endpoints of the server
kosipc::components::Root root;
// Bind the root object to the class objects that implement the server endpoints.
// The fields of the root object repeat the description of components and endpoints
// defined collectively by the CDL and EDL files.
root.component1.endpoint1 = &impl_1;
root.component2.endpoint2 = &impl_2;
// Create and initialize the object that implements the
// loop for dispatching incoming IPC messages
kosipc::EventLoop loopDynamicChannel = app.MakeEventLoop(ServeDynamicChannel(root));
// Start the loop for dispatching incoming IPC messages in a separate thread
std::thread dynChannelThread(
[&loopDynamicChannel]() {
loopDynamicChannel.Run();
}
);
// Create an object that implements a standard handler for receiving incoming requests
// to dynamically create an IPC channel
kosipc::SimpleConnectionAcceptor acceptor(root);
// Create an object that implements a loop for receiving incoming requests
// to dynamically create an IPC channel
kosipc::EventLoop loopDynamicChannel = app.MakeEventLoop(ServeConnectionRequests(&acceptor));
// Start the loop for receiving incoming requests to dynamically create an IPC channel in the current thread
loopConnectionReq.Run();
If necessary, you can create and initialize multiple kosipc::components::Root
class objects combined into a list of objects of the ServiceList
type using the AddServices()
method. For example, use of multiple objects enables you to separate components and endpoints of the server into groups or publish endpoints under different names.
Example
// 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 and initialize the group_2 object
kosipc::components::Root group_2;
group_2.component1.endpoint1 = &impl_3;
group_2.component2.endpoint2 = &impl_4;
// Create and initialize the group_3 object
kosipc::components::Root group_3;
group_3.component1.endoint1 = &impl_5;
// Create a list of objects
ServiceList endpoints;
endpoints.AddServices(group_1);
endpoints.AddServices(group_2);
endpoints.AddServices(group_3.component1.endpoint1, "SomeCustomEndpointName");
// Create an object that implements the handler for receiving incoming requests
// to dynamically create an IPC channel
kosipc::SimpleConnectionAcceptor acceptor(std::move(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));
Page top