1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
This component provides a helper that allows a server process to handle multiple
concurrent IPCs coming through a `NamedPlatformChannel`.
## Example usage
In the server process:
```cpp
static const uint64_t kMessagePipeId = 0u;
class MyInterfaceImpl: public mojom::MyInterface {
void Start() {
server_.set_disconnect_handler(
base::BindRepeating(&MyInterfaceImpl::OnDisconnected, this));
server_.StartServer();
}
void OnDisconnected() {
LOG(INFO) << "Receiver disconnected: " << server_.current_receiver();
}
// mojom::MyInterface Implementation.
void DoWork() override {
// Do something...
// If you want to close the connection:
server_.Close(server_.current_receiver());
}
NamedMojoIpcServer<mojom::MyInterface> server_{
{
.server_name = "my_server_name",
.message_pipe_id = kMessagePipeId,
// Other options when necessary...
}, this,
base::BindRepeating([](mojom::MyInterface* impl, base::ProcessId caller) {
// Verify the calling process, returning nullptr if unverified.
return impl; // impl must outlive NamedMojoIpcServer.
}, this)};
};
```
Note: In unittests `base::test:TaskEnvironment` should run until idle after
`NamedMojoIpcServer` is shutdown. Otherwise, memory may leak. E.g:
```cpp
void MyTestFixture::TearDown() {
ipc_server_->StopServer();
task_environment_.RunUntilIdle();
}
```
In the client:
```cpp
void ConnectToServer() {
mojo::PlatformChannelEndpoint endpoint =
named_mojo_ipc_server::ConnectToServer(server_name);
auto invitation = mojo::IncomingInvitation::Accept(std::move(endpoint));
mojo::Remote<mojom::MyInterface> remote(
mojo::PendingRemote<mojom::MyInterface>(
invitation.ExtractMessagePipe(kMessagePipeId), 0));
}
```
Note that for compatibility with all supported platforms clients should use
`named_mojo_ipc_server::ConnectToServer` instead of
`mojo::NamedPlatformChannel::ConnectToServer`. Some platforms require
additional connection brokerage steps which are abstracted by the former.
On Windows, the server needs to have the following access rights on the client
process: `PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION`.
It is possible to bind a different implementation of the interface to each
connection by returning different `mojom::MyInterface*` values rather than
`this`. All implementations must outlive the NamedMojoIpcServer.
|