// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.modular.session;

using fuchsia.mem;
using fuchsia.sys;

/// A protocol used to launch sessionmgr.
///
/// basemgr serves this protocol to session components.
[Discoverable]
protocol Launcher {
    /// Launches an instance of sessionmgr with the given Modular configuration.
    ///
    /// |config| should contain all configuration necessary for starting a
    /// session. When LaunchSessionmgr is called, basemgr uses only |config| to
    /// configure the session. It does not use any fields from its startup
    /// configuration (/config(_override)/data/startup.config).
    ///
    /// |config| cannot include a session launcher component.
    ///
    /// If sessionmgr is already running, it will be stopped and restarted with
    /// the new configuration.
    ///
    /// On error, the protocol channel is closed with:
    ///
    ///   * `ZX_ERR_INVALID_ARGS`: |config| is invalid, could not be read, or
    ///     includes a session launcher component.
    ///   * `ZX_ERR_BAD_STATE`: The session cannot be launched because
    ///     basemgr is shutting down.
    ///
    /// * `config` Modular configuration serialized as UTF-8 JSON
    LaunchSessionmgr(fuchsia.mem.Buffer config);

    /// Launches an instance of sessionmgr with the given Modular configuration and
    /// a list of services to be provided to agents in
    /// ModularConfig.sessionmgr_config.session_agents and .startup_agents.
    ///
    /// |additional_services.host_directory| is required. The channel will close with
    /// ZX_ERR_INVALID_ARGS if not present.
    LaunchSessionmgrWithServices(fuchsia.mem.Buffer config,
                                 fuchsia.sys.ServiceList additional_services);
};
