Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(493)

Unified Diff: services/service_manager/public/interfaces/connector.mojom

Issue 2804373002: Eliminate Connector::Connect(), Connection, etc. (Closed)
Patch Set: . Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: services/service_manager/public/interfaces/connector.mojom
diff --git a/services/service_manager/public/interfaces/connector.mojom b/services/service_manager/public/interfaces/connector.mojom
index 3c759cbbe918aed432832f5f394aaecb49319f67..63168e4a15ac5f6ae04d0991307068eda41d03de 100644
--- a/services/service_manager/public/interfaces/connector.mojom
+++ b/services/service_manager/public/interfaces/connector.mojom
@@ -6,50 +6,51 @@ module service_manager.mojom;
import "services/service_manager/public/interfaces/interface_provider.mojom";
+// TODO(beng): Determine who (if anyone) uses kRootUserID.
const string kRootUserID = "505C0EE9-3013-43C0-82B0-A84F50CF8D84";
const string kInheritUserID = "D26290E4-4485-4EAE-81A2-66D1EEB40A9D";
const uint32 kInvalidInstanceID = 0;
+// TODO(beng): Evalute the utility of this enum. There are some inconsistencies
+// in its use with BindInterface/StartService.
enum ConnectResult {
- // The connection was established successfully.
+ // The operation was established successfully.
SUCCEEDED,
// The name or user id supplied was malformed, or the service specified by
// |name| could not be loaded.
INVALID_ARGUMENT,
- // The connection was blocked by policy. Either connections to |name| are
- // forbidden from this app by the CapabilityFilter, or the service attempted
- // to connect using a user id other than its own, |kInheritUserID| or
- // |kRootUserID|.
+ // Policy prevented the successful completion of this operation. Either
+ // requests to bind to |name| are forbidden from the calling service by its
+ // manifest, or the service attempted to connect using a user id other than
+ // its own, |kInheritUserID| or |kRootUserID|.
ACCESS_DENIED
};
// A collection of metadata that disambiguates instances in the service manager.
struct Identity {
- // A service: or exe: name identifying a service.
+ // A name identifying a service.
string name;
- // The user id of the target service instance to connect to. If no such
- // instance exists, the service manager may start one. This user id will be
- // passed to the new instance via Initialize().
- //
- // When connecting to other services, services must generally pass
- // kInheritUserID for this value, and the service manager will either connect
- // to an existing instance matching the caller's user id, create a new
- // instance matching the caller's user id, or connect to an existing instance
- // running as kRootUserID. By default, services do not have the ability to set
- // arbitrary values to this field, and doing so will result in a connection
- // error on the remote service provider.
+ // The user id of the target service instance to bind to. If no such instance
+ // exists, the service manager may start one. This user id will be passed to
+ // the new instance via Initialize().
+ //
+ // When binding to other services, services must generally pass kInheritUserID
+ // for this value, and the service manager will either bind to an existing
+ // instance matching the caller's user id, create a new instance matching the
+ // caller's user id, or bind to an existing instance running as kRootUserID.
+ // By default, services do not have the ability to set arbitrary values to
+ // this field, and doing so will result in an error response.
//
// A service with the ability to launch other services with arbitrary user ids
- // (e.g. a login service) may set this value to something meaningful to it.
- // The user id string is a valid guid of the form
- // "%08X-%04X-%04X-%04X-%012llX", and (aside from the root user whose
- // guid is defined above) intended to be not-guessable.
+ // (e.g. a login service) may set this value. The user id string is a valid
+ // guid of the form "%08X-%04X-%04X-%04X-%012llX", and (aside from the root
+ // user whose guid is defined above) intended to be not-guessable.
//
- // When a service is initialized or receives a connection from another
+ // When a service is initialized or receives a bind request from another
// service, this value is always the resolved user id, never |kInheritUserID|.
string user_id;
@@ -67,76 +68,99 @@ interface PIDReceiver {
SetPID(uint32 pid);
};
-// Encapsulates establishing connections with other Services.
+// An interface that allows the holder to start other services & bind to
+// interfaces exposed by them.
interface Connector {
- // Typically, the service manager will start a process for a service the first
- // time it receives a connection request for it. This struct allows a client
- // to start the process itself and provide the service manager the pipes it
- // needs to communicate with it. When this function is called, the client owns
- // the lifetime of the child process it started, not the service manager. The
- // service manager binds the |service| pipe, and when it closes destroys the
- // associated instance but the process stays alive.
+ // Asks the service manager to route a request to bind an implementation of
+ // the interface to a named service instance.
+ //
+ // A service's ability to bind interfaces exposed by another is controlled by
+ // policy set out in each service's manifest. See
+ // //services/service_manager/README.md for more information on manifests.
+ // If policy prevents the requesting service from binding the specified
+ // interface, the request pipe will be closed.
//
// Parameters:
//
- // service
- // A pipe to an implementation of Service that the service manager can use
- // to communicate with the service.
+ // target
+ // The identity of the service instance to route the request to. If no
+ // instance exists, the service will be started.
//
- // pid_receiver_request
- // Allows the client process launcher to tell the service manager the PID of
- // the process it created (the pid isn't supplied directly here as the
- // process may not have been launched by the time Connect() is called.)
+ // interface_name
+ // The name of the interface to be bound. If the target service does not
+ // expose an interface of this name, the request pipe will be closed.
//
- StartService(Identity name,
- handle<message_pipe> service,
- PIDReceiver& pid_receiver_request);
-
- // Requests a connection with another service. The service originating the
- // request is referred to as the "source" and the one receiving the "target".
+ // interface_pipe
+ // A message pipe endpoint encapsulating a request for an interface named
+ // |interface_name|.
+ //
+ // Response parameters:
+ //
+ // result
+ // Indicates the result of the BindInterface() operation.
//
- // The connection is embodied by a pair of message pipes binding the
- // InterfaceProvider interface, which allows both the source and target
- // services to export interfaces to one another. The interfaces bound via
- // these InterfaceProviders are brokered by the service manager according to
- // the security policy defined by each service in its manifest.
+ // identity
+ // The fully resolved identity of the instance in the service manager, with
+ // a resolved user id. Typically the client passes |kInheritUserID| as the
+ // user id to BindInterface(), which will be resolved by the service
+ // manager into a concrete user id.
//
- // If the target service is not running, the service manager will run it,
- // calling its OnStart() method before completing the connection.
+ BindInterface(Identity target,
+ string interface_name,
+ handle<message_pipe> interface_pipe) =>
+ (ConnectResult result, Identity user_id);
+
+ // Asks the service manager to create an instance for a service. No action is
+ // taken if an instance is already present. If the service is not yet running,
+ // it will be initialized and its OnStart() method will be called. A process
+ // may be allocated.
//
// Parameters:
//
// target
- // Identifies the target service instance to connect to.
- //
- // remote_interfaces
- // Allows the source service access to interface implementations exposed by
- // the target service. The interfaces accessible via this InterfaceProvider
- // are filtered by the security policy described by the source and target
- // service manifests.
+ // The identity of the service to start.
//
// Response parameters:
//
// result
- // Indicates the result of the Connect() operation.
+ // Indicates the result of the StartService() operation.
//
- // user_id
- // The user id the service manager ran the target service as. Typically a
- // client passes |kInheritUserID| as the user id to Connect(), which is
- // resolved by the service manager into a valid user id returned through
- // this callback.
+ // identity
+ // The fully resolved identity of the instance in the service manager, with
+ // a resolved user id. Typically the client passes |kInheritUserID| as the
+ // user id to BindInterface(), which will be resolved by the service
+ // manager into a concrete user id.
//
- Connect(Identity target, InterfaceProvider&? remote_interfaces) =>
- (ConnectResult result, string user_id);
+ StartService(Identity target) => (ConnectResult result, Identity identity);
- // Variant of Connect() above. Will (gradually) replace it. Think of this like
- // a combination of Connect() and InterfaceProvider::GetInteface() - requests
- // a connection to a service and binds an interface in one step.
- // TODO(beng): Update this comment once the implementation is complete.
- BindInterface(Identity target,
- string interface_name,
- handle<message_pipe> interface_pipe) =>
- (ConnectResult result, string user_id);
+ // Typically, the service manager will start a process for a service the first
+ // time it receives a bind interface request for it, or when StartService() is
+ // called. This struct allows a client to start the process itself and provide
+ // the service manager the pipes it needs to communicate with it. When this
+ // function is called, the client owns the lifetime of the child process it
+ // started, not the service manager. The service manager binds the |service|
+ // pipe, and when it closes destroys the associated instance but the process
+ // stays alive.
+ //
+ // Parameters:
+ //
+ // target
+ // The identity of the service to create the instance for.
+ //
+ // service
+ // A pipe to an implementation of Service that the service manager can use
+ // to communicate with the service.
+ //
+ // pid_receiver_request
+ // Allows the client process launcher to tell the service manager the PID of
+ // the process it created (the pid isn't supplied directly here as the
+ // process may not have been launched by the time BindInterface() is
+ // called.)
+ //
+ StartServiceWithProcess(Identity target,
+ handle<message_pipe> service,
+ PIDReceiver& pid_receiver_request) =>
+ (ConnectResult result, Identity identity);
// Clones this Connector so it can be passed to another thread.
Clone(Connector& request);
« no previous file with comments | « services/service_manager/public/cpp/service_test.h ('k') | services/service_manager/public/interfaces/service.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698