blob: 3d9db8a41ae45e8698a19eaa61d4d1d899b2f5cb [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_SERVER_H_
#define MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_SERVER_H_
#include <memory>
#include "base/component_export.h"
#include "base/functional/callback.h"
#include "base/task/single_thread_task_runner.h"
#include "mojo/public/cpp/platform/platform_channel_endpoint.h"
#include "mojo/public/cpp/platform/platform_channel_server_endpoint.h"
namespace mojo {
// PlatformChannelServer takes ownership of a PlatformChannelServerEndpoint
// and listens for a single incoming client connection.
//
// This class is not thread-safe and must be used on a thread which runs an I/O
// MessagePump.
class COMPONENT_EXPORT(MOJO_CPP_PLATFORM) PlatformChannelServer {
public:
using ConnectionCallback = base::OnceCallback<void(PlatformChannelEndpoint)>;
// Implemented for each supported platform.
class COMPONENT_EXPORT(MOJO_CPP_PLATFORM) Listener {
public:
virtual ~Listener() = default;
// Implemented for each supported platform.
static std::unique_ptr<Listener> Create();
// Attempts to start listening on `server_endpoint`. Returns true on success
// or false on failure. Same semantics as Listen() below, which calls this.
virtual bool Start(PlatformChannelServerEndpoint& server_endpoint,
ConnectionCallback& callback) = 0;
};
PlatformChannelServer();
// Destruction implicitly stops the listener if started, ensuring the
// ConnectionCallback will not be called beyoned the lifetime of this object.
~PlatformChannelServer();
// Spins up a PlatformChannelServer on the current (I/O) task runner to listen
// on `server_endpoint` for an incoming connection. `callback` is always
// called eventually, as long as the calling task runner is still running when
// either the server accepts a connection or is disconnected. If disconnected,
// `callback` receives an invalid endpoint.
static void WaitForConnection(PlatformChannelServerEndpoint server_endpoint,
ConnectionCallback callback);
// Listens on `server_endpoint` for a single connection, invoking `callback`
// once it arrives. Must not be called on a server that is already listening.
//
// If the server endpoint is disconnected before a connection is received,
// the callback will be invoked with an invalid endpoint.
//
// If the server is stopped before a connection is received, `callback` will
// not be called.
//
// If the server could not listen on the given endpoint, this returns false
// and `callback` is never called. Otherwise it returns true.
//
// This takes ownership of (i.e. moves) `server_endpoint` and `callback` if
// and only if it returns true.
bool TryListen(PlatformChannelServerEndpoint& server_endpoint,
ConnectionCallback& callback);
// Same as above, but takes a callback by value for convenience when the
// doesn't care about retaining the arguments in the failure case.
bool Listen(PlatformChannelServerEndpoint server_endpoint,
ConnectionCallback callback) {
return TryListen(server_endpoint, callback);
}
// Stops listening for new connections immediately. The callback given to
// Listen() can no longer be invoked once this is called.
void Stop();
private:
std::unique_ptr<Listener> listener_;
};
} // namespace mojo
#endif // MOJO_PUBLIC_CPP_PLATFORM_PLATFORM_CHANNEL_SERVER_H_