// Copyright 2016 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.sys;

/// Maximum length for an environment label.
const uint32 kLabelMaxLength = 32;

struct EnvironmentOptions {
    /// True if this environment should inherit services provided by the
    /// parent environment.
    bool inherit_parent_services;
    /// True if components in this environment will share a runner provided
    /// by the parent environment. If false, a new runner will be started
    /// in this environment for components.
    bool use_parent_runners;
    /// True if this environment should be killed first in out of memory
    /// situations by setting the `ZX_PROP_JOB_KILL_ON_OOM` property on this
    /// environment's job.
    bool kill_on_oom;
    /// True if "persistent" storage requested by components in this environment should not actually
    /// be persistent, and instead be deleted when this environment is killed.
    bool delete_storage_on_death;
};

/// An interface for managing a set of applications.
///
/// Applications run inside environments, which provide ambient services and
/// support for their lifecycle.
[Discoverable]
protocol Environment {
    /// Creates a new environment nested inside this environment.
    ///
    /// When applications are created inside the nested environment using the
    /// environment's `Launcher`, the environment requests the
    /// environment services from `host_directory` before passing those services to
    /// the newly created application in its `StartupInfo`.
    ///
    /// The `controller` can be used to control the lifecycle of the created
    /// environment. Note that by default the environment will be killed
    /// automatically when the `EnvironmentController`'s interface is closed. You
    /// can use `EnvironmentController.Detach` to disable this behavior.
    ///
    /// `label` defines the new environment's label/name. It must be unique within
    /// the parent environment (though not globally) and is used for isolating
    /// separate environments. It can also be used for diagnostic purposes. The
    /// label will be truncated if it is longer than `kLabelMaxLength`.
    ///
    /// `additional_services`, which may be empty, contains a list of services
    /// that the environment provides, which are hosted by
    /// `additional_services.host_directory`. If `options.inherit_parent_services`
    /// is false, `host_directory` must provide a `Loader` service if it wishes to
    /// allow new components to be loaded in the new environment.
    ///
    /// `options` provides additional options, see `EnvironmentOptions` for
    /// details.
    CreateNestedEnvironment(request<Environment> environment,
                            request<EnvironmentController> controller,
                            string label,
                            ServiceList? additional_services,
                            EnvironmentOptions options);

    /// Gets the Launcher associated with this environment.
    ///
    /// Applications created using this application launcher will be given the
    /// environment services provided by this environment's `host_directory`.
    GetLauncher(request<Launcher> launcher);

    /// Gets a superset of services provided by this environment's
    /// `host_directory`.
    GetServices(request<ServiceProvider> services);

    /// Gets a superset of services provided by this environment's
    /// `host_directory`.
    GetDirectory(handle<channel> directory_request);
};
